Najlepsza praktyka nazywania podklas



Często znajduję się w sytuacji, w której mam pojęcie reprezentowane przez interfejs lub klasę, a następnie mam serię podklas/podinterfejsów, które ją rozszerzają.


Na przykład:
rodzajowy "DoiGraphNode"
A "DoiGraphNode" reprezentujący zasób
A "DoiGraphNode" reprezentujący zasób Java
A "DoiGraphNode" z towarzyszącym ścieżce etc., etc.


I może myśleć o trzech konwencjach nazewnictwa i doceniłby komentarze do wyboru.







Opcja 1: Zawsze zaczynaj od nazwy pojęcia.


Zatem: DoiGraphNode, DoiGraphNodeResource, DoiGraphNodeJavaResource, DoiGraphNodeWithPath itp


Pro: Jest bardzo jasne, co mam do czynienia z, to łatwo zobaczyć wszystkie opcje mam


Con: Nie bardzo naturalny? Wszystko wygląda tak samo?







Opcja 2: Umieść specjalne rzeczy na początku.


Zatem: DoiGraphNode, ResourceDoiGraphNode, JavaResourceDoiGraphNode, PathBaseDoiGraphNode,
, itp


Pro: Jest bardzo jasne, kiedy widzę go w kodzie


Con: Znalezienie to może być trudne, zwłaszcza jeśli nie pamiętam nazwy, brak spójności wizualnej







Wariant 3: Umieść specjalny materiał i usunąć niektóre z nadmiarowym tekstu


Zatem: DoiGraphNode, ResourceNode, JavaResourceNode, GraphNodeWithPath


Pro: Nie, że dużo pisać i czytać
Con: Wygląda na to cr * p, bardzo niespójne, może kolidować z innymi nazwami
Nazwa je takimi, jakimi są.


Jeśli nazywanie ich jest trudne lub niejednoznaczne, często jest to znak, że Klasa robi zbyt wiele (Zasada Odpowiedzialności Pojedynczej).


Aby uniknąć konfliktów nazw, należy odpowiednio wybrać przestrzeń nazw.


