ความแตกต่างระหว่างสำนวนและรูปแบบการออกแบบ?


39

อะไรคือความแตกต่างระหว่างสำนวนและรูปแบบการออกแบบ? ดูเหมือนว่าคำศัพท์เหล่านี้ทับซ้อนกันที่ไหนสักแห่ง; ที่ไหนฉันไม่รู้ พวกเขาใช้แทนกันได้หรือไม่ ฉันควรใช้อะไรเมื่อไหร่

นี่คือรายการของ C ++ Idioms ฉันสามารถเรียกพวกเขาว่าลวดลายการออกแบบได้หรือไม่?

วิกิพีเดียกำหนด

การเขียนโปรแกรมสำนวนเป็นรูปแบบการออกแบบในระดับต่ำ

มันหมายความว่าอะไร? อะไร"ระดับต่ำ"หมายถึงที่นี่?

คำถามนี้ได้รับแรงบันดาลใจจากคำถามอื่น: https://stackoverflow.com/questions/7343531/are-the-some-design-patterns-language-donian


ในทางปฏิบัติความแตกต่างอาจเป็นเรื่องยากที่จะกำหนด (และอาจมีความต่อเนื่องระหว่างสำนวนและรูปแบบการออกแบบ) แต่อาจมาจากคำว่า "สำนวน" ในภาษาธรรมชาติ: en.wikipedia.org/wiki/Idiom (ซึ่งไม่เหมาะกับการใช้งานจริง)
Merlyn Morgan-Graham

2
นี่น่าจะเหมาะกว่าสำหรับโปรแกรมเมอร์ SE
Oliver Charlesworth

3
@Nawaz: "รูปแบบการออกแบบ" เป็นโครงสร้างค่อนข้าง "ระดับสูง" ที่มีข้อบกพร่องด้านภาษา "สำนวน" เป็น "ระดับต่ำ" สร้างรอบข้อบกพร่องภาษา; )
อุโมงค์เซนต์

@ Nawaz- +1 สำหรับเรื่องตลก
Jennifer S

ดูเพิ่มเติมสำนวนรูปแบบกับ
MS Dousti

คำตอบ:


30

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

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

มีความต่อเนื่องระหว่างสำนวนและรูปแบบการออกแบบเช่นเดียวกับที่มีตั้งแต่ระดับต่ำถึงภาษาระดับสูง

รูปแบบของผู้เข้าชมเป็นตัวอย่างที่ดี หากมีเพียงภาษาเดียวที่รองรับการแจกจ่ายแบบไดนามิกเดียวเราอาจพิจารณารูปแบบของผู้เข้าชมว่าเป็นสำนวนของภาษานั้น แต่มีภาษามากมายที่ไม่สนับสนุนการส่งหลายรายการโดยตรง ดังนั้นรูปแบบของผู้มาเยี่ยมจึงเกิดขึ้น

รูปแบบการสังเกตการณ์ก็คำนึงถึงด้วย - C # รองรับโดยตรงดังนั้นจึงไม่จำเป็นต้องมีรูปแบบการทำงานทั่วไปของรูปแบบ

ตัวอย่างที่ไปในทิศทางอื่นคือฟีเจอร์ OO (การสืบทอด, ความหลากหลาย, ฯลฯ ) C ไม่สนับสนุนพวกเขาโดยตรง หากภาษาอื่น ๆ มีลักษณะเหมือน C เราอาจพัฒนารูปแบบการออกแบบเพื่อใช้ v-table, ประเภทความปลอดภัยเป็นต้นเนื่องจากภาษามากมายสนับสนุนคุณลักษณะเหล่านั้นเราจึงเรียกวิธีแก้ปัญหาทั่วไปในภาษา C แทนที่จะเป็นแบบทั่วไป แก้ปัญหารูปแบบการออกแบบ


2
อีกตัวอย่างที่น่าสนใจ: API ไวยากรณ์ได้อย่างคล่องแคล่ว พวกเขาคิดว่าคุณไม่มีการสนับสนุน DSL โดยตรงในภาษาของคุณและมันก้าวข้ามขอบเขตของภาษา ฉันไม่แน่ใจว่ามันได้จบการศึกษาสถานะ "รูปแบบการออกแบบ" และมันดังแหวนสำนวน syntactic ...
Merlyn Morgan-Graham

