Witam,
Czy macie jakieś przeciwwskazania na używanie publicznego dostępu do właściwości w obiektach DTO?
Pytam z czystej ciekawości, gdzieś tam słyszałem, że niektórzy jak widzą publiczną właściwość to dostają ataku serca.
Raczej tak, dostaje palpitacji serca jak ktoś setterami zmienia DTO. Hołduje zasadzie że DTO powinno być valueObject'em.
Ludzie dostają palpitacji serca, bo jest hype na niezmienność, programowanie funkcyjne, pola finalne (tak zwą się w javie, nie wiem jak w php) i valueObjects. I jest to mądry hype
Coś mieszacie DTO != VO.
W DTO możesz mieć pola publiczne.
VO jest niemutowalne, pola masz prywatne, a setter zwraca nowy obiekt.
@Kamil Żabiński:
Raz utworzony VO powinien być:
- zawsze poprawny (edit: czyli albo powstaje, albo rzucany jest wyjątek),
- niezmienny po utworzeniu
I to jest w nim najfajniejsze, zawsze wiadomo czego sie po nim spodziewać.
@Bibet
"Czy macie jakieś przeciwwskazania na używanie publicznego dostępu do właściwości w obiektach DTO?"
Tak. Nigdy nie powinno to mieć miejsca.
W programowaniu to co nie jest zabronione to jest dozwolone. Inaczej: udostępniając taki dostęp umozliwiasz każdemu korzystającemu z tego DTO rozłożenie systemu.
Z tego co się orientuję, to DTO służy do przenoszenia danych między warstwami. W jednej warstwie go tworzysz, a w innej sobie używasz tych wartości. Po kiego grzyba Ci setter? Jeżeli potrzebujesz jakoś poskładać tego DTO, to użyj sobie buildera.
@Bibet: Oczywiście, że będą. Zwłaszcza w PHP, gdzie nie ma (jeszcze) typowanych pól klasy. W Javie to jeszcze jak Cie mogę, bo tam chronią Cie typy, ale w PHP? Zwrócisz gdzieś DTO, a ktoś sobie tam wpierdzieli tablicę zamiast obiektu, albo zamiast false przypisze 0 lub 1, a Ty na przykład później używasz tego pola z potrójnym porównaniem i jesteś w dupie.
Poza tym jak masz getter, to łatwiej jest zmienić wew. implementację. Ktoś sobie wywołuje getX i nie obchodzi go jak to X jest składane. Możesz sobie pod spodem tam robić różne dziwne rzeczy. Jak X jest publiczne, to tracisz tą możliwość.