ความแตกต่างระหว่าง DTO, VO, POJO, JavaBeans?


584

ได้เห็นคำถามที่คล้ายกัน:

คุณช่วยเล่าเรื่องเกี่ยวกับบริบทที่พวกเขาใช้ให้ฉันได้ไหม หรือวัตถุประสงค์ของพวกเขา?


1
POJO มาพร้อมกับข้อ จำกัด ที่ javabeans มาพร้อมกับข้อ จำกัด ดังกล่าวข้างต้น
exexzian

คำตอบ:


848

JavaBeans

JavaBean เป็นคลาสที่ตามหลังการประชุม JavaBeans ตามที่กำหนดโดย Sun Wikipedia มีข้อสรุปที่ดีว่าJavaBeansคืออะไร:

JavaBeans เป็นส่วนประกอบซอฟต์แวร์ที่สามารถใช้ซ้ำได้สำหรับ Java ที่สามารถจัดการได้ด้วยเครื่องมือสร้าง ในทางปฏิบัติแล้วจะเป็นคลาสที่เขียนด้วยภาษาการเขียนโปรแกรม Java ที่สอดคล้องกับข้อกำหนดเฉพาะ พวกเขาจะใช้ในการห่อหุ้มวัตถุจำนวนมากเป็นวัตถุเดียว (ถั่ว) เพื่อให้พวกเขาสามารถถูกส่งผ่านเป็นวัตถุถั่วเดียวแทนที่จะเป็นวัตถุหลายบุคคล JavaBean เป็น Java Object ที่สามารถทำให้เป็นอนุกรมมีตัวสร้าง nullary และอนุญาตให้เข้าถึงคุณสมบัติโดยใช้วิธี getter และ setter

เพื่อที่จะทำหน้าที่เป็นคลาส JavaBean คลาสอ็อบเจ็กต์ต้องปฏิบัติตามข้อตกลงบางอย่างเกี่ยวกับการตั้งชื่อเมธอดการก่อสร้างและพฤติกรรม อนุสัญญาเหล่านี้ทำให้สามารถมีเครื่องมือที่สามารถใช้นำมาใช้ใหม่ทดแทนและเชื่อมต่อ JavaBeans

การประชุมที่ต้องการคือ:

  • ชั้นต้องมีตัวสร้างค่าเริ่มต้นสาธารณะ สิ่งนี้ทำให้การอินสแตนซ์ง่ายภายในกรอบการแก้ไขและการเปิดใช้งาน
  • คุณสมบัติคลาสต้องสามารถเข้าถึงได้โดยใช้ get, set และเมธอดอื่น ๆ (เรียกว่าเมธอด accessor และเมธอด mutator) ตามหลักการตั้งชื่อมาตรฐาน สิ่งนี้ช่วยให้การตรวจสอบอัตโนมัติและการอัปเดตสถานะถั่วง่ายขึ้นภายในเฟรมเวิร์กซึ่งส่วนใหญ่มีตัวแก้ไขที่กำหนดเองสำหรับคุณสมบัติประเภทต่างๆ
  • คลาสควรเป็นแบบอนุกรม สิ่งนี้อนุญาตให้แอ็พพลิเคชันและกรอบงานสามารถบันทึกจัดเก็บและกู้คืนสถานะของ bean ในแบบที่เป็นอิสระจาก VM และแพลตฟอร์มได้อย่างน่าเชื่อถือ

เนื่องจากข้อกำหนดเหล่านี้ส่วนใหญ่จะแสดงเป็นแบบแผนแทนที่จะใช้ส่วนต่อประสานนักพัฒนาบางคนมองว่า JavaBeans เป็นวัตถุ Java แบบธรรมดาแบบเก่าที่ตามหลักการตั้งชื่อแบบเฉพาะ

POJO

Plain Old Object Java หรือ POJO เป็นคำที่เริ่มต้นในการกำหนดวัตถุ Java น้ำหนักเบาอย่างง่ายไม่ได้ใช้javax.ejbอินเตอร์เฟซใด ๆเมื่อเทียบกับ EJB 2.x เฮฟวี่เวท (โดยเฉพาะ Entity Beans, เซสชันไร้สัญชาติถั่วไม่ IMO แย่) วันนี้คำนี้ใช้สำหรับวัตถุอย่างง่าย ๆ ที่ไม่มีสิ่งใดพิเศษ อีกครั้ง Wikipedia ทำงานได้ดีในการกำหนดPOJO :