Personnally, użyję 3
<p>byłbym bardzo podejrzliwy wobec jakiegokolwiek zestawu uniwersalnych najlepszych praktyk, ponieważ w większości tych dziedzin diabeł tkwi w szczegółach. to, że informacje są stosunkowo powszechne, nie oznacza, że ​​aplikacja korzysta z danych dokładnie w taki sam sposób, jak inne aplikacje. oznacza to, że twój model danych może być nieco inny.</p><ul> <li>imię i nazwisko: dlaczego przechwytujesz imię? jeśli masz obowiązek przechwycenia pełnego imienia i nazwiska osoby (tj. przygotowujesz dokumenty prawne lub akty urodzenia), prawdopodobnie chcesz dać ludziom więcej miejsca na pisanie niż gdybyś tylko prosił o imię i nazwisko osoby, więc wezwać ich w nowej aplikacji internetowej.</li> <li>adres: co zamierzasz zrobić z adresem? jakie adresy przechowujesz? jeśli przechowujesz adres nieruchomości w stanach zjednoczonych, na której tworzysz hipotekę, prawdopodobnie bardzo zależy ci na uzyskaniu w pełni znormalizowanego adresu, w którym to przypadku model danych prawdopodobnie będzie chciał bardzo blisko pod dowolnym adresem narzędzie normalizacyjne zwraca. jeśli chcesz tylko, aby ludzie mogli wpisać adres w celu dostarczenia produktu, prawdopodobnie wystarczy kilka wierszy tekstu swobodnego. długość linii może zależeć od wymagań dalszych procesów, które wykonują takie czynności jak drukowanie etykiet adresowych.</li> <li>stan: zakładając, że możesz zidentyfikować prawidłowe wartości stanu, prawdopodobnie sensowne jest utworzenie tabeli <code>state</code> i utworzenie relacji klucza obcego między tabelami <code>state</code> i <code>address</code>. ale możliwość zidentyfikowania prawidłowych wartości oznacza, że ​​ograniczasz zestaw prawidłowych adresów przynajmniej do określonego zestawu krajów. to jest w porządku dla wielu stron, ale musisz trochę popracować, aby wesprzeć nowy kraj.</li> <li>miasto: jeśli masz do czynienia z danymi, w których istnieją potencjalnie regulacje na poziomie miasta (tj. w których istnieją różne rodzaje stawek podatkowych, które są stosowane w zależności od miasta), możesz chcieć traktować je podobnie jak państwo i mieć <code>city</code> tabela z prawidłowymi miastami i relacja klucza obcego między tabelami <code>city</code> i <code>address</code>. z drugiej strony, jeśli próbujesz tylko dostarczyć produkt i nie przejmujesz się tym, że masz w tabeli różne wersje tego samego miasta, wystarczy, że użytkownik wprowadzi dowolny tekst. oczywiście, jeśli przechowujesz klucze obce, będziesz mieć sporo pracy, aby upewnić się, że masz wszystkie prawidłowe wartości. ale są produkty, w których chodzi o to, że firma już wykonała tę pracę (tj. bazy danych podatków od sprzedaży).</li> <li>telefon: co robisz z numerami telefonów i dlaczego? niektóre aplikacje będą chciały pobierać numery telefonów w dowolnym formacie, w którym użytkownik zdecyduje się je wprowadzić i zachować to formatowanie dla wszystkich kolejnych zapytań. byłoby to powszechne, jeśli projektujesz osobistą książkę adresową, w której użytkownicy mają własne preferencje dotyczące sposobu przechowywania i wyświetlania numerów telefonów. inne aplikacje chciałyby zignorować wprowadzone formatowanie, wyodrębnić tylko znaki numeryczne, a następnie sformatować dane przy pobieraniu, aby wszystkie numery telefonów miały podobne formatowanie. jeśli prowadzisz działalność dla firm, możesz chcieć wprowadzić oddzielne pole dla użytkowników, aby wprowadzić rozszerzenie. jeśli próbujesz wesprzeć proces połączeń wychodzących, możesz chcieć przechowywać numer kierunkowy i kod kraju w osobnych kolumnach, ponieważ chcesz mieć pewność, że masz okna specyficzne dla strefy czasowej do nawiązywania połączeń z osobami o różnych numerach kierunkowych (tworzenie połączenie z kimś ze wschodniej strefy czasowej o 10 rano będzie znacznie lepsze niż wykonanie tego samego połączenia z kimś w strefie czasowej pacyfiku, gdzie jest 7 rano).</li> <li>płeć: w przypadku wielu aplikacji jest całkowicie rozsądne przechowywanie kodu płci („m” lub „f”) w tabeli. z drugiej strony zdarzają się sytuacje, w których możesz chcieć dodatkowych opcji (inne, interseksualne, transseksualne) lub gdy musisz przechowywać coś takiego jak płeć przy urodzeniu i aktualna płeć.</li> </ul> Jeśli chodzi Ci o naukę od zera to możesz zacząć od poznania 100 najczęściej używanych słów (można też 1000, ale to trudniejsze zadanie dla początkującego). Dzięki temu łatwiej będzie Ci się nauczyć reszty słów. Dlaczego poznanie najczęściej występujących słów jest ważne? Odpowiedź jest prosta - najczęściej występują, więc możesz wtedy zrozumieć dużo czytanego tekstu. W rozmowie najczęściej używamy słówek takich jak: wcześniej, potem, jej, jego, robić, czytać. Natomiast w szkołach uczy się najczęściej nazw jakichś egzotycznych zwierząt, które w ogóle nie są potrzebne, kiedy chce się zacząć mówić w jakimś języku. To pytanie jest załadowany, dane Driven Design vs domenie napędzane projektu. Dla każdej aplikacji, która ma dobrą ilość zachowań, a następnie powinny być preferowane domeny Driven Design. Raportowania, lub aplikacje użytkowe wydają się działać lepiej (lub są szybsze rozwijanie) z danych Driven Design.


Co pytasz jest „moja firma powinna dokonać fundamentalnej zmiany w jaki projektujemy naszego kodu”. Jako domena-dziwaka, moja reakcja jelit jest krzyczeć **tak** . Jednak przez prosty charakter Twojego pytania, nie jestem pewien, że w pełni zrozumieć zakres zmian pan proponuje. Myślę, że powinieneś porozmawiać ze swoim zespołem o nim.


