วิธีการตั้งชื่อโรงงานเช่นวิธีการ?


146

createผมคิดว่าส่วนใหญ่โรงงานเช่นวิธีการเริ่มต้นด้วย แต่ทำไมถึงเรียกว่า " สร้าง " ทำไมไม่ " สร้าง ", " สร้าง ", " สร้าง ", " สร้าง " หรืออย่างอื่น มันเป็นเพียงเรื่องของการลิ้มรสหรือไม่? การประชุมหรือไม่? หรือมีความหมายพิเศษใน "สร้าง"?

createURI(...) 
makeURI(...)
produceURI(...)
buildURI(...)
generateURI(...)

คุณจะเลือกแบบไหนและทำไม?


4
ฉันเคยทำงานในโครงการที่ชื่อวิธีการของโรงงาน "get ()" ตอนแรกสับสนมาก
Muxecoid

4
และตัวเลือกสุดท้ายไม่มีคำนำหน้าเกี่ยวกับอะไร เนื่องจากเรามักจะใช้โรงงานจากบริบทที่คงที่ตลอดเวลาจึงไม่ควรมีความชัดเจน? เพียงแค่ขอให้กระตุ้นการอภิปราย - createXyz()การตั้งค่าส่วนตัวของฉันคือ
vikingsteve

@ vikingsteve ในระบบที่ฉันสร้างขึ้นฉันใช้createคำนำหน้าเป็นเรื่องของการประชุมเพื่อความสอดคล้องของ API และเพราะเพียงแค่พิมพ์ตัวอักษรcจะทำให้พวกเขาทั้งหมดแสดงใน IDE ของ auto-complete ซึ่งจะทำให้ง่ายขึ้น สำหรับคนที่พยายามเรียนรู้สิ่งที่มีอยู่ ฉันจะได้มีMatrix4f.identity(), Matrix4f.transpose()ฯลฯ แต่พวกเขาต้องการจะได้เร็วขึ้นที่จะหาMatrix4f.createIdentity()และMatrix4f.createTranspose(...)ฯลฯ
code_dredd

คำตอบ:


117

ความคิดสุ่ม:

  • 'สร้าง' เหมาะกับคุณลักษณะที่ดีกว่าคำอื่น ๆ ส่วนใหญ่ คำที่ดีที่สุดถัดไปที่ฉันนึกได้จากส่วนบนของหัวคือ 'สร้าง' ในอดีต 'Alloc' (จัดสรร) อาจถูกนำมาใช้ในสถานการณ์ที่คล้ายกันซึ่งสะท้อนให้เห็นถึงความสำคัญในบล็อกของข้อมูลมากกว่าวัตถุในภาษาเช่น C

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

  • 'การสร้าง' อยู่ใกล้ แต่มักใช้เพื่ออธิบายสเตจเฉพาะในกระบวนการสร้างวัตถุ (จัดสรร / ใหม่สร้างสร้างเริ่มต้น ... )

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

  • 'สร้าง' สำหรับฉันหมายถึงการคำนวณที่ใช้ในการสร้างค่าจากอินพุตเช่นการสร้างรหัสแฮชหรือตัวเลขสุ่ม

  • 'ผลิต', 'สร้าง', 'สร้าง' จะพิมพ์ / อ่านได้นานกว่า 'สร้าง' โปรแกรมเมอร์ในอดีตนิยมใช้ชื่อย่อเพื่อลดการพิมพ์ / อ่าน


5
ยกนิ้วให้ "สร้าง"
pimbrouwers

103

Joshua Blochใน "Effective Java" แนะนำการตั้งชื่อต่อไปนี้

valueOf - ส่งคืนอินสแตนซ์ที่มีการพูดอย่างหลวม ๆ ค่าเดียวกันกับพารามิเตอร์ โรงงานแบบคงที่ดังกล่าวเป็นวิธีการแปลงประเภทอย่างมีประสิทธิภาพ

