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

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

2
MVCS - รุ่น Store View Controller
ฉันเพิ่งตัดสินใจที่จะเริ่มต้นเรียนรู้การพัฒนา iOS และเพื่อการนี้ฉันได้อ่านการเขียนโปรแกรม iOS: บิ๊กไร่ Nerd คู่มือ ในหนังสือเล่มนี้ผู้เขียนอธิบายรูปแบบการออกแบบMVCS - Model-View-Controller-Storeแนวคิดพื้นฐานว่าเนื่องจากแอปพลิเคชันจำนวนมากใช้ประโยชน์จากแหล่งข้อมูลภายนอกหลายแหล่งที่ทำให้ตรรกะคำขอในตัวควบคุมนั้นยุ่งเหยิงมากแทนที่จะเป็นผู้เขียน เสนอว่าการย้ายตรรกะคำขอทั้งหมดออกจากตัวควบคุมและไปยังวัตถุที่แยกต่างหาก ในระยะสั้นเพื่ออ้างหนังสือ Model-View-Controller-Store ทำให้ตรรกะคำขอเป็นวัตถุแยกต่างหากและเราเรียกวัตถุนี้ว่าร้านค้า (รูปที่ 28.4) การใช้ออบเจกต์ร้านค้าลดรหัสที่ซ้ำซ้อนให้น้อยที่สุดและลดความซับซ้อนของรหัสที่ดึงและบันทึกข้อมูล สิ่งสำคัญที่สุดคือมันย้ายตรรกะในการจัดการกับแหล่งข้อมูลภายนอกเป็นชั้นเรียนที่เป็นระเบียบเรียบร้อยด้วยเป้าหมายที่ชัดเจนและมุ่งเน้น รหัสนี้ทำให้เข้าใจง่ายยิ่งขึ้นซึ่งทำให้ง่ายต่อการบำรุงรักษาและตรวจแก้จุดบกพร่องรวมถึงแบ่งปันกับโปรแกรมเมอร์คนอื่น ๆ ในทีมของคุณ และ สิ่งที่ยอดเยี่ยมเกี่ยวกับร้านค้าอะซิงโครนัสคือแม้ว่าวัตถุจำนวนมากกำลังทำงานเป็นจำนวนมากในการประมวลผลคำขอการไหลของคำขอและการตอบสนองอยู่ในที่เดียวในคอนโทรลเลอร์ สิ่งนี้ทำให้เราได้รับประโยชน์จากโค้ดที่อ่านง่ายและแก้ไขได้ง่าย ฉันต้องการค้นหาเพิ่มเติมเกี่ยวกับรูปแบบนี้และเพื่อดูว่าคนอื่น ๆ อาจจะพูดถึงเรื่องนี้อย่างไร แต่ในขณะที่ค้นหาทางออนไลน์มีเพียงข้อมูลอ้างอิงเดียวที่ฉันพบได้ในหนังสือเล่มเดียวกันนั้น (เป็นชื่อที่รู้จักกันในชื่ออื่น) สำหรับฉันแล้วตรรกะของผู้เขียนดูเหมือนจะสมเหตุสมผลและดูเหมือนว่าเป็นการขยายตรรกะของรูปแบบ MVC ปกติ แต่อาจเป็นเพราะฉันไม่มีประสบการณ์มากกับรูปแบบ MVC ในทางปฏิบัติ (นอกเหนือจากการจู่โจมสู่การพัฒนา iOS ที่ฉันมี ประเภท MVV ที่ใช้แล้วที่มีbackbone.js (นั่นคือถ้าคุณพิจารณาว่าเป็น MVC ) ฉันหวังว่าอาจมีบางคนที่มีประสบการณ์มากกว่านั้นสามารถบอกได้ว่ามีข้อบกพร่อง / ปัญหาที่ชัดเจนเกี่ยวกับรูปแบบMVCSที่ฉันพลาดไปหรือไม่

2
เทียบเท่าหลักการของ SOLID สำหรับการโปรแกรมเชิงฟังก์ชัน
ฉันพบว่าหลักการของ SOLIDค่อนข้างมีประโยชน์เมื่อคิดถึงการออกแบบเชิงวัตถุ มีหลักการเกี่ยวกับภาษาที่ไม่เชื่อเรื่องพระเจ้า / ชุดที่คล้ายกันเหมาะสำหรับการเขียนโปรแกรมการทำงานหรือไม่?

2
การแยกการเข้าถึงข้อมูลใน ASP.NET MVC
ฉันต้องการตรวจสอบให้แน่ใจว่าฉันปฏิบัติตามมาตรฐานอุตสาหกรรมและแนวปฏิบัติที่ดีที่สุดกับการแตกที่แท้จริงครั้งแรกของฉันที่ MVC ในกรณีนี้คือ ASP.NET MVC โดยใช้ C # ฉันจะใช้ Entity Framework 4.1 สำหรับโมเดลของฉันโดยมีวัตถุเป็นรหัสแรก (ฐานข้อมูลมีอยู่แล้ว) ดังนั้นจะมีวัตถุ DBContext สำหรับดึงข้อมูลจากฐานข้อมูล ในการสาธิตที่ฉันได้อ่านผ่านเว็บไซต์ asp.net ผู้ควบคุมจะมีรหัสการเข้าถึงข้อมูลอยู่ สิ่งนี้ดูไม่ถูกต้องสำหรับฉันโดยเฉพาะอย่างยิ่งเมื่อทำตามแนวทางปฏิบัติของ DRY (อย่าทำซ้ำตัวเอง) ตัวอย่างเช่นสมมติว่าฉันกำลังเขียนแอปพลิเคชันเว็บที่จะใช้ในห้องสมุดสาธารณะและฉันมีตัวควบคุมสำหรับการสร้างอัปเดตและลบหนังสือในแคตตาล็อก การกระทำหลายอย่างอาจใช้ ISBN และต้องการส่งคืนวัตถุ "หนังสือ" (โปรดทราบว่านี่อาจไม่ใช่รหัสที่ถูกต้อง 100%): public class BookController : Controller { LibraryDBContext _db = new LibraryDBContext(); public ActionResult Details(String ISBNtoGet) { Book currentBook = _db.Books.Single(b …

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

4
คำสั่ง angularjs ควรโต้ตอบโดยตรงกับบริการหรือไม่หรือเป็นรูปแบบการต่อต้าน?
อันไหนที่ถือว่าดีกว่า: มีคำสั่งที่โต้ตอบกับบริการโดยตรง หรือ มีคำสั่งที่แสดง hooks บางอย่างที่ผู้ควบคุมอาจผูกพฤติกรรม (เกี่ยวข้องกับบริการ)?

2
วิธีการปรับปรุงตามรูปแบบของตัวสร้างของ Bloch เพื่อให้เหมาะสมกับการใช้งานในชั้นเรียนที่ขยายได้สูง
ฉันได้รับอิทธิพลอย่างมากจากหนังสือ Java ที่มีประสิทธิภาพของ Joshua Bloch (ฉบับที่ 2) ซึ่งอาจจะมากกว่าหนังสือโปรแกรมที่ฉันอ่าน โดยเฉพาะรูปแบบตัวสร้างของเขา (รายการ 2) มีผลมากที่สุด แม้ผู้สร้างของ Bloch จะช่วยให้ฉันออกไปไกลกว่าเดิมในช่วงสองเดือนกว่าในช่วงสิบปีที่ผ่านมาของการเขียนโปรแกรม แต่ฉันก็ยังพบว่าตัวเองกำลังชนกำแพงเดียวกัน: การขยายชั้นเรียนด้วยโซ่ตรวนวิธีการกลับมาด้วยตนเอง - โดยเฉพาะอย่างยิ่งเมื่อ generics เข้ามาเล่นและโดยเฉพาะอย่างยิ่งกับgenerics อ้างอิงตนเอง (เช่นComparable<T extends Comparable<T>>) มีความต้องการหลักสองประการที่ฉันมีอยู่เพียงข้อที่สองที่ฉันต้องการเน้นในคำถามนี้: ปัญหาแรกคือ "วิธีการแบ่งปันวิธีการส่งกลับโซ่ตนเองโดยไม่ต้องใช้พวกเขาในทุก ... เดียว ... ชั้น?" สำหรับผู้ที่อาจจะอยากรู้อยากเห็นฉันได้กล่าวถึงส่วนนี้ที่ด้านล่างของคำตอบโพสต์นี้ แต่ไม่ใช่สิ่งที่ฉันต้องการมุ่งเน้นที่นี่ ปัญหาที่สองที่ฉันขอความคิดเห็นคือ "ฉันจะสร้างตัวสร้างในชั้นเรียนที่มีความตั้งใจที่จะขยายโดยชั้นเรียนอื่น ๆ อีกมากมายได้อย่างไร" การขยายชั้นเรียนด้วยตัวสร้างนั้นเป็นเรื่องยากกว่าการขยายชั้นเรียนแบบไม่มี การขยายชั้นเรียนที่มีการสร้างเป็นที่ยังดำเนินการNeedableและดังนั้นจึงมียาชื่อสามัญสำคัญที่เกี่ยวข้องกับมันเป็นเทอะทะ นั่นคือคำถามของฉัน: ฉันจะปรับปรุง (สิ่งที่ฉันเรียกว่า) ตัวสร้าง Bloch ได้อย่างไรฉันจึงสามารถแนบตัวสร้างกับคลาสใดก็ได้ - แม้ว่าคลาสนั้นจะมีความหมายว่า "คลาสพื้นฐาน" ที่อาจเป็น …

6
มีรูปแบบการออกแบบที่จะนำไปใช้กับแบบจำลองส่วนลดหรือไม่?
มีรูปแบบการออกแบบใดบ้างที่รู้จักกันในการใช้โมเดลจำลองส่วนลดหรือไม่? ตามแบบจำลองส่วนลดฉันหมายถึงสิ่งต่อไปนี้: หากลูกค้าซื้อผลิตภัณฑ์ X, ผลิตภัณฑ์ Y และผลิตภัณฑ์ Z เขาจะได้รับส่วนลด 10% หรือ $ 100 หากลูกค้าซื้อผลิตภัณฑ์ X 100 หน่วยเขาจะได้รับส่วนลด 15% หรือ $ 500 หากลูกค้านำมาในปีที่แล้วมากกว่า $ 100K เขาจะได้รับส่วนลด 20% หากลูกค้าซื้อผลิตภัณฑ์ X 2 หน่วยเขาจะได้รับผลิตภัณฑ์ X (หรือ Y) 1 หน่วยฟรี ... มีรูปแบบทั่วไปที่สามารถใช้เพื่อจัดการสถานการณ์ข้างต้นทั้งหมดได้หรือไม่ ฉันกำลังคิดของรุ่นไม่กี่ แต่ไม่สามารถเจอแบบทั่วไป

4
แนวคิดการใช้งาน Model-View-Presenter
ฉันพยายามเข้าใจวิธีนำ decoupling ที่ดีระหว่าง UI และโมเดลมาใช้ แต่ฉันมีปัญหาในการหาตำแหน่งที่จะแบ่งเส้นตรง ฉันได้ดู Model-View-Presenter แล้ว แต่ฉันไม่แน่ใจว่าจะนำไปใช้อย่างไร ตัวอย่างเช่นมุมมองของฉันมีหลายกล่องโต้ตอบ .. ควรมีคลาส View พร้อมอินสแตนซ์ของแต่ละกล่องโต้ตอบหรือไม่? จากนั้นในกรณีนั้นกล่องโต้ตอบควรโต้ตอบกับผู้นำเสนออย่างไร กล่าวคือ ถ้าไดอะล็อกแต่ละรายการต้องการขอข้อมูลจาก Model ผ่าน Presenter กล่องโต้ตอบนั้นควรได้รับการอ้างอิงไปยัง Presenter อย่างไร ผ่านการอ้างอิงไปยังมุมมองที่ให้ไว้ในระหว่างการก่อสร้าง? ฉันคิดว่าบางทีมุมมองที่ควรจะเป็นระดับคงที่? จากนั้นกล่องโต้ตอบ GetView และรับผู้นำเสนอจากที่นั่น ... ฉันกำลังคิดเกี่ยวกับการตั้งค่าผู้นำเสนอด้วยความเป็นเจ้าของมุมมองและรูปแบบ (ตรงข้ามกับมุมมองที่มีผู้นำเสนอและผู้นำเสนอมีรูปแบบ) และผู้นำเสนอลงทะเบียนการเรียกกลับสำหรับกิจกรรมในมุมมอง แต่นั่นทำให้ดูเหมือนมาก คู่เพิ่มเติม (หรือภาษาขึ้นอยู่กับอย่างน้อย) ฉันพยายามที่จะ: ทำให้เป็น decoupled มากที่สุด ทำให้เป็นไปได้ที่จะจับคู่ Presenter / Model กับมุมมองของภาษาอื่น ๆ (ฉันไม่ได้ทำเรื่องระหว่างภาษา แต่ฉันรู้ว่ามันเป็นไปได้โดยเฉพาะยิ่งvoid(void)ฉันสามารถติดแอพ C # …

12
มันเป็นกลิ่นรหัสในการจัดเก็บวัตถุทั่วไปในภาชนะและจากนั้นรับวัตถุและทำให้วัตถุตกต่ำจากคอนเทนเนอร์?
ตัวอย่างเช่นฉันมีเกมที่มีเครื่องมือบางอย่างเพื่อเพิ่มความสามารถของผู้เล่น: Tool.h class Tool{ public: std::string name; }; และเครื่องมือบางอย่าง: Sword.h class Sword : public Tool{ public: Sword(){ this->name="Sword"; } int attack; }; Shield.h class Shield : public Tool{ public: Shield(){ this->name="Shield"; } int defense; }; MagicCloth.h class MagicCloth : public Tool{ public: MagicCloth(){ this->name="MagicCloth"; } int attack; int defense; }; …

8
จะตัดสินได้อย่างไรว่าคลาสตรงตามหลักการความรับผิดชอบเดียว?
หลักการความรับผิดชอบเดี่ยวอยู่บนพื้นฐานของหลักการทำงานร่วมกันสูง ความแตกต่างระหว่างทั้งสองคือคลาสที่มีความเหนียวแน่นสูงมีชุดของความรับผิดชอบที่เกี่ยวข้องอย่างมากในขณะที่คลาสที่ใช้ SRP มีความรับผิดชอบเพียงอย่างเดียว แต่เราจะตัดสินได้อย่างไรว่าคลาสใดมีคุณสมบัติของชุดความรับผิดชอบและมีความสอดคล้องสูงหรือมีความรับผิดชอบเพียงอย่างเดียวและสอดคล้องกับ SRP หรือไม่ กล่าวอีกนัยหนึ่งมันไม่ได้เป็นอัตวิสัยมากกว่าหรือน้อยกว่าเนื่องจากบางคนอาจมองว่าคลาสนั้นมีความละเอียดมาก (และจะเชื่อว่าคลาสนั้นเป็นไปตาม SRP) ในขณะที่คนอื่น ๆ อาจคิดว่ามันไม่ละเอียดเพียงพอ

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

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

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

6
การเพิ่มประสิทธิภาพแบบก้าวหน้ากับแอปหน้าเดียว
ผมเพิ่งกลับมาจากการประชุมในบอสตันที่เรียกว่าเหตุการณ์นอกเหนือ ชุดรูปแบบที่นิยมมากในหมู่ผู้พูดคือแนวคิดของการปรับปรุงแบบก้าวหน้า - เนื้อหาของเว็บไซต์ควรเป็น HTML และ JavaScript ควรใช้เพื่อปรับปรุงพฤติกรรมเท่านั้น ข้อโต้แย้งที่ผู้บรรยายได้ให้ไว้เพื่อการปรับปรุงอย่างต่อเนื่องนั้นน่าสนใจมาก ไม่เพียง แต่เป็นรูปแบบที่มั่นคงสำหรับการสนับสนุนเบราว์เซอร์รุ่นเก่าและอุปกรณ์บนเครือข่ายที่มีแบนด์วิดท์ต่ำ แต่ HTML ล้มเหลวอย่างงดงามมากกว่า JavaScript (เช่นมาร์กอัปที่ไม่รองรับจะถูกละเว้นเพียงแค่ในขณะที่เบราว์เซอร์ สคริปต์ - คุณถูก hosed) Jeremy Keithพูดคุยอย่างลึกซึ้งโดยเฉพาะเกี่ยวกับเรื่องนี้ แต่เว็บแอปพลิเคชันหน้าเดียวเช่น Backbone และ Angular ล่ะ การออกแบบทั้งหมดที่อยู่เบื้องหลังเฟรมเวิร์กเหล่านี้ดูเหมือนจะผลักดันให้ผู้พัฒนาเคลื่อนย้ายเนื้อหาออกจาก HTML และกลายเป็นสิ่งที่คล้ายกับ JSON API ฉันไม่สามารถพูดถึงรูปแบบการออกแบบทั้งสองนี้ได้: การเพิ่มประสิทธิภาพแบบก้าวหน้ากับแอปพลิเคชันเว็บหน้าเดียว มีกรณีที่หนึ่งดีกว่าอีกหรือไม่ หรือว่าพวกเขาไม่ได้เป็นเทคโนโลยีที่เป็นปรปักษ์กันและฉันขาดอะไรบางอย่างที่นี่ด้วยแบบจำลองทางจิตของฉัน?

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

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