เมื่อเขียนโค้ดเชิงวัตถุฉันควรทำตามรูปแบบการออกแบบหรือไม่


37

มีรูปแบบการออกแบบที่เป็นไปได้สำหรับโปรแกรมเชิงวัตถุหรือไม่? ฉันถามนี้เพราะเมื่อเร็ว ๆ นี้ผมเห็นการดำเนินการระดับกับDoor Lockมันเป็นส่วนหนึ่งของการทดสอบและคำตอบบอกว่ารหัสเป็นไปตามรูปแบบวัตถุ Null:

class Lock
{
public:
    virtual void close() = 0;
    virtual void open() = 0;
    virtual bool is_open() const = 0;
    virtual ~Lock() { }
};

class DummyLock
    : public Lock
{
private:
    DummyLock();
    DummyLock(const DummyLock&) = delete;
    DummyLock& operator=(const DummyLock&) = delete;

private:
    void close() { }
    void open() { }
    bool is_open() const { return true; }

public:
    static DummyLock m_instance;
};

class Door
{
public:
    Door() : m_lock(DummyLock::m_instance) { }
    Door(Lock &lock) : m_lock(lock) { }

public:
    Lock& get_lock() const { return m_lock; }

private:
    Lock &m_lock;
};

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



51
คุณคิดว่าคุณสามารถพูดเป็นสำนวนทั้งหมดได้หรือไม่? ไม่มี? จากนั้นคุณไม่ควรสร้างโปรแกรมของคุณโดยการปูด้วยกันให้เป็นลวดลายการออกแบบ
Kilian Foth

4
ในตัวอย่างของคุณรูปแบบวัตถุ Null จะถูกเพิ่มเพื่อวัตถุประสงค์ทางการศึกษาเท่านั้นไม่แนะนำ "การออกแบบที่ดี" ในรหัสนี้
Doc Brown

4
@djechlin: ในคำอื่น ๆ ที่ใช้ "สองคำว่า" รูปแบบการออกแบบ :)
ไมเคิลชอว์

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

คำตอบ:


143

ควรมีรูปแบบการออกแบบบางอย่างที่ฉันกำลังติดตามอยู่หรือไม่

Dear God NO!

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

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

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


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

11
@Cerad: แน่นอนตราบใดที่คุณสัญญาว่าจะไม่เขียนชั้นเรียนพระเจ้าด้วย!
yatima2975

9
John Doe - วิศวกรเทคนิค, รหัสลิงทั่วไปและราชาแห่งเก้าอี้คอมพิวเตอร์ของเขา
hjk

1
การออกแบบควรใช้รูปแบบที่เหมาะสมและคลาสควรตั้งชื่อเช่นนี้ พวกเขาเป็นเครื่องมือสำคัญ การกลัวthe_cult(tm) เป็นเพียงอันตราย
Gusdor

25
คำตอบที่ดี! คำวิจารณ์เดียวของฉันคือ "Dear God NO!" ไม่ใหญ่พอ
tobyink

37

เลขที่

นี่คือสิ่งที่ Gang of Four (ผู้ซึ่งเป็นที่นิยมในรูปแบบการออกแบบ) ได้กล่าวไว้ในหนังสือของพวกเขา :

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

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

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


7
หนังสือเป็นแบบการออกแบบ: องค์ประกอบของซอฟต์แวร์เชิงวัตถุที่นำกลับมาใช้ใหม่ได้โดย Erich Gamma, Richard Helm, Ralph Johnson และ John Vlissides
developerwjk

4
+1 สำหรับการอ้างอิงแหล่งที่มาของรูปแบบการออกแบบจริง
Pharap

29

ถ้าฉันเขียนโค้ดที่ซับซ้อนมากขึ้นควรมีรูปแบบการออกแบบที่ฉันติดตามอยู่เสมอหรือไม่?

ไม่รูปแบบการออกแบบเป็นเพียง: รูปแบบความสัมพันธ์ระหว่างวัตถุ กล่าวอีกนัยหนึ่งความสัมพันธ์ที่ใช้และนำกลับมาใช้บ่อยครั้งมากพอที่บางคนพูดว่า "เฮ้เราดูเหมือนจะทำสิ่งนี้มากแล้วขอตั้งชื่อให้" รายการรูปแบบการออกแบบไม่ได้ถูกกำหนดพร้อมกันทั้งหมดในช่วงเริ่มต้นของ OOP และGOF ! พวกเขาถูกค้นพบและจัดทำเอกสารในที่สุดแล้วได้รับความนิยมจากหนังสือ

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

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


10

