คำถามติดแท็ก design-patterns

รูปแบบการออกแบบเป็นโซลูชันที่ใช้ซ้ำได้ทั่วไปสำหรับปัญหาที่เกิดขึ้นทั่วไปในการออกแบบซอฟต์แวร์

3
จุดของรูปแบบ PImpl คืออะไรในขณะที่เราสามารถใช้ส่วนต่อประสานเพื่อจุดประสงค์เดียวกันใน C ++
ฉันเห็นซอร์สโค้ดจำนวนมากซึ่งใช้ PImpl idiom ใน C ++ ฉันถือว่ามันมีวัตถุประสงค์เพื่อซ่อนข้อมูลส่วนตัว / ประเภท / การใช้งานเพื่อให้สามารถลบการพึ่งพาและลดปัญหาการรวบรวมเวลาและส่วนหัวรวมถึงปัญหา แต่อินเทอร์เฟซ / คลาสเพียว - นามธรรมใน C ++ ยังมีความสามารถนี้พวกเขายังสามารถใช้เพื่อซ่อนข้อมูล / ประเภท / การใช้งาน และเพื่อให้ผู้โทรเห็นส่วนต่อประสานเมื่อสร้างวัตถุเราสามารถประกาศเมธอดจากโรงงานในส่วนหัวของส่วนต่อประสาน การเปรียบเทียบคือ: ราคา : ค่าใช้จ่ายในการใช้อินเตอร์เฟสลดลงเนื่องจากคุณไม่จำเป็นต้องใช้ฟังก์ชั่น wrapper สาธารณะซ้ำvoid Bar::doWork() { return m_impl->doWork(); }คุณเพียงแค่ต้องกำหนดลายเซ็นในอินเตอร์เฟส เข้าใจดี : เทคโนโลยีอินเทอร์เฟซเป็นที่เข้าใจกันดีกว่าโดยนักพัฒนา C ++ ทุกคน ประสิทธิภาพ : วิธีการเชื่อมต่อประสิทธิภาพไม่เลวร้ายยิ่งกว่าสำนวน PImpl ทั้งการเข้าถึงหน่วยความจำเพิ่มเติม ฉันถือว่าประสิทธิภาพเหมือนกัน ต่อไปนี้เป็นรหัสเทียมเพื่อแสดงคำถามของฉัน: // Forward …

11
มีหนังสือมาตรฐานเกี่ยวกับรูปแบบการออกแบบหรือไม่? [ปิด]
ฉันสนใจที่จะเรียนรู้รูปแบบการออกแบบและต้องการที่จะรู้ว่าหนังสือชั้นบนสุดในการเรียนรู้เรื่องนี้คืออะไร มีหนังสือที่มีมาตรฐาน de-facto สำหรับอธิบายวิธีปฏิบัติที่ดีที่สุดวิธีการออกแบบและข้อมูลที่เป็นประโยชน์อื่น ๆ ในรูปแบบการออกแบบหรือไม่ หนังสือเล่มไหนที่ทำให้มันพิเศษ?

