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:

public class SomeClass
{
    public int Foo { get; set; }
}

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:

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.

  • RSS
  • Facebook
  • Twitter
  • Wykop
  • Reddit
  • del.icio.us
  • Google Bookmarks
Tagi: , , , , ,
Autor: Xion w Programowanie »


Możesz śledzić komentarze do tej notki poprzez kanał RSS 2.0.
Możesz przejść do końca i zostawić komentarz. Śledzenie notek (trackback) jest aktualnie wyłączone.


3 komentarze/y do notki “Pola i akcesory wewnątrz klasy”.
  1. Kot:
    Październik 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:
    Październik 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:
    Październik 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 ;]

Dodaj komentarz

Znaki nowej linii dodawane są automatycznie.
Do wstawiania kodu użyj [code][/code], a do wzorów (w LaTeX-u) [tex][/tex].
Dozwolne tagi HTML:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

 



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