Różnica między DTO, VO, POJO, JavaBeans?

Odpowiedzi:

848

JavaBeans

JavaBean to klasa zgodna z konwencjami JavaBeans zdefiniowanymi przez Sun. Wikipedia ma całkiem dobre podsumowanie, czym są JavaBeans :

JavaBeans to komponenty oprogramowania wielokrotnego użytku dla Java, które można wizualnie manipulować w narzędziu do budowania. Praktycznie są to klasy napisane w języku programowania Java zgodnie z określoną konwencją. Służą do kapsułkowania wielu obiektów w jednym obiekcie (fasoli), dzięki czemu można je przekazywać jako obiekt jednej fasoli zamiast wielu pojedynczych obiektów. JavaBean to obiekt Java, który można serializować, ma konstruktor zerowy i umożliwia dostęp do właściwości za pomocą metod pobierających i ustawiających.

Aby funkcjonować jako klasa JavaBean, klasa obiektowa musi przestrzegać pewnych konwencji dotyczących nazewnictwa, budowy i zachowania metod. Konwencje te umożliwiają korzystanie z narzędzi, które mogą używać, ponownie wykorzystywać, zastępować i łączyć komponenty JavaBeans.

Wymagane konwencje to:

  • Klasa musi mieć domyślny konstruktor publiczny. Umożliwia to łatwe tworzenie instancji w ramach do edycji i aktywacji.
  • Właściwości klasy muszą być dostępne przy użyciu metod get, set i innych (tak zwane metody akcesora i metody mutatora), zgodnie ze standardową konwencją nazewnictwa. Umożliwia to łatwą automatyczną kontrolę i aktualizację stanu komponentu w ramach, z których wiele zawiera niestandardowe edytory dla różnych typów właściwości.
  • Klasa powinna być serializowalna. Pozwala to aplikacjom i platformom na niezawodne zapisywanie, przechowywanie i przywracanie stanu komponentu bean w sposób niezależny od maszyny wirtualnej i platformy.

Ponieważ wymagania te są w dużej mierze wyrażone jako konwencje, a nie przez implementację interfejsów, niektórzy programiści postrzegają komponenty JavaBeans jako zwykłe stare obiekty Java zgodne z określonymi konwencjami nazewnictwa.

POJO

Zwykły stary obiekt Java lub POJO to termin początkowo wprowadzony w celu oznaczenia prostego lekkiego obiektu Java, nie implementującego żadnego javax.ejbinterfejsu, w przeciwieństwie do ciężkiego EJB 2.x (szczególnie Fasola Entity, Stateless Session Beans nie są aż tak złe IMO). Dziś termin ten jest używany dla każdego prostego obiektu bez dodatkowych rzeczy. Ponownie Wikipedia wykonuje dobrą robotę w definiowaniu POJO :

POJO to skrót od Plain Old Java Object. Nazwa służy do podkreślenia, że ​​przedmiotowy obiekt to zwykły obiekt Java, a nie obiekt specjalny, a w szczególności nie Enterprise JavaBean (zwłaszcza przed EJB 3). Termin został wymyślony przez Martina Fowlera, Rebeccę Parsons i Josha MacKenzie we wrześniu 2000 r .:

„Zastanawialiśmy się, dlaczego ludzie są tak przeciwni używaniu zwykłych obiektów w swoich systemach, i doszliśmy do wniosku, że dzieje się tak, ponieważ proste obiekty nie mają fantazyjnej nazwy. Więc daliśmy im jedną i jest bardzo ładna”.

Termin ten kontynuuje wzór starszych terminów dla technologii, które nie wykorzystują wymyślnych nowych funkcji, takich jak POTS (zwykła stara usługa telefoniczna) w telefonii i PODS (zwykłe stare struktury danych), które są zdefiniowane w C ++, ale używają tylko funkcji języka C, i POD (Plain Old Documentation) w Perlu.

Termin najprawdopodobniej zyskał powszechną akceptację ze względu na potrzebę wspólnego i łatwego do zrozumienia terminu, który kontrastuje ze skomplikowanymi ramami obiektowymi. JavaBean to POJO, który można serializować, ma konstruktor bez argumentów i umożliwia dostęp do właściwości za pomocą metod pobierających i ustawiających. Enterprise JavaBean nie jest pojedynczą klasą, ale całym modelem komponentów (ponownie, EJB 3 zmniejsza złożoność Enterprise JavaBeans).

