Nie rób tego; to nadmiernie skomplikuje rzeczy, a Ty nie będziesz tego potrzebował
... to odpowiedź, którą napisałbym tutaj 2 lata temu. Teraz jednak nie jestem tego taki pewien; w rzeczywistości w ostatnich miesiącach zacząłem migrować stary kod do tego formatu, nie dlatego, że nie mam nic lepszego do roboty, ale dlatego, że naprawdę potrzebowałem go do wdrożenia nowych funkcji lub zmiany istniejących. Rozumiem automatyczne awersje, które inni widzą w tym kodzie, ale myślę, że jest to coś, co zasługuje na poważne przemyślenie.
Korzyści
Najważniejszą zaletą jest możliwość modyfikacji i rozszerzenia kodu. Jeśli użyjesz
class Point {
int x,y;
// other point operations
}
zamiast po prostu przekazać kilka liczb całkowitych - co jest niestety w wielu interfejsach - znacznie łatwiej jest później dodać inny wymiar. Lub zmień typ na double
. Jeśli użyjesz List<Author> authors
lub List<Person> authors
zamiast List<String> authors
tego później znacznie łatwiej będzie dodać więcej informacji do tego, co reprezentuje autor. Zapisując to w ten sposób, wydaje mi się, że stwierdzam to, co oczywiste, ale w praktyce byłem winny wielokrotnego używania ciągów w ten sposób, szczególnie w przypadkach, gdy na początku nie było to oczywiste, potrzebowałem więcej niż sznurek.
Obecnie próbuję refaktoryzować listę ciągów, która jest przeplatana w całym kodzie, ponieważ potrzebuję tam więcej informacji i odczuwam ból: \
Poza tym zgadzam się z autorem bloga, że zawiera on więcej informacji semantycznych , co ułatwia czytelnikowi zrozumienie. Podczas gdy parametry często otrzymują znaczące nazwy i otrzymują specjalną linię dokumentacji, często nie dzieje się tak w przypadku pól lub miejscowych.
Ostatnią korzyścią jest bezpieczeństwo typu , z oczywistych powodów, ale moim zdaniem jest to drobna sprawa.
Wady
Pisanie zajmuje więcej czasu . Pisanie małej klasy jest szybkie i łatwe, ale nie wymaga wysiłku, szczególnie jeśli potrzebujesz wielu takich klas. Jeśli przestajesz pisać co 3 minuty, aby napisać nową klasę opakowań, może to być również poważna szkoda dla koncentracji. Chciałbym jednak pomyśleć, że taki stan wysiłku zwykle występuje tylko na pierwszym etapie pisania dowolnego fragmentu kodu; Zwykle mogę szybko uzyskać całkiem niezły pomysł na to, jakie podmioty będą musiały być zaangażowane.
Może obejmować wiele zbędnych seterów (lub konstrukcji) i getterów . Autor bloga podaje naprawdę brzydki przykład new Point(x(10), y(10))
zamiast new Point(10, 10)
, i chciałbym dodać, że użycie może również obejmować rzeczy takie jak Math.max(p.x.get(), p.y.get())
zamiast Math.max(p.x, p.y)
. Długi kod jest często uważany za trudniejszy do odczytania i słusznie. Ale szczerze mówiąc, mam wrażenie, że wiele kodu przenosi obiekty i tylko wybrane metody go tworzą, a jeszcze mniej potrzebuje dostępu do jego drobnych szczegółów (co zresztą nie jest OOPy).
Sporny
Powiedziałbym, czy to pomaga w czytelności kodu jest dyskusyjne. Tak, więcej informacji semantycznych, ale dłuższy kod. Tak, łatwiej jest zrozumieć rolę każdego lokalnego, ale trudniej jest zrozumieć, co możesz z nim zrobić, chyba że przeczytasz jego dokumentację.
Podobnie jak w przypadku większości innych szkół programistycznych, myślę, że niezdrowe jest doprowadzenie tego do skrajności. Nie widzę, aby kiedykolwiek oddzielałem współrzędną xiy, aby każdy był innego typu. Nie uważam za Count
konieczne, kiedy int
powinno wystarczyć. Nie podoba mi się unsigned int
użycie w C - teoretycznie dobre, ale po prostu nie zapewnia wystarczającej ilości informacji i zabrania późniejszego rozszerzania kodu w celu obsługi tego magicznego -1. Czasami potrzebujesz prostoty.
Myślę, że ten post na blogu jest nieco skrajny. Ale ogólnie nauczyłem się z bolesnego doświadczenia, że podstawową ideą tego są właściwe rzeczy.
Mam głęboką awersję do przerobionego kodu. Naprawdę. Ale dobrze wykorzystane, nie sądzę, aby ta nadmierna inżynieria.