2013-05-14 18 views
20

W moich latach programowania często tworzyłem klasy, które po prostu grupują kilka zmiennych z ich ustawiaczami i pobierającymi. Widziałem te typy obiektów, nazywane obiektami wartości, obiektami domeny lub obiektami modelu w zależności od kontekstu, w którym są używane. Najodpowiedniejszym terminem dla ogólnego użycia wydaje się Data Transfer Object (DTO). Opisuje POJO, który zawiera tylko akcesory i mutatory.Pola publiczne w obiekcie przenoszenia danych

Właśnie napisałem jeden taki obiekt, który zawiera około pięćdziesiąt pól używanych do ustawienia parametrów kompozycji na wykresie. Teraz zastanawiam się, czy zamiast generować setki pobierających i ustawiających powinienem zadeklarować te pola jako publiczne. Takie postępowanie jest sprzeczne z tym, co mówią mi moje instynkty programowania, ale nie mogę zaprzeczyć, że znacznie zwiększyłoby to czytelność mojego kodu i zmniejszyło ilość kodu standardowego w klasie.

Jedyny powód, dla którego mogę zobaczyć nie używać pól publicznych byłoby, gdybym musiał wykonać jakiegokolwiek rodzaju sprawdzania poprawności na tych polach. Jeśli założymy, że walidacja typu jest wystarczająca dla moich celów, to w tym scenariuszu używa pól publicznych akceptowalnej przerwy od projektowania obiektowego? Czy publiczny DTO będzie działał lepiej w dużych operacjach wsadowych?

+0

Możliwy duplikat - http://stackoverflow.com/questions/1568091/why-use-getters-and-setters – sanbhat

+0

pobierające i ustawiające jeżeli są wymagane próbujesz użyć frameworków 'DI' takich jak' Spring' lub coś w stylu 'jsp: useBean' etc !!! – NINCOMPOOP

+0

@sanbhat: niektóre z powodów podanych w zaakceptowanej odpowiedzi na to pytanie mają zastosowanie tutaj, ale nie wszystkie. Zakres i zachowanie DTO różni się od ogólnej klasy, więc zastanawiałem się, czy zastosowalibyśmy tu różne "zasady". – Lilienthal

Odpowiedz

23

Większość programistów domyślnie wybierze prywatne pola z obiektami pobierającymi/ustawiającymi, nie myśląc o tym. Ale jak każdy kultowy towar, lepiej podjąć świadomą decyzję.

Głównym powodem użycia kombinacji getter/setter zamiast publicznego jest to, że można zmienić definicję. Tak więc, jeśli twój DTO jest częścią interfejsu pomiędzy komponentami, najlepiej użyć getters. Jeśli zmienisz wewnętrzne działania, możesz dostosować gettera, aby naśladować stare zachowanie i zachować kompatybilność.

Innym powodem jest to, że można tworzyć pola tylko do odczytu. Często dla DTO, tylko do odczytu i niezmienny jest dobrym wyborem.

Trzecim powodem może być to, że Twój DTO musi być javabean, ponieważ zamierzasz go użyć w narzędziu, które tego wymaga.

Jeśli żadna z tych właściwości nie pasuje do Ciebie, nie ma powodu, aby nie używać pól publicznych.

Nie należy się spodziewać większej różnicy wydajności chociaż :)

+1

Właśnie to, co potrzebowałem wiedzieć.Jeśli podsumuję, wydaje się, że decyzja o tym, czy korzystać z pól publicznych, zależy od zakresu projektu, od tego, czy zostanie ponownie użyta lub połączona, czy też z prawdopodobieństwem zmiany. Nie uważałem też, że nieprymitywne pola 'końcowe' nie będą niezmienne. Gdybym chciał zrobić takie pole tylko do odczytu, musiałbym przekonwertować całą klasę, aby zachować jednolity dostęp. – Lilienthal

+2

Plus jeden za niezmienność. Rozważ także zamiast używać ustawiających, jeśli możesz użyć wzorca Konstruktora. Wtedy większość twojego dostępu byłaby przez pobierające, pozwalające ci zwrócić niezmiennie lub bezpieczne kopie przedmiotów, których nie chcesz pośrednio wpływać na efekty uboczne. –

3

Nie uważam za okropne złą praktykę posiadanie klasy "ustawienia" lub "tematu" lub "stylu" z atrybutami publicznymi.

Nowoczesne IDE z narzędziami do refaktoryzacji sprawiają, że łatwe jest promowanie atrybutu getter/setter, jeśli chcesz wykonać skomplikowane obliczenia lub sprawdzić wartości w czasie ustawiania.

Często w twoim "setTheme" lub jakiejkolwiek funkcji, która zużywa te ustawienia klasy jest dobrym, czystym miejscem do sprawdzania poprawności.

Podczas ustawiania takich ustawień zwykle zaleca się wykonanie obiektu z głębokim kopiowaniem zamiast zachowania odniesienia do zmiennej klasy.

Powiązane problemy