Ponieważ projekty wykorzystujące POJO stały się coraz bardziej popularne, pojawiły się systemy, które dają POJO niektóre funkcje używane w ramach i dają większy wybór, które obszary funkcjonalności są rzeczywiście potrzebne. Hibernacja i Wiosna to przykłady.

Obiekt wartości

Obiekt wartości lub VO to obiekt taki jak te, java.lang.Integerktóre przechowują wartości (stąd obiekty wartości). Aby uzyskać bardziej formalną definicję, często odwołuję się do opisu obiektu wartości : Martin Fowler :

W Patterns of Enterprise Application Architecture opisałem Value Object jako mały obiekt, taki jak Money lub obiekt zakresu dat. Ich kluczową właściwością jest to, że stosują semantykę wartości zamiast semantyki odniesienia.

Zwykle możesz im powiedzieć, ponieważ ich pojęcie równości nie jest oparte na tożsamości, zamiast tego dwa obiekty wartości są równe, jeśli wszystkie ich pola są równe. Chociaż wszystkie pola są równe, nie trzeba porównywać wszystkich pól, jeśli podzbiór jest unikalny - na przykład kody walut dla obiektów walutowych wystarczą do przetestowania równości.

Ogólna heurystyka polega na tym, że obiekty wartości powinny być całkowicie niezmienne. Jeśli chcesz zmienić obiekt wartości, powinieneś go zastąpić nowym i nie możesz aktualizować wartości samego obiektu wartości - obiekty z możliwością aktualizacji prowadzą do problemów z aliasingiem.

Wczesna literatura J2EE używała terminu wartość obiekt do opisania innego pojęcia, które nazywam Obiektem Transferu Danych . Od tego czasu zmienili swoje użycie i zamiast tego używają terminu Obiekt transferu .

Więcej dobrych materiałów na temat przedmiotów wartościowych można znaleźć na wiki i przez Dirka Riehle'a .

Obiekt transferu danych

Obiekt transferu danych lub DTO to (anty) wzór wprowadzony w EJB. Zamiast wykonywać wiele zdalnych wywołań w EJB, pomysł polegał na kapsułkowaniu danych w obiekcie wartości, który można było przesyłać przez sieć: Obiekt przesyłania danych. Wikipedia ma przyzwoitą definicję obiektu do przesyłania danych :

Obiekt przesyłania danych (DTO), wcześniej znany jako obiekty wartości lub VO, to wzorzec projektowy używany do przesyłania danych między podsystemami aplikacji. DTO są często używane w połączeniu z obiektami dostępu do danych w celu pobierania danych z bazy danych.

Różnica między obiektami do przesyłania danych a obiektami biznesowymi lub obiektami dostępu do danych polega na tym, że DTO nie zachowuje się poza przechowywaniem i odzyskiwaniem własnych danych (akcesoriów i mutatorów).

W tradycyjnej architekturze EJB DTO służą dwóm celom: po pierwsze, rozwiązują problem polegający na tym, że komponenty bean nie są serializowane; po drugie, domyślnie definiują fazę montażu, w której wszystkie dane, które mają być użyte w widoku, są pobierane i wprowadzane do DTO przed przywróceniem kontroli do warstwy prezentacji.


Tak więc dla wielu osób DTO i VO są tym samym (ale Fowler używa VO w znaczeniu czegoś innego, jak widzieliśmy). Przez większość czasu przestrzegają konwencji JavaBeans, a zatem są również JavaBeans. I wszystkie są POJO.