รูปแบบการออกแบบมีข้อดีสองประการ

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

เป้าหมายของทุกโปรแกรมควรเป็น

  1. มันได้ผล. มันต้องทำอะไรก็ตามที่เป้าหมายสุดท้ายคืออะไรหรือไม่สำคัญว่าคุณใช้ลวดลายการออกแบบกี่แบบ รูปแบบการออกแบบของ OO ช่วยให้การแก้ปัญหาเป็นเรื่องง่ายที่จะเข้าใจบิตดังนั้นมันจึงง่ายต่อการพิสูจน์การทำงาน
  2. อ่านง่าย นี่คือรูปแบบการออกแบบที่ดี ปัญหา OO ที่พวกเขาแก้ไขนั้นซับซ้อน หากคุณแก้ปัญหาด้วยวิธี "มาตรฐาน" มันจะง่ายกว่าในผู้พัฒนารายต่อไป
  3. มันง่ายที่จะเติบโต โปรแกรมที่ทันสมัยเกือบ 0 รายการเสร็จสิ้นทุกคนที่วางแผนไว้ ทุกโปรแกรมเติบโตหลังจากการเปิดตัวครั้งแรก รูปแบบ OO เป็นที่รู้จักกันดีว่ามีการเติบโตที่ดี

ทุกสิ่งที่กล่าวมาโปรดทราบว่าการอ้างอิงถึงรูปแบบการออกแบบทุก OO คือ "พวกเขาทำได้ดีมาก" พวกเขาไม่สมบูรณ์แบบ แต่พวกเขาเติมช่องได้อย่างมีประสิทธิภาพมาก ใช้พวกเขาเมื่อพวกเขาทำงานหลีกเลี่ยงพวกเขาเมื่อพวกเขาไม่

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

ใช้รูปแบบการออกแบบเมื่อใดก็ตามที่ทำให้ผลิตภัณฑ์ของคุณดีขึ้น หลีกเลี่ยงพวกเขาเมื่อพวกเขาทำให้ผลิตภัณฑ์ของคุณแย่ลง


2
ฉันคิดว่าประโยคสุดท้ายควรเป็นตัวหนาหรือเป็นบทสรุป
Pharap

5

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

โปรแกรมที่ไม่สำคัญโดยไม่มีรูปแบบการออกแบบบ่งบอกถึง:

  • โปรแกรมของคุณไม่เหมือนใครไม่มีส่วนใดที่คล้ายคลึงกับปัญหาทั่วไปที่โปรแกรมเมอร์เคยประสบมาก่อน หรือ
  • โปรแกรมของคุณมีปัญหาที่พบบ่อยเหล่านั้น แต่คุณได้แก้ไขในวิธีที่ดีกว่าที่ไม่มีใครเคยคิดมาก่อน

ทั้งสองสถานการณ์มีความเป็นไปได้สูงมากไม่มีความผิด

นั่นไม่ได้หมายความว่ารูปแบบการออกแบบควรผลักดันการออกแบบของคุณหรือคุณควรแทรกรูปแบบที่ไม่เลือกออกเพราะคุณคิดว่ามันจะดูไม่ดีถ้าคุณไม่ทำ รูปแบบการออกแบบที่ผิดจะเลวร้ายยิ่งกว่าไม่มี

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

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

ดูความแตกต่าง? มันเป็นความแตกต่างที่บอบบาง แต่สำคัญ


5
มีปัญหาที่พบบ่อยมากมาย (และวิธีแก้ไขปัญหาทั่วไป) กว่ามีรูปแบบการออกแบบ รูปแบบการออกแบบเป็นชุดย่อยของแค็ตตาล็อกของโซลูชัน OO ทั่วไปไม่ใช่ชุดของโซลูชันทั่วไปทั้งหมด
Michael Shaw

1
คุณสามารถนิยามความหมายของคำว่า "ไม่ไร้สาระ" ได้หรือไม่ฉันรู้สึกว่าคำว่า "ไม่ไร้สาระ" นั้นเป็นเรื่องส่วนตัว
Pharap

1
มันเป็นเรื่องส่วนตัว ฉันหมายถึงประเภทของโปรแกรมที่คุณจะเขียนในทีมที่ทำงานต้องการผู้ดูแลหลายคนอย่างต่อเนื่อง
Karl Bielefeldt

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

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

4

คำถามแตก ผมขอให้คำนิยามนวนิยายของรูปแบบการออกแบบที่จะยกเลิกความเสียหายจำนวนมากที่ออกโดย GoF A: รูปแบบการออกแบบที่ดีคือการปฏิบัติการเข้ารหัส แค่นั้นแหละ.

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

