Czy dodawanie logiki w ustawianiu właściwości jest uważane za złą praktykę?

28

Wskoczyłem do projektu i widzę, że inni programiści dodają dużo logiki w ustawieniach zsyntetyzowanych właściwości. Rozumiem, jak to działa, ale myślę, że utrudnia to zrozumienie przebiegu programu; podczas czytania kodu, za każdym razem, gdy widzę self.something = whatever, zawsze sprawdzam, czy somethingsetter jest przesłonięty.

Jakie są twoje opinie na ten temat? Czy uważasz, że jest to oznaką złej architektury lub skomplikowanego rozwiązania?

Z przyjemnością przeczytam więcej na ten temat, jeśli masz odpowiednie linki / źródła, zbyt trudno jest uzyskać dobre wyniki wyszukiwania w Google, więc postanowiłem również zapytać tutaj.

Dziękuję za każdą odpowiedź i pamiętaj, że mówię o celu C na wypadek, gdybyś nie widział tagu (nawet jeśli nie powinien to być problem specyficzny dla języka).

phi
źródło
5
Jaki rodzaj logiki? Na przykład nie ma nic złego we wprowadzaniu logiki sprawdzania poprawności. Z drugiej strony setter, który wywołuje kilka zdarzeń, wywołuje usługę internetową i aktualizuje interfejs użytkownika, jest całkowicie niepoprawny.
Arseni Mourzenko
@MainMa Zgadzam się, że sprawdzanie poprawności jest w porządku - może dodając również obserwatorów, prawda? Czy możesz podać kilka przykładów tego, co uważasz za bardziej odpowiednie do ustawienia?
phi
rzeczywiście obserwatorzy mają rację. Jeśli chodzi o rzeczy, które są odpowiednie dla setera, pozwalam bardziej doświadczonym programistom odpowiedzieć na to pytanie.
Arseni Mourzenko

Odpowiedzi:

44

Czy dodawanie logiki w ustawianiu właściwości jest uważane za złą praktykę?

Nie

Wymyślono właściwości, aby umożliwić projektantom klas dołączenie logiki do wygodnego interfejsu dostępu do pola i przypisywania.

Jak dużo jest za dużo? To zależy od obowiązków klasy. Oto kilka rzeczy, które można rozsądnie umieścić w narzędziu do ustawiania właściwości:

  • zaktualizuj niektóre wartości pochodne
  • powiadom obserwatorów o zmianie stanu klasy
  • propaguj zmianę do jakiegoś zawartego obiektu
  • rozpowszechnij zmianę w magazynie kopii zapasowych
  • wykonać walidację

Programowanie jest łatwiejsze, gdy klasy mają interfejsy, dzięki którym oczywiste jest, co klasa może zrobić, bez wywoływania przez osoby dzwoniące przemyślenia na temat tego, jak się to odbywa. Umieszczenie logiki za ustawiaczami właściwości pozwala klasom ukryć ich implementację za prostym interfejsem. W przypadku niektórych klas nie są wymagane żadne metody. Wystarczy przekręcić pokrętła, ustawiając właściwości i odczytać dane wyjściowe, uzyskując właściwości.

Kevin Cline
źródło
13
Przeprowadź walidację ...
Robert Harvey
Jak dobrze jest przeładować widok kolekcji lub widok tabeli w przesłoniętej metodzie setera?
Krishnan,
15

Setery są zwykle używane do zmiany stanu obiektu bez znaczących efektów ubocznych lub ciężkich obliczeń; do tego celu należy używać metod i funkcji. Podstawowym powodem implementacji settera jest zmiana i utrzymanie prawidłowego stanu . Tak więc ograniczenie zakresu, ustawienie flag w celu żądania ponownego obliczenia lub dostosowanie powiązanych właściwości jest absolutnie w porządku.

Rob van der Veer
źródło
7

Nie wiem o celu C, ale jak mówisz, wydaje się dość ogólne pytanie dla każdego języka OO. Przede wszystkim i tak naprawdę związane z tym, czy posiadanie seterów i getterów jest przede wszystkim kwestią dyskusyjną (w niektórych przypadkach ich istnienie jest uzasadnione przez użycie frameworka lub biblioteki).

Uważam, że nazwa metody powinna wyjaśniać jej działanie i całą metodę. Dodatkowo dokumentacja związana z tą metodą powinna opisywać ją w bardziej wyraźny sposób. W tym sensie nazwa metody w postaci „set” + {rzecz.} Nie powinna mieć żadnych skutków ubocznych poza ustawieniem wartości zmiennej i powinna to być jedyna akcja z nią związana. Sprawdzanie poprawności argumentu jest dopuszczalne, ale należy je opisać w jego dokumentacji.

DPM
źródło
1
+1 dla „czy mieć seterów i getterów”. I kolejne +1 dla „nazwa metody powinna wyjaśniać, co robi”.
aviv