อะไรคือชื่อสำนวนที่ใช้วิธีการผูกมัดเพื่อสร้างวัตถุ?


21

ฉันมักจะใช้รูปแบบที่ฉันใช้วิธีการผูกมัดการตั้งค่าวัตถุคล้ายกับBuilderหรือPrototypeรูปแบบ แต่ไม่ได้สร้างวัตถุใหม่ที่มีการเรียกแต่ละวิธีแทนการปรับเปลี่ยนวัตถุเดิม

ตัวอย่าง:

new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner");

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


3
อินเทอร์เฟซที่คล่องแคล่วเป็นเรื่องของสไตล์ หากคุณกำลังเขียน API ให้รูปแบบทางเลือกให้กับมัน
Oded

1
สำหรับการสนทนาเพิ่มเติมลองดูคำถามนี้: programmers.stackexchange.com/questions/69519/…
Eric King

@Oded เป็นไปได้หรือไม่ที่จะใช้ API ดังกล่าวโดยไม่ต้องผูกมัดด้วยการโทรแต่ละครั้งเป็นคำสั่งที่แยกกันหรือคุณมีแนวคิดอื่นสำหรับทางเลือกอื่นหรือไม่?
Garrett Hall

@ GarrettHall - แน่นอนมันเป็นไปได้ แต่หลังจากนั้นคุณก็จบลงด้วยการเรียกสิ่งต่าง ๆmenu.withStyle("")โดยไม่มีบริบท คุณต้องมีสอง API ในกรณีเช่นนี้
Oded

2
@ GarrettHall จุดของ 'ส่วนต่อประสานที่คล่องแคล่ว' เป็นห่วงโซ่วิธีการซึ่งมีความหมายที่จะอ่านเหมือนประโยค ในแง่นี้โซ่วิธียาวไม่ถือว่าแย่ แต่และที่นี่ฉันเห็นด้วยกับ Oded จะเป็นการดีที่สุดที่จะให้ฟังก์ชันการทำงานที่เหมือนกันในไวยากรณ์ทั่วไป ด้วยวิธีนี้ผู้พัฒนาสามารถเลือกวิธีการที่จะใช้
Eric King

คำตอบ:


37

ส่วนต่อประสานที่คล่องแคล่ว

ฉันได้ยินมาเสมอว่าวิธีการนี้เรียกว่า ' ส่วนต่อประสานที่คล่องแคล่ว ' ซึ่งประกาศโดย Eric Evans (จากชื่อเสียงด้านการออกแบบโดเมนที่ขับเคลื่อนด้วย ) และ Martin Fowler (จากชื่อเสียงAgile Manifesto )

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

แน่นอนฉันไม่คิดว่ามันเป็นรูปแบบการต่อต้านแม้ว่าฉันจะใช้เทคนิคเพียงไม่กี่ครั้งเอง


4
โปรดทราบว่าผู้เสนอนั้นค่อนข้างยืนกรานว่าอินเทอร์เฟซที่คล่องแคล่วนั้นเกี่ยวข้องกับมากกว่าเพียงแค่การผูกมัดวิธีแม้ว่ามันมักจะไม่ชัดเจนว่าคำอื่นนั้นมีความหมายอย่างไร
Kilian Foth

เป็นเรื่องปกติหรือไม่ที่โซ่ทั้งหมดจะถูกพิจารณาว่าเป็นคำสั่งเดียว? ฟังดูเหมือนปัญหาการดีบักเกอร์ที่ออกแบบมาไม่ดีสำหรับฉัน
blueberryfields

ฉันไม่เจอบั๊กที่ปฏิบัติกับเชนเป็นคำสั่งเดียว แต่ก็ยังคงเป็นเรื่องเจ็บปวดหากคุณสนใจวิธีใดวิธีหนึ่งในการจบเชนในเชนนั้น
vaughandroid

1
ฉันทำงานใน C # และดีบักเกอร์. NET ช่วยให้ฉันสามารถเข้าสู่แต่ละวิธีได้ ภาษาอื่น ๆ ฉันไม่แน่ใจ
Eric King

