Weźmy inny przykład, który jest mniej przepełniony koncepcjami i oczekiwaniami. Mam tutaj wyliczenie i jest to zestaw priorytetów dla błędu.
Jaką wartość przechowujesz w bazie danych?
Tak, mogę być przechowywanie 'C'
, 'H'
, 'M'
oraz 'L'
w bazie danych. Lub 'HIGH'
tak dalej. Ma to problem z ciągami danych. Znany jest zestaw prawidłowych wartości, a jeśli nie przechowujesz tego zestawu w bazie danych, praca z nim może być trudna.
Dlaczego przechowujesz dane w kodzie?
Masz List<String> priorities = {'CRITICAL', 'HIGH', 'MEDIUM', 'LOW'};
lub coś w tym rodzaju w kodzie. Oznacza to, że masz różne mapowania tych danych do właściwego formatu (wstawiasz wszystkie Caps do bazy danych, ale wyświetlasz je jako Critical
). Twój kod jest teraz również trudny do zlokalizowania. Związano reprezentację pomysłu bazy danych z ciągiem przechowywanym w kodzie.
Gdziekolwiek musisz uzyskać dostęp do tej listy, musisz mieć duplikację kodu lub klasę z szeregiem stałych. Żaden z nich nie jest dobrym rozwiązaniem. Nie należy również zapominać, że istnieją inne aplikacje, które mogą korzystać z tych danych (które mogą być napisane w innych językach - aplikacja internetowa Java ma używany system raportowania Crystal Reports i dane wsadowe do zadania wsadowego Perl ). Aparat raportujący musiałby znać prawidłową listę danych (co się stanie, jeśli nie ma nic zaznaczonego w 'LOW'
priorytecie i musisz wiedzieć, że jest to prawidłowy priorytet dla raportu?), A zadanie wsadowe będzie zawierało informacje o tym, co jest ważne wartości są.
Hipotetycznie, to może powiedzieć „jesteśmy sklep single-język - wszystko jest napisane w języku Java” i mieć jeden .jar, który zawiera tę informację - ale teraz oznacza to, że aplikacje są ściśle sprzężone ze sobą i że .jar zawierającego dane. Musisz wydać część raportującą i część dotyczącą aktualizacji wsadowej wraz z aplikacją internetową za każdym razem, gdy zachodzi zmiana - i mam nadzieję, że to wydanie będzie przebiegać płynnie dla wszystkich części.
Co się stanie, gdy szef chce innego priorytetu?
Twój szef przyszedł dzisiaj. Jest nowy priorytet - CEO
. Teraz musisz przejść i zmienić cały kod oraz dokonać ponownej kompilacji i ponownego wdrożenia.
Dzięki metodzie „wyliczania w tabeli” aktualizujesz listę wyliczania, aby uzyskać nowy priorytet. Cały kod, który pobiera listę, pobiera ją z bazy danych.
Dane rzadko są samodzielne
W przypadku priorytetów klucze danych do innych tabel, które mogą zawierać informacje o przepływach pracy lub o tym, kto może ustawić ten priorytet lub co innego.
Wracając do płci, jak wspomniano w pytaniu: Płeć ma link do używanych zaimków: he/his/him
i she/hers/her
... i chcesz uniknąć twardego kodowania tego w samym kodzie. A potem przychodzi twój szef i musisz dodać, że masz 'OTHER'
płeć (dla uproszczenia) i musisz powiązać tę płeć z they/their/them
... i twój szef widzi, co ma Facebook i ... no tak.
Ograniczając się do łańcucha danych o ciągach ciągłych zamiast do tablicy wyliczeniowej, musisz teraz zreplikować ten ciąg w szeregu innych tabel, aby zachować ten związek między danymi a innymi bitami.
Co z innymi magazynami danych?
Niezależnie od tego, gdzie to przechowujesz, istnieje ta sama zasada.
- Możesz mieć plik
priorities.prop
z listą priorytetów. Czytasz tę listę z pliku właściwości.
Możesz mieć bazę danych magazynu dokumentów (taką jak CouchDB ), która zawiera wpis dla enums
(a następnie napisać funkcję sprawdzania poprawności w JavaScript ):
{
"_id": "c18b0756c3c08d8fceb5bcddd60006f4",
"_rev": "1-c89f76e36b740e9b899a4bffab44e1c2",
"priorities": [ "critical", "high", "medium", "low" ],
"severities": [ "blocker", "bad", "annoying", "cosmetic" ]
}
Możesz mieć plik XML ze schematem:
<xs:element name="priority" type="priorityType"/>
<xs:simpleType name="priorityType">
<xs:restriction base="xs:string">
<xs:enumeration value="critical"/>
<xs:enumeration value="high"/>
<xs:enumeration value="medium"/>
<xs:enumeration value="low"/>
</xs:restriction>
</xs:simpleType>
Podstawowa idea jest taka sama. Sam magazyn danych jest miejscem, w którym należy przechowywać i egzekwować listę prawidłowych wartości. Umieszczając go tutaj, łatwiej jest zrozumieć kod i dane. Nie trzeba się martwić o defensywnie sprawdzanie co masz za każdym razem (jest to górna przypadek? Czy niższa? Dlaczego istnieje chritical
typ w tej kolumnie? Etc ...), bo wiesz, co otrzymujesz z powrotem magazyn danych jest dokładnie to, czego oczekuje magazyn danych, że w przeciwnym razie wyślesz - i możesz zapytać magazyn danych o listę prawidłowych wartości.
Na wynos
Zestaw prawidłowych wartości to dane , a nie kod. Ty nie musisz dążyć do DRY kodu - ale problem powielania jest, że jesteś powielanie danych w kodzie, a nie respektując jego miejsce jako danych i przechowywanie go w bazie danych.
Ułatwia pisanie wielu aplikacji w magazynie danych i pozwala uniknąć instancji, w których trzeba będzie wdrożyć wszystko, co jest ściśle związane z danymi - ponieważ nie połączono kodu z danymi.
Ułatwia to testowanie aplikacji, ponieważ nie trzeba ponownie testować całej aplikacji po CEO
dodaniu priorytetu - ponieważ nie ma kodu, który dbałby o rzeczywistą wartość priorytetu.
Możliwość niezależnego rozumowania kodu i danych ułatwia znajdowanie i naprawianie błędów podczas konserwacji.