Pola i akcesory wewnątrz klasy

2009-10-26 23:53

Zgodnie z zasadami programowania obiektowego pola klas nie powinny być bezpośrednio dostępne na zewnątrz. Należy jest zawsze opakowywać w akcesory: właściwości lub krótkie metody typu get i set. Z nich właśnie korzysta potem kod zewnętrzny, dzięki czemu nie może on (w dobrze napisanej klasie) niczego zepsuć poprzez – chociażby – ustawienie jakiegoś pola na nieprzewidzianą wartość.
Taka praktyka jest powszechnie przyjęta i raczej nie budzi wątpliwości. Inaczej jest z używaniem tychże pól lub akcesorów wewnątrz klasy, a więc w jej własnych metodach. Tutaj często mamy wybór: czy odwołać się do “gołego” pola, czy też poprzez odpowiednią właściwość/metodę.

Które podejście jest właściwsze? C#/.NET od wersji 3.0 zdaje się to rozstrzygać, umożliwiając półautomatyczne tworzenie właściwości:

  1. public class SomeClass
  2. {
  3.     public int Foo { get; set; }
  4. }

Nie ma tutaj nie tylko bloków get i set, ale i ukrytą pod tą właściwością pola. Przy korzystaniu z tego feature‘a żadnego dylematu więc nie ma.
Wydaje mi się jednak, że wybór nie jest taki oczywisty i że niekoniecznie należy używać akcesorów wewnątrz klasy. Argumentem przeciw, który od razu przychodzi do głowy, jest troska o wydajność – zwykle jednak przesadzona, bo proste gettery i settery są bez problemu rozwijane w miejscu użycia. Drugim ‘ale’ jest wygląd kodu w językach bez właściwości; zwłaszcza dotyczy to Javy, w której odpowiednik C#-owego:

  1. Foo.Bar.Baz.Qux.Thud = 5;

roiłby się od getów. W końcu można by się jeszcze pokusić o uzasadnienie na wpół merytoryczne: skoro bądź co bądź prywatne pole jest składnikiem klasy do jej wyłącznej dyspozycji, to dlaczego metody miałyby obchodzić je dokoła zamiast odwoływać się doń bezpośrednio? A może jednak lepiej jest skorzystać z tej dodatkowej warstwy pośredniczącej (mogącej np. wykrywać jakieś błędy)?…

Na razie – mimo całkiem przyzwoitego doświadczenia w programowaniu w językach wszelakich – trudno jest mi na te pytania odpowiedzieć. Ostatnio aczkolwiek skłaniam się ku bezpośredniemu dostępowi do pól w metodach klas. Chętnie poznałbym jednak opinie innych koderów na ten temat.

Tags: , , , , ,
Author: Xion, posted under Programming »


3 comments for post “Pola i akcesory wewnątrz klasy”.
  1. Kot:
    October 27th, 2009 o 0:03

    Moim zdaniem klasa reprezentuje pewną spójną i zamkniętą całość, więc prosty dostęp do składowych powinien odbywać się wprost. Aczkolwiek widzę pewne przypadki, gdzie byłoby inaczej: jeżeli na składowe dodajemy dodatkowe wymagania (choćby sprawdzanie jakichś preconditions przy dostępie), i walidujemy je w jakiejś rozszerzonej metodzie akcesorowej, to wywołania z wewnątrz też powinny przez to przechodzić. Chociaż z drugiej strony coś takiego świadczyłoby raczej o niskiej spójności klasy, czyli wskazywałoby na potrzebę rozbicia jej na mniejsze :). Suma summarum – moim zdaniem w większości przypadków dostęp do własnych składowych powinien iść bezpośrednio.
    A przykład jest tendencyjny, bo łamie prawo Demeter ;).

  2. Sobol:
    October 27th, 2009 o 15:25

    Mnie naszło na napisanie odpowiedzi troszkę większej. Może nie jest idealnie w temacie, bo nie chodzi o rozwiązanie składniowe, ale jednak w pewnym sensie jest spory związek. Odpowiedź napisałem na blogu, żeby nie śmiecić Ci tutaj za bardzo :) http://soboltech.blogspot.com/2009/10/re-pola-i-akcesory-wewnatrz-klas.html

  3. reVis:
    October 27th, 2009 o 23:43

    Wychodzę z założenia, że wewnątrz klasy lepiej zmieniać wartości bezpośrednio poprzez dane pole lub metodę prywatne jeżeli logiki jest więcej. Właściwość jest do użytku zewnętrznego i ma bronić nasze cudo przed gUpim użytkownikiem ;]

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.