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

รูปแบบการออกแบบ (โซลูชันที่สามารถทำซ้ำได้สำหรับปัญหาที่เกิดขึ้นทั่วไป) และแนวทางปฏิบัติที่ดีที่สุดในวิศวกรรมซอฟต์แวร์

11
เกิดอะไรขึ้นกับ“ ทีมศัลยกรรม” จาก“ ตำนานคนเดือน”?
หลายปีก่อนเมื่อฉันอ่าน The Mythical Man-Month ฉันพบสิ่งต่าง ๆ มากมายที่ฉันรู้จักจากแหล่งอื่น ๆ อย่างไรก็ตามมีสิ่งใหม่ ๆ อยู่ในนั้นแม้จะเป็นหนังสือจากปี 1975 หนึ่งในนั้นคือ: ทีมผ่าตัด มิลส์เสนอว่าแต่ละส่วนของงานที่มีขนาดใหญ่จะได้รับการจัดการทีม แต่ทีมจะได้รับการจัดระเบียบเหมือนทีมผ่าตัดมากกว่าทีมงานหมู นั่นคือแทนที่จะเป็นสมาชิกแต่ละคนตัดปัญหาปัญหาคนหนึ่งตัดและคนอื่นให้การสนับสนุนทุกอย่างแก่เขาซึ่งจะเพิ่มประสิทธิภาพและประสิทธิผลของเขา นี่เป็นรูปแบบที่น่าสนใจมากสำหรับการจัดทีมพัฒนาซอฟต์แวร์ แต่ฉันไม่เคยพบมันมาอธิบายไว้ในหนังสือวิศวกรรมซอฟต์แวร์เล่มอื่น ๆ ทำไมถึงเป็นอย่างนั้น? "ทีมศัลยกรรม" เป็นเรื่องที่ผิดปกติหรือเปล่า หรือว่ามีการลองและล้มเหลว ถ้าเป็นเช่นนั้นมันล้มเหลวได้อย่างไร? ถ้าไม่ทำไมเราไม่เห็นรูปแบบนั้นถูกนำไปใช้ในโครงการซอฟต์แวร์ในปัจจุบัน

13
ข้อยกเว้น vs ชุดผลลัพธ์ว่างเปล่าเมื่ออินพุตมีความถูกต้องทางเทคนิค แต่ไม่น่าพอใจ
ฉันกำลังพัฒนาห้องสมุดที่มีไว้สำหรับเผยแพร่สู่สาธารณะ มันมีวิธีการต่าง ๆ สำหรับการทำงานกับชุดของวัตถุ - การสร้างการตรวจสอบการแบ่งและการฉายชุดในรูปแบบใหม่ ในกรณีที่มีความเกี่ยวข้องมันเป็นไลบรารีคลาส C # ที่มีส่วนขยายของสไตล์ LINQ IEnumerableที่จะเปิดตัวเป็นแพ็คเกจ NuGet วิธีการบางอย่างในไลบรารีนี้สามารถให้พารามิเตอร์อินพุตที่ไม่น่าพอใจ ตัวอย่างเช่นในวิธี combinatoric มีวิธีการสร้างชุดnรายการทั้งหมดที่สามารถสร้างขึ้นจากชุดแหล่งที่มาของรายการm ตัวอย่างเช่นกำหนดชุด: 1, 2, 3, 4, 5 และขอให้รวมกัน 2 จะผลิต: 1, 2 1, 3 1, 4 ฯลฯ ... 5, 3 5, 4 เห็นได้ชัดว่าเป็นไปได้ที่จะขอสิ่งที่ไม่สามารถทำได้เช่นให้ชุด 3 รายการจากนั้นขอชุดค่าผสม 4 รายการพร้อมตั้งค่าตัวเลือกที่ระบุว่าสามารถใช้งานได้เพียงครั้งเดียว ในสถานการณ์สมมตินี้แต่ละพารามิเตอร์จะถูกต้องเป็นรายบุคคล : การรวบรวมแหล่งที่มาไม่เป็นโมฆะและมีรายการต่างๆ ขนาดที่ต้องการของชุดค่าผสมเป็นจำนวนเต็มบวกที่ไม่ใช่ศูนย์ โหมดที่ร้องขอ (ใช้แต่ละรายการเพียงครั้งเดียว) เป็นตัวเลือกที่ถูกต้อง …

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