ความจริงที่ว่า C # โดยตรงสนับสนุนรูปแบบการสังเกตการณ์จะชี้ให้เห็นว่ามันไม่ได้มีความจำเป็นอย่างมากสำหรับรูปแบบมากเพื่อที่จะเปลี่ยนการดำเนินการออกไปจากนักพัฒนาและเป็นภาษาของตัวเอง
jaco0646

@ jaco0646 ฉันสร้างข้อความใหม่ในบรรทัดนั้นอาจชัดเจนกว่านี้ในตอนนี้
Merlyn Morgan-Graham

37

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


+1 สำหรับการวาดความแตกต่างด้วยคำไม่กี่คำและความไม่ถูกต้องไม่กี่
Merlyn Morgan-Graham

1
@ Merlyn Morgan-Graham: คุณได้แสดงความคิดเห็นเกี่ยวกับคำตอบเกือบทั้งหมดรวมถึงคำถาม เหตุใดคุณจึงไม่โพสต์คำตอบอย่างละเอียดโดยไม่ผิดพลาดเลย? ฉันต้องการทราบความคิดของคุณ
นาวาซ

1
@Nawaz: ความคิดเห็นเกี่ยวกับคำตอบอื่น ๆ อันนี้เกือบจะสมบูรณ์แล้ว ฉันต้องการตัวอย่างที่ดีเลิศในคำตอบ แต่ดูเหมือนว่าไม่มีใครทำให้ถูกต้อง ฉันอาจจะทำไม่ได้ไม่งั้นฉันก็จะต้องรับผิดชอบอย่างมีความสุข :)
Merlyn Morgan-Graham

@Nawaz: เอาล่ะฉันให้มันยิงล่ะค่ะ :)
เมอร์ลิน Morgan-เกรแฮม

12

ฉันจะไม่ใส่เงินมากเกินไปในนิยามของ Wikipedia

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

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


1
+1; คำตอบที่ดี. ฉันอยากจะเชื่อทุกอย่างที่นี่ยกเว้นบิตสุดท้าย มีภาษาที่รองรับการจัดส่งได้หลายแบบโดยตรงดังนั้นรูปแบบผู้เข้าชมจึงไม่จำเป็นต้องอยู่ที่นั่น จากมุมมองของพวกเขา "รูปแบบ" อาจเป็นสำนวนที่มากกว่า จากภาษาระดับสูงที่ดีที่สุดทุกรูปแบบอาจจะกลายเป็นสำนวน ...
เมอร์ลิน Morgan-เกรแฮม

@ Merlyn สิ่งที่เป็นเรื่องเกี่ยวกับการปรับใช้คุณสมบัติภาษาชั้นหนึ่งอีกครั้ง? ใครทำอย่างนั้น?
Luc Danton

นั่นคือประเด็น ผู้ใช้ภาษาที่จะพิจารณา "รูปแบบการออกแบบ" สำนวนเพราะภาษาของพวกเขาเย็น :)
เมอร์ลิน Morgan-เกรแฮม

@ Merlyn ไม่เหมาะกับการใช้ 'สำนวน' ของฉัน สำนวนภาษาเป็นสิ่งที่คุณคาดหวังว่าผู้ใช้จะได้รับรู้ถึงการสุ่มของภาษา การนำคุณลักษณะระดับเฟิร์สคลาสมาใช้ใหม่จะมีลักษณะที่แปลกใหม่และไม่เป็นที่นิยม ไม่มีสำนวน C ++ สำหรับการจัดส่งครั้งเดียวเพียงแค่ใช้virtualในบางสถานที่ในขณะที่ตัวชี้ที่เขียนด้วยมือไปยังเล่ห์เหลี่ยมตารางของสมาชิกจะดูไร้สาระ
Luc Danton

1
ฉันชอบที่คุณจะไปกับนิยามของสำนวนที่แตกต่างจาก "รูปแบบการออกแบบของคนจน" ซึ่งเป็นประเภทของแบบจำลองของฉันปฏิบัติต่อมัน (ดูคำตอบของฉัน) มันน้อย "นี่คือวิธีการใช้งานนี้" และอื่น ๆ "ที่นี่เป็นวิธีที่เหมาะสมในการใช้งาน" ตัวอย่างเช่นฉันไม่สามารถจินตนาการ "บิ๊กทรี" ที่พัฒนาไปสู่รูปแบบการออกแบบ และมีองค์ประกอบของวากยสัมพันธ์เช่นกันdo_something() or die "...";(ถูกขโมยจากความคิดเห็นอื่นที่นี่) มันขึ้นอยู่กับคุณสมบัติภาษาเฉพาะ แต่เป็นวิธีการทั่วไปในการใช้คุณสมบัติเหล่านั้น มันไม่ข้ามภาษาและอาจจะไม่
Merlyn Morgan-Graham

