Niedawno zasugerowałem metodę łączenia dla pewnej klasy w pewnym projekcie, aby poprawić czytelność kodu. Dostałem odpowiedź „płynne interfejsy nie powinny być implementowane tylko dla wygody, ale dla semantyki” i kazałem zrzucić moją sugestię. Odpowiedziałem, że nie sugeruję płynnego interfejsu, ale samą metodę łączenia łańcuchów (obie można pomylić ze sobą, czytać na dole), aby poprawić czytelność i komfort kodowania, sugestia została ponownie zestrzelona.
W każdym razie, to sprawiło, że pomyślałem, że być może będę narażony na złą praktykę, zawsze zwracając „to” metodami, które nie powinny niczego zwracać (np. Setery).
Moje pytanie brzmi: czy stosowanie poprzedniej konwencji można uznać za złą praktykę lub nadużycie ?, dlaczego ?. Nie sądzę, żeby były wady wydajności, czy są?
źródło
Odpowiedzi:
Nie
Jak zauważa Kent Beck , kod jest odczytywany znacznie częściej niż jest pisany.
Jeśli łączenie metod sprawia, że kod jest bardziej czytelny, użyj łączenia łańcuchowego metod.
źródło
Tak, są wady
Kod, który jest łatwy do odczytania, jest dobry, ale należy także uważać na to, co kod komunikuje . Kiedy metody obiektu zawsze zwracają obiekt, komunikuje się kilka rzeczy:
Prawidłowy przypadek użycia: zapytania do bazy danych ad hoc
Biblioteki klas istnieją w większości języków, które pozwalają wyszukiwać w bazie danych bez uciekania się do SQL. Weźmy przykład Entity Framework dla platformy .NET:
Jest to płynny interfejs, w którym każde kolejne wywołanie metody opiera się na poprzednim. Logiczne czytanie tych wywołań ma sens w kontekście odpytywania bazy danych.
Nieprawidłowy przypadek użycia: cukier składniowy do ustawiania właściwości
Teraz zastosujmy ten sam wzór z
Post
klasą:Spójrzmy teraz, jak używałbyś tej klasy:
Kiedy widzę ten kod, natychmiast zadaję to pytanie: „Czy po wywołaniu
SetBody
wysyła zapytanie do bazy danych? Czy muszę wywoływać inną metodę, aby powiedzieć„ gotowe ”?Co łańcuchowe wywołania metod komunikują się z kodem za pomocą
Post
klasy?Czy to rzeczywiście prawda? Nie.
Post
Klasa nie ma skomplikowanej konfiguracji. Ustawienie tytułu, daty utworzenia i treści nie opiera się na sobie w celu osiągnięcia bardziej skomplikowanego celu końcowego. Wcieliłeś kwadratowy kołek w okrągły otwór.Wadą samodzielnego łączenia metod jest to, że komunikujesz, że do wykonania czegoś potrzeba wielu wywołań metod i że każde wywołanie opiera się na ostatnim. Jeśli nie jest to prawdą, wówczas łączenie metod może przekazywać niewłaściwe informacje innym programistom.
Kiedy twoi współpracownicy powiedzieli:
Miały absolutną rację. Płynny interfejs lub łączenie metod komunikuje coś samo w sobie, co może nie być prawdą.
źródło
When an object's methods always return the object, it communicates a couple of things
- Myślę, że to osobista opinia; trudno twierdzić, że każdy, kto patrzy na powiązane metody, zakłada te same rzeczy.Główną wadą jest utrata przejrzystości. Na przykład:
Ponieważ żadna z tych instrukcji nie zwraca wartości (a jeśli tak, to jest ignorowana), mogą być użyteczne tylko wtedy, gdy wywołują skutki uboczne. Porównaj to z:
Po pierwsze, nie jest jasne
bar
ibaz
działa na obiektach tego samego typu cox
, chyba że wiadomo, żex
klasa jest jedyną klasą z tymi metodami. Nawet jeśli tak jest, nie jest jasne, czy metody działają nax
nowych obiektach.Podświetlanie części kodu, które mają skutki uboczne, jest przydatne, ponieważ trzeba śledzić te skutki uboczne, aby uzasadnić program. Musisz porównać potencjalną utratę przejrzystości z potencjalnym zyskiem na łatwości pisania kodu, ale pamiętaj również, że kod jest czytany więcej niż jest napisany.
źródło
Rozważ wszystkie elementy stylistyczne języków programowania (w przeciwieństwie do języka maszynowego kodowania ręcznego) i osłabia to argument „semantyka, a nie wygoda”.
Wiele z tego, co robimy jako inżynierowie, zapewnia wygodę w zakresie semantyki.
źródło