ฉันควรเพิ่มคำนำหน้า“ Abstract” ในคลาสนามธรรมของฉันหรือไม่ [ปิด]


20

Taskสมมติว่าฉันมีระดับนามธรรมชื่อ

มีมาตรฐานหรืออนุสัญญาที่แนะนำให้ฉันควรตั้งชื่อAbstractTaskแทนหรือไม่?


ข้อตกลงการตั้งชื่อที่ระบุไว้ที่นี่: oracle.com/technetwork/java/codeconventions-135099.htmlแนะนำว่าไม่แม้ว่าลิงก์นี้: stackoverflow.com/questions/1006332/…บอกว่าคุณทำได้และมันจะไม่เลวร้ายอะไรถ้าคุณ
FrustratedWithFormsDesigner

ใน C # การประชุมมาตรฐานจะต่อท้ายด้วย '* Base'
Den

คำตอบ:


26

ตาม Java ที่มีประสิทธิภาพของรายการ (18 รายการ) คำนำหน้าบทคัดย่อเป็นแบบแผนที่ใช้ในกรณีพิเศษ

คุณสามารถรวมข้อดีของอินเทอร์เฟซและคลาสนามธรรมโดยจัดให้มีคลาสการใช้โครงร่างนามธรรมเพื่อไปกับอินเทอร์เฟซแบบ nontrivial แต่ละรายการที่คุณส่งออก ... โดยการประชุมการใช้โครงร่างเรียกว่า AbstractInterface โดยที่Interfaceเป็นชื่อของอินเตอร์เฟสที่ใช้

แต่โบลชก็ชี้ให้เห็นว่าชื่อ SkeletalInterface นั้นสมเหตุสมผล แต่ก็สรุปว่า

การประชุมบทคัดย่อได้รับการยอมรับอย่างมั่นคงแล้ว

ตามที่คำตอบอื่น ๆ ได้ชี้ให้เห็นโดยทั่วไปแล้วไม่มีเหตุผลใดที่จะใช้หลักการตั้งชื่อนี้กับคลาสนามธรรมทั้งหมด


15

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

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

ในบันทึกอื่น ๆข้อกำหนดของรหัสสำหรับภาษาการเขียนโปรแกรม Java: 9.ข้อกำหนดการตั้งชื่อไม่แนะนำให้ต้องการ:

ชื่อชั้นควรเป็นคำนามในกรณีผสมกับตัวอักษรตัวแรกของแต่ละคำภายในตัวพิมพ์ใหญ่ พยายามทำให้ชื่อคลาสของคุณเรียบง่ายและเป็นคำอธิบาย ใช้ทั้งคำย่อ - หลีกเลี่ยงคำย่อและตัวย่อ (ยกเว้นตัวย่อที่ใช้กันอย่างแพร่หลายมากกว่าแบบยาวเช่น URL หรือ HTML)


13

ไม่ได้ Intellisense จะบอกฉันเล็กน้อยว่ามันเป็นนามธรรมหรือไม่ดังนั้นคุณแค่ละเมิด DRY ที่นี่


21
-1 การเพิ่มabstractเข้าไปในชื่อคลาสไม่ละเมิด DRY และไม่ใช่ทุกคนที่ใช้การ intellisence ตัวอย่างเช่นคุณจะทำอย่างไรถ้าคุณกำลังอ่านโค้ดบนเว็บเพจหรือถ้ามันเป็นส่วนหนึ่งของแพตช์ที่คุณกำลังดูในเท็กซ์เอดิเตอร์ข้อความธรรมดาหรือเครื่องมือดิฟภายนอก
ไบรอัน Oakley

10
@ ไบรอัน: แน่นอนมันเป็นการละเมิด DRY abstract class AbstractName? เห็นได้ชัดว่ามี "นามธรรม" สองครั้ง และถ้าคุณไม่ได้ใช้ Intellisense นั่นคือปัญหาของคุณทุกคนใช้เครื่องมือที่มีเหตุผลเพื่อดูรหัส
DeadMG

13
"everbody"? คนส่วนใหญ่ที่ฉันรู้จักใช้ emacs และ vi กับบางคนที่ใช้ eclipse การพูดอะไรบางอย่างคือ "ปัญหาของคุณ" ไม่ใช่คำจำกัดความของการทำงานเป็นทีม จุดด้อยคุณภาพของฉันคือคุณไม่สามารถตั้งกฎแบบครอบคลุมและบอกว่ามันเป็นอย่างไร ทีมที่ต่างกันมีข้อกำหนดที่แตกต่างกันและไม่ใช่ทุกคนที่ต้องการความช่วยเหลือในการใช้ระบบ Intellisense นอกจากที่ฉันกล่าวมีหลายครั้งเมื่อคุณดูรหัสในเครื่องมืออื่นนอกเหนือจากตัวแก้ไขหลักหรือ IDE ของคุณ
ไบรอัน Oakley