6

คำจำกัดความภาษาอังกฤษทั่วไปของ Idiom เป็นวลีที่ความหมายที่ยอมรับไม่อยู่ในคำที่ใช้ ตัวอย่างเช่น "Raining cat and Dogs" หรือ "Where's the Beef?"

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

Perl อาจเป็นภาษาที่อุดมไปด้วยสำนวนมากที่สุด ด้วยโครงสร้างเช่น:

while (<IN>) {
    print $_
}

ความหมายของใครมีความชัดเจนต่อโปรแกรมเมอร์ perl ที่มีประสบการณ์ แต่เป็นปริศนาสำหรับคนอื่น


ฉันคิดว่า "เนื้อวัวอยู่ที่ไหน" มีมส์มากกว่าสำนวน อาจมีอีกอย่างต่อเนื่องที่นั่น;) อาจมีสำนวนมากกว่าการใช้ภาษาเพราะสิ่งต่าง ๆ อาจเป็นบางส่วนหรือล้มเหลวในการนำไปใช้ของ "Big Three" ของสำนวนนั้น ในกรณีนั้นสำนวนนั้นเป็นชื่อและคำอธิบายของ "บิ๊กทรี"
Merlyn Morgan-Graham

2
Perl มีสำนวนที่ดีที่สุด -do_something() or die "arrrrgh!";
cxfx

2

สำนวนเป็นภาษาเฉพาะ เช่นwhile (*dest++=*src++);เป็นสำนวน C / C ++ มันเป็นไปไม่ได้เลยที่จะเขียนสิ่งที่คล้ายกันใน Pascal หรือ Java จากระยะไกล ใช้คำว่า "สำนวน" ตามที่คุณใช้เป็นภาษาอังกฤษ "คุณจะทำอย่างไร" เป็นการทักทายเป็นสำนวน บางภาษาเช่นเยอรมันและเฟรนช์มีสำนวนเดียวกัน แต่ภาษาอื่น ๆ อีกมากมายจะไม่ "ถาม" สิ่งนี้เป็นคำทักทาย รูปแบบ (เชิงวัตถุ) ในอีกด้านหนึ่งมักจะสามารถดัดแปลงเป็นภาษาใดก็ได้ที่สนับสนุนการสืบทอดและการมอบหมาย สำนวนอาจจะง่ายเหมือนหนึ่งบรรทัดของรหัส รูปแบบการออกแบบเกี่ยวข้องกับหลายคลาสเสมอ


+1 จุดดี:A idiom might be as simple as one line of code. A design pattern always involves several classes.
นาวาซ

2

ฉันพบโพสต์นี้ค้นหาสำนวน C ++ ทั่วไปเนื่องจากฉันได้รับลึกลงไปในมันเมื่อเร็ว ๆ นี้และต้องการรหัสของฉันดูไม่ชำนาญเท่าที่ฉันคิดว่ามันเป็น ... :-P

เมื่อใช้เวลากับ Perl ค่อนข้างนานฉันได้พบสำนวนในภาษานั้นเหมือนกับภาษาธรรมชาติเช่นภาษาอังกฤษหรือภาษาสเปน (มีเพียงสองคนเท่านั้นที่รู้พอที่จะรู้สำนวน)

ฉันไม่เห็นด้วยว่าสำนวนเป็นเหมือน "รูปแบบการออกแบบขนาดเล็ก" ฉันยังไม่เห็นด้วยถึงแม้จะน้อยกว่านั้นว่าสำนวนเป็นวิธีการแก้ไขข้อบกพร่องในภาษา

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