ของ - ทางเลือกสั้น ๆ ที่valueOfได้รับความนิยมโดยEnumSet(ข้อ 32)

getInstance - ส่งคืนอินสแตนซ์ที่อธิบายโดยพารามิเตอร์ แต่ไม่สามารถบอกได้ว่ามีค่าเดียวกัน ในกรณีของซิงเกิล getInstanceไม่มีพารามิเตอร์และส่งคืนอินสแตนซ์เดียว

newInstance - Like getInstanceยกเว้นว่าnewInstanceรับประกันว่าแต่ละอินสแตนซ์ที่ส่งคืนจะแตกต่างจากผู้อื่นทั้งหมด

รับประเภท - ชอบgetInstanceแต่ใช้เมื่อวิธีการที่โรงงานอยู่ในระดับที่แตกต่างกัน Typeหมายถึงประเภทของวัตถุที่ถูกส่งคืนโดยวิธีการจากโรงงาน

ใหม่Type - Like newInstanceแต่ใช้เมื่อวิธีการจากโรงงานอยู่ในคลาสอื่น Typeหมายถึงประเภทของวัตถุที่ถูกส่งคืนโดยวิธีการจากโรงงาน


คุณให้คะแนนfromอย่างไร เช่นการสมมุติId.of("abc")vs Id.from("xyz")…หรือจะfromแนะนำให้เกิดตรรกะเพิ่มเติม (เช่นการแยกวิเคราะห์อินพุตการค้นหา / สหสัมพันธ์จาก / กับข้อมูลอื่น, …)? มันยากมากที่จะค้นหา "of vs from": D
knittl

22

ต้องการเพิ่มสองสามคะแนนที่ฉันไม่เห็นในคำตอบอื่น ๆ

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

  2. Guava เป็นแหล่งเก็บข้อมูลที่ดีของแนวคิดการตั้งชื่อจากโรงงาน เป็นที่นิยมในสไตล์ DSL ที่ดี ตัวอย่าง:

    Lists.newArrayListWithCapacity(100);
    ImmutableList.of("Hello", "World");
    

1
คุณพูดถูก Guava เป็นห้องสมุดที่ยอดเยี่ยมพร้อมรหัสที่อ่านง่าย
deamon

11

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

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

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


3

ฉันคิดว่ามันเกิดจาก“ การสร้างวัตถุ” อย่างไรก็ตามในภาษาอังกฤษคำว่า "สร้าง" มีความสัมพันธ์กับความคิด "ที่จะทำให้เกิดขึ้นเพราะเป็นสิ่งที่ไม่เหมือนใครที่จะไม่พัฒนาตามธรรมชาติหรือไม่ได้เกิดจากกระบวนการธรรมดา" และ "วิวัฒนาการจากความคิดของตัวเองหรือ จินตนาการในฐานะงานศิลปะหรือสิ่งประดิษฐ์” ดังนั้นดูเหมือนว่า "สร้าง" ไม่ใช่คำที่เหมาะสมที่จะใช้ “ ทำ” ในทางกลับกันหมายถึง“ ทำให้เกิดขึ้นโดยการสร้างหรือเปลี่ยนวัสดุรวมส่วนประกอบ ฯลฯ ” ตัวอย่างเช่นคุณไม่ได้สร้างชุดคุณสร้างชุด (วัตถุ) ดังนั้นในความคิดของฉัน "ทำ" โดยความหมาย "เพื่อผลิต; สาเหตุที่มีอยู่หรือเกิดขึ้น; นำมาซึ่ง” เป็นคำที่ดีกว่าสำหรับวิธีการของโรงงาน


3

ฉันชอบใหม่ ถึงฉัน

var foo = newFoo();

อ่านดีกว่า

var foo = createFoo();

