สิ่งใดที่คุณเรียกคลาสที่ไม่มีเมธอด


10

สิ่งใดที่คุณเรียกคลาสที่ไม่มีเมธอด

ตัวอย่างเช่น,

class A
{
  public string something;
  public int a;
}

ด้านบนเป็นคลาสที่ไม่มีวิธีการใด ๆ คลาสประเภทนี้มีชื่อพิเศษหรือไม่?


1
คลาสที่ปราศจากเมธอด
ChaosPandion

11
ระยะทางเทคนิคคือการบันทึกหรือstruct
Kilian Foth

4
"ถุงทรัพย์สิน"
Martin York

Kilian: ฉันชอบ "glorified struct" สำหรับความหมายแฝงที่เพิ่มเข้ามา
เจสัน

คำตอบ:


23

ส่วนใหญ่เวลา: รูปแบบการต่อต้าน

ทำไม? เพราะมันช่วยให้การเขียนโปรแกรมขั้นตอนกับชั้นเรียน "ผู้ประกอบการ" และโครงสร้างข้อมูล คุณแยกข้อมูลและพฤติกรรมที่ไม่ดีกับ OOP

บ่อยครั้ง: A DTO (Data Transfer Object)

อ่านเฉพาะโครงสร้างข้อมูลเพื่อแลกเปลี่ยนข้อมูลที่ได้มาจากวัตถุธุรกิจ / โดเมน

บางครั้ง: แค่โครงสร้างข้อมูล

บางครั้งคุณต้องมีโครงสร้างเหล่านั้นเพื่อเก็บข้อมูลที่เรียบง่ายและไม่มีการดำเนินการใด ๆ แต่ฉันจะไม่ใช้ฟิลด์สาธารณะยกเว้น accessors (getters and setters)


4
ฉันขอแนะนำให้ทุกคนที่จะเรียนด้วยเพียง getters สาธารณะ / setters ใน java มันเป็นสมองตายและคอนเทนเนอร์บางตัวจะไม่เรียกใช้ setter / getter code (ดู Glassfish ... ) ดังนั้นจึงเป็นค่าเริ่มต้นหรือคุณมี แมลง ฉันไม่เชื่อว่าการห่อหุ้ม OOP ถูกต้องแล้วปรากฎว่าส่วนใหญ่แล้วในแอปพลิเคชันส่วนใหญ่ DTO นั้นไม่เพียง แต่ต้องการ แต่พวกเขาเป็นคลาสที่ใช้บ่อยที่สุด ดังนั้นพวกเขาเป็นอะไรก็ได้นอกจาก antipatterns ฉันจะใช้คำว่า "หน่วยการสร้างพื้นฐาน" แทน
Aadaam

8
พวกเขาอาจจะเป็นรูปแบบการต่อต้านถ้าคุณอยู่ในสภาพแวดล้อมที่ OO อย่างเคร่งครัด สำหรับส่วนที่เหลือทั้งหมดของโลกการเขียนโปรแกรมที่มีโครงสร้างข้อมูลที่มีคอลเลกชันที่แตกต่างกันที่เรียบง่ายของสาขาที่เป็นประโยชน์อย่างชัดเจนจากทางเลือกและเป็นกำลังใจให้แม้จะอยู่ในหนึ่งในแกนนำ OO ที่รู้จักกันดี
Telastyn

@Aadaam: คุณไม่เข้าใจฉัน DTO ไม่ใช่ปฏิสสาร บางครั้งวัตถุเหล่านั้นก็ปรับได้อย่างสมบูรณ์ถ้าพวกเขาเป็น DTO! และเมื่อ Glassfish ไม่ดูที่ getters และ setters นั่นหมายถึงว่า glassfish นั้นเขียนไม่ดีนัก (แม้ว่าจะยากในจาวาโดยที่ไม่มี accessor ในตัว) รหัสนี้ไม่ได้เป็นความคิดสร้างสรรค์มันมีประโยชน์สำเร็จรูป
เหยี่ยว