Pascal Thivent
źródło
1
Więc jeśli mam klasę wygody stworzoną tylko do przesyłania niepowiązanych danych, takich jak ta class SomeClass { public String foo;public String bar; }wewnątrz klasy z dużą ilością skomplikowanej logiki, na pewno nie jest to JavaBean, nie może to być VO, ponieważ jest zmienne, czy może to być DTO? Uważa się jednak, że nie jest on przeznaczony do wszelkiego rodzaju zdalnych wywołań. Czy można to uznać za POJO?
Jaime Hablutzel
3
@ user2601512: Nadal byłby to fasolka. : P Nie ma nic złego w zachowaniu się Fasoli - w rzeczywistości jest to prawie oczekiwane. Jeśli nic więcej nie robi, to w zasadzie DTO.
cHao
7
@xSNRG: Częściowo dlatego, że degraduje obiekty do danych, na które działa inny kod. To krok wstecz z perspektywy OO, w którym obiekty działają i powinny odpowiadać za swój własny stan. DTO są czasami przyzwoitym rozwiązaniem, jeśli faktycznie przesyłasz dane - stąd nazwa - ale hermetyzacja zasadniczo wychodzi poza okno i zazwyczaj tracisz wszelkie gwarancje ważności / spójności, które może zapewnić prawdziwy obiekt.
cHao
1
@KumaresanPerumal: Możesz, jeśli chcesz. Ale model różni się od warstwy danych i ma inne cele i reguły. Warstwa danych zwykle potrzebuje wszystkiego, co jest ułożone i dowolnie konfigurowalne, a model idealnie chce ukryć dane i egzekwować niezmienniki. Chcesz użyć obiektów modelu do przechowywania, będziesz musiał iść na kompromis z jednej lub drugiej strony.
cHao
1
@KumaresanPerumal: Warstwa danych służy do przechowywania i pobierania danych. Aby to zrobić, potrzebuje prawie pełnego dostępu do dowolnego obiektu zawierającego dane, ponieważ pobieranie oznacza ustawienie wartości w jakimś obiekcie. Ale model zarządza tymi danymi w systemie i jest związany zasadami OO, takimi jak hermetyzacja - ideą, że obiekty powinny zachować kontrolę nad swoim stanem wewnętrznym i nie mogą powodować, że inne kody będą miały do ​​czynienia z własnymi wnętrznościami. DTO mogą wypełnić tę lukę; warstwa danych może uzyskać do nich dostęp do woli, a model nie musi rezygnować z kontroli.
cHao
66

DTO vs VO

DTO - Obiekty do przesyłania danych to tylko kontenery danych, które służą do transportu danych między warstwami i warstwami.

  • Zawiera głównie atrybuty. Możesz nawet używać publicznych atrybutów bez pobierających i ustawiających.
  • Obiekty przesyłania danych nie zawierają żadnej logiki biznesowej.

Analogia:
prosty formularz rejestracyjny z atrybutami nazwa użytkownika, hasło i identyfikator e-mail.

  • Gdy ten formularz zostanie przesłany w pliku RegistrationServlet, otrzymasz wszystkie atrybuty z warstwy widoku do warstwy biznesowej, gdzie przekazujesz atrybuty do java bean, a następnie do DAO lub warstwy trwałości.
  • DTO pomaga w przenoszeniu atrybutów z warstwy widoku do warstwy biznesowej i wreszcie do warstwy trwałości.

DTO służyło głównie do wydajnego przesyłania danych w sieci, może to być nawet z JVM do innego JVM.

DTO są często java.io.Serializable - w celu przesyłania danych przez JVM.

VO - Obiekt wartości [1] [2] reprezentuje stały zestaw danych i jest podobny do wyliczenia Java. Tożsamość obiektu wartości opiera się raczej na jego stanie niż na tożsamości obiektu i jest niezmienna. Przykładem w świecie rzeczywistym jest Color.RED, Color.BLUE, SEX.FEMALE itp.

POJO vs JavaBeans

[1] Java-Beanness POJO polega na tym, że wszystkie jego prywatne atrybuty są dostępne za pośrednictwem publicznych programów pobierających i ustawiających, które są zgodne z konwencjami JavaBeans. na przykład

    private String foo;
    public String getFoo(){...}
    public void setFoo(String foo){...}; 

[2] JavaBeans musi implementować Serializable i mieć konstruktor bez argumentów, podczas gdy w POJO nie ma tych ograniczeń.

Srinivas MV
źródło
Przepraszam za komentarz, bardzo późno, ale dowiaduję się o różnicach między nimi i mam pytanie. Co jeśli mam klasę Java Bean, ale z innymi metodami, takimi jak doSomething (). Jaka to byłaby klasa? Pozdrawiam
jscherman
@ srinivas dlaczego nie możemy przekazać danych w obiekcie DOMAIN lub MODEL java? Ale używam MODELU bez DTO. proszę wyjaśnij mi krótko. dzięki
Kumaresan Perumal
46

Gruntownie,

DTO: „Obiekty przesyłania danych” mogą przemieszczać się między oddzielnymi warstwami w architekturze oprogramowania.

