Wpis z mikrobloga

Mam obiekt którego jedyna publiczna metoda ma za zadanie coś zwrócić. Ciało, działanie nieistotne.
Mam funkcję walidującą dane wejściowe.

Jak zgodnie ze sztuką, z zasadami czystego kodu powinienem osadzić ciało funkcji (kilka linijek, praktycznie nie do rozbicia), w stosunku do walidacji danych wejściowych? Mam narzuconą nazwę metody publicznej, mam określone co ona ma zwracać.

Chciałbym przenieść ciało funkcji do osobnej metody i ją po prostu wywołać po walidacji, jednak jak w takim wypadku powinienem nazwać tę metodę?
Bo domyślam się, że taka forma jest "niedopuszczalna":

if(!validate) {
throw exception
} else {
funkcja coś robi...
return false;
}

Wiem, że pytanie dość abstrakcyjne, ale mam nadzieję że udało mi się dostatecznie wytłumaczyć.

#programowanie #php #webdev #czystykod
  • 10
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

@Jurix: tak jest spoko, nie potrzebujesz jednak tego else (bo w if robisz throw) i z tego przykładu wynika, że ta funkcja albo rzuca exception albo zwraca false -> warto spojrzeć na szerszy obraz czy to jest dobry design
  • Odpowiedz
@GlenPL: @mozetenbedziewolny: I takie rozwiązanie jest kompletnie zgodne z czystym kodem, OOP, Solidem i czymś tam jeszcze? Nie powinienem wyjąć logiki do osobnej metody? Zależy mi na możliwie wysokiej jakości kodu, normalnie raczej bym się nie zastanawiał.
  • Odpowiedz
Chciałbym przenieść ciało funkcji do osobnej metody i ją po prostu wywołać po walidacji, jednak jak w takim wypadku powinienem nazwać tę metodę?


@Jurix: Moim zdaniem dobrze kombinujesz. Nazwa nie ma większego znaczenia. W całości odwróciłbym jednak logikę..

[nie
  • Odpowiedz
@gzkk: Dokładnie o tej zasadzie myślałem, stąd moje zaskoczenie co do powyższych odpowiedzi. Nazwa "Process" w każdym z obiektów jest ok?
  • Odpowiedz
Nazwa "Process" w każdym z obiektów jest ok?


@Jurix: Nazwa tak samo dobra jak sporo innych - jeżeli jest to jakaś ogólna metoda (virtualna / abstrakcyjna). Jeżeli możesz precyzyjniej określić, co się się dzieje w Process(), to bardziej szczegółowa nazwa będzie IMO lepsza.
  • Odpowiedz
@Jurix: @gzkk: Odwrócenie warunku to zły pomysł. Powinieneś wychodzić z metody najszybciej jak się da. Czyli masz:
if(!Validate()) {
throw exception;
}
// bez else bo
  • Odpowiedz
@gzkk: Z racji że precyzyjną nazwę mam już zajętą, a nie chcę dodawać jakiś _, bo imo kod będzie nieczytelny, dam nazwaMetodyProcess()

@bmLq: Wydaje mi się że masz rację, ale mam przykład zrobiony jak to opisałeś "lujowo" zrobiony przez osobę której ten kod ma się podobać, więc lepiej abym tak też zrobił.
  • Odpowiedz
@Jurix: Największym smrodkiem jest tu na razie return false na końcu - po co cokolwiek zwracać jeśli każde poprawne dane (nie rzucające wyjątku) dają z góry znany wynik? Inne opcje do poprawy to wspomniane wywalenie else i zostawienie samego early exit, prywatna metoda rzucająca wyjątek od razu zamiast przypisywania zmiennej valid i sprawdzania warunku później... W zasadzie to kwestia konwencji, która powinna być spójna i nie ma sensu wymyślać lepszej
  • Odpowiedz
Odwrócenie warunku to zły pomysł. Powinieneś wychodzić z metody najszybciej jak się da.


@bmLq: "Odwieczny" dylemat - wychodzić jak najprędzej, czy minimalizować ilość punktów wyjścia. A to powinno zależeć od priorytetów przy optymalizacji, a w wypadku OPa zależy od upodobań tego, kto nad nim stoi :P
  • Odpowiedz