4
ด่วน @Aadaam มีคนกำลังตั้งค่าเขตข้อมูลเป็นค่าที่ไม่ถูกต้องสร้างความหายนะเมื่ออ่านในภายหลัง โยนข้อยกเว้นเพื่อให้คุณสามารถตรวจจับผู้กระทำผิด ครั้งแรกที่คุณต้องทำอะไรแบบนั้นสำหรับเขตข้อมูลสาธารณะที่ใช้ในสถานที่ 1,000 แห่งคุณจะอยากเป็นหมา ทุ่งสาธารณะมีสถานที่ของพวกเขา แต่กระบวนทัศน์ของผู้ทะเยอทะยาน / สุนัขเซทเทอร์เป็นที่นิยมสำหรับเหตุผลที่ดี
Karl Bielefeldt

@ KarlBielefeldt: ในรุ่น glassfish หนึ่งฉันมีข้อยกเว้นเพียงอย่างเดียวในรหัส setter เป็นการทดสอบ (โดยไม่มีเงื่อนไข) ซึ่งไม่เคยดำเนินการ คุณสมบัตินี้มีตัวแปรส่วนตัวและ public getters-and-setters สองตัว ภาชนะบรรจุเพียงหลบเลี่ยง setter หากสิ่งที่จริงมีค่าที่ไม่ถูกต้องโดยส่วนตัวฉันชอบเรียนพิมพ์แทนค่าดั้งเดิม แต่อาจเป็นเพียงฉัน
Aadaam

9

ฉันเรียกมันstructหรือrecordเพราะมันถูกนำมาใช้สำหรับการจัดเก็บข้อมูลและนี้เป็นเรื่องธรรมดามากที่จะภาษาเช่นCในขณะที่คุณสามารถดูมี: struct (โปรแกรมภาษา C) โดยส่วนตัวแล้วฉันต้องการใช้structคลาสที่เหมาะสมและอ่านได้มากกว่า:

struct A
{
  public string something;
  public int a;
}

พวกเขามักจะใช้เป็นDTOs (Data Transfer Object)ตามที่คนอื่นพูด


4
ปัญหาของ struct คือ "struct" นั้นเป็นคำสำคัญในหลายภาษา ตัวอย่างเช่น C # ถือว่า structs เป็นชนิดค่าที่มีซีแมนทิกส์ต่างกัน สิ่งนี้ก็เป็นจริงสำหรับ "บันทึก" ในบางภาษา (PL / SQL)
เหยี่ยว

5

สิ่งเหล่านี้รู้จักกันในชื่อOld Plain __ Objects (PO_Os) โดยที่ blank คือ Java หรือ C หรือ CIL หรือภาษาที่คุณใช้

หากพวกมันถูกใช้เป็นบล็อคข้อมูลอย่างง่ายสำหรับการสื่อสารพวกเขาก็สามารถรู้จักกันในชื่อData Transfer Objects (DTOs)

หากพวกเขากำลังเป็นตัวแทนของข้อมูลที่ได้รับจากภายนอกบางพวกเขาสามารถเป็นที่รู้จักในฐานะหน่วยงาน


6
คุณกำลังคิดถึง POD - เป็นความคิดที่แตกต่างกันมาก POJO อย่างชัดเจนรวมถึง "ตรรกะทางธุรกิจ" แต่ไม่รวมการพึ่งพากรอบงานเฉพาะ
Tom Hawtin - tackline

POD ได้รับอนุญาตให้มีวิธีการอย่างน้อยใน C ++ พวกเขาเพียงแค่ต้องมีสิ่งก่อสร้างเล็กน้อยสิ่งก่อสร้างสิ่งคัดลอกสิ่งก่อสร้างและสิ่งก่อสร้างที่กำหนดสมาชิกข้อมูลสาธารณะเท่านั้นไม่มีคลาสพื้นฐานและไม่มีฟังก์ชันเสมือน โดยพื้นฐานแล้วพวกเขาเพียงแค่ต้องเข้ากันได้กับ C struct
Dirk Holsopple

2

ฉันจะเรียกชั้นเช่นนี้เป็นผู้ถือข้อมูลที่ไม่แน่นอนและบางครั้งก็ใช้รูปแบบทั่วไป:

class DataHolder<T>
{
   public T dat;
}