Lektor: „Obiekty wartości” przechowują obiekty takie jak liczba całkowita, pieniądze itp.

POJO: Plain Old Java Object, który nie jest obiektem specjalnym.

Java Beans: wymaga Java Classmożliwości serializacji, posiadania no-argkonstruktora oraz metody pobierającej i ustawiającej dla każdego pola

Olcay Tarazan
źródło
Te opisy są w większości błędne / niekompletne.
cellepo
24

Ziarna Java to nie to samo, co komponenty EJB.

Specyfikacja JavaBeans w Javie 1.0 była próbą Sun pozwalającą na manipulowanie obiektami Java w środowisku IDE, które wyglądało jak VB. Dla obiektów zakwalifikowanych jako „Java Beans” określono zasady:

  1. Domyślny konstruktor
  2. Obiekty pobierające i ustawiające dla prywatnych członków danych, które przestrzegały właściwej konwencji nazewnictwa
  3. Serializowalny
  4. Może inni, o których zapominam.

EJB przyszły później. Łączą rozproszone komponenty i model transakcyjny, działając w kontenerze, który zarządza wątkami, pula, cykl życia i świadczy usługi. Są dalekie od Java Beans.

DTO powstały w kontekście Java, ponieważ ludzie odkryli, że specyfikacja EJB 1.0 była zbyt „gadatliwa” z bazą danych. Zamiast obchodzić każdy element danych, ludzie pakowaliby je masowo do komponentów Java Beans i wysyłali.

POJO były reakcją na EJB.

duffymo
źródło
1
Myliłem się i wolałem usunąć swoją wiadomość. Dzięki za korektę. Chcę zauważyć, że znaczenie POJO zmieniło się jakiś czas temu. Po pierwsze, składają się wyłącznie z prywatnych nieruchomości i ich akcesoriów. Teraz uważamy POJO za klasę z adnotacjami, implementującą i rozszerzającą inne klasy itp.
sinuhepop
Co z VO, jak zadawano Pytanie? To nie jest odpowiedź, dopóki nie odpowie na pełne pytanie
cellepo
4

POJO : Jest to plik (klasa) java, który nie rozszerza ani nie implementuje żadnego innego pliku (klasy) java.

Fasola : jest to plik java (klasa), w którym wszystkie zmienne są prywatne, metody są publiczne, a do uzyskiwania dostępu do zmiennych używane są odpowiednie metody pobierające i ustawiające.

Normalna klasa : jest to plik java (klasa), który może składać się ze zmiennych publicznych / prywatnych / domyślnych / chronionych i który może, ale nie musi, rozszerzyć lub zaimplementować inny plik java (klasa).

Suraj Kalokhe
źródło
Co z VO, jak zadawano Pytanie? To nie jest odpowiedź, dopóki nie odpowie na pełne pytanie
cellepo
1

Pierwsza rozmowa o

Normalna klasa - oznacza to, że każda klasa definiuje normalnie w Javie, oznacza to, że tworzysz różne właściwości metod itp.
Fasola - Fasola to nic innego, to tylko obiekt tej konkretnej klasy. Za pomocą tej fasoli możesz uzyskać dostęp do swojej klasy Java tak samo jak obiekt. .

a potem rozmowa o ostatnim POJO

POJO - POJO to klasa, która nie ma żadnych usług, ma tylko domyślny konstruktor i własność prywatną oraz te właściwości do ustawiania odpowiadającej wartości metody ustawiającej i pobierającej. To krótka forma Plain Java Object.

ASHISH KUMAR SINGH
źródło
Co z VO, jak zadawano Pytanie? To nie jest odpowiedź, dopóki nie odpowie na pełne pytanie
cellepo
1
  • Obiekt wartości : należy użyć, gdy trzeba zmierzyć równość obiektów na podstawie wartości obiektów.
  • Obiekt przenoszenia danych : Przekaż dane z wieloma atrybutami w jednym ujęciu od klienta do serwera między warstwami, aby uniknąć wielu połączeń z serwerem zdalnym.
  • Zwykły stary obiekt Java : To jak prosta klasa posiadająca właściwości, publiczny konstruktor bez argonu. Jak deklarujemy dla podmiotu JPA.

różnica między wartością wzorzec-obiekt-wzorzec i wzorzec transferu danych

Atul Jain
źródło