2
มีหลักการ OO ใดบ้างที่ใช้ได้กับ Javascript จริงหรือไม่
Javascript เป็นภาษาเชิงวัตถุต้นแบบ แต่สามารถเป็นคลาสได้หลายวิธีโดย: การเขียนฟังก์ชั่นที่จะใช้เป็นคลาสด้วยตัวเอง ใช้ระบบระดับดีในกรอบ (เช่นmootools Class.Class ) สร้างจาก Coffeescript ในตอนแรกฉันมักจะเขียนโค้ดตามคลาสใน Javascript และพึ่งพามันอย่างมาก อย่างไรก็ตามเมื่อเร็ว ๆ นี้ฉันได้ใช้กรอบงาน Javascript และNodeJSที่หายไปจากความคิดในชั้นเรียนนี้และพึ่งพาเพิ่มเติมเกี่ยวกับลักษณะแบบไดนามิกของรหัสเช่น: การเขียนโปรแกรม Async การใช้และการเขียนโค้ดที่ใช้ callbacks / events การโหลดโมดูลด้วย RequireJS (เพื่อไม่ให้รั่วไหลไปยัง namespace ทั่วโลก) แนวคิดการเขียนโปรแกรมเชิงหน้าที่เช่นรายการความเข้าใจ (แผนที่ตัวกรองและอื่น ๆ ) เหนือสิ่งอื่นใด สิ่งที่ฉันรวบรวมได้คือหลักการและรูปแบบ OO ส่วนใหญ่ที่ฉันอ่าน (เช่นรูปแบบ SOLID และ GoF) ถูกเขียนขึ้นสำหรับภาษา OO ที่อ้างอิงกับคลาสในใจเช่น Smalltalk และ C ++ แต่มีผู้ใดบ้างที่สามารถใช้งานได้กับภาษาต้นแบบเช่น Javascript …

4
การพัฒนาคุณสมบัติที่มีวัตถุประสงค์เพียงอย่างเดียวที่จะนำออกมา? [ปิด]
ชื่อของรูปแบบที่ผู้มีส่วนร่วมแต่ละคน (โปรแกรมเมอร์ / นักออกแบบ) ได้พัฒนาสิ่งประดิษฐ์สำหรับวัตถุประสงค์เพียงอย่างเดียวคือการให้บริการเพื่อเบี่ยงเบนความสนใจเพื่อให้การจัดการสามารถลบคุณลักษณะนั้นในผลิตภัณฑ์ขั้นสุดท้าย ? นี่คือคติชนวิทยาที่ฉันได้ยินจากอดีตเพื่อนร่วมงานที่เคยทำงานใน บริษัท พัฒนาเกมขนาดใหญ่ ที่ บริษัท ดังกล่าวเป็นที่ทราบกันดีว่าผู้บริหารระดับกลางถูกกดดันให้ "ให้ข้อมูล" และ "ทำการเปลี่ยนแปลง" กับผลิตภัณฑ์มิฉะนั้นพวกเขาเสี่ยงที่จะถูกมองว่าไม่ได้มีส่วนร่วมในโครงการ สถานการณ์นี้ได้ล่าช้าหลายโครงการเนื่องจาก "การจัดการอินพุต" ฟุ่มเฟือยเหล่านี้ ในโครงการหนึ่งที่ บริษัท ข้างต้นศิลปินและนักพัฒนาได้สร้างตัวละครอนิเมชั่นที่ยิ่งใหญ่ที่ปรากฏในทุก ๆ ฉากและตัดออกมาเหมือนนิ้วโป้งที่เจ็บ พวกเขาออกแบบมันในลักษณะที่สามารถลบออกได้ง่ายก่อนที่เกมจะวางจำหน่าย (นี่คือเมื่อเกมยังคงขายในสื่อทางกายภาพและไม่ใช่ผลิตภัณฑ์ที่ดาวน์โหลดได้) เห็นได้ชัดว่าฝ่ายบริหารลงมติให้ลบภาพเคลื่อนไหว ในด้านบวกฝ่ายบริหารไม่ได้แนะนำการเปลี่ยนแปลงที่ไม่จำเป็นที่จะทำให้โครงการล่าช้าเพราะพวกเขาแสดงให้เห็นว่าพวกเขาได้ให้ข้อมูลที่สร้างสรรค์กับผลิตภัณฑ์ รูปแบบกระบวนการนี้มีชื่อในบรรดาโปรแกรมเมอร์เกมที่ทำงานใน บริษัท เอกชน แต่ฉันลืมชื่อที่แท้จริง ผมเชื่อว่ามัน duck- บางสิ่งบางอย่าง ทุกคนสามารถช่วยชี้ให้เห็นชื่อและอาจมีการอ้างอิงที่น่าเชื่อถือว่ารูปแบบการพัฒนา?