กลับไป Perl อาจเป็นสำนวนที่รู้จักกันดีที่สุดคือ " Schwartzian Transform " นิพจน์ที่ดำเนินการเรียงลำดับข้อมูลในลักษณะที่กะทัดรัดและมีประสิทธิภาพ มันไม่ได้เป็นวิธีที่ชัดเจนที่สุดในการดำเนินการดังกล่าว แต่มันรวบรัดและผู้ที่ได้เห็นมาก่อนรู้ทันทีว่ามันกำลังทำอะไร

อีกตัวอย่างที่น่าสังเกตคือ " The Orcish Maneuver " ซึ่งใช้ประโยชน์จากแนวคิดของ perl ของตัวดำเนินการจริง / เท็จ, ตัวดำเนินการรวยและความสำคัญของตัวดำเนินการ

หนึ่งที่ฉันชอบโดยส่วนตัวค่อนข้างจะค่อนข้างเกี่ยวข้องกับ Orcish Maneuver แต่ฉันรู้ว่าไม่มีชื่อ:

push @{ $some_hash{$key} ||= [] }, $some_value;

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

นอกจากนี้ยังเป็นที่น่าสังเกตว่าเป็นของ Perl 5.14 ส่วนหนึ่งของสำนวนนี้เป็นล้าสมัย - ผลักดันในขณะนี้สามารถใช้งานได้โดยตรงบนอ้างอิงอาร์เรย์ไม่มี @ {} จำเป็น! นอกจากนี้ในฐานะของ Perl 5.10 เราสามารถใช้ // = แทน || = ซึ่งตรวจสอบไม่ได้สำหรับความจริง แต่สำหรับการกำหนด -ness


some_dict.setdefault(key, []).append(some_value)ในหลาม:
Jonas Kölker

0

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


ฟังเหตุการณ์เป็นคุณสมบัติภาษาที่ใช้สัญญาณ / ช่อง (รูปแบบ?) หรือรูปแบบการสังเกตการณ์ นอกจากนี้ยังมีสิ่งต่าง ๆ ใน C ++ ที่เรียกว่าสำนวนที่ไม่สำคัญหรือไม่เหมาะกับภาษาอื่น ๆ (เท่าที่ฉันรู้) - เช่นสำนวนคัดลอกและแลกเปลี่ยน
Merlyn Morgan-Graham

Design patterns are specific implementations of an idiom? ว่าอย่างไร คุณเห็นสำนวน C ++ ในลิงก์ในคำถามของฉันหรือไม่
นาวาซ

0

ฉันไม่แน่ใจ 100% แต่สำนวนเป็นคำศัพท์ที่เกี่ยวข้องกับสาขาเฉพาะ เมื่อคุณพูดว่า "รูปแบบการออกแบบ" คุณจะนึกถึง "รูปแบบการสังเกต" "ห่วงโซ่ความรับผิดชอบ" "รูปแบบผู้เข้าชม" "โรงงาน" นี่เป็นรูปแบบทั่วไปที่ใช้ในการแก้ปัญหาทั่วไปในการเขียนโปรแกรม ดูที่นี่สำหรับรายการที่ครอบคลุม: http://en.wikibooks.org/wiki/C++_Programming/Code/Design_Patterns


0

มันหมายความว่าอะไร? "ระดับต่ำ" หมายความว่าอะไรที่นี่

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

ตัวอย่างเช่นการตั้งค่าตัวแปรหากประเมินเป็นเท็จ (มักใช้เพื่อตั้งค่าตัวแปร nil แบบมีเงื่อนไข):

var ||= some_default_value

0

นี่คือตัวอย่างของสำนวน (ใน C #) สำหรับการจัดการเหตุการณ์ คุณไม่ได้รับอนุญาตให้เริ่มต้นกิจกรรมหากยังไม่มีตัวจัดการที่แนบมาดังนั้นสำนวนจะต้องตรวจสอบสิ่งนี้ก่อนเสมอ

ดังนั้นสำนวนทั่วไปสำหรับการจัดการเหตุการณ์จึงเป็น:

EventHandler handler = this.MyEvent;
if ( null != handler ) { handler( param1, param2 ); }

สำนวนนี้มีความเฉพาะเจาะจง (แต่ไม่ จำกัด เฉพาะ) สำหรับภาษา C #

อย่างไรก็ตามโดยทั่วไปกลไกการจัดเหตุการณ์ C # เป็นตัวอย่างของรูปแบบการออกแบบของผู้สังเกตการณ์ซึ่งสามารถนำไปใช้ในภาษาใดก็ได้

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