7
ทำไม setters ที่ไม่เป็นทางการคืออะไร
การผูกมัดแบบติดตั้งบนถั่วนั้นมีประโยชน์มาก: ไม่จำเป็นต้องใช้ตัวสร้างมากเกินไปตัวสร้างขนาดใหญ่โรงงานและช่วยให้คุณอ่านง่ายขึ้น ฉันไม่สามารถคิดถึงข้อเสียใด ๆ เว้นแต่ว่าคุณต้องการให้วัตถุของคุณไม่เปลี่ยนรูปในกรณีนี้มันจะไม่มีตัวตั้งค่าใด ๆ อยู่ดี มีเหตุผลทำไมนี่ไม่ใช่การประชุม OOP? public class DTO { private String foo; private String bar; public String getFoo() { return foo; } public String getBar() { return bar; } public DTO setFoo(String foo) { this.foo = foo; return this; } public DTO setBar(String bar) { this.bar …

5
รูปแบบของตัวสร้าง: เมื่อใดจะล้มเหลว
เมื่อใช้รูปแบบของเครื่องมือสร้างฉันมักพบว่าตัวเองสับสนเมื่อต้องปล่อยให้สิ่งก่อสร้างล้มเหลวและฉันก็จัดการวางแผงที่แตกต่างกันในทุก ๆ วัน ก่อนอื่นให้อธิบาย: ด้วยความล้มเหลวในช่วงต้นผมหมายถึงว่าการสร้างวัตถุควรจะล้มเหลวทันทีเป็นพารามิเตอร์ที่ไม่ถูกต้องผ่านใน. SomeObjectBuilderดังนั้นภายใน ด้วยความล้มเหลวในช่วงปลายฉันหมายความว่าการสร้างวัตถุสามารถล้มเหลวในการbuild()โทรเท่านั้น จากนั้นข้อโต้แย้งบางอย่าง: ในความโปรดปรานของความล้มเหลวในช่วงปลาย: ระดับผู้สร้างไม่ควรเกินชั้นที่มีค่าเพียง นอกจากนี้ยังนำไปสู่การทำสำเนารหัสน้อยลง ในความโปรดปรานของความล้มเหลวในช่วงต้น: วิธีการทั่วไปในการเขียนโปรแกรมซอฟต์แวร์คือคุณต้องการตรวจสอบปัญหาให้เร็วที่สุดเท่าที่จะเป็นไปได้และดังนั้นสถานที่ที่มีเหตุผลที่สุดในการตรวจสอบจะอยู่ใน 'constructor,' setters ' ข้อสรุปทั่วไปเกี่ยวกับเรื่องนี้คืออะไร?

4
การเผยแพร่ข้อยกเว้น: เมื่อใดที่ฉันควรตรวจจับข้อยกเว้น
เมธอด A เรียกเมธอด B ซึ่งจะเรียกเมธอด C ไม่มีการจัดการข้อยกเว้นใน MethodB หรือ MethodC แต่มีข้อยกเว้นการจัดการใน MethodA ใน MethodC มีข้อยกเว้นเกิดขึ้น ตอนนี้ข้อยกเว้นนั้นทำให้เดือดร้อนขึ้นไปที่ MethodA ซึ่งจัดการมันอย่างเหมาะสม เกิดอะไรขึ้นกับสิ่งนี้? ในใจของฉันในบางจุดผู้เรียกจะเรียกใช้เมธอด B หรือ MethodC และเมื่อเกิดข้อยกเว้นขึ้นในวิธีการเหล่านั้นสิ่งที่จะได้รับจากการจัดการข้อยกเว้นภายในวิธีการเหล่านั้นซึ่งโดยพื้นฐานแล้วเป็นเพียงลอง / จับ / ในที่สุดบล็อก พวกเขาฟองขึ้นไปที่ callee? คำแถลงหรือความเห็นเป็นเอกฉันท์เกี่ยวกับการจัดการข้อยกเว้นคือการโยนเมื่อการดำเนินการไม่สามารถดำเนินการได้เนื่องจากข้อผิดพลาดนั้น ฉันเข้าใจ. แต่ทำไมไม่จับข้อยกเว้นเพิ่มเติมขึ้นโซ่แทนที่จะลอง / จับบล็อกจนสุด ฉันเข้าใจเมื่อคุณต้องการเพิ่มทรัพยากร นั่นเป็นเรื่องที่แตกต่างอย่างสิ้นเชิง

11
ตัวแปรข้อผิดพลาดเป็นการต่อต้านรูปแบบหรือการออกแบบที่ดีหรือไม่?
เพื่อจัดการข้อผิดพลาดที่เป็นไปได้หลายอย่างที่ไม่ควรหยุดการทำงานฉันมีerrorตัวแปรที่ลูกค้าสามารถตรวจสอบและใช้เพื่อโยนข้อยกเว้น นี่เป็น Anti-Pattern หรือไม่ มีวิธีที่ดีกว่าในการจัดการกับเรื่องนี้? ตัวอย่างของสิ่งนี้คุณสามารถดูmysqli API ของ PHP สมมติว่าปัญหาการมองเห็น (ผู้เข้าถึงขอบเขตสาธารณะและส่วนตัวเป็นตัวแปรในคลาสหรือระดับโลกหรือไม่) ได้รับการจัดการอย่างถูกต้อง

2
วัตถุประสงค์ของ NaN Boxing คืออะไร?
การอ่านศตวรรษที่ 21 Cฉันมาที่บทที่ 6 ในหัวข้อ"การทำเครื่องหมายตัวเลขที่เป็นตัวเลขที่ยอดเยี่ยมกับ NaNs"ซึ่งอธิบายการใช้บิตในแมนทิสซาเพื่อเก็บรูปแบบบิตโดยพลการเพื่อใช้เป็นเครื่องหมายหรือพอยน์เตอร์ WebKit ใช้เทคนิคนี้) ฉันไม่แน่ใจจริงๆฉันเข้าใจประโยชน์ของเทคนิคนี้ว่าฉันเห็นว่าเป็นแฮ็ค (ขึ้นอยู่กับฮาร์ดแวร์ที่ไม่สนใจคุณค่าของ mantissa ใน NaN) แต่มาจากพื้นหลัง Java ที่ฉันไม่คุ้นเคย ความหยาบของ C. นี่คือตัวอย่างของรหัสที่ตั้งและอ่านเครื่องหมายใน NaN #include <stdio.h> #include <math.h> //isnan double ref; double set_na(){ if (!ref) { ref=0/0.; char *cr = (char *)(&ref); cr[2]='a'; } return ref; } int is_na(double in){ if (!ref) return 0; …

13
รูปแบบการออกแบบ - คุณใช้มันหรือไม่
ในฐานะนักเรียนไอทีฉันเพิ่งได้รับภาพรวมเกี่ยวกับรูปแบบการออกแบบโดยหนึ่งในอาจารย์ของเรา ฉันเข้าใจว่าสิ่งนั้นมีไว้เพื่ออะไร แต่บางแง่มุมยังคงดักฟังฉันอยู่ พวกเขาส่วนใหญ่ใช้โปรแกรมเมอร์หรือไม่ เมื่อพูดถึงประสบการณ์ฉันมีปัญหาบางอย่างระหว่างการเขียนโปรแกรมสิ่งที่ฉันไม่สามารถแก้ไขได้ในขณะนี้ แต่ Google และการวิจัยหลายชั่วโมงสามารถแก้ไขปัญหาของฉันได้ หากบางแห่งในเว็บฉันหาวิธีแก้ปัญหาของฉันนี่คือรูปแบบการออกแบบหรือไม่ ฉันใช้มันหรือเปล่า และคุณ (โปรแกรมเมอร์) พบว่าคุณกำลังมองหารูปแบบ (ที่ฉันควรจะมองหาโดยวิธี?) เมื่อคุณเริ่มการพัฒนา? ถ้าเป็นเช่นนี้นี่เป็นนิสัยที่ฉันต้องเริ่มยอมรับ UPDATE: ฉันคิดว่าเมื่อฉันถามว่าโปรแกรมเมอร์ใช้งานพวกเขาหรือไม่ฉันถามว่าเมื่อคุณมีปัญหาในการแก้ปัญหาที่คุณคิดว่า "โอ้ฉันควรใช้รูปแบบนั้น"

5
อะไรคือความพินาศของ MVC [ปิด]
ฉันใช้ MVC / MV * ตั้งแต่ฉันเริ่มจัดระเบียบโค้ดของฉันเมื่อหลายปีก่อน ฉันใช้มันมานานจนฉันไม่สามารถคิดวิธีอื่นใดในการวางโครงสร้างโค้ดของฉันและงานทุกอย่างที่ฉันเคยทำหลังจากฝึกงานเป็น MVC คำถามของฉันคืออะไรการล่มสลายของ MVC คืออะไร? MVC จะเป็นตัวเลือกที่ไม่ดีสำหรับโครงการในกรณีใดและตัวเลือกที่ถูกต้อง (เพิ่มเติม) จะเป็นอย่างไร เมื่อฉันค้นหาทางเลือก MVC เกือบทุกผลลัพธ์เป็นเพียงประเภท MVC ที่แตกต่างกัน หากต้องการ จำกัด ขอบเขตให้แคบลงเพื่อไม่ให้ถูกปิดให้พูดสำหรับเว็บแอปพลิเคชัน ฉันทำงานกับส่วนหลังและส่วนหน้าสำหรับโครงการต่าง ๆ ดังนั้นฉันจึงไม่สามารถพูดได้ว่าส่วนหน้าหรือส่วนหลัง

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

2
ประสิทธิภาพเป็นเหตุผลเดียวที่ไม่ใช้ SignalR (websockets) ทั้งหมดแทน REST API แบบดั้งเดิมหรือไม่
ฉันเคยใช้SignalRฟังก์ชั่นส่งข้อความตามเวลาจริงในหลายโครงการของฉัน ดูเหมือนว่าจะทำงานได้อย่างน่าเชื่อถือและง่ายต่อการเรียนรู้ที่จะใช้ อย่างน้อยที่สุดสิ่งล่อใจสำหรับฉันคือการละทิ้งการพัฒนาบริการ Web API และใช้SignalRสำหรับทุกสิ่ง ฉันรู้สึกว่าสิ่งนี้สามารถทำได้โดยการออกแบบอย่างรอบคอบและถ้าเป็นเช่นนั้นก็จะหมายความว่ารหัสลูกค้าน้อยกว่าจะจำเป็น ที่สำคัญกว่านั้นก็หมายความว่าจะมีอินเทอร์เฟซเดียวกับบริการมากกว่าแยกส่วนและในกรณีที่เลวร้ายที่สุดที่หนึ่งสามารถเชื่อมต่อนี้โดยไม่ต้องคิดเกี่ยวกับเมื่อสิ่งที่ได้รับการแสดง ฯลฯ ดังนั้นฉันอยากรู้ว่า: มีเหตุผลอื่นใดอีกหรือไม่ที่จะไม่ใช้ SignalR แทนบริการเว็บทั้งหมดนอกเหนือจากประสิทธิภาพ ประสิทธิภาพของ SignalR นั้นเพียงพอหรือไม่เกี่ยวกับเรื่องนี้ มันเป็นความฝันของฉันมานานแล้วที่จะสามารถแปลวัตถุฝั่งเซิร์ฟเวอร์และคำจำกัดความการบริการเป็นรหัสการเข้าถึงบริการฝั่งไคลเอ็นต์โดยไม่มีอะไรโง่node.jsๆ ตัวอย่างเช่นถ้าฉันกำหนดวัตถุที่น่าสนใจInterestingObjectและบริการไปCRUDยังวัตถุInterestingObjectServiceฉันสามารถกำหนดเส้นทาง URL มาตรฐานไปยังบริการ - พูดว่า "/ {serviceName} / {methodName}" - แต่ฉันยังคงต้องเขียนรหัสลูกค้าเพื่อเข้าถึง บริการ. เนื่องจากวัตถุจะถูกส่งผ่านจากไคลเอนต์ไปยังเซิร์ฟเวอร์และย้อนกลับจึงไม่มีเหตุผลเชิงปฏิบัติที่จะมีเพื่อกำหนดวัตถุอย่างชัดเจนในรหัสฝั่งไคลเอ็นต์และไม่จำเป็นต้องกำหนดเส้นทางเพื่อดำเนินการ CRUD อย่างชัดเจน ฉันรู้สึกว่าควรมีวิธีที่จะทำให้มาตรฐานทั้งหมดนี้เป็นไปได้ในการเขียนไคลเอนต์ภายใต้สมมติฐานที่ว่าการเข้าถึงบริการทำงานจากไคลเอนต์ไปยังเซิร์ฟเวอร์และกลับมาอย่างโปร่งใสเหมือนที่ฉันเขียน WinForms หรือ Java Applet หรือ Native App หรือสิ่งที่มีคุณ หาก SignalR นั้นดีพอที่จะใช้แทนเว็บเซอร์วิสแบบดั้งเดิมมันอาจเป็นวิธีที่ปฏิบัติได้เพื่อให้บรรลุเป้าหมายนี้ SignalR มีฟังก์ชั่นเพื่อทำให้ฮับทำงานเหมือนบริการที่ฉันอธิบายดังนั้นฉันสามารถกำหนดบริการทั่วไป (CRUD) ที่จะให้ฟังก์ชั่นทั้งหมดนี้นอกกรอบพร้อมภาพสะท้อนบางอย่าง จากนั้นฉันเกือบจะสามารถรับสิทธิ์ในการเข้าถึงบริการได้ช่วยให้ฉันรำคาญกับการเขียนรหัสใหม่เพื่อเข้าถึงสิ่งที่สามารถเข้าถึงได้โดยการประชุม - …

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

3
ผู้ช่วยคืออะไร? มันเป็นรูปแบบการออกแบบหรือไม่? มันเป็นอัลกอริทึมหรือไม่?
อาจจะเป็นเรื่องเล็ก ๆ น้อย ๆ ที่แก้ม แต่ฉันไม่สามารถหาคำตอบได้ทุกที่ผ่านทาง Google ดังนั้นเพื่อให้แน่ใจว่าคำตอบด้านวิศวกรรมซอฟต์แวร์มีคำตอบ: ผู้ช่วยคืออะไร? ฉันได้เห็นชื่อที่ใช้ทุกที่ (ชื่อโมดูลชื่อคลาสชื่อเมธอด) ราวกับว่าความหมายนั้นลึกซึ้งและมีความหมาย แต่ในบริบทของวิทยาศาสตร์คอมพิวเตอร์ (แม้ว่าฉันจะไม่ได้รับปริญญา) ไม่เคยเห็นคำอธิบายหรือคำนิยามใด ๆ ! มันเป็นรูปแบบการออกแบบหรือไม่? มันเป็นอัลกอริทึมหรือไม่? ฉันเคยทำงานในโปรแกรมที่ทั้งโมดูลและคลาสเรียกว่าsomethingsomethinghelper (ซึ่งsomethingsomethingนั้นค่อนข้างสามัญด้วยเช่นกัน) และฉันเปลี่ยนชื่อเป็นบางสิ่งที่สมเหตุสมผลสำหรับฉัน แต่ฉันรู้สึกว่าฉันขาดอะไรบางอย่างที่นี่!

1
ความแตกต่างระหว่างรูปแบบโรงงานและโรงงานแบบนามธรรมคืออะไร
ในที่สุดเมื่อเริ่มพยายามอย่างจริงจังที่จะเรียนรู้รูปแบบพื้นฐานบางอย่าง (ช้ามากในอาชีพการงาน แต่นั่นเป็นเรื่องที่แตกต่างกัน) ฉันพยายามที่จะหาความแตกต่างระหว่างรูปแบบโรงงานและโรงงานนามธรรม อะไรคือความแตกต่างที่สำคัญระหว่างสองรูปแบบนี้? ฉันเข้าใจว่าวิธีการจากโรงงานสร้างวัตถุผ่านการสืบทอดและ Abstract Factory ทำผ่านการจัดวางวัตถุ แต่จากมุมมองที่ใช้งานได้จริงฉันยังคงมีปัญหาในการมองเห็นภาพว่าแต่ละคนทำงานอย่างไร

6
ทำไมหลีกเลี่ยงการสืบทอด Java "ขยาย"
Jame Gosling กล่าว “ คุณควรหลีกเลี่ยงการสืบทอดการปฏิบัติเมื่อทำได้” และใช้การสืบทอดส่วนต่อประสานแทน แต่ทำไม เราจะหลีกเลี่ยงการสืบทอดโครงสร้างของวัตถุโดยใช้คำสำคัญ "ขยาย" และในเวลาเดียวกันทำให้รหัสของเราเป็นวัตถุเชิง? ใครช่วยกรุณายกตัวอย่าง Object Oriented ที่แสดงแนวคิดนี้ในสถานการณ์เช่น "สั่งซื้อหนังสือในร้านหนังสือ"

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