โปรดทราบว่าการห่อdatภายในพร็อพเพอร์ตี้จะทำให้ประสิทธิภาพลดลงและไม่ได้รับประโยชน์เนื่องจากไม่มีสิ่งใดที่ตัวเข้าถึงคุณสมบัติสามารถทำได้ (นอกเหนือจากการอ่าน / เขียนฟิลด์) ซึ่งจะไม่ทำให้แอพพลิเคชั่นบางอย่างเสียหาย นอกจากนี้อาจจำเป็นต้องใช้Interlockedวิธีการที่มีdat(หรือถ้าเป็นโครงสร้างพร้อมเขตข้อมูล) แต่ไม่สามารถทำได้หากdatถูกห่อในคุณสมบัติ

โปรดทราบว่าในขณะที่ผู้ถือข้อมูลที่ไม่แน่นอนอาจมีประโยชน์สำหรับประเภท (ไม่แน่นอนหรือไม่) ซึ่งจำเป็นต้องเก็บข้อมูลพวกเขาไม่สามารถใช้สำหรับการแลกเปลี่ยนข้อมูลได้อย่างปลอดภัยในลักษณะเดียวกับประเภทที่ไม่เปลี่ยนรูปแบบ ตัวอย่างเช่นคำสั่งเช่น:

myData = myCollection.GetData(myKey);

จะมีความหมายที่ชัดเจนหากGetDataส่งกลับประเภทชั้นที่ไม่เปลี่ยนรูปหรือ struct ("ไม่แน่นอน" หรือไม่) ซึ่งไม่ได้มีการอ้างอิงถึงข้อมูลที่ไม่แน่นอน ถ้ามันส่งคืนคลาสอ็อบเจ็กต์ที่ไม่แน่นอนอย่างไรก็ตามมันจะไม่ชัดเจนว่าการเปลี่ยนแปลงใด ๆ กับอ็อบเจ็กต์นั้นจะถูกละเว้นโดยการรวบรวมพื้นฐานส่งผลให้มีการอัพเดตใหม่ทั้งหมดหรือทำให้เกิดพฤติกรรมที่น่ารำคาญหรือคาดเดาไม่ได้

หากมีใครต้องการเก็บรวบรวมข้อมูลที่ส่งคืนในวัตถุที่เปลี่ยนแปลงได้กระบวนทัศน์ที่ถูกต้องมักจะเป็นสิ่งที่ต้องการ:

var myData = new WhateverType();
myCollection.GetData(myKey, myData);
myData.ModifySomehow();
myCollection.StoreData(myKey, myData);

การใช้วิธีการนั้นมีความหมายชัดเจนที่GetDataจะทำให้myDataข้อมูลจากการรวบรวม แต่myCollectionจะไม่ถูกคาดหวังว่าจะอ้างอิงถึงเมื่อฟังก์ชั่นเสร็จสมบูรณ์และจะไม่ใช้เพื่อวัตถุประสงค์อื่นใด StoreDataจะคัดลอกข้อมูลmyDataไปยังโครงสร้างข้อมูลภายในของตัวเองโดยไม่ต้องอ้างอิง โปรดทราบว่าข้อดีอย่างหนึ่งของวิธีนี้คือถ้ารหัสลูกค้าจะอ่านรายการข้อมูลจำนวนมากภายในลูปมันอาจสร้างอินสแตนซ์myDataนอกวงหนึ่งอย่างปลอดภัยแล้วนำอินสแตนซ์เดียวกันนั้นกลับมาใช้ใหม่ทุกครั้ง ในทำนองเดียวกันmyCollectionอาจสามารถใช้งานอินสแตนซ์ของวัตถุที่เชื่อมโยงกับคีย์ (คัดลอกข้อมูลจากอินสแตนซ์ที่ส่งผ่าน) โดยไม่ต้องสร้างอินสแตนซ์ใหม่


0

ฉันเรียกพวกเขาว่าหน่วยงานขึ้นอยู่กับบริบท ในแอปพลิเคชันทางธุรกิจที่น่าเบื่อของฉันพวกเขามักจะแมป 1: 1 กับ DER ของฉัน


0

Schemaฉันจะเรียกมันว่า

สิ่งนี้ครอบคลุมการใช้งานหลายอย่างเช่นการเป็นตัวแทนของตารางฐานข้อมูลหรือการบันทึก deserialised หรือ DTO เป็นต้น

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