POJO เป็นตัวย่อสำหรับวัตถุ Java เก่าธรรมดา ชื่อนี้ใช้เพื่อเน้นว่าวัตถุที่เป็นปัญหานั้นเป็น Java Object ธรรมดาไม่ใช่วัตถุพิเศษและโดยเฉพาะอย่างยิ่งไม่ใช่ Enterprise JavaBean (โดยเฉพาะก่อน EJB 3) คำประกาศเกียรติคุณจาก Martin Fowler, Rebecca Parsons และ Josh MacKenzie ในเดือนกันยายน 2000:

"เราสงสัยว่าทำไมผู้คนถึงต่อต้านการใช้วัตถุปกติในระบบของพวกเขาและสรุปว่ามันเป็นเพราะวัตถุธรรมดา ๆ ไม่มีชื่อแฟนซีดังนั้นเราจึงให้พวกเขาหนึ่งและมันก็จับได้อย่างดี"

คำนี้ยังคงรูปแบบของคำศัพท์ที่เก่ากว่าสำหรับเทคโนโลยีที่ไม่ได้ใช้คุณสมบัติใหม่ที่แปลกใหม่เช่น POTS (บริการโทรศัพท์เก่าธรรมดา) ในโทรศัพท์และ PODS (โครงสร้างข้อมูลเก่าธรรมดา) ที่กำหนดไว้ใน C ++ แต่ใช้เฉพาะภาษา C เท่านั้น และ POD (เอกสารเก่าธรรมดา) ใน Perl

คำนี้มีแนวโน้มที่จะได้รับการยอมรับอย่างกว้างขวางเนื่องจากความต้องการคำทั่วไปและเข้าใจได้ง่ายซึ่งขัดแย้งกับกรอบวัตถุที่ซับซ้อน JavaBean เป็น POJO ที่สามารถทำให้เป็นอนุกรมมีตัวสร้างแบบไม่มีอาร์กิวเมนต์และอนุญาตให้เข้าถึงคุณสมบัติโดยใช้วิธี getter และ setter Enterprise JavaBean ไม่ใช่คลาสเดียว แต่เป็นโมเดลส่วนประกอบทั้งหมด (อีกครั้ง EJB 3 จะลดความซับซ้อนของ Enterprise JavaBeans)

เมื่อการออกแบบที่ใช้ POJO กลายเป็นสิ่งที่ใช้กันอย่างแพร่หลายระบบได้เกิดขึ้นที่ให้ POJO ฟังก์ชั่นบางอย่างที่ใช้ในเฟรมเวิร์กและทางเลือกอื่น ๆ Hibernate และ Spring เป็นตัวอย่าง

วัตถุค่า

Value Object หรือ VO เป็นวัตถุเช่นjava.lang.Integerนั้นถือค่า (วัตถุค่าดังนั้น) สำหรับคำจำกัดความที่เป็นทางการมากขึ้นฉันมักจะอ้างถึงคำอธิบายของValue Objectของ Martin Fowler :

ในรูปแบบของสถาปัตยกรรมแอปพลิเคชันองค์กรฉันอธิบายถึงวัตถุค่าเป็นวัตถุขนาดเล็กเช่นเงินหรือวัตถุช่วงวันที่ คุณสมบัติที่สำคัญของพวกเขาคือพวกเขาปฏิบัติตามค่าความหมายมากกว่าการอ้างอิงความหมาย

โดยปกติคุณสามารถบอกพวกเขาได้เพราะแนวคิดเรื่องความเท่าเทียมไม่ได้ขึ้นอยู่กับตัวตน แต่วัตถุค่าสองค่าเท่ากันถ้าเขตข้อมูลทั้งหมดเท่ากัน แม้ว่าเขตข้อมูลทั้งหมดจะเท่ากัน แต่คุณไม่จำเป็นต้องเปรียบเทียบทุกเขตข้อมูลหากชุดย่อยไม่ซ้ำกัน - เช่นรหัสสกุลเงินสำหรับวัตถุสกุลเงินก็เพียงพอที่จะทดสอบความเท่าเทียมกัน

