Task
สมมติว่าฉันมีระดับนามธรรมชื่อ
มีมาตรฐานหรืออนุสัญญาที่แนะนำให้ฉันควรตั้งชื่อAbstractTask
แทนหรือไม่?
Task
สมมติว่าฉันมีระดับนามธรรมชื่อ
มีมาตรฐานหรืออนุสัญญาที่แนะนำให้ฉันควรตั้งชื่อAbstractTask
แทนหรือไม่?
คำตอบ:
ตาม Java ที่มีประสิทธิภาพของรายการ (18 รายการ) คำนำหน้าบทคัดย่อเป็นแบบแผนที่ใช้ในกรณีพิเศษ
คุณสามารถรวมข้อดีของอินเทอร์เฟซและคลาสนามธรรมโดยจัดให้มีคลาสการใช้โครงร่างนามธรรมเพื่อไปกับอินเทอร์เฟซแบบ nontrivial แต่ละรายการที่คุณส่งออก ... โดยการประชุมการใช้โครงร่างเรียกว่า AbstractInterface โดยที่Interfaceเป็นชื่อของอินเตอร์เฟสที่ใช้
แต่โบลชก็ชี้ให้เห็นว่าชื่อ SkeletalInterface นั้นสมเหตุสมผล แต่ก็สรุปว่า
การประชุมบทคัดย่อได้รับการยอมรับอย่างมั่นคงแล้ว
ตามที่คำตอบอื่น ๆ ได้ชี้ให้เห็นโดยทั่วไปแล้วไม่มีเหตุผลใดที่จะใช้หลักการตั้งชื่อนี้กับคลาสนามธรรมทั้งหมด
ไม่มีการประชุม มันคือทั้งหมดที่เกี่ยวกับสิ่งที่จะช่วยคุณในฐานะนักพัฒนาโค้ดให้เร็วขึ้นและดีขึ้นและช่วยให้ผู้อื่นเข้าใจโค้ดของคุณ
ถามคนที่จะเห็นและดูแลรหัส พวกเขาจะเห็นอะไรดี อะไรจะทำให้ง่ายขึ้นสำหรับพวกเขา จากนั้นตั้งชื่อตามสิ่งที่พวกเขาต้องการ
ในบันทึกอื่น ๆข้อกำหนดของรหัสสำหรับภาษาการเขียนโปรแกรม Java: 9.ข้อกำหนดการตั้งชื่อไม่แนะนำให้ต้องการ:
ชื่อชั้นควรเป็นคำนามในกรณีผสมกับตัวอักษรตัวแรกของแต่ละคำภายในตัวพิมพ์ใหญ่ พยายามทำให้ชื่อคลาสของคุณเรียบง่ายและเป็นคำอธิบาย ใช้ทั้งคำย่อ - หลีกเลี่ยงคำย่อและตัวย่อ (ยกเว้นตัวย่อที่ใช้กันอย่างแพร่หลายมากกว่าแบบยาวเช่น URL หรือ HTML)
ไม่ได้ Intellisense จะบอกฉันเล็กน้อยว่ามันเป็นนามธรรมหรือไม่ดังนั้นคุณแค่ละเมิด DRY ที่นี่
abstract
เข้าไปในชื่อคลาสไม่ละเมิด DRY และไม่ใช่ทุกคนที่ใช้การ intellisence ตัวอย่างเช่นคุณจะทำอย่างไรถ้าคุณกำลังอ่านโค้ดบนเว็บเพจหรือถ้ามันเป็นส่วนหนึ่งของแพตช์ที่คุณกำลังดูในเท็กซ์เอดิเตอร์ข้อความธรรมดาหรือเครื่องมือดิฟภายนอก
abstract class AbstractName
? เห็นได้ชัดว่ามี "นามธรรม" สองครั้ง และถ้าคุณไม่ได้ใช้ Intellisense นั่นคือปัญหาของคุณทุกคนใช้เครื่องมือที่มีเหตุผลเพื่อดูรหัส
นี่เป็นเรื่องของการตั้งค่า (แต่แนวปฏิบัติที่ไม่ดี) แต่คนส่วนใหญ่ไม่ชอบที่จะเห็นส่วนหนึ่งของตัวระบุในชื่อของคลาส
IDE ส่วนใหญ่จะทำให้คุณสามารถใช้ข้อมูลนั้นได้อย่างง่ายดายดังนั้นจึงไม่จำเป็นต้องวางในชื่อและจะสะอาดกว่าหากไม่ต้องใส่ข้อมูล มันชวนให้นึกถึงสัญกรณ์ฮังการีสำหรับการตั้งชื่อตัวแปรและที่ถือว่าเป็นรูปแบบที่ไม่ดีในตอนนี้ต่อวัน Task
ผมขอแนะนำให้เพียงแค่เรียกมันว่า
ใน. NET การใช้ "ฐาน" เป็นคำต่อท้ายเพื่อแสดงคลาสฐานนามธรรมมักจะเห็น ฉันจะเลื่อนไปที่คำตอบอื่น ๆ ว่านี่เป็นเรื่องธรรมดาใน Java หรือไม่
ในความคิดของฉันชื่อของกิจการไม่ควรนำเสนอข้อมูลเกี่ยวกับโครงสร้างชนิดของมัน แต่เกี่ยวกับความหมายของมัน ดังนั้นจึงไม่สมเหตุสมผลที่จะกำหนดคลาสของคุณเป็น "AbstractSomething" ถ้าสิ่งที่เป็นนามธรรมไม่ได้เป็นส่วนหนึ่งของเป้าหมายรันไทม์ มันเป็นคลาสนามธรรมพื้นฐานสำหรับโปรแกรมเมอร์และไม่จำเป็นต้องสะท้อนให้เห็นในชื่อ
อย่างไรก็ตามถ้าทำให้สมบูรณ์แบบในการเรียกการใช้งานบทคัดย่อของโรงงาน AbstractFactory เพราะมันเกี่ยวข้องกับเจตนาของชั้นเรียน
โดยทั่วไปให้ใช้หลักการตั้งชื่อที่ช่วยในการถ่ายทอดข้อมูลส่วนใหญ่เกี่ยวกับเป้าหมายในชั้นเรียนของคุณ
SomethingImpl
ในทำนองเดียวกันอยู่ที่ชัดเจนจาก เราไม่สนใจว่ามันเป็นการใช้งานและไม่ใช่คลาสพื้นฐาน หากลำดับชั้นของคลาสของคุณได้รับการออกแบบมาอย่างเหมาะสมสำหรับการสืบทอดดังนั้นบางคนสามารถสืบทอดจากมันได้ แน่นอนว่าจะไม่มีค่าในการเพิ่มส่วนต่อท้าย "Impl" เพิ่มเติมหรือสิ่งประดิษฐ์อื่น ๆ นอกจากนี้ยังไม่มีค่าในการเพิ่มคำต่อท้าย "อินเทอร์เฟซ" หรือคำนำหน้า "ฉัน"
พิจารณา:
IVehicle <-- IMotoredVehicle <-- AbstractCar <-- CarImpl
ตรงข้ามกับ:
Vehicle <-- MotoredVehicle <-- Car <-- DefaultCar
<-- Ferrari
<-- Trabi
ฉันชอบคนหลังมาก
นี้ในการเคารพบางส่วนคล้ายกับการใช้ผิดวัตถุประสงค์ที่เห็นได้ชัดของฮังการีโน้ตว่าหลังให้มันตัวแทนที่ไม่ดีเป็นคนเริ่มที่จะตีความผิดว่ามันเป็นที่กำหนดให้นักพัฒนาที่จะนำหน้าตัวแปรของพวกเขาด้วยตัวบ่งชี้ประเภทของตัวแปรที่ แม้ว่าบางครั้งสิ่งนี้สามารถใช้งานได้ (ส่วนใหญ่ถ้าคุณขี้เกียจที่จะค้นหาคำจำกัดความของประเภท) มันก็ไม่มีประโยชน์อะไร ความคิดดั้งเดิมของ Simonyi ที่มีสัญกรณ์ฮังการีคือใช้เป็นเครื่องช่วยในการเตือนความจำของผู้พัฒนาความสามารถของเอนทิตีไม่ใช่ประเภทของมัน
กฎง่ายๆคือการไม่รวมคุณสมบัติในชื่อที่ชัดเจนจากไวยากรณ์ ตั้งแต่ในจาวาคุณต้องทำเครื่องหมายคลาสนามธรรมด้วยคำสำคัญที่มีชื่อ aptly abstract
ฉันจะไม่รวมไว้ในชื่อ ยกตัวอย่างเช่นใน C ++ เคสไม่ชัดเจนมากนัก แต่อย่างน้อยคอมไพเลอร์จะบอกคุณเมื่อคุณใช้คลาสนามธรรมอย่างไม่ถูกต้อง ในบางอย่างเช่น Python อีกครั้งการตั้งชื่อคลาสนามธรรมอย่างชัดเจนไม่ใช่ความคิดที่ไม่ดี
ข้อยกเว้นปกติของกฎคือเมื่อชื่อไม่ชัดเจน ถ้าด้วยเหตุผลอะไรก็ตามที่มีเป็น subclass คอนกรีตTask
(ในตัวอย่างอื่น ๆ นี้อาจจะเหมาะสมมากขึ้น แต่สิ่งที่) AbstractTask
จากนั้นตรวจสอบว่าการใช้งาน
protected abstract SomeClass { }
นี่บอกฉันว่านี่เป็นคลาสนามธรรม การเพิ่มคำนำหน้าเป็นคำซ้ำซากและการต่อต้านรูปแบบและไม่เหมาะสมในกรณีส่วนใหญ่ให้ดูลิงก์ที่พูดถึงpackage local
การเป็นข้อยกเว้น
ในกรณีส่วนใหญ่Abstract
เรียนไม่ควรจะเป็นส่วนหนึ่งของการหันหน้าไปทางประชาชน API AbstractSomeClass
ถ้ามันมีจริงๆควรจะเป็นเหตุผลที่ดีและมีเหตุผลที่ดีควรให้ชื่อที่ดีอย่างเห็นได้ชัดกว่าคนอื่น
ในกรณีส่วนใหญ่หากคุณไม่สามารถหาชื่อที่มีความหมายมากกว่านี้ได้คุณอาจต้องทำการออกแบบใหม่
ห้าเซนต์ของฉันคุณอาจมีการใช้งานของคลาสนามธรรมและพวกเขาจะมีชื่อว่า 'SomeSpecificTask', 'TaskWithBubbles', 'StrangeTask' เป็นต้นดังนั้นจะไม่มีการปะทะกันระหว่างชื่อ 'Task' และพวกเขา
นอกจากนี้คำว่า "นามธรรม" เป็นเรื่องเกี่ยวกับไวยากรณ์ภาษาไม่ใช่เอนทิตีโดเมนธุรกิจดังนั้นฉันไม่ต้องการใช้เป็นส่วนหนึ่งของชื่อ
ในอีกทางหนึ่งคำตอบที่นี่ฉันเห็นข้อความที่ตัดตอนมาจาก J.Bloch Effective Java ซึ่งกล่าวว่าการใช้ 'abstract' เป็นส่วนหนึ่งของชื่อเป็นการฝึกฝนที่ดี อาจเป็นเช่นนั้น แต่อย่างไรก็ตามในอนุสัญญาโค้ดจาวาอย่างเป็นทางการไม่มีอะไรเกี่ยวกับเรื่องนี้
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
- ไม่สามารถใช้List
เป็นชื่อสำหรับAbstractList
คลาสได้เนื่องจากเป็นชื่อของอินเทอร์เฟซ มันเป็นวิธีปฏิบัติที่ได้รับการยอมรับเป็นอย่างดีและเป็นส่วนหนึ่งของรหัส Java อย่างเป็นทางการที่ใช้งานในกรณีที่บางสิ่งที่ใช้งานอินเทอร์เฟซอาจจะหรืออาจจะไม่ขยายคลาสนามธรรม
หากคุณทำงานเป็นทีมทั้งทีมจะต้องตัดสินใจว่าคุณควรใช้คำนำหน้าคลาสนามธรรมด้วย "Abstract" หรือไม่
ถ้าคุณทำงานด้วยตัวคุณเองมันก็ขึ้นอยู่กับคุณแล้วไม่ใช่ฉันหรือคนอื่น ๆ ในเว็บไซต์นี้
ฉันไม่ใช่นักพัฒนา Java (INAJD?) และไม่รู้จักระบบการตั้งชื่อมาตรฐานสำหรับสิ่งต่าง ๆ แต่ฉันคิดTask
ว่ามันฟังดูเป็นนามธรรมมากพอที่จะสามารถยืนอยู่คนเดียวได้
ถ้าคุณต้องการเขียนAbstractSyntaxTree
คลาสนามธรรม หรือบางทีอาจจะเป็นเพียงนามธรรมSyntaxTree
?
มันไม่ธรรมดาและทำให้คนสับสนได้ง่าย
ฉันทำสิ่งนี้แล้ว ฉันเพิ่ม 'Abstract' เป็นคำนำหน้าให้กับคลาสนามธรรมของฉันชื่อ AbstractOperation เหตุผลที่ฉันทำเช่นนี้คือมีแพ็คเกจอื่นที่มีคลาสที่ไม่เป็นนามธรรมชื่อ Operation และมันช่วยทีมของฉันและโปรแกรมเมอร์ที่เข้ามาแทนที่ในภายหลังเพื่อหลีกเลี่ยงความสับสนระหว่างทั้งสอง