4
ควรใช้คำหลัก const แบบใดใน C เพื่อหาตัวแปรเมื่อใดและเพื่ออะไร
ในขณะที่รับรหัสของฉันได้รับการตรวจสอบที่นี่ปัญหาการใช้constคำหลักเกิดขึ้น ฉันเข้าใจว่ามันใช้สำหรับการใช้งานพฤติกรรมอ่านอย่างเดียวกับตัวแปร ฉันสับสนเกี่ยวกับสถานการณ์ต่าง ๆ ว่าจะมีประโยชน์เมื่อใด ควรใช้เพื่อความชัดเจนในฟังก์ชั่นต้นแบบหรือไม่ ควรใช้เป็นมาตรการรักษาความปลอดภัยระหว่างการพัฒนารหัสหรือไม่ มันควรจะใช้ในขอบเขตของฟังก์ชั่นต่าง ๆ เพื่อประกาศค่าคงที่แบบรันไทม์หรือไม่? ควรจะใช้เลยหรือไม่? คำถามเหล่านี้เป็นเพียงตัวอย่างของความสับสนที่ฉันเผชิญ ความสับสนทั่วไปคือ ควรconstใช้คำหลักในการเขียนโปรแกรม C เมื่อใด สิทธิประโยชน์หลายประเภทที่สามารถได้รับจากการใช้คำหลักนี้ใน C คืออะไร? มีข้อเสียของการใช้constคำหลักหรือไม่ มีการชี้ว่าคำถามนี้อาจกว้างเกินไปเนื่องจากคำถามเหล่านี้มีรายละเอียดตามคำถามของฉัน ฉันแค่อยากจะชี้แจงว่าคำถามเหล่านี้เป็นเพียงเพื่อชี้แจงความสับสนเกี่ยวกับคำถามหลัก ควรใช้คำหลัก const แบบใดใน C เพื่อหาตัวแปรเมื่อใดและเพื่ออะไร นอกจากนี้ยังสามารถใช้ถ้อยคำใหม่เป็น การใช้constคำหลักที่เหมาะสมใน C` ด้วยข้อดีข้อเสียของสิ่งเดียวกัน

8
คำศัพท์ (หรือ“ รูปแบบ”) สำหรับ“ ทำอะไรบางอย่างถ้ายังไม่ได้ทำ” [ปิด]
ฟังดูพื้นฐานดีฉันรู้ แต่เมื่อเร็ว ๆ นี้มีเพื่อนร่วมงานคนหนึ่งบอกฉันว่าวิธีการที่เรียกว่าstartHttpServerซับซ้อนเกินไปที่จะเข้าใจเพราะมันเริ่มเซิร์ฟเวอร์เท่านั้นหากยังไม่ได้ทำงาน ฉันพบว่าฉันมีปัญหาเมื่อฉันตอบว่า "จริงจังฉันทำสิ่งนี้มานานหลายสิบปีแล้ว - มันเป็นรูปแบบทั่วไปในการเขียนโปรแกรม" บ่อยครั้งกว่าที่ฉันจะยอมรับว่าเขากลับมาพร้อมกับเอกสารหลักฐานบางอย่างที่แสดงว่าชุมชนการเขียนโปรแกรมทั้งหมดอยู่เบื้องหลังมุมมองของเขาและฉันก็รู้สึกอาย คำถาม : มีรูปแบบการออกแบบที่จัดทำเป็นเอกสารไว้เบื้องหลังแนวคิดของวิธีการที่ไม่ใช้งานหรือไม่หากการกระทำที่ต้องการมีผลบังคับใช้แล้วหรือไม่? หรือถ้าไม่ใช่รูปแบบจะมีชื่อด้วยหรือไม่? และถ้าไม่มีมีเหตุผลใดที่คิดว่ามันซับซ้อนเกินกว่าที่จะพิจารณาการเขียนวิธีในลักษณะนี้?

5
“ การประชุมเรื่องการตั้งค่า” ไม่ละเมิดหลักการเขียนโปรแกรมพื้นฐานใช่หรือไม่
ผมกำลังมองไปที่ WPF MVVM กรอบCaliburn.Microและอ่านที่มากของสิ่งที่มาตรฐานจะขึ้นอยู่กับการตั้งชื่อ ตัวอย่างเช่นการโยงคุณสมบัติโดยอัตโนมัติใน View to properties ใน ViewModel แม้ว่าสิ่งนี้จะสะดวก (เอารหัสสำเร็จรูปบางส่วนออกไป) แต่ปฏิกิริยาแรกของฉันคือว่ามันไม่ชัดเจนนักกับโปรแกรมเมอร์ใหม่ที่จะอ่านรหัสนี้ กล่าวอีกนัยหนึ่งฟังก์ชันการทำงานของแอปพลิเคชันไม่ได้อธิบายอย่างสมบูรณ์ด้วยรหัสของตัวเอง แต่ยังรวมถึงเอกสารประกอบของกรอบงานด้วย แก้ไข: ดังนั้นวิธีนี้เรียกว่าการประชุมเรื่องการตั้งค่า เนื่องจากฉันไม่พบคำถามใด ๆ เกี่ยวกับเรื่องนี้ฉันจึงเปลี่ยนคำถามของฉัน: คำถามของฉันคือ: การประชุมผ่านการตั้งค่าเป็นวิธีที่ถูกต้องในการทำให้สิ่งต่าง ๆ ง่ายขึ้นหรือเป็นการละเมิดหลักการเขียนโปรแกรมบางอย่าง (และถ้าเป็นเช่นนั้นข้อใด)

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

6
วิธีที่ดีที่สุดในการเริ่มต้นการอ้างอิงของเด็กถึงผู้ปกครองคืออะไร
ฉันกำลังพัฒนาโมเดลวัตถุที่มีคลาสแม่ / ลูกที่แตกต่างกันจำนวนมาก แต่ละวัตถุลูกมีการอ้างอิงถึงวัตถุแม่ของมัน ฉันสามารถนึกถึง (และลอง) หลายวิธีในการเริ่มต้นการอ้างอิงผู้ปกครอง แต่ฉันพบข้อบกพร่องที่สำคัญสำหรับแต่ละวิธี ให้แนวทางที่อธิบายไว้ด้านล่างซึ่งดีที่สุด ... หรือสิ่งที่ดียิ่งขึ้น ฉันจะไม่ตรวจสอบว่ารหัสด้านล่างรวบรวมดังนั้นโปรดลองดูความตั้งใจของฉันถ้ารหัสไม่ถูกต้อง syntactically โปรดทราบว่าตัวสร้างคลาสลูกของฉันบางคนใช้พารามิเตอร์ (นอกเหนือจากแม่) แม้ว่าฉันจะไม่แสดงใด ๆ ผู้เรียกมีหน้าที่ตั้งค่าพาเรนต์และเพิ่มในพาเรนต์เดียวกัน class Child { public Child(Parent parent) {Parent=parent;} public Parent Parent {get; private set;} } class Parent { // singleton child public Child Child {get; set;} //children private List<Child> _children = new List<Child>(); …

5
เป็นวิธีปฏิบัติที่ดีในการสร้าง ClassCollection ของคลาสอื่นหรือไม่?
ให้บอกว่าฉันมีCarคลาส: public class Car { public string Engine { get; set; } public string Seat { get; set; } public string Tires { get; set; } } ให้บอกว่าเรากำลังสร้างระบบเกี่ยวกับที่จอดรถฉันจะใช้Carคลาสจำนวนมากดังนั้นเราจึงสร้างCarCollectionคลาสมันอาจมีวิธีการโฆษณาสองสามอย่างเช่นFindCarByModel: public class CarCollection { public List<Car> Cars { get; set; } public Car FindCarByModel(string model) { // code here return new Car(); …

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

3
วิธีการแสดง (enum) ประเภทใน API สาธารณะ
ฉันกำลังทำงานกับ API อย่างง่ายที่ฉันต้องการใช้สำหรับลูกค้าของตัวเองและเพื่อเปิดให้ประชาชนในอนาคต ฉันมีวัตถุ "รายการ" ซึ่งสามารถมี "ประเภท" ที่แตกต่างกัน ประเภทคือ C "typedef enum" ในขณะที่ฉันมี: typedef enum { ItemTypeBool, ItemTypeNumber, ItemTypeDate, } ItemType; (ฉันอาจเพิ่มบางอย่างในอนาคต) ฉันสงสัยว่าฉันควรจะถ่ายโอนมันเป็นจำนวนเต็มหรือตามที่กำหนดไว้ "สตริง" JSON จะเป็น: สำหรับจำนวนเต็ม: { "name": "The name", "type": 0, ... } สำหรับสตริง: { "name": "The name" "type": "boolean" ... } ฉันสงสัยว่ามีวิธีปฏิบัติที่ดีที่สุดสำหรับสิ่งนี้หรือไม่ การรักษาจำนวนเต็มจะลดความซับซ้อนของรหัสเล็กน้อยและลดแบนด์วิดธ์ แต่สตริงจะง่ายขึ้นสำหรับนักพัฒนาที่จะจำ ฉันจำได้ว่าฉันทำงานในโครงการและฉันต้องจำ 1 = …

6
ฉันควรวางฟังก์ชั่นที่ใช้ในฟังก์ชั่นอื่นเพียงหนึ่งฟังก์ชั่นภายในฟังก์ชั่นนั้นหรือไม่?
โดยเฉพาะฉันเขียนใน JavaScript สมมติว่าฟังก์ชั่นหลักของฉันคือฟังก์ชั่น A ถ้าฟังก์ชั่น A ทำการโทรไปยังฟังก์ชั่น B หลายครั้ง แต่ฟังก์ชั่น B นั้นไม่ได้ใช้ที่อื่นฉันควรวางฟังก์ชั่น B ไว้ในฟังก์ชั่น A หรือไม่ เป็นการปฏิบัติที่ดีหรือไม่? หรือฉันควรจะวาง Function B ในขอบเขตเดียวกับ Function A หรือไม่

12
รูปแบบการออกแบบใดที่เลวร้ายที่สุดหรือมีการ จำกัด แคบที่สุด? [ปิด]
สำหรับทุกโครงการการเขียนโปรแกรมผู้จัดการที่มีประสบการณ์การเขียนโปรแกรมที่ผ่านมาพยายามส่องแสงเมื่อพวกเขาแนะนำรูปแบบการออกแบบบางอย่างสำหรับโครงการของคุณ ฉันชอบรูปแบบการออกแบบเมื่อพวกเขาเข้าท่าหรือถ้าคุณต้องการโซลูชันที่ปรับขนาดได้ ฉันใช้พร็อกซีผู้สังเกตการณ์และรูปแบบคำสั่งในลักษณะที่เป็นบวกและทำทุกวัน แต่ฉันลังเลที่จะใช้พูดรูปแบบโรงงานหากมีวิธีเดียวเท่านั้นในการสร้างวัตถุเนื่องจากโรงงานอาจทำให้ทุกอย่างง่ายขึ้นในอนาคต แต่จะทำให้รหัสซับซ้อนและมีค่าใช้จ่ายที่ซับซ้อน ดังนั้นคำถามของฉันคือเกี่ยวกับอาชีพในอนาคตของฉันและคำตอบของฉันสำหรับผู้จัดการประเภทที่มีการสุ่มชื่อรูปแบบรอบ ๆ : คุณใช้รูปแบบการออกแบบแบบไหนที่ทำให้คุณกลับมาโดยรวม? รูปแบบการออกแบบใดที่เลวร้ายที่สุดรูปแบบที่คุณควรพิจารณายกเว้นในสถานการณ์เดียวที่มีเหตุผล (อ่าน: รูปแบบการออกแบบใดที่นิยามไว้แคบมาก) (มันเหมือนกับว่าฉันกำลังมองหารีวิวเชิงลบของผลิตภัณฑ์ที่ดีโดยรวมของ Amazon เพื่อดูว่าคนที่ถูกหลอกลวงมากที่สุดในการใช้รูปแบบการออกแบบ) และฉันไม่ได้พูดถึง Anti-Patterns ที่นี่ แต่เกี่ยวกับรูปแบบที่มักจะคิดว่าเป็น รูปแบบ "ดี" แก้ไข:ตามที่บางคนตอบปัญหาส่วนใหญ่มักจะมีรูปแบบที่ไม่ "ไม่ดี" แต่ "ใช้ผิด" หากคุณรู้จักรูปแบบที่มักใช้ในทางที่ผิดหรือยากต่อการใช้

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