ฮิวริสติกทั่วไปคือวัตถุที่มีคุณค่าควรจะไม่เปลี่ยนรูปแบบโดยสิ้นเชิง หากคุณต้องการเปลี่ยนวัตถุค่าคุณควรแทนที่วัตถุด้วยวัตถุใหม่และไม่ได้รับอนุญาตให้อัปเดตค่าของวัตถุค่าเอง - วัตถุค่าที่อัพเดตได้นำไปสู่ปัญหานามแฝง

วรรณกรรม J2EE ช่วงต้นใช้วัตถุคุณค่าในระยะที่จะอธิบายความคิดที่แตกต่างกันสิ่งที่ผมเรียกวัตถุการถ่ายโอนข้อมูล พวกเขาเปลี่ยนการใช้งานและใช้คำว่าTransfer Objectแทน

คุณสามารถค้นหาบางวัสดุที่ดีมากขึ้นบนวัตถุที่คุ้มค่าในวิกิพีเดีย และเดิร์ค Riehle

วัตถุการถ่ายโอนข้อมูล

Data Transfer Object หรือ DTO เป็นรูปแบบ (ต่อต้าน) ที่รู้จักกับ EJB แทนที่จะทำการเรียกระยะไกลจำนวนมากบน EJB แนวคิดก็เพื่อห่อหุ้มข้อมูลในวัตถุค่าที่สามารถถ่ายโอนผ่านเครือข่าย: วัตถุการถ่ายโอนข้อมูล Wikipedia มีคำจำกัดความที่ดีของData Transfer Object :

Data transfer object (DTO) เดิมชื่อ value objects หรือ VO เป็นรูปแบบการออกแบบที่ใช้ในการถ่ายโอนข้อมูลระหว่างระบบย่อยของแอปพลิเคชันซอฟต์แวร์ DTO มักใช้ร่วมกับ data access objects เพื่อดึงข้อมูลจากฐานข้อมูล

ความแตกต่างระหว่างวัตถุการถ่ายโอนข้อมูลและวัตถุธุรกิจหรือวัตถุการเข้าถึงข้อมูลคือ DTO ไม่มีพฤติกรรมใด ๆ ยกเว้นการจัดเก็บและการดึงข้อมูลของตัวเอง (accessors และ mutators)

ในสถาปัตยกรรม EJB แบบดั้งเดิม DTO ให้บริการวัตถุประสงค์ที่สอง: อันดับแรกพวกเขาแก้ไขปัญหาที่เอนทิตีถั่วไม่ได้ต่อเนื่องกัน วินาทีพวกเขากำหนดเฟสแอสเซมบลีโดยนัยซึ่งข้อมูลทั้งหมดที่จะใช้โดยมุมมองถูกดึงและ marshalled เข้าไปใน DTOs ก่อนที่จะกลับการควบคุมไปยังระดับการนำเสนอ


ดังนั้นสำหรับคนจำนวนมาก DTO และ VO นั้นเป็นสิ่งเดียวกัน (แต่ Fowler ใช้ VO เพื่อหมายถึงสิ่งอื่นที่เราเห็น) เวลาส่วนใหญ่พวกเขาปฏิบัติตามอนุสัญญา JavaBeans และทำให้ JavaBeans เกินไป และทั้งหมดคือ POJOs


1
ดังนั้นถ้าฉันมีคลาสความสะดวกสบายที่สร้างขึ้นสำหรับการถ่ายโอนข้อมูลที่ไม่เกี่ยวข้องเช่นนี้class SomeClass { public String foo;public String bar; }ภายในคลาสที่มีตรรกะที่ซับซ้อนจำนวนมากแน่นอนว่าไม่ใช่ JavaBean มันไม่สามารถเป็น VO ได้เนื่องจากมันไม่แน่นอน DTO? altought มันไม่ได้มีการกำหนดเป้าหมายสำหรับการเรียกใช้จากระยะไกลทุกประเภท มันอาจจะถือเป็น POJO หรือไม่?
Jaime Hablutzel