แปลเป็นภาษาอังกฤษเรามี foo เป็น foo ใหม่หรือ foo คือสร้าง foo ในขณะที่ฉันไม่ใช่ผู้เชี่ยวชาญด้าน grammer ฉันค่อนข้างแน่ใจว่าหลังไม่ถูกต้องตามหลักไวยากรณ์


พวกเขาทั้งสองทำงาน createFooเป็นฟังก์ชั่น fooไม่createFooเป็นอย่างที่คุณพูด เป็นผลมาจากfoo createFoo()
Krzysztof Czelusniak

2

การประชุมบางส่วนความหมายบางส่วน

วิธีการของโรงงาน (ส่งสัญญาณโดยแบบดั้งเดิมcreate) ควรเรียกใช้ตัวสร้างที่เหมาะสม ถ้าฉันเห็นbuildURIฉันจะสมมติว่ามันเกี่ยวข้องกับการคำนวณหรือการชุมนุมจากส่วนต่าง ๆ (และฉันจะไม่คิดว่ามีโรงงานที่เกี่ยวข้อง) สิ่งแรกที่ฉันคิดว่าเมื่อฉันเห็นgenerateURIคือการทำสิ่งที่สุ่มเหมือนลิงค์ดาวน์โหลดส่วนตัวใหม่ คำที่แตกต่างไม่เหมือนกันทุกคำทำให้เกิดความหมายที่แตกต่างกัน แต่ส่วนใหญ่ของพวกเขาไม่ธรรมดา


1

ฉันจะเรียกมันว่า UriFactory.Create()

ที่ไหน

UriFactoryเป็นชื่อของประเภทชั้นเรียนซึ่งมีวิธีการที่สร้างUriอินสแตนซ์

และCreate()วิธีการที่มากเกินไปสำหรับรูปแบบที่คุณมีในข้อกำหนดของคุณ

public static class UriFactory
{
    //Default Creator
    public static UriType Create() 
    {
    }

    //An overload for Create()
    public static UriType Create(someArgs) 
    {
    }
}

1
ในขณะที่ฉันเห็นด้วยกับการตั้งชื่อของคุณฉันไม่เห็นด้วยอย่างยิ่งกับการประชุมของคุณเกี่ยวกับการใช้ชื่อวิธีการใส่ Pascal
Chatatata

2
@ Leviathlon มันขึ้นอยู่กับภาษาการเขียนโปรแกรมและอนุสัญญาภายในเสมอ Pascal Case ใช้งานได้ดีสำหรับ langauges เช่น C #
momo

@momo แน่นอนฉันคิดว่าฉันมีข้อสันนิษฐานของภาษาที่พูดถึงคือ Java
Chatatata

0

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

ตอนนี้การสร้างจะให้เสียงที่ดีกว่าสำหรับฉันกระตุ้นความหมายที่ชัดเจนของการกระทำ

ใช่แล้วมันเป็นเรื่องของรสนิยม (วรรณกรรม)


0

โดยส่วนตัวแล้วฉันชอบinstantiateและinstantiateWithนั่นเป็นเพราะประสบการณ์ Unity and Objective C ของฉัน อนุสัญญาการตั้งชื่อภายในเอ็นจิ้น Unity ดูเหมือนจะหมุนรอบคำinstantiateเพื่อสร้างอินสแตนซ์ผ่านวิธีการจากโรงงานและ Objective C ดูเหมือนว่าต้องการwithระบุว่าพารามิเตอร์ / s คืออะไร วิธีนี้ใช้ได้ผลดีจริง ๆ ถ้าวิธีอยู่ในคลาสที่จะถูกยกตัวอย่างแม้ว่า (และในภาษาที่อนุญาตให้ตัวสร้างการโอเวอร์โหลดสิ่งนี้ไม่ใช่สิ่ง 'มาก')

แค่ Objective C ธรรมดา ๆinitWithก็ดีนะ!


-3

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

สำหรับรายละเอียดเพิ่มเติมเยี่ยมชม url http://xeon2k.wordpress.com


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