Zetknąłem się z problemem związanym z przypadkami narożnymi z ogólnymi wskazówkami:
- rzeczowniki dla zmiennych
- czasowniki dla funkcji
W szczególności mam przypadek, w którym słowo jest dwuznaczne - może to być czasownik lub rzeczownik. W niektórych przypadkach, gdy omawiamy aplikację, będzie ona używana w obie strony w tym samym zdaniu.
Moim celem jest upewnienie się, że program pozostanie czytelny zarówno dla przyszłych programistów, jak i dla mnie, gdy wrócę do części kodu później.
Jednym z przykładów jest battery
. A battery
ma charge
i możesz także charge()
baterię.
Myślę, że o obu Battery.Charge
i Battery.Charge(value)
będzie mylące dla przyszłych programistów.
Moje obecne rozwiązanie to po prostu wybrać inne słowo dla jednego lub obu tych przypadków (zmiennej i funkcji). Mój problem z tym podejściem polega na tym, Battery
że zmienna obiektu i funkcja charge
nie są zgodne z dyskusjami projektowymi z udziałem Battery
.
Moje pytanie brzmi, czy istnieje inny / lepszy sposób radzenia sobie z tym konfliktem w konwencji nazewnictwa?
Dodatkowe lektury na ten temat. Nikt tak naprawdę nie zajął się szczegółem mojego pytania.
enqueue
się słowem, ale jest czasownikiem w Javie. Jak odoCharge
? Nadal nie powiedzie się test symetrii, ponieważ twoje inne metody nie będą miały tego prefiksuOdpowiedzi:
W podobnych sytuacjach staram się znaleźć synonimy. W tym przypadku użyłbym „doładowania” dla czasownika. „Re” jest nieco zbędne, ale znaczenie jest jasne. Użycie prostego „ładowania” dla pozostałego ładunku w akumulatorze jest dwuznaczne, ponieważ nie określa żadnych jednostek fizycznych. Wolałbym „availableAmpHours”, „hoursUntilRecharge” lub coś podobnego. Jednostki będą zależeć od wszystkiego, co jest wygodne dla aplikacji.
Osobiście wolę używać czasowników tylko dla funkcji, które zmieniają stan. Używam rzeczowników do funkcji niemutujących. Przypuszczam, że to zależy od twojego punktu widzenia. Na poziomie maszyny funkcje niemutujące coś robią, ale na poziomie modelu nie.
źródło
Po prostu to wyrzucamy, ale być może rozwiązaniem tego niejednoznacznego nazewnictwa jest całkowite usunięcie tej funkcjonalności z baterii. Nigdy nie widziałem samodzielnie ładującej się baterii i dla mnie sensowniejsze byłoby posiadanie klasy BatteryCharger. Pomogłoby to utrzymać Twoje obawy w większym stopniu oddzielone od siebie i uwydatnić działanie.
battery.Charge(50)
vsbatteryCharger.Charge(battery, 50)
Dla mnie druga forma jest znacznie bardziej zrozumiała i utrzymuje cały kod „Ładowanie” w jednym miejscu, zamiast posypywać go wszystkimi klasami akumulatorów.
źródło
Battery
jest to abstrakcja dla akumulatora + systemu ładowania. Nasza aplikacja nie wymaga dzielenia dwóch aspektów na osobne obiekty, więcBattery
dla wygody są one łączone w jeden (aka ). Ostatecznie fizyka akumulatorów narzuca, że ma on jakąś funkcję akceptowania ładunku.Unikaj podwójnego znaczenia
Celowo wybrałeś słowo, które ma więcej niż jedno znaczenie, i ta pierwsza decyzja jest problemem. Istnieje mnóstwo słów, które są problematyczne dla programistów. Innym przykładem może być
phone
. Możeszphone
kogoś lub możesz miećphone
w kieszeni.Użyj Getters i Setters
Standardowe nazewnictwo większości obiektów to metody pobierające / ustawiające właściwości.
Właściwości są stanami, a nie rzeczownikami
Myślę, że mylisz się, klasyfikując właściwości obiektu jako rzeczowniki, a zmienne można również traktować jako stany. Są to stany związane z lokalnym zakresem ich istnienia.
Możesz opisać wartość, którą mają jako rzeczownik, ale nie jestem pewien, czy tak jest we wszystkich przypadkach.
W terminologii OOP właściwości obiektu opisują stan tego obiektu. W twoim przypadku
Battery
jest to obiekt iCharge
jest stanem. To byłaby właściwość obiektu, ale zależy to od kontekstu jego użycia.Jeśli musisz być w stanie
Charge
naładować baterię, a także wiedzieć, co to jest prądCharge
, masz problem.Używanie zakresu do wymuszania kontekstu
Kontekst wyjaśnia, jakie znaczenie słowa ma przekazać metoda lub właściwość. Zakres określa ustawienie właściwości / metody spoza obiektu.
Metody to czasowniki
Możesz opisać metodę obiektu jako czasownik, ale lepiej nadaje się akcja słowo. W terminologii OOP wykonujesz działania na obiektach przy użyciu ich metod. Zła forma modyfikowania właściwości obiektu spoza obiektu. Preferowane jest wywołanie metody, która wykonuje wymagane działania, które powodują zmianę stanu.
Słowo
Charge
jest czasownikiem, ale także rzeczownikiem. W przypadku wywołania metody akcji staje się jasne, że czasownik jest używanyBattery.Charge(....)
.Ale kontekst jest bardzo ważny. Chociaż słowo
Charge()
jest czasownikiem, nie jest tak znaczące jakstartCharging()
.Prawidłowe metody
Battery
mogą obejmowaćCharging
,Discharging
,setCharge
,getCharge
,hasCharge
,Discharge
iCharged
.Proste metody jedno słowo często nie wyraźnie stwierdzić jasno swoje działania, ale są pewne przypadki, jak
open
iclose
gdzie wymagana jest trochę wyjaśnień.Więc tak naprawdę nie ma poprawnej odpowiedzi na pytanie, jak nazwać tego rodzaju właściwości / metody. Tyle, że musisz mądrze stosować powyższe techniki, aby upewnić się, że nie ma zamieszania.
źródło
StartCharge()
iEndCharge()
wiązałoby. W rzeczywistości ta terminologia spowodowałaby znaczne obciążenie związane z obsługą systemu akumulatorów. W każdym przedziale to może alboCharge()
alboDischarge()
.Charge
okazuje się być najłatwiej zrozumiałym niejednoznacznym słowem dla tej domeny. Istnieje kilka innych.Przygotuj je czasownikami, które uczynią z nich czasownik lub rzeczownik.
źródło
W przypadku czasownika myślę, że
Charge
jest OK. W przypadku rzeczownika, czygetCurrentChargeLevel
zadziałałoby dla ciebie?źródło
getCurrentChargeLevel()
nadal nie musiałbym odwoływać się do wewnętrznej zmiennejBattery
i jaka byłaby nazwa tej zmiennej?Battery.currentChargeLevel
może działać. Można spróbować użyćBattery.coloumbs
alboBattery.ampereHours
ale to może nie być tak oczywiste ...Charge
jestEnergy
coPower
(V * wzmacniacze == W) pomnożonej przez czas. W takim przypadku opłata to liczba. Istnieje również stan naładowania, który stanowi procent.Watt*time
na pewno nie pasowałby do rozmów projektowych, ale takChargeLevel
by było.W większości przypadków dodanie czasownika pomocniczego, przysłówka lub przymiotnika jest wystarczająco dobre, aby je rozróżnić i może pomóc w zrozumieniu. W przypadku Charge i Charge () na akumulatorze DeltaCharge () może pokazywać, że jest to funkcja, która może obsługiwać ładowanie lub rozładowywanie.
Delta (w przypadkach, w których występuje zmiana, ale niejednoznaczna) jest modyfikatorem, którego używam i polecam innym przez cały czas do przekazywania zmiany stanu (nawet jeśli czasownik jest półoczywisty).
źródło
Notacja węgierska na ratunek. Możesz mieć
intCharge
ifcnCharge(value)
, co pozwala uniknąć nieporozumień i nie dodając szalony długą nazwę, kiedy trzy litery będzie działać dobrze.Lub możesz po prostu użyć tej samej nazwy i pozwolić IDE sobie z tym poradzić. W każdym razie tworzenie dłuższej lub innej nazwy może być równie mylące na dłuższą metę.
źródło