3
@ user2601512: ยังคงเป็น Bean อยู่ : P ไม่มีอะไรผิดปกติกับ Bean ที่มีพฤติกรรม - ที่จริงแล้วมันค่อนข้างคาดหวังมาก ถ้าไม่ทำอะไรเลยมันเป็น DTO
cHao

7
@xSNRG: ส่วนหนึ่งเป็นเพราะมันลดระดับวัตถุไปยังข้อมูลที่รหัสอื่นทำหน้าที่ นั่นเป็นขั้นตอนย้อนหลังจากมุมมอง OO ที่วัตถุทำหน้าที่และควรรับผิดชอบต่อสถานะของตนเอง บางครั้ง DTOs เป็นทางออกที่ดีถ้าคุณเพียงแค่ถ่ายโอนข้อมูล - ดังนั้นชื่อ - แต่โดยทั่วไปแล้วการห่อหุ้มจะออกไปนอกหน้าต่างและโดยทั่วไปคุณจะสูญเสียความถูกต้อง / ความสอดคล้องใด ๆ ที่รับประกันว่าวัตถุจริงสามารถให้ได้
cHao

1
@ KumaresanPerumal: คุณสามารถทำได้ถ้าคุณต้องการ แต่ตัวแบบนั้นแตกต่างจากชั้นข้อมูลและมีจุดมุ่งหมายและกฎที่ต่างกัน โดยทั่วไปแล้วชั้นข้อมูลต้องการทุกอย่างที่วางไว้และตั้งค่าได้โดยพลการและแบบจำลองต้องการซ่อนข้อมูลและบังคับใช้ค่าคงที่ คุณต้องการใช้โมเดลวัตถุสำหรับการจัดเก็บคุณจะต้องประนีประนอมในด้านใดด้านหนึ่ง
cHao

1
@KumaresanPerumal: ชั้นข้อมูลอยู่ที่นั่นเพื่อจัดเก็บและดึงข้อมูล ในการทำเช่นนั้นทั้งหมด แต่ต้องการการเข้าถึงอย่างเต็มที่กับวัตถุใดก็ตามที่เก็บข้อมูลเนื่องจากการดึงข้อมูลหมายถึงการตั้งค่าในวัตถุบางแห่ง แต่ตัวแบบจะจัดการข้อมูลนั้นในระบบและถูกผูกมัดโดยหลักการของ OO เช่นการห่อหุ้ม - ความคิดที่ว่าวัตถุควรรักษาการควบคุมสถานะภายในของตนและไม่มีรหัสอื่น ๆ มายุ่งเกี่ยวกับอวัยวะภายในโดยพลการ DTO สามารถเชื่อมช่องว่างนั้น ชั้นข้อมูลสามารถเข้าถึงได้ตามความประสงค์และโมเดลไม่จำเป็นต้องสละการควบคุม
cHao

66

DTO กับ VO

DTO -วัตถุการถ่ายโอนข้อมูลเป็นเพียงภาชนะข้อมูลที่ใช้ในการขนส่งข้อมูลระหว่างชั้นและชั้น

  • ส่วนใหญ่ประกอบด้วยคุณลักษณะ คุณยังสามารถใช้แอททริบิวสาธารณะโดยไม่ต้องรับและผู้ตั้งค่า
  • วัตถุการถ่ายโอนข้อมูลไม่มีตรรกะทางธุรกิจใด ๆ

คล้ายคลึง:
แบบฟอร์มการลงทะเบียนง่ายพร้อมชื่อผู้ใช้แอตทริบิวต์รหัสผ่านและอีเมล

  • เมื่อส่งแบบฟอร์มนี้ในไฟล์ RegistrationServlet คุณจะได้รับคุณลักษณะทั้งหมดจากมุมมองเลเยอร์ไปยังชั้นธุรกิจที่คุณผ่านแอททริบิวไปยังจาวาถั่วแล้วไปยัง DAO หรือเลเยอร์คงอยู่
  • DTO ช่วยในการขนส่งคุณลักษณะจากมุมมองเลเยอร์ไปยังชั้นธุรกิจและในที่สุดก็ไปยังชั้นการคงอยู่

