Wpis z mikrobloga

21/100 dni z książką

Nie zwracamy null.
Nie zliczę widzianych przeze mnie aplikacji, w których niemal każdy wiersz kodu zawierał test wartości null. [...] Gdy zwracamy wartość null, w rzeczywistości tworzymy sobie dodatkową pracę i powodujemy problemy w funkcjach wywołujących. W takich przypadkach brak jednego testu wartości null powoduje, że aplikacja wymyka się spod kontroli.”

[Więcej infomacji]


#feaoftruss #czystykod #programowanie #programista15k #webdev #gamedev

Podobało się? To zaplusuj i zapisz się do wołania (link w stopce)

************

[Chcesz być wołany?]
  • 93
  • Odpowiedz
@krasnoludkolo: No zależy z jaką aplikacją pracujesz. Jeżeli klepiesz formularze to może założenie opa ma jakieś tam uzasadnienie. No, ale przypuśćmy są pola nullable, bo nie musisz ich ustawiać. To co, do bazy lepiej przekazać pusty string? Czy pusty string jest tożsamy z null? Jest sporo filozoficznych pytań które moim zdaniem są zależne od tego jak projektujesz aplikacje i jaki ma charakter. Null to narzędzie którego możesz użyć lub nie. W
  • Odpowiedz
@krasnoludkolo:

obiekty biznesowe umiały się tworzyć z klas bazodanowych


Same się nauczą? To jest to o czym pisałem i jest to jak najbardziej warstwa. Przykładem jest hibernate i jakieś DTO/DAO. To szkielet aplikacji pod logiką i tutaj są decyzje projektowe czy pole może być null, czy jest to tożsame z tym że w bazie jest null i tym podobne.
  • Odpowiedz
@FEAofTruss: uczę się dopiero, jak powinno się tego unikać? Optionali jeszcze nie ogarniałem, znam tylko wyjątki. Trzeba dać wyrzucanie wyjątku jeśli miałoby zwrócić null, żeby wymusić jego obsługę? Trochę więcej kodu, ale chyba tak to jest jeśli chce się zapewnić obsługę błędów.
  • Odpowiedz
@ZasilaczKomputerowy:

To normalnie nie masz tej warstwy? ¯\(ツ)_/¯ Bo taki wniosek można wyciągnąć, że wyciągasz sobie rowy i na nich operujesz, by odpowiedzialności za konwersję w obiekt dziedziny nie mieć dla mitycznego performance'u, którego wąskim gardłem i tak będzie I/O ¯\(ツ)_/¯

Zamiast nullowania pola wtedy wystarczy mapować do Some(x) | None i tyle. I wykorzystywać zalety Option(al) dalej w aplikacji. Jeżeli null w polu != null w bazie to
  • Odpowiedz
: I dzięki temu nie robimy testu wartości? O.o


@Vetinari: tak, tzn robimy ich znacznie mniej (tam gdzie są niezbędne).

Powiedzmy że masz aplikację która ma 50 metod zwracających Object które wywoływane są gdzieś 100 razy.
Jeżeli chcesz zagwarantować poprawność kodu teoretycznie powinieneś sprawdzić wartość null ok. 100 razy (za każdym wywołaniem dowolnej metody zwracającej Object, w końcu każda może zwrócić null).

Ale teraz przyszedł senior engineer i kazał w projekcie
  • Odpowiedz
@krasnoludkolo: też nie lubię isPresent, ale to najlepsza droga na bezinwazyjny refaktor istniejącego kodu (zamieniamy return null; i (if x!=null) na return Optional.empty() i (if x.isPresent()) . I ładnie nam wyskakują w kompilatorze na czerwono wszystkie miejsca w których zapomnieliśmy sprawdzić null elegancko utwierdzając nas w przekonaniu że refaktoring to był dobry pomysł :)

i czasami jest jednak czytelniejsze niż ifPresent czy map
  • Odpowiedz
@krasnoludkolo: Jak masz aplikację która obsługuje bardzo dużo klientów, a infrastruktura jest taka, że normalnie wytrzymuje, ale są momenty natężonego ruchu parę razy do roku to wtedy wszystko ma znaczenie. Tym bardziej jak jest faza optymalizacji już zrobionych funkcjonalności. Nie wiem czy pracowałeś już z profilerami, indexami i tak dalej, ale mi się zdarzało i tylko mówię jakie są wnioski.

@SwordPL: Dla mnie te Optionale produkują więcej mniej czytelnego kodu,
  • Odpowiedz