1
@KilianFoth ตามที่ระบุไว้ในความคิดเห็นของคำถามวิธีการล่ามโซ่ในส่วนติดต่อได้อย่างคล่องแคล่วควรอ่านได้เกือบเป็นประโยค บางครั้งสิ่งนี้หมายความว่าวิธีการของแต่ละบุคคลควรมีชื่อแตกต่างจากการพิจารณาวิธีปฏิบัติที่ดี
Izkata

5

วิธีการผูกมัดเช่นนั้นมักจะเรียกว่า Fluent Interface เมื่อมีการไหลหรือการค้นพบบางอย่างในห่วงโซ่ หรือคุณสามารถนึกถึง API อย่าง jQuery ที่อาศัยวิธีการผูกมัดที่ไม่ใช่ 'คล่องแคล่ว' เพราะไม่มีความสำคัญเท่ากันในการค้นพบ - มันมีความสะดวกมากกว่า

สำหรับตัวอย่างของคุณ (โดยใช้ withx, withy) คุณสามารถพิจารณาตัวแปรนี้ของรูปแบบตัวสร้างได้เนื่องจากคุณมีคลาสพิเศษที่กำหนดสถานะ (การเรียกใช้เมธอด) ให้รู้วิธีส่งคืนออบเจ็กต์ที่กำหนดค่าอย่างเหมาะสม

นี่ไม่ใช่รูปแบบการต่อต้านหากใช้อย่างเหมาะสม


Discoverabilty คืออะไร ความสามารถในการค้นหาวิธีที่คุณต้องการผ่านการเติมข้อความอัตโนมัติของ API หรือไม่
Josiah Yoder

ฉันไม่คุ้นเคยกับ jQuery วิธีการของพวกเขาเชื่อมโยงเพื่อความสะดวกเท่านั้นไม่ใช่การค้นพบได้อย่างไร เพราะมีหลายวิธีในการเชื่อมโยงมันเข้าครอบงำแม้จะมีการเติมข้อความอัตโนมัติหรือไม่
Josiah Yoder

3

ไม่ว่าจะเป็นการป้องกันแบบแผน

ไม่ต่อต้านรูปแบบแน่นอน jQuery น่าจะเป็นการใช้งานที่ดีที่สุดในเรื่องนี้

เพราะแม้ว่ามันจะสามารถอ่านได้อย่างคล่องแคล่วมากขึ้นก็สามารถนำไปสู่โซ่วิธียาว

ใช่มันสามารถทำได้ แต่ทางเลือกคืออะไร? คุณสามารถจบด้วยประโยคภาษาอังกฤษธรรมดา ๆ ได้โดยที่ api จะแนะนำคุณถึงสิ่งที่มีอยู่และเหมาะสม


.. แล้วคุณจะได้สิ่งที่คุณต้องการใน 1 บรรทัดแทนที่จะเป็น 8 - 10 ซึ่งจะดีถ้าคุณเขียนซับในเทอร์มินัล ง่ายต่อการจำ 1 คำสั่งมากกว่า 10 เพราะมันคล่องแคล่วและวิธีการมีชื่อที่อธิบายง่ายต่อการอ่าน น่าเสียดายที่เรื่องนี้ใน Python2 ไม่สามารถทำได้ใน Python3 / Python4 อีกต่อไป
mckenzm

-3

มันถูกเรียกว่ารูปแบบ "ซากรถไฟ"

(มันเป็นรูปแบบการต่อต้านและต่อต้านรหัสสะอาด)

"การก่อวินาศกรรมรถไฟ" รูปแบบการละเมิดกฎหมายของ Demeter


3
a.getB().getC().doSomething()นี้ไม่ได้เป็นเช่นเดียวกับวิธีการผูกมัดในบทความที่คุณเชื่อมโยงไปยังที่ตัวอย่างคือ ตัวอย่างนั้นไม่ดีเนื่องจาก "วิธีการของคุณสามารถเรียกใช้เมธอดในเขตข้อมูลของตนเองโดยตรง (แต่ไม่ใช่ในเขตข้อมูลของเขตข้อมูล)" ที่นี่มีวัตถุเพียง 1 ชิ้นเท่านั้นที่ถูกสร้างขึ้นและ "คุณสามารถเล่นกับของเล่นที่คุณสร้างขึ้นเองได้"
Nic
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.