DTO ส่วนใหญ่ใช้เพื่อรับส่งข้อมูลข้ามเครือข่ายได้อย่างมีประสิทธิภาพอาจจะเป็นจาก JVM ไปยัง JVM อื่น

บ่อยครั้งที่ DTOs java.io.Serializable- เพื่อถ่ายโอนข้อมูลข้าม JVM

VO -วัตถุที่มีค่า [1] [2] หมายถึงชุดข้อมูลที่แน่นอนและคล้ายกับ Java enum เอกลักษณ์ของค่าวัตถุขึ้นอยู่กับสถานะของพวกเขามากกว่าตัวตนของวัตถุและไม่เปลี่ยนรูป ตัวอย่างในโลกแห่งความเป็นจริงจะเป็น Color.RED, Color.BLUE, SEX.FEMALE เป็นต้น

POJO กับ JavaBeans

[1] Java-Beanness ของ POJO คือแอททริบิวต์ส่วนตัวเข้าถึงได้ทั้งหมดผ่าน public getters และ setters ที่สอดคล้องกับระเบียบ JavaBeans เช่น

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

[2] JavaBeans ต้องใช้งาน Serializable ได้และไม่มี Constructor ในขณะที่ POJO ไม่มีข้อ จำกัด เหล่านี้


ขออภัยในความคิดเห็นช้ามาก แต่ฉันกำลังเรียนรู้เกี่ยวกับความแตกต่างระหว่างพวกเขากับฉันมีคำถาม ถ้าฉันมีคลาส Java Bean แต่ด้วยวิธีอื่นเช่น doSomething () คลาสแบบไหนกันแน่? ขอแสดงความนับถือ
jscherman

@srinivas ทำไมเราไม่สามารถส่งผ่านข้อมูลใน DOMAIN หรือ MODEL java object ได้? แต่ฉันใช้ MODEL โดยไม่ใช้ DTO โปรดอธิบายฉันสั้น ๆ ขอขอบคุณ
Kumaresan Perumal

46

โดยทั่วไป

DTO: "วัตถุการถ่ายโอนข้อมูล" สามารถเดินทางระหว่างเลเยอร์แยกในสถาปัตยกรรมซอฟต์แวร์

VO: "วัตถุค่า" ถือวัตถุเช่นจำนวนเต็มเงิน ฯลฯ

POJO: วัตถุ Java เก่าธรรมดาซึ่งไม่ใช่วัตถุพิเศษ

Java Beans: ต้องการJava Classให้เป็นแบบอนุกรม, มีno-argConstructor และ Getter และ Setter สำหรับแต่ละฟิลด์


คำอธิบายเหล่านี้ส่วนใหญ่ผิด / ไม่สมบูรณ์
เซเล่โป

24

Java Beans นั้นไม่เหมือนกับ EJB

ข้อกำหนด JavaBeansใน Java 1.0 เป็นความพยายามของดวงอาทิตย์ที่จะอนุญาตให้วัตถุ Java ที่จะจัดการใน IDE ที่ดูเหมือน VB มีกฎที่วางไว้สำหรับวัตถุที่ผ่านการรับรองเป็น "Java Beans":

  1. ตัวสร้างเริ่มต้น
  2. Getters และ setters สำหรับสมาชิกข้อมูลส่วนตัวที่ปฏิบัติตามหลักการตั้งชื่อที่เหมาะสม
  3. serializable
  4. บางทีคนอื่นที่ฉันลืม

EJB มาในภายหลัง พวกเขารวมองค์ประกอบกระจายและรูปแบบของทรานแซคชันทำงานในภาชนะบรรจุที่จัดการหัวข้อการรวมกำไรวงจรชีวิตและให้บริการ พวกเขาเป็นหนทางไกลจาก Java Beans

DTOs เกิดขึ้นในบริบทของ Java เพราะผู้คนพบว่าข้อมูลจำเพาะ EJB 1.0 นั้น "ช่างพูด" เกินไปกับฐานข้อมูล แทนที่จะทำการส่งแบบไปกลับสำหรับองค์ประกอบข้อมูลทุกคนผู้คนจะจัดเก็บข้อมูลเหล่านั้นลงใน Java Beans เป็นกลุ่มและจัดส่งไปทั่ว