Trochę literatury, takich jak [DDD Evana](http://domaindrivendesign.org/books/index.html#DDD_apply) książki lub [wolnego fundamentów ebook](http://codebetter.com/blogs/karlseguin/archive/2008/06/24/foundations-of-programming-ebook.aspx) , a następnie będziesz w stanie lepiej ocenić, w jakim kierunku należy się udać. Pierwszą rzeczą, myślę o tym, kiedy czytam to pytanie brzmi: *jakiego rodzaju rzeczy wykorzystywać wykresy / drzew?* i wtedy myślę wstecz, jak mogę z nich korzystać.


Na przykład, weźmy dwa wspólne zastosowań drzewa:


* DOM
* systemy plików


DOM, XML dla tej sprawy, przypominają struktury drzewa.   

![tekst alternatywny](https://i.stack.imgur.com/bk5RY.gif)


To ma sens, też. **Ma to sens, ponieważ, jak wymaga tego dane do uzgodnienia** . System plików, too. W systemie UNIX istnieje węzeł główny, a rozgałęzienia w dół poniżej. Podczas montażu nowego urządzenia, jesteś dołączenie go do drzewa.


Należy również być zadając sobie pytanie: czy dane należą do tego typu konstrukcji? Tworzenie struktur danych, które mają sens problemu, a reszta przyjdzie sama.


O ile łatwiej jest, myślę, że to jest to względne. Czy jesteś dobry z funkcji rekurencyjnych przemierzać drzewo / wykres? Co zrobić, jeśli trzeba zrównoważyć drzewo?


Pomyśl o program, który rozwiązuje zagadkę wyszukiwarki słowo. Można nakreślić wszystkie litery szukanej słowo na wykresie i sprawdzić okolicznych węzłów aby sprawdzić, czy ciąg jest dopasowanie którekolwiek ze słów. Ale nie można po prostu zrobić to samo z jednym z tablicy? Wszystko, co naprawdę trzeba zrobić, to przenieść wskaźnik do sprawdzenia listy po lewej i prawej stronie, a przez szerokość, by sprawdzić powyżej i poniżej liter. Rozwiązanie tego problemu z wykresu nie jest trudne, ale może stworzyć wiele dodatkowej pracy i trudności, jeśli nie jesteś dobrze z ich użyciem - oczywiście, że nie powinna zniechęcać od robią to, zwłaszcza jeśli są nauki o im.


Mam nadzieję, że pomaga myśleć o tych struktur. Jeśli chodzi o zalecenie książki, będę musiał iść z **[Wprowadzenie do algorytmów](http://rads.stackoverflow.com/amzn/click/0262032937)** . Może jestem szalony, ale obawy o prędkości w takich przypadkach przy użyciu języka interpretacyjny jest jak próbuje dowiedzieć się, jaki kolor pomalować szopy. Załóżmy nawet nie dostać się do idei, że ten rodzaj optymalizacji jest całkowicie przedwczesne.


Trafisz sedno, gdy powiedział: „konserwacji”. Chciałbym wybrać podejście, które jest najbardziej wydajne i najbardziej utrzymaniu. Jeśli trzeba przyspieszyć później, to nie przyjdzie od przełączania między proceduralne kontra obiektowego paradygmaty kodowania wewnątrz interpretowanym języku. To naprawdę zależy od rodzaju danych, które zabierasz powrotem. Ponieważ zbiór danych (w efekcie) tylko zbiór DataTable obiektów, można zwracać wiele różnych zestawów danych w jednym, a więc łatwiejsze, obiektu. 


Performance-mądry, jesteś bardziej prawdopodobne, aby uzyskać nieefektywność z zapytaniami niezoptymalizowanych niż z „niewłaściwym” wybór .NET konstruktu. Przynajmniej tak było moje doświadczenie. Obie alternatywy, które zostały wskazane ma wady i zalety, decyzja zależy od tego jak to plusy i minusy wpływa na aplikację:



> 
> Pobrać wszystkie wartości z bazy danych przy użyciu zwykłego PHP następnie przechowywać je w zmiennej JavaScript, później szukać sekund rozwijanej listy (jeśli wartość pierwszej rozwijanej liście na zmiany wartości) w zmiennej JavaScript (array).
> 
> 
> 


Plusy:


* Minimalizuje petycje http, trzeba tylko jedną prośbę, aby odzyskać całość danych.
* Minimalizuje kwerenda jest potrzebne w bazie danych, na ogół tylko wykonać jedno zapytanie.


Cons:


* Zwiększa ilość pamięci używanej jeśli masz duże ilości danych.
* Jeśli dane zmienia się nieustannie, użytkownicy nie widzą zmian aż odświeżyć całą stronę.



> 
> Jeśli pierwszy rozwijanej liście zmian wartości jest następnie pobrać wartości dla drugiej listy rozwijanej z bazą danych za pomocą technologii AJAX (jQuery).
> 
> 
> 


Plusy:


* Nie trzeba do przechowywania wszystkich danych w pamięci całych jedynie dane, które zostaną wykorzystane, co zmniejsza ilość potrzebnej pamięci.
* Twoje dane są aktualizowane za każdym razem, bez konieczności przeładowania strony tylko zmieniając wybór.


Cons:


* Trzeba wykonać kilka petycji HTTP i biegnie querys z bazą danych przy każdej zmianie wyboru.


Osobiście preferuję metodę 2, jeśli ilość danych jest stosunkowo duża i wydajność nie jest koniecznością. <p>to jest ważne. możesz mieć tyle bloków danych (= <code>script</code> elements), ile chcesz.</p><p>możliwa korzyść z użycia tylko jednego elementu <code>script</code>: pozwala to na łatwiejsze relacje między wieloma elementami (np. jeśli zdecydujesz się użyć <a href="http://schema.org/haspart"><code>haspart</code></a> lub <a href="http://schema.org/mainentity"><code>mainentity</code></a> ), ponieważ wystarczy zagnieździć elementy.<br> ale stworzenie tych relacji jest oczywiście możliwe również przy użyciu oddzielnych bloków danych, poprzez odniesienie uri elementu za pomocą <code>@id</code> ( <a href="https://stackoverflow.com/questions/30723531/best-json-ld-practices-using-multiple-script-elements/30730343#comment49548502\_30730343">dzięki, @ gregg kellogg</a> ).</p><p>(dla porównania <a href="https://stackoverflow.com/a/30506476/1591669">dodanie dwóch lub więcej elementów najwyższego poziomu w jednym <code>script</code></a> jest możliwe za pomocą <code>@graph</code>.)</p> To ostrzeżenie jest tam, ponieważ Java nie jest faktycznie przechowywania informacji typu w czasie wykonywania w obiekcie, który używa rodzajowych. Tak więc, jeśli `object`jest rzeczywiście `List<String>`, nie będzie `ClassCastException`w czasie wykonywania wyjątkiem aż element jest dostępny z listy, która nie pasuje do typu rodzajowego zdefiniowanego w zmiennej. 


Może to spowodować dalsze komplikacje, jeśli elementy są dodawane do listy, z tej błędnej informacji ogólnych typu. Każdy kod nadal trzyma odniesienie do wykazu, ale z prawidłowym informacji ogólnych typu będą miały teraz listę niespójne. 


Aby usunąć ostrzeżenie, spróbuj:



```
List<?> list = (List<?>) object;

```

Należy jednak pamiętać, że nie będą mogli korzystać z pewnych metod, takich jak dodawanie, ponieważ kompilator nie wie, czy próbujesz dodać obiekt nieprawidłowego typu. Powyższe będzie działać w wielu sytuacjach, ale jeśli trzeba użyć dodać, lub jakiś podobny sposób ograniczony sposób, po prostu trzeba cierpieć żółty podkreślenia w Eclipse (lub `SuppressWarning`adnotację). kde, gnome i xfce to po prostu różne [środowiska graficzne](https://www.wikiwand.com/pl/graficzny_interfejs_u%c5%bcytkownika) i wybór każdego z nich to kwestia indywidualna, zależna od twoich potrzeb. możesz mieć zainstalowanych kilka środowisk, wtedy wybierasz przy logowaniu z którego chcesz korzystać, ale nie bez powodu domyślnie jest tylko jedno, bo im więcej zai…