Nazwa pola logicznego, które jest czasownikiem

14

W Javie, zgodnie z konwencją, getter i setter dla pól logicznych będą isField()i setField(). To działa perfekcyjnie z nazwami pól, które są przymiotniki jak active, visible, closeditp

Ale jak nazwać pole, które ma znaczenie czasownika, na przykład haveChildren? Może dodać „_ing” do czasownika ( )?havingChildren

Aby to wyjaśnić, nie mam kontroli nad nazwami metod (getter i setter), ponieważ są one generowane automatycznie przez IDE. Potrzebuję więc odpowiedniej nazwy pola, aby gdy IDE wygenerowało dla niego getter, wyczuła. Na przykład, hasChildrenjest idealną nazwą pola, ale gdy IDE wygeneruje getter dla tego pola, będzie isHasChildren. Jak to rozwiązać?

dnang
źródło
3
Jeśli to pole bool, parentzadziałałoby.
yannis,
2
Jeśli uda ci się odwrócić znaczenie, „bezdzietny” podstępnie.
Kilian Foth,
3
Wydaje się to głupie, że trzeba przeskakiwać przez obręcze dotyczące nazwy pola, aby uniknąć problemów gramatycznych spowodowanych przez IDE. Niezależnie od tego, oto kilka dodatkowych sugestii, choć myślę, że te już podane przez innych są lepsze: isAllowedChildren, isNotEmpty, isContainer, isLeaf,
Apprentice Dr. Wily's
droga bezdzietna wydaje się być właściwą drogą. Problem z rodzicem polega na tym, że mam już pole nadrzędne do przechowywania odwołania do obiektu nadrzędnego. Myślę, że potrzebuję ogólnej zasady konwertowania wszystkich czasowników na przymiotniki dla pól boolowskich.
dnang
1
Zgadzam się z @dnhang, że nie powinieneś pozwolić IDE na dyktowanie takich rzeczy. Wybór nazw zmiennych i metod jest ważny, aby kod był czytelny, a IDE, w którym jest zapisany, nie powinno mieć znaczenia.
Digitalex,

Odpowiedzi:

11

Krótka odpowiedź:

  • nazwy metod nie mają na celu odzwierciedlenia wewnętrznej implementacji, ale oczekiwane zachowanie.

Długa odpowiedź:

haveChildren()powinien być nazwany hasChildren().

Nie uważam też hasChildren()za koniecznie pobierającego członka klasy boolowskiej. Wydaje mi się, że taka metoda sprawdzi, czy element typu Collectionjest pusty.

Domyślna nazwa, którą IDE nadaje generowanym pobierającym i ustawiającym, nie ma być przypuszczalnym kamieniem.

Kolejna kwestia: interfejsy mają nazwy dla metod, które mają być jeszcze zaimplementowane.

Gdyby nazwy metod miały odzwierciedlać wewnętrzną implementację, jak ktoś mógłby kiedykolwiek zaprojektować interfejs? Interfejsy nie mają implementacji ani nie wiedzą z góry, co realizatorzy zrobią pod maską.

Weźmy na przykład Iteratorinterfejs w Javie.

Po wdrożeniu Iterator, nawet jeśli masz nazwę boolean next, nie masz prawa zmieniać nazwy hasNext()na isNext()lub isHavingNext(). To szczegół implementacji. W rzeczywistości zaimplementowałem Iteratori to, co robię, to członek tego, co moja klasa ma listę, o nazwie next(nie boolean). hasNext()następnie wraca next!=null.

Zobacz także:

class patient {
      private boolean pulse;
      private boolean breaths:
      public boolean isDead(){ return (!pulse & !breaths);}
}

Zauważ, że isDead()to nie jest normalny getter.

Weź narzędzia produktywności IDE takie, jakie są.

Tulains Córdova
źródło
3

Proponuję zmienić nazwę pola, aby parentgetter był isParenti seter będzie setParent.

Możesz także wypróbować childPresentnazwę zmiennej isChildPresentoraz setChildPresentjako getter i setter.

Thirumalai Parthasarathi
źródło
1
Taki sam pomysł jak w powyższym komentarzu Yannisa, ale problem polega na tym, że mam już parentpole do przechowywania odwołania do obiektu nadrzędnego. Myślę, że potrzebuję ogólnej zasady konwertowania wszystkich czasowników na przymiotniki dla pól boolowskich.
dnang,
0

Możesz postawić doesprzed czasownikiem. Tak jak doesHaveChildrenw przykładzie, który podałeś. A może w shouldHaveChildrenzależności od kontekstu.

miguel.martin
źródło
1
Problem polega na tym, że nie mam kontroli nad nazwą metody, ponieważ moduł pobierający i ustawiający są automatycznie generowane przez IDE (np. Eclipse).
dnang,
1
Po prostu zmień nazwę metody? Dodaj skrót klawiszowy, aby zmienić nazwę metod (jeśli jeszcze go nie masz).
miguel.martin
@dnhang, jeśli jest to Twój kod, możesz wywoływać metody w dowolny sposób, niezależnie od tego, jak IDE je nazywa, gdy generuje się automatycznie.
Richard
1
@ miguel.martin Jednym z powodów, dla których nie chcesz tego robić, są fasole Java. Założenie isSomethingjest częścią tej specyfikacji i wokół niego poczyniono wiele założeń, na lepsze lub gorsze, przeciwstawianie się temu doesSomethingmoże zepsuć rzeczy w nie tak oczywisty sposób, prowadząc do błędów.
0

Pytanie jest całkowicie uzasadnione. Czasami zmiana nazwy metody generowanej automatycznie nie jest wystarczająca. Przykład: Oczekuje się, że fasole zarządzane JSF będą miały isXyz()metodę pobierania boolean xyzwłaściwości.

Zgadzam się z BlackPanther, który sugeruje zmianę nazwy pola parenti użycie go isParentjako nazwy metody. Zgodnie z zasadą ukrywania informacji, czytelność i metody ustawiające są ważniejsze niż atrybutu.

Paulo Merson
źródło