POJO เป็นปฏิกิริยาต่อ EJB


1
ฉันผิดและฉันต้องการลบข้อความ ขอบคุณสำหรับการแก้ไข ฉันต้องการที่จะสังเกตเห็นว่าความหมาย POJO มีการเปลี่ยนแปลงบางเวลาที่ผ่านมา อันดับแรกพวกเขาทำจากคุณสมบัติส่วนตัวและอุปกรณ์ของพวกเขา ตอนนี้เราพิจารณา POJO ระดับด้วยคำอธิบายประกอบการดำเนินการและการขยายชั้นเรียนอื่น ๆ ฯลฯ
sinuhepop

คำถามเกี่ยวกับ VO เป็นอย่างไร นี่ไม่ใช่คำตอบจนกว่าจะตอบคำถามเต็ม
cellepo

4

POJO : เป็นไฟล์ java (คลาส) ซึ่งไม่ขยายหรือใช้ไฟล์ java อื่น (คลาส)

Bean : มันเป็นไฟล์ java (คลาส) ซึ่งตัวแปรทั้งหมดเป็นส่วนตัววิธีการเป็นสาธารณะและได้รับที่เหมาะสมและ setters จะใช้สำหรับการเข้าถึงตัวแปร

คลาสปกติ : เป็นไฟล์ java (คลาส) ซึ่งอาจประกอบด้วยตัวแปรสาธารณะ / ส่วนตัว / ค่าเริ่มต้น / ที่ได้รับการป้องกันและอาจขยายหรือใช้ไฟล์ java อื่น (คลาส) ได้หรือไม่


คำถามเกี่ยวกับ VO เป็นอย่างไร นี่ไม่ใช่คำตอบจนกว่าจะตอบคำถามเต็ม
cellepo

1

พูดคุยครั้งแรกเกี่ยวกับ

Normal Class -นั่นหมายถึงคลาสใด ๆ ที่ปกติแล้วในจาวานั่นหมายถึงคุณสร้างคุณสมบัติเมธอดที่แตกต่างกันเป็นต้น
Bean - Bean ไม่ได้เป็นเพียงวัตถุของคลาสนั้นโดยใช้ bean นี้คุณสามารถเข้าถึงคลาสจาวาของคุณได้เช่นเดียวกับวัตถุ .

และหลังจากนั้นพูดคุยเกี่ยวกับ POJO อันสุดท้าย

POJO - POJOเป็นคลาสที่ไม่มีบริการใด ๆ มันมีเพียงคอนสตรัคเตอร์เริ่มต้นและคุณสมบัติส่วนตัวและคุณสมบัติเหล่านั้นสำหรับการตั้งค่าเมธอด setter และ getter ที่สอดคล้องกัน มันเป็นรูปแบบสั้น ๆ ของวัตถุ Java ธรรมดา


คำถามเกี่ยวกับ VO เป็นอย่างไร นี่ไม่ใช่คำตอบจนกว่าจะตอบคำถามเต็ม
cellepo

1
  • ค่าวัตถุ : ใช้เมื่อจำเป็นต้องวัดความเท่าเทียมกันของวัตถุตามมูลค่าของวัตถุ
  • การถ่ายโอนข้อมูลวัตถุ : ส่งผ่านข้อมูลที่มีคุณสมบัติหลายอย่างในหนึ่งนัดจากไคลเอนต์ไปยังเซิร์ฟเวอร์ข้ามชั้นเพื่อหลีกเลี่ยงการโทรไปยังเซิร์ฟเวอร์ระยะไกลหลาย
  • วัตถุ Java เก่าธรรมดา : มันเป็นคลาสที่เรียบง่ายซึ่งเป็นคุณสมบัติคอนสตรัคเตอร์ no-arg สาธารณะ ตามที่เราประกาศสำหรับเอนทิตี JPA

ความแตกต่างระหว่างมูลค่าวัตถุรูปแบบและการถ่ายโอนข้อมูลรูปแบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.