รูปแบบการต่อต้านคืออะไร?


193

ฉันกำลังศึกษารูปแบบและรูปแบบการต่อต้าน ฉันมีความคิดที่ชัดเจนเกี่ยวกับรูปแบบ แต่ฉันไม่ได้รับรูปแบบต่อต้าน คำจำกัดความจากเว็บและ Wikipedia ทำให้ฉันสับสนมาก

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




มันถือว่าแย่ แต่อาจเป็นทางออกเดียว คิดสองครั้งและไป
КонстантинВан

คำตอบ:


245

รูปแบบการต่อต้านเป็นรูปแบบบางอย่างในการพัฒนาซอฟต์แวร์ซึ่งถือว่าเป็นวิธีการเขียนโปรแกรมที่ไม่ดี

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

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

ตัวอย่างเช่น:

class GodObject {
    function PerformInitialization() {}
    function ReadFromFile() {}
    function WriteToFile() {}
    function DisplayToScreen() {}
    function PerformCalculation() {}
    function ValidateInput() {}
    // and so on... //
}

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

class FileInputOutput {
    function ReadFromFile() {}
    function WriteToFile() {}
}

class UserInputOutput {
    function DisplayToScreen() {}
    function ValidateInput() {}
}

class Logic {
    function PerformInitialization() {}
    function PerformCalculation() {}
}

บรรทัดล่างคือมีวิธีที่ดีในการพัฒนาซอฟต์แวร์ที่มีรูปแบบที่ใช้กันทั่วไป ( รูปแบบการออกแบบ ) แต่ยังมีวิธีที่ซอฟต์แวร์ถูกพัฒนาและนำไปใช้ซึ่งอาจนำไปสู่ปัญหา รูปแบบที่ถือว่าเป็นแนวทางการพัฒนาซอฟต์แวร์ที่ไม่ดีนั้นเป็นรูปแบบการต่อต้าน


9
ตัวอย่างอื่น ๆ ของ Anti-Patterns ข้าง GodObject?
Tomasz Mularczyk

@Tomasz Programming Pasta ทำหน้าที่เป็นตัวอย่างหนึ่ง เป็นการสรุปที่ดีที่สุดระหว่างการห่อหุ้มที่ไม่ดีระหว่างวัตถุขนาดเล็กจำนวนมาก คิดว่ามันตรงกันข้ามกับวัตถุของพระเจ้าen.wikipedia.org/wiki/Spaghetti_code
AWrightIV

@ Tomasz อะไรก็ตามที่ไม่ดี แต่บางคนทำมาแล้วเป็นปฏิปักษ์ เช่นtry: <do something>; except: passอาจเป็นปฏิปักษ์ต่อพระคาร์ดินัลซินในไพ ธ อน ดูสิ่งนี้: realpython.com/blog/python/…
eric

1
Singleton ถือเป็นรูปแบบการต่อต้านได้หรือไม่เพราะมันทำให้การเยาะเย้ยและรันการทดสอบในแบบคู่ขนานยากกว่า (เนื่องจากการทดสอบทั้งหมดใช้และกลายพันธุ์ซิงเกิลเดียวกันทำให้เกิดความไม่สอดคล้องกัน)?
lostsoul29

63

เมื่อใดก็ตามที่ฉันได้ยินเกี่ยวกับรูปแบบการต่อต้านฉันจำคำอื่น ๆ ได้แก่ กลิ่นการออกแบบ

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

มีการออกแบบหลายกลิ่นจำแนกตามการละเมิดหลักการออกแบบ:

กลิ่นที่เป็นนามธรรม

Missing Abstraction:กลิ่นนี้เกิดขึ้นเมื่อมีการใช้กลุ่มข้อมูลหรือสตริงที่เข้ารหัสแทนการสร้างคลาสหรือส่วนต่อประสาน

สิ่งที่เป็นนามธรรมที่เป็นนามธรรม:กลิ่นนี้เกิดขึ้นเมื่อการผ่าตัดกลายเป็นชั้นเรียน

สิ่งที่เป็นนามธรรมที่ไม่สมบูรณ์:กลิ่นนี้เกิดขึ้นเมื่อสิ่งที่เป็นนามธรรมไม่สนับสนุนวิธีการเสริมหรือเกี่ยวข้องกันอย่างสมบูรณ์

Multifaceted Abstraction:กลิ่นนี้เกิดขึ้นเมื่อ Abstraction มีความรับผิดชอบมากกว่าหนึ่งรายการ

Unn นามธรรม Abstraction:กลิ่นนี้เกิดขึ้นเมื่อ Abstraction ที่ไม่จำเป็น (ซึ่งสามารถหลีกเลี่ยงได้) ได้ถูกนำมาใช้ในการออกแบบซอฟต์แวร์