1
+1 ละเมิด DRY อย่างแน่นอน การพึ่งพา Intellisense ค่อนข้างแข็งแกร่ง แต่อย่างน้อยทุกคนที่ใช้คลาสฐานควรมองว่าสิ่งที่พวกเขากำลังขยายเป็นส่วนหนึ่งของ SOLID
Gary Rowe

8
@BryanOakley ทำไมไม่ใส่ชื่อสาธารณะและสุดท้ายด้วย? ชื่อชั้นจะมีลักษณะเหมือน PublicAbstractPersonThatImplementsInterfaceHuman อืมไม่ค่อยแน่ใจว่ามันดี แต่ฉันเห็นด้วยไม่มีอะไรเช่นอนุสัญญาสากล - ใช้อะไรก็ตามที่เพิ่มประสิทธิภาพการทำงานร่วมกันของทีม
Apoorv Khurasia

9

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

IDE ส่วนใหญ่จะทำให้คุณสามารถใช้ข้อมูลนั้นได้อย่างง่ายดายดังนั้นจึงไม่จำเป็นต้องวางในชื่อและจะสะอาดกว่าหากไม่ต้องใส่ข้อมูล มันชวนให้นึกถึงสัญกรณ์ฮังการีสำหรับการตั้งชื่อตัวแปรและที่ถือว่าเป็นรูปแบบที่ไม่ดีในตอนนี้ต่อวัน Taskผมขอแนะนำให้เพียงแค่เรียกมันว่า


9

ใน. NET การใช้ "ฐาน" เป็นคำต่อท้ายเพื่อแสดงคลาสฐานนามธรรมมักจะเห็น ฉันจะเลื่อนไปที่คำตอบอื่น ๆ ว่านี่เป็นเรื่องธรรมดาใน Java หรือไม่


1
+1 สำหรับส่วนต่อท้าย "ฐาน" และ "Impl" พวกเขาสร้างจุดโครงสร้าง (คลาสนามธรรมจะเป็นฐานสำหรับบางสิ่ง)
vski

7
@ vski: ไม่ฉันไม่เห็นด้วยอย่างยิ่ง: พวกเขาเจ็บที่ไร้ประโยชน์ โดยทั่วไปแล้วดีมากที่จะตั้งชื่ออินเทอร์เฟซหรือคลาสพื้นฐานของคุณด้วยชื่อทั่วไปอธิบายถึงอินเทอร์เฟซและการใช้งานที่เป็นรูปธรรมของคุณด้วยชื่อที่ชัดเจนมากขึ้น
haylem

3
ฉันมักจะใช้ ... Base สำหรับคลาสพื้นฐานที่อยู่เบื้องหลังส่วนต่อประสาน ชื่อที่ดีนั้นได้รับการดำเนินการโดยอินเทอร์เฟซและไม่ได้ใช้คลาสฐานโดยรหัสลูกค้า
starblue

1
@Haylem หลายรูปแบบการออกแบบจาวาใช้อินเตอร์เฟสที่มีการใช้งานที่คาดหวังเพียงหนึ่งเดียว Impl เป็นคำต่อท้ายที่มีประโยชน์มากในกรณีเหล่านี้
funkybro

เกี่ยวกับการใช้ Impl ให้ดูที่Default vs Impl - อยู่ให้ห่างจาก Impl! การใช้ Base เป็นคำต่อท้าย (เช่น TaskBase) แสดงว่าคลาสฐานเป็นรูปแบบแทนที่จะเป็นโครงสร้างภาษา
Gary Rowe

8

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

อย่างไรก็ตามถ้าทำให้สมบูรณ์แบบในการเรียกการใช้งานบทคัดย่อของโรงงาน AbstractFactory เพราะมันเกี่ยวข้องกับเจตนาของชั้นเรียน

โดยทั่วไปให้ใช้หลักการตั้งชื่อที่ช่วยในการถ่ายทอดข้อมูลส่วนใหญ่เกี่ยวกับเป้าหมายในชั้นเรียนของคุณ

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

พิจารณา:

IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl

ตรงข้ามกับ:

Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
                                   <-- Ferrari
                                   <-- Trabi

ฉันชอบคนหลังมาก


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


3

กฎง่ายๆคือการไม่รวมคุณสมบัติในชื่อที่ชัดเจนจากไวยากรณ์ ตั้งแต่ในจาวาคุณต้องทำเครื่องหมายคลาสนามธรรมด้วยคำสำคัญที่มีชื่อ aptly abstractฉันจะไม่รวมไว้ในชื่อ ยกตัวอย่างเช่นใน C ++ เคสไม่ชัดเจนมากนัก แต่อย่างน้อยคอมไพเลอร์จะบอกคุณเมื่อคุณใช้คลาสนามธรรมอย่างไม่ถูกต้อง ในบางอย่างเช่น Python อีกครั้งการตั้งชื่อคลาสนามธรรมอย่างชัดเจนไม่ใช่ความคิดที่ไม่ดี