"รูปแบบการออกแบบ" เป็นคำที่ไม่เป็นที่นิยมโดย GoF ซึ่งทำให้ดูเหมือนว่ารูปแบบทั้งหมดอยู่ในระดับเดียวกันหรือคุณควรใช้หมอที่แนะนำ 3 ถึง 5 ต่อชั้นเรียน เมื่อใดก็ตามที่คุณทำสิ่งที่ถูกต้องว่าคนอื่นไม่เหมาะสมจะเป็นรูปแบบการออกแบบ A for(;;)เป็นรูปแบบทั่วไปที่ใช้เพื่อแสดงลูปไม่สิ้นสุด

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

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


2
ในสิ่งที่เป็นภาษาfor(;;)สำนวน? นั่นอาจไม่ใช่ตัวอย่างที่ดีที่สุดของบางสิ่งที่คนทำ "ถูกต้อง"
Telastyn

1
@Telastyn C, C ++, Java, Javascript, C #
djechlin

2
ฉันไม่เคยเห็นใครชอบมากกว่าwhile(true)(หรือwhile(1)) ใน C, C ++, Java หรือ C # ใน 20 ปีของการเขียนโปรแกรมของฉัน
Telastyn

1
@Telastyn stackoverflow.com/a/2611744/1339987 fwiw ฉันเริ่มชอบในขณะที่ (จริง) เพราะดูเหมือนว่าฉันจะอ่านได้มากขึ้น
djechlin

1
ฉันมักจะใช้สำหรับ (;;) ไม่มีเหตุผลพิเศษที่ฉันอ่านมันที่ไหนสักแห่งอาจจะ ฉันชอบความจริงที่ว่าไม่มีตัวแปรหรือค่าคงที่ที่เกี่ยวข้อง อย่างไรก็ตาม @Telastyn ตอนนี้คุณได้พบกับใครบางคน
Ant

0

คุณควรปฏิบัติตามหลักการออกแบบของ OOเสมอ(เช่นโมดูลแยกส่วนการซ่อนข้อมูลการทำงานร่วมกันสูง ฯลฯ ) รูปแบบการออกแบบเป็นช่องกลั่นค่อนข้างหลักการออกแบบ OO โดยเฉพาะอย่างยิ่งถ้าคุณพิจารณาหลักการ KISS

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

มันไม่ง่ายเลยที่จะรู้ว่าเมื่อใดควรใช้รูปแบบ รูปแบบบางอย่างอยู่ในระดับต่ำใกล้การเข้ารหัสและพื้นที่การแก้ปัญหา (เช่น Singleton, วัตถุ Null, Iterator) ผู้อื่นได้รับแรงบันดาลใจจากความต้องการในพื้นที่ปัญหา (เช่นรูปแบบคำสั่งเพื่อสนับสนุนการเลิกทำ / ทำซ้ำกลยุทธ์เพื่อรองรับไฟล์อินพุต / เอาต์พุตหลายประเภท)

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


0

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

ที่กล่าวว่าคำตอบของฉันคือไม่ แต่ใช่คุณมักจะทำตามรูปแบบของคุณเอง ในฐานะที่เป็น GoF ถูกต้องทำให้มัน -

รูปแบบของบุคคลหนึ่งคือการสร้างแบบดั้งเดิมของบุคคลอื่น

คำพูดที่ยอดเยี่ยม


นี้ไม่ได้ดูเหมือนจะนำเสนออะไรที่สำคัญกว่าจุดทำและอธิบายในก่อน 7 คำตอบ
ริ้น

ละเอียด. หมายเหตุฉันทำประเด็นทั่วไป ... มันใช้ได้กับรูปแบบการออกแบบเป็นการอภิปรายเชิงทฤษฎี
Syed Priom

"เว็บไซต์นี้เกี่ยวกับการรับคำตอบมันไม่ใช่ฟอรัมการสนทนา ... " ( ทัวร์ )
gnat

ฉันตอบคำถาม ขอขอบคุณ. การสนทนานี้จบลงที่นี่
Syed Priom

@ คาดว่ามันจะเป็นเรื่องที่กระชับกว่านี้มาก
djechlin

0

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

นี่คือบทความเกี่ยวกับการใช้หลักการ OOD โดยใช้รูปแบบการออกแบบและมีตัวอย่างโค้ดด้วย (ใน C ++) มันแสดงให้เห็นว่าจะใช้รูปแบบการออกแบบบางอย่างในการเขียนโค้ดใหม่ได้อย่างไรและเมื่อใด


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