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

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

1
วิธีเลือกระหว่างการใช้กิจกรรมโดเมนหรือปล่อยให้แอปพลิเคชันเลเยอร์จัดการทุกอย่าง
ฉันกำลังตั้งค่าขั้นตอนแรกของฉันในการออกแบบที่ขับเคลื่อนด้วยโดเมนซื้อสมุดสีฟ้าและทั้งหมดและฉันพบว่าตัวเองเห็นวิธีสามวิธีในการนำโซลูชันมาใช้ สำหรับบันทึก: ฉันไม่ได้ใช้ CQRS หรือการจัดหากิจกรรม สมมติว่าคำขอของผู้ใช้มาในเลเยอร์บริการแอพพลิเคชัน ตรรกะทางธุรกิจสำหรับคำขอนั้นคือ (ด้วยเหตุผลใดก็ตาม) ที่แยกออกเป็นวิธีการในเอนทิตีและวิธีการในบริการโดเมน ฉันจะเรียกวิธีการเหล่านั้นได้อย่างไร ตัวเลือกที่ฉันรวบรวมได้มีดังนี้: ให้บริการแอปพลิเคชันโทรทั้งสองวิธี ใช้วิธีการฉีด / ส่งสองครั้งเพื่อฉีดบริการโดเมนลงในเอนทิตีปล่อยให้เอนทิตีทำสิ่งนั้นแล้วปล่อยให้มันเรียกวิธีการบริการโดเมน (หรือวิธีอื่น ๆ ให้บริการโดเมนเรียกวิธีการในนิติบุคคล) เพิ่มเหตุการณ์โดเมนในวิธีเอนทิตีซึ่งเป็นตัวจัดการที่เรียกใช้บริการโดเมน (ประเภทของกิจกรรมโดเมนที่ฉันกำลังพูดถึงคือ: http://www.udidahan.com/2009/06/14/domain-events-salvation/ ) ฉันคิดว่าสิ่งเหล่านี้ใช้ได้จริง แต่ฉันไม่สามารถเลือกระหว่างพวกเขาได้ ฉันเคยคิดเกี่ยวกับเรื่องนี้มานานแล้วและฉันก็มาถึงจุดที่ฉันไม่เห็นความแตกต่างทางความหมายระหว่างทั้งสาม คุณรู้แนวทางบางอย่างเมื่อใช้อะไร

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

4
อะไรคือชื่อสำนวนที่ใช้วิธีการผูกมัดเพื่อสร้างวัตถุ?
ฉันมักจะใช้รูปแบบที่ฉันใช้วิธีการผูกมัดการตั้งค่าวัตถุคล้ายกับBuilderหรือPrototypeรูปแบบ แต่ไม่ได้สร้างวัตถุใหม่ที่มีการเรียกแต่ละวิธีแทนการปรับเปลี่ยนวัตถุเดิม ตัวอย่าง: new Menu().withItem("Eggs").withItem("Hash Browns").withStyle("Diner"); เพียงแค่สงสัยว่ามีชื่อสำหรับรูปแบบนี้หรือไม่และพิจารณาว่าเป็นรูปแบบการต่อต้านหรือไม่เพราะถึงแม้ว่ามันจะสามารถอ่านได้อย่างคล่องแคล่วมากขึ้นก็สามารถนำไปสู่โซ่วิธียาว

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

2
ใช้ System.Tuple คลาสที่ออกแบบไม่ดีใหม่หรือไม่
ฉันชอบแนวคิดของ System.Tuple ซึ่งทำให้ฉันสามารถส่งคืนพารามิเตอร์หลาย ๆ ตัวในการเรียกใช้ฟังก์ชันเดียวโดยไม่ต้องสร้างคลาสใหม่ทันทีอย่างไรก็ตามสิ่งนี้ท้าทายการเขียนโปรแกรมที่ดีเช่น Microsoft Patterns & Practices, SOLID Principles เป็นต้น ฉันแค่พยายามที่จะประเมินว่าฉันควรใช้คุณลักษณะนี้อย่างอิสระเพียงใดหรือถ้าฉันควรใช้เฉพาะในสถานการณ์กรณีขอบเมื่อจำเป็นเท่านั้น

9
สิ่งที่ต้องทำในฐานะทีมใหม่นำไปสู่โครงการที่มีปัญหาการบำรุงรักษา?
ฉันเพิ่งรับผิดชอบโครงการโค้ดที่มีปัญหาการบำรุงรักษา ฉันจะทำอะไรได้บ้างเพื่อให้โครงงานมีเสถียรภาพ ฉันพบว่าตัวเองอยู่ในสถานที่ที่เรากำลังทำงานกับระบบหลายชั้นที่มีขนาดใหญ่มากที่ขาดสิ่งสำคัญมากมายเช่นการทดสอบหน่วย IOC, MEF, คลาสสแตติกคงที่มากเกินไปชุดข้อมูลบริสุทธิ์เป็นต้นฉัน เพียง 24 แต่ฉันอยู่ที่นี่มาเกือบสามปีแล้ว (แอพนี้พัฒนามา 5 ปี) และส่วนใหญ่เป็นเพราะข้อ จำกัด ด้านเวลาเราเพิ่งเพิ่มอึมากขึ้นเพื่อให้พอดีกับอึคนอื่น หลังจากทำหลายโครงการในเวลาว่างฉันเริ่มเข้าใจว่าแนวคิดเหล่านั้นสำคัญเพียงใด นอกจากนี้เนื่องจากการเปลี่ยนพนักงานฉันพบว่าตัวเองเป็นผู้นำทีมในโครงการนี้และฉันต้องการวิธีการที่ชาญฉลาดในการปรับปรุงแอพนี้ วิธีที่ค่าสามารถอธิบายการจัดการ ฉันมีความคิดเกี่ยวกับสิ่งที่ฉันต้องการจะทำ แต่พวกเขาทั้งหมดดูเหมือนล้นหลามโดยไม่ได้รับมากล่วงหน้า เรื่องราวใด ๆ ที่ผู้คนมีหรือเกี่ยวข้องกับเรื่องนี้จะเป็นเรื่องที่น่าสนใจมาก ขอบคุณ

6
ลอง / จับ / บันทึก / Rethrow - เป็นรูปแบบการต่อต้านหรือไม่
ฉันสามารถดูโพสต์ได้หลายแห่งซึ่งมีความสำคัญของการจัดการข้อยกเว้นที่ตำแหน่งศูนย์กลางหรือที่ขอบเขตกระบวนการได้รับการเน้นว่าเป็นแนวปฏิบัติที่ดีแทนที่จะทิ้งขยะบล็อคโค้ดทุกอันรอบลอง / จับ ฉันเชื่ออย่างยิ่งว่าพวกเราส่วนใหญ่เข้าใจถึงความสำคัญของมัน แต่ฉันเห็นคนยังคงลงท้ายด้วยรูปแบบการป้องกัน catch-log-rethrow เป็นหลักเพราะเพื่อความสะดวกในการแก้ไขปัญหาในระหว่างการยกเว้นพวกเขาต้องการบันทึกข้อมูลเฉพาะบริบทเพิ่มเติม ผ่าน) และวิธีคือการห่อวิธีรอบลอง / catch / log / rethrow public static bool DoOperation(int num1, int num2) { try { /* do some work with num1 and num2 */ } catch (Exception ex) { logger.log("error occured while number 1 = {num1} and number 2 = …

4
มันเป็นการปฏิบัติที่ไม่ถูกต้องหรือไม่ที่จะอนุญาตให้ผู้ใช้กำหนดเขตข้อมูล?
โดยทั่วไปแล้วจะถือว่าเป็นวิธีปฏิบัติที่ไม่ดีที่จะอนุญาตให้ผู้ใช้สร้างฟิลด์ในฐานข้อมูลสำหรับเว็บแอพหรือไม่? ตัวอย่างเช่นฉันกำลังสร้างเว็บแอปสินค้าคงคลังที่บ้านสำหรับภรรยาของฉันและเธอจะต้องการกำหนดฟิลด์ของเธอเองสำหรับรายการที่แตกต่างกัน ฉันวางแผนที่จะอนุญาตให้เธอสร้างหมวดรายการและเพิ่ม "คุณสมบัติ" ให้กับหมวดหมู่เหล่านั้น คุณสมบัติจะเป็นคีย์ / ค่าที่จัดเก็บเป็นสตริง ถ้าเธอมีหมวดหมู่ที่เรียกว่า "Audio CDs" เธอสามารถเพิ่มฟีเจอร์สำหรับสิ่งต่าง ๆ เช่น "artist", "track" เป็นต้น แต่ในหมวดหมู่อื่นเช่น "เฟอร์นิเจอร์" เธอสามารถเพิ่มฟีเจอร์สำหรับสิ่งต่าง ๆ เช่น "วัสดุ "(ไม้พลาสติก ฯลฯ ) จากนั้นรายการใด ๆ อาจเป็นของหนึ่งหมวดหมู่ (หรือหลายกลุ่ม) เพิ่มคุณสมบัติเหล่านั้นไปยังรายการ ฉันสามารถดูปัญหาที่การค้นหาโดยคุณลักษณะเหล่านี้ต้องใช้การเปรียบเทียบสตริงไม่มีการตรวจสอบข้อมูล ฯลฯ ตามวิธีการแบบเปรียวบางทีมันอาจจะเป็นการดีกว่าถ้าให้เธอมากับหมวดหมู่และแอตทริบิวต์ใหม่และฉันจะต้องสร้างตารางใหม่ ในขณะที่เราไป ในตัวอย่างของฉันมันเป็นฐานข้อมูลขนาดเล็ก (เรา 2 คน) และจำนวนของเรกคอร์ดที่สร้างจะมีขนาดเล็กดังนั้นจึงไม่เลวร้ายเกินไป โดยทั่วไปแล้วผู้คนจะจัดการกับสิ่งนี้ใน "ชีวิตจริง" ได้อย่างไร?


5
การรวมตัว getters และ setters
ไลบรารี JavaScript เช่น jQuery รวม 'getters' และ 'setters' ในอินเตอร์เฟสการเขียนโปรแกรมเช่น: $('element').css({'color','blue'}); จะตั้งค่าสีหรือ $('element').css(); จะได้รับ CSS สำหรับองค์ประกอบ มีชื่อสำหรับรูปแบบดังกล่าวและเป็นวิธีปฏิบัติที่ดีที่จะใช้ในแอปพลิเคชันหรือไม่

4
ควรทำการฉีดแบบพึ่งพาได้ใน ctor หรือต่อวิธี?
พิจารณา: public class CtorInjectionExample { public CtorInjectionExample(ISomeRepository SomeRepositoryIn, IOtherRepository OtherRepositoryIn) { this._someRepository = SomeRepositoryIn; this._otherRepository = OtherRepositoryIn; } public void SomeMethod() { //use this._someRepository } public void OtherMethod() { //use this._otherRepository } } ต่อต้าน: public class MethodInjectionExample { public MethodInjectionExample() { } public void SomeMethod(ISomeRepository SomeRepositoryIn) { //use SomeRepositoryIn } …

6
ข้อดีของรูปแบบกลยุทธ์
ทำไมจึงเป็นประโยชน์ในการใช้รูปแบบกลยุทธ์หากคุณสามารถเขียนโค้ดของคุณใน if / then cases? ตัวอย่างเช่น: ฉันมีคลาส TaxPayer และหนึ่งในวิธีการของมันจะคำนวณภาษีโดยใช้อัลกอริทึมที่แตกต่างกัน เหตุใดจึงไม่มีกรณีและกรณีและคิดว่าอัลกอริธึมที่จะใช้ในวิธีการนั้นแทนที่จะใช้รูปแบบกลยุทธ์หรือไม่ นอกจากนี้ทำไมคุณไม่สามารถใช้วิธีแยกต่างหากสำหรับแต่ละอัลกอริทึมในคลาส TaxPayer ได้ นอกจากนี้มันหมายความว่าอัลกอริทึมที่จะเปลี่ยนที่รันไทม์?

12
การใช้เงื่อนไขนี้เป็นการป้องกันแบบแผนหรือไม่?
ฉันเห็นสิ่งนี้มากมายในระบบเดิมของเราในที่ทำงาน - ฟังก์ชั่นที่เป็นไปตามนี้: bool todo = false; if(cond1) { ... // lots of code here if(cond2) todo = true; ... // some other code here } if(todo) { ... } ฟังก์ชั่นนี้มีสองส่วน ส่วนแรกทำการประมวลผลบางอย่าง (อาจมีลูปผลข้างเคียงและอื่น ๆ ) และตามวิธีที่อาจตั้งค่าสถานะ "todo" ส่วนที่สองจะดำเนินการก็ต่อเมื่อมีการตั้งค่าสถานะ "todo" ดูเหมือนจะเป็นวิธีที่น่าเกลียดในการทำสิ่งต่าง ๆ และฉันคิดว่ากรณีส่วนใหญ่ที่ฉันใช้เวลาในการทำความเข้าใจจริง ๆ แล้วสามารถนำกลับมาใช้ใหม่ได้เพื่อหลีกเลี่ยงการใช้ธง แต่นี่เป็นรูปแบบการต่อต้านที่แท้จริงความคิดที่ไม่ดีหรือเป็นที่ยอมรับอย่างสมบูรณ์หรือไม่? refactorization ชัดเจนแรกจะตัดเป็นสองวิธี อย่างไรก็ตามคำถามของฉันเกี่ยวกับว่ามีความต้องการ (ในภาษา OO …

6
คำสั่งใดที่ใช้กำหนดตัวตั้งค่าและตัวตั้งค่า [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้มีแนวโน้มที่จะเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา มีวิธีปฏิบัติที่ดีที่สุดสำหรับการสั่งซื้อเพื่อกำหนด getters และ setters หรือไม่ ดูเหมือนจะมีสองวิธี: คู่ getter / setter getters แรกจากนั้น setters (หรือวิธีอื่น ๆ ) เพื่อเพิ่มความแตกต่างนี่คือตัวอย่าง Java ของคู่ getter / setter: public class Foo { private int var1, var2, var3; public int getVar1() { return var1; } public void setVar1(int var1) …

5
วิธีการย้ายความคิดของฉันจาก C ++ ไปยัง C #
ฉันเป็นนักพัฒนา C ++ ที่มีประสบการณ์ฉันรู้ภาษาอย่างละเอียดและใช้คุณสมบัติบางอย่างของมันอย่างเข้มข้น นอกจากนี้ฉันรู้หลักการของ OOD และรูปแบบการออกแบบ ตอนนี้ฉันเรียนรู้ C # แต่ฉันไม่สามารถหยุดความรู้สึกที่ไม่สามารถกำจัดความคิด C ++ ได้ ฉันผูกตัวเองอย่างหนักเพื่อจุดแข็งของ C ++ ที่ฉันไม่สามารถอยู่ได้หากไม่มีคุณสมบัติบางอย่าง และฉันไม่สามารถหาวิธีแก้ปัญหาที่ดีสำหรับพวกเขาได้ใน C # อะไรแนวปฏิบัติที่ดี , รูปแบบการออกแบบ , สำนวนที่มีความแตกต่างกันใน C # จากมุมมองของ C ++ คุณสามารถแนะนำ? วิธีการได้รับการออกแบบ C ++ ที่สมบูรณ์แบบไม่ได้ดูโง่ใน C # โดยเฉพาะฉันไม่สามารถหาวิธีที่ดีในการจัดการกับ C # (ตัวอย่างล่าสุด): การควบคุมอายุการใช้งานของทรัพยากรที่ต้องมีการล้างข้อมูลที่กำหนด (เช่นไฟล์) นี่เป็นเรื่องง่ายที่มีusingอยู่ในมือ แต่จะใช้งานได้อย่างไรเมื่อมีการถ่ายโอนความเป็นเจ้าของทรัพยากร [... betwen threads]? ใน …

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