ข้อยกเว้นปกติของกฎคือเมื่อชื่อไม่ชัดเจน ถ้าด้วยเหตุผลอะไรก็ตามที่มีเป็น subclass คอนกรีตTask(ในตัวอย่างอื่น ๆ นี้อาจจะเหมาะสมมากขึ้น แต่สิ่งที่) AbstractTaskจากนั้นตรวจสอบว่าการใช้งาน


... หรืออินเทอร์เฟซเช่นListและAbstractListคลาส (ซึ่งใช้งาน)

3
protected abstract SomeClass { }

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

ในกรณีส่วนใหญ่Abstractเรียนไม่ควรจะเป็นส่วนหนึ่งของการหันหน้าไปทางประชาชน API AbstractSomeClassถ้ามันมีจริงๆควรจะเป็นเหตุผลที่ดีและมีเหตุผลที่ดีควรให้ชื่อที่ดีอย่างเห็นได้ชัดกว่าคนอื่น

ในกรณีส่วนใหญ่หากคุณไม่สามารถหาชื่อที่มีความหมายมากกว่านี้ได้คุณอาจต้องทำการออกแบบใหม่


0

ห้าเซนต์ของฉันคุณอาจมีการใช้งานของคลาสนามธรรมและพวกเขาจะมีชื่อว่า 'SomeSpecificTask', 'TaskWithBubbles', 'StrangeTask' เป็นต้นดังนั้นจะไม่มีการปะทะกันระหว่างชื่อ 'Task' และพวกเขา

นอกจากนี้คำว่า "นามธรรม" เป็นเรื่องเกี่ยวกับไวยากรณ์ภาษาไม่ใช่เอนทิตีโดเมนธุรกิจดังนั้นฉันไม่ต้องการใช้เป็นส่วนหนึ่งของชื่อ

ในอีกทางหนึ่งคำตอบที่นี่ฉันเห็นข้อความที่ตัดตอนมาจาก J.Bloch Effective Java ซึ่งกล่าวว่าการใช้ 'abstract' เป็นส่วนหนึ่งของชื่อเป็นการฝึกฝนที่ดี อาจเป็นเช่นนั้น แต่อย่างไรก็ตามในอนุสัญญาโค้ดจาวาอย่างเป็นทางการไม่มีอะไรเกี่ยวกับเรื่องนี้


public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>- ไม่สามารถใช้Listเป็นชื่อสำหรับAbstractListคลาสได้เนื่องจากเป็นชื่อของอินเทอร์เฟซ มันเป็นวิธีปฏิบัติที่ได้รับการยอมรับเป็นอย่างดีและเป็นส่วนหนึ่งของรหัส Java อย่างเป็นทางการที่ใช้งานในกรณีที่บางสิ่งที่ใช้งานอินเทอร์เฟซอาจจะหรืออาจจะไม่ขยายคลาสนามธรรม

-1

หากคุณทำงานเป็นทีมทั้งทีมจะต้องตัดสินใจว่าคุณควรใช้คำนำหน้าคลาสนามธรรมด้วย "Abstract" หรือไม่

ถ้าคุณทำงานด้วยตัวคุณเองมันก็ขึ้นอยู่กับคุณแล้วไม่ใช่ฉันหรือคนอื่น ๆ ในเว็บไซต์นี้


-2

ฉันไม่ใช่นักพัฒนา Java (INAJD?) และไม่รู้จักระบบการตั้งชื่อมาตรฐานสำหรับสิ่งต่าง ๆ แต่ฉันคิดTaskว่ามันฟังดูเป็นนามธรรมมากพอที่จะสามารถยืนอยู่คนเดียวได้


RE: ส่วนต่อท้ายฐาน: stackoverflow.com/a/429494/1782
juan

-2

ถ้าคุณต้องการเขียนAbstractSyntaxTreeคลาสนามธรรม หรือบางทีอาจจะเป็นเพียงนามธรรมSyntaxTree?

มันไม่ธรรมดาและทำให้คนสับสนได้ง่าย


-2

ฉันทำสิ่งนี้แล้ว ฉันเพิ่ม 'Abstract' เป็นคำนำหน้าให้กับคลาสนามธรรมของฉันชื่อ AbstractOperation เหตุผลที่ฉันทำเช่นนี้คือมีแพ็คเกจอื่นที่มีคลาสที่ไม่เป็นนามธรรมชื่อ Operation และมันช่วยทีมของฉันและโปรแกรมเมอร์ที่เข้ามาแทนที่ในภายหลังเพื่อหลีกเลี่ยงความสับสนระหว่างทั้งสอง

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