Unutilized Abstraction:กลิ่นนี้เกิดขึ้นเมื่อไม่ได้ใช้สิ่งที่เป็นนามธรรม (ไม่ได้ใช้โดยตรงหรือไม่สามารถเข้าถึงได้)

Duplicate Abstraction:กลิ่นนี้เกิดขึ้นเมื่อ abstractions สองตัวขึ้นไปมีชื่อเหมือนกันหรือมีการใช้งานที่เหมือนกันหรือทั้งสองอย่าง

กลิ่นห่อหุ้ม

Encapsulation บกพร่อง:กลิ่นนี้เกิดขึ้นเมื่อประกาศการเข้าถึงของหนึ่งหรือมากกว่าหนึ่งสมาชิกของสิ่งที่เป็นนามธรรมได้รับอนุญาตมากขึ้นกว่าที่จำเป็นจริง

Encapsulation ที่รั่วไหล:กลิ่นนี้เกิดขึ้นเมื่อสิ่งที่เป็นนามธรรม“ exposes” หรือ“ รั่วไหล” รายละเอียดการใช้งานผ่านส่วนต่อประสานสาธารณะ

Encapsulation ที่ขาดหายไป:กลิ่นนี้เกิดขึ้นเมื่อรูปแบบการนำไปใช้งานไม่ได้ถูกห่อหุ้มภายในนามธรรมหรือลำดับชั้น

การห่อหุ้มแบบไม่ได้ใช้ประโยชน์:กลิ่นนี้เกิดขึ้นเมื่อรหัสลูกค้าใช้การตรวจสอบประเภทที่ชัดเจน (โดยใช้คำสั่ง if-else หรือคำสั่งสลับที่ตรวจสอบประเภทของวัตถุ) แทนที่จะใช้ประโยชน์จากรูปแบบที่ห่อหุ้มไว้แล้วภายในลำดับชั้น

การทำให้เป็นโมดูลของกลิ่น

การแยกส่วนแบบแยกส่วน:กลิ่นนี้เกิดขึ้นเมื่อข้อมูลและ / หรือวิธีการที่ควรได้รับการแปลเป็นนามธรรมเป็นสิ่งที่แยกออกจากกันและกระจายไปทั่ว abstractions หลาย

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

การแยกส่วนแบบแยกส่วน - ขึ้นอยู่กับกลิ่น:กลิ่นนี้เกิดขึ้นเมื่อนามธรรมสองตัวหรือมากกว่านั้นขึ้นอยู่กับกันและกันโดยตรงหรือโดยอ้อม (การสร้างการเชื่อมต่อที่แน่นหนาระหว่างนามธรรม)

Hub-Like Modularization:กลิ่นนี้เกิดขึ้นเมื่อสิ่งที่เป็นนามธรรมมีการพึ่งพา (ทั้งขาเข้าและขาออก) ที่มี abstractions อื่นจำนวนมาก

ลำดับชั้นมีกลิ่น

ลำดับชั้นที่ขาดหายไป:กลิ่นนี้เกิดขึ้นเมื่อส่วนของรหัสใช้ตรรกะตามเงื่อนไข (โดยทั่วไปจะใช้ร่วมกับ“ ประเภทที่ติดแท็ก”) เพื่อจัดการรูปแบบที่เปลี่ยนแปลงอย่างชัดเจนในพฤติกรรมที่ลำดับชั้นอาจถูกสร้างขึ้นและใช้

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

ลำดับขั้นของ Unfactored:กลิ่นนี้เกิดขึ้นเมื่อมีการทำซ้ำที่ไม่จำเป็นระหว่างประเภทในลำดับชั้น

Wide Hierarchy:กลิ่นนี้เกิดขึ้นเมื่อลำดับชั้นของการสืบทอดมีค่า“ เกินไป” ที่บ่งบอกว่าประเภทกลางอาจหายไป

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

ลำดับชั้นลึก:กลิ่นนี้เกิดขึ้นเมื่อลำดับชั้นของการสืบทอด "ลึกเกินไป"

ลำดับขั้นของการกบฏ:กลิ่นนี้เกิดขึ้นเมื่อชนิดย่อยปฏิเสธวิธีที่มีให้โดย supertype

ลำดับขั้นตอนที่ใช้งานไม่ได้:กลิ่นนี้เกิดขึ้นเมื่อ Supertype และแนวคิดย่อยไม่ได้แบ่งปันความสัมพันธ์“ IS- A” ซึ่งส่งผลให้เกิดความสามารถในการทดแทนที่ใช้งานไม่ได้

Multipath Hierarchy:กลิ่นนี้เกิดขึ้นเมื่อ subtype สืบทอดทั้งทางตรงและทางอ้อมจาก supertype ที่นำไปสู่เส้นทางการสืบทอดที่ไม่จำเป็นในลำดับชั้น

Cyclic Hierarchy:กลิ่นนี้เกิดขึ้นเมื่อ supertype ในลำดับชั้นขึ้นอยู่กับชนิดย่อยของมัน


คำจำกัดความและการจำแนกประเภทข้างต้นอธิบายไว้ใน"การปรับโครงสร้างใหม่สำหรับกลิ่นการออกแบบซอฟต์แวร์: การจัดการหนี้ด้านเทคนิค " บางแหล่งข้อมูลที่เกี่ยวข้องอื่น ๆ อาจจะพบได้ที่นี่


41

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

ตัวอย่าง: "รูปแบบ" จะใช้ฟังก์ชั่นสำหรับการนำโค้ดกลับมาใช้อีกครั้ง "รูปแบบการต่อต้าน" จะใช้ copy-paste สำหรับสิ่งเดียวกัน ทั้งสองแก้ปัญหาเดียวกัน แต่การใช้ฟังก์ชั่นมักจะนำไปสู่รหัสที่อ่านง่ายและบำรุงรักษาได้ดีกว่า copy-paste


18

รูปแบบการต่อต้านเป็นวิธีหนึ่งในการไม่แก้ปัญหา แต่มีมากกว่านั้น: มันเป็นวิธีที่สามารถเห็นได้บ่อยครั้งในความพยายามที่จะแก้ปัญหา


13

หากคุณต้องการศึกษา AntiPatterns จริงๆให้รับหนังสือAntiPatterns (ISBN-13: 978-0471197133)

ในนั้นพวกเขากำหนด "AntiPattern เป็นรูปแบบวรรณกรรมที่อธิบายถึงวิธีการแก้ปัญหาที่เกิดขึ้นทั่วไปกับปัญหาที่สร้างผลกระทบเชิงลบอย่างเด็ดขาด"

ดังนั้นหากเป็นการฝึกเขียนโปรแกรมที่ไม่ดี แต่ไม่ใช่โปรแกรมทั่วไป - จำกัด เพียงหนึ่งแอปพลิเคชันหนึ่ง บริษัท หรือโปรแกรมเมอร์หนึ่งโปรแกรมไม่ตรงกับส่วน "รูปแบบ" ของนิยาม AntiPattern



6

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


6

ต่อต้านรูปแบบที่เป็นส่วนประกอบหนึ่งของรูปแบบการออกแบบ รูปแบบการต่อต้านเป็นโซลูชันเทมเพลตที่คุณไม่ควรใช้ในบางสถานการณ์


6

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


4

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

"กระบวนการโครงสร้างหรือรูปแบบการปฏิบัติที่ใช้กันทั่วไปซึ่งแม้ในตอนแรกจะปรากฏว่าเป็นการตอบสนองที่เหมาะสมและมีประสิทธิภาพต่อปัญหา แต่โดยทั่วไปแล้วจะมีผลกระทบที่เลวร้ายกว่าผลลัพธ์ที่เป็นประโยชน์"

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


2

รูปแบบการต่อต้านเป็นวิธีการทั่วไปที่ผู้คนมักจะเขียนโปรแกรมในทางที่ผิดหรืออย่างน้อยก็เป็นวิธีที่ไม่ดีนัก


0

รูปแบบการออกแบบใด ๆ ที่ทำอันตรายมากกว่าดีต่อสภาพแวดล้อมการพัฒนาซอฟต์แวร์ที่กำหนดจะถือเป็นรูปแบบการต่อต้าน

รูปแบบการต่อต้านบางอย่างชัดเจน แต่บางแบบก็ไม่ชัดเจน เช่น Singleton แม้ว่าหลายคนคิดว่าเป็นรูปแบบการออกแบบที่ดีเก่า แต่มีคนอื่นที่ไม่

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


จริงๆแล้วรูปแบบการต่อต้านโดยทั่วไปไม่ชัดเจน เห็นได้ชัดว่ารูปแบบการออกแบบที่ไม่ดีนั้นเป็นเพียงรูปแบบการออกแบบที่ไม่ดี รูปแบบการต่อต้านของแท้ดูได้บนพื้นผิว แต่มีปัญหาในภายหลัง ในความเป็นจริงการไม่เห็นได้ชัดว่าไม่ดีคือความแตกต่างที่ทำให้พวกเขาต่อต้านแบบในตอนแรก
Hawkeyegold

0

เช่นเดียวกับในอัลกอริทึมคุณสามารถบรรลุการแก้ปัญหาโดยใช้กำลังดุร้าย แต่คุณต้องจ่ายมากถ้าสถานการณ์ซับซ้อน

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