วิศวกรรมซอฟต์แวร์

ถาม - ตอบสำหรับมืออาชีพนักวิชาการและนักเรียนที่ทำงานในวงจรการพัฒนาระบบ

4
บริบทแวดล้อมกับการสร้างคอนสตรัคชัน
ฉันมีคลาสแกนกลางจำนวนมากที่ต้องการ ISessionContext ของฐานข้อมูล ILogManager สำหรับบันทึกและ IService ที่ใช้สำหรับสื่อสารกับบริการอื่น ฉันต้องการใช้การฉีดพึ่งพาสำหรับชั้นนี้ใช้โดยชั้นเรียนหลักทั้งหมด ฉันใช้งานได้สองแบบ คลาสหลักที่ยอมรับ IAmbientContext กับคลาสทั้งหมดสามคลาสหรือฉีดสำหรับคลาสทั้งหมดสามคลาส public interface ISessionContext { ... } public class MySessionContext: ISessionContext { ... } public interface ILogManager { } public class MyLogManager: ILogManager { ... } public interface IService { ... } public class MyService: IService { ... } …

5
ทำตามเส้นทางของสิ่งที่ฉันรู้จากนั้นลองใช้วิธีการเข้ารหัสที่ถูกต้องหรือเริ่มต้นด้วยวิธีการเข้ารหัสที่ดีและพยายามฝืนวิธีของฉันผ่าน?
ก่อนอื่นฉันอยากจะบอกว่าฉันคุ้นเคยกับการทำ Programming Processural เป็นงานอดิเรกของฉัน - ฉันพยายามเรียนรู้ OOP ในสองภาษาและเข้าใจทฤษฎีไม่ใช่แค่การฝึกฝน ฉันมีโครงการสัตว์เลี้ยงที่ฉันต้องการสร้างโดยเฉพาะใน PHP ด้วยแบ็กเอนด์ฐานข้อมูล (ไม่สนใจเลย) เหตุผลหลักของฉันคือการใช้แอพในอุปกรณ์ใด ๆ ดังนั้น WebApp จึงดูเหมือนเป็นตัวเลือกที่สมเหตุสมผล ฉันเข้าใจว่าในการสร้าง PHP WebApps ที่บำรุงรักษาได้มันควรใช้ OOP, Classes, Frameworks, Libraries และอื่น ๆ ซึ่งฟังดูสมเหตุสมผลดังนั้นฉันจึงตัดสินใจลองบางอย่างที่เป็นที่นิยม อย่างไรก็ตามหลังจากสุดสัปดาห์ที่ผ่านมาเพียงแค่พยายามและพยายามผ่านบทช่วยสอนฉันก็สับสนและหงุดหงิดกับการพยายามปรับบทเรียนให้เข้ากับโครงการขนาดเล็กของฉัน ฉันตัดสินใจส่วนใหญ่เป็นหลักฐานพิสูจน์แนวคิดในการสร้างแอปในโปรแกรมอื่น (Microsoft Access) และบรรลุเป้าหมายหลักของฉันในเวลาเพียงไม่กี่ชั่วโมง - ยกเว้นส่วนของเว็บ คำถามของฉันคือฉันควรทำตามเส้นทางของสิ่งที่ฉันรู้จากนั้นลองใช้วิธีการเข้ารหัสที่ถูกต้องหรือฉันควรเริ่มต้นด้วยวิธีการเข้ารหัสที่ดีและพยายามฝืนวิธีของฉันผ่าน? สำหรับโครงการนี้ฉันอยากให้เป็น Open Sourced บน GitHub ดังนั้นฉันจะเปิดให้คนอื่นที่ใช้และเปลี่ยนรหัสของฉัน แต่ฉันก็รู้ว่าถ้าเขียนรหัสไม่ดีมันก็ยากที่จะรวบรวม coders มาช่วย

1
วิธีการนำแนวคิดของ DDD ไปใช้กับโค้ดจริง คำถามเฉพาะภายใน
ฉันกำลังศึกษา DDD อยู่และขณะนี้ฉันกำลังดิ้นรนเพื่อหาวิธีที่จะใช้แนวคิดในโค้ดจริง ฉันมีประสบการณ์เกี่ยวกับ N-Tier ประมาณ 10 ปีดังนั้นจึงเป็นไปได้อย่างมากว่าเหตุผลที่ฉันต้องดิ้นรนคือแบบจำลองทางจิตของฉันมีความสัมพันธ์กับการออกแบบนั้นมากเกินไป ฉันสร้างแอปพลิเคชันเว็บ Asp.NET และฉันเริ่มต้นด้วยโดเมนง่ายๆ: แอปพลิเคชันตรวจสอบเว็บ ที่ต้องการ: ผู้ใช้จะต้องสามารถลงทะเบียน Web App ใหม่เพื่อตรวจสอบ แอปพลิเคชันเว็บมีชื่อที่จดจำง่ายและชี้ไปที่ URL แอปพลิเคชันบนเว็บจะทำการสำรวจสถานะเป็นระยะ ๆ (ออนไลน์ / ออฟไลน์) แอปพลิเคชันเว็บจะสำรวจความคิดเห็นของเวอร์ชันปัจจุบันเป็นระยะ (คาดว่าแอพพลิเคชั่นเว็บจะมี "/version.html" ซึ่งเป็นไฟล์ที่ประกาศรุ่นของระบบในมาร์กอัพที่เฉพาะเจาะจง) ข้อสงสัยของฉันส่วนใหญ่เกี่ยวกับการแบ่งหน้าที่ความรับผิดชอบการหาสถานที่ที่เหมาะสมสำหรับแต่ละสิ่ง (การตรวจสอบความถูกต้องกฎเกณฑ์ทางธุรกิจ ฯลฯ ) ด้านล่างฉันเขียนโค้ดและเพิ่มความคิดเห็นพร้อมคำถามและข้อควรพิจารณา กรุณาวิพากษ์วิจารณ์และให้คำแนะนำ ขอบคุณล่วงหน้า! MODEL DOMAIN สร้างแบบจำลองเพื่อแค็ปซูลกฎธุรกิจทั้งหมด // Encapsulates logic for creating and validating Url's. // Based on "Unbreakable …

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

2
การออกแบบที่เหมาะสมเพื่อหลีกเลี่ยงการใช้ dynamic_cast?
หลังจากทำการวิจัยบางอย่างฉันไม่สามารถหาตัวอย่างง่ายๆในการแก้ไขปัญหาที่ฉันพบบ่อยได้ สมมติว่าฉันต้องการสร้างแอปพลิเคชั่นเล็ก ๆ ที่ฉันสามารถสร้างSquares, Circles และรูปร่างอื่น ๆ แสดงมันบนหน้าจอปรับเปลี่ยนคุณสมบัติของพวกเขาหลังจากที่เลือกพวกเขาแล้วคำนวณขอบเขตทั้งหมดของพวกเขา ฉันจะทำคลาสโมเดลดังนี้: class AbstractShape { public : typedef enum{ SQUARE = 0, CIRCLE, } SHAPE_TYPE; AbstractShape(SHAPE_TYPE type):m_type(type){} virtual ~AbstractShape(); virtual float computePerimeter() const = 0; SHAPE_TYPE getType() const{return m_type;} protected : const SHAPE_TYPE m_type; }; class Square : public AbstractShape { public: Square():AbstractShape(SQUARE){} …

1
รูปแบบไม่ใช่แบบบล็อกดังนั้นฉันไม่ควรสร้างแอปในรูปแบบ MVC / MVP?
ฉันได้อ่านหน้านี้เกี่ยวกับรูปแบบการออกแบบและวิธีที่คุณควรปฏิบัติต่อพวกเขาเมื่อเขียนรหัสของคุณ จากความเข้าใจของฉันเป็นชื่อในรัฐลิงค์: รูปแบบไม่ใช่การสร้างบล็อก ถ้าฉันเข้าใจถูกต้องนี่หมายความว่าไม่ใช้รูปแบบการออกแบบจนกว่าจะเหมาะสมใช่ไหม? อย่าเริ่มต้นโดยบอกว่าคุณจะใช้รูปแบบกลยุทธ์รอจนกว่าคุณจะเขียนโค้ดและถ้าใช้รูปแบบกลยุทธ์นั้นเหมาะสมกับการออกแบบของคุณแล้วใช้มัน ฉันปฏิบัติต่อรูปแบบMCV / MVPเช่นเดียวกับเมื่อฉันสร้างแอปพลิเคชัน GUI หรือไม่ จากลิงก์ที่เกี่ยวข้องมันบอกว่ามันเป็นรูปแบบสถาปัตยกรรม สมมติว่าถ้าฉันสร้างแอปพลิเคชัน GUI และฉันไม่ได้ใช้รูปแบบ MCV / MVP แต่รหัสของฉันสะอาดอ่านได้และบำรุงรักษาได้หรือไม่มันยังคงเป็นกลิ่นรหัส / การออกแบบที่ไม่ดีที่ฉันไม่ได้ใช้รูปแบบ MCV / MVP ?

2
ข้อมูลใดที่ควรเก็บไว้เป็น "อ้างสิทธิ์"
ใน ASP.Net Core ฉันพบว่าการClaimsอนุญาตเป็นวิธีที่ไม่เป็นรูปธรรมมาก เราสามารถเพิ่มอะไรก็ได้ClaimTypeและClaimValueจับคู่; กลุ่ม, ชื่อ, นามสกุล, brithdate, canAccessThisURI, isEditor, ฯลฯ อย่างไรก็ตามวิธีการนี้ (การจัดเก็บสิ่งที่สามารถจัดเก็บเป็นสิทธิเรียกร้อง) จะทำให้ตารางการเรียกร้องจำนวนมากซึ่งรวมถึง 50% ของข้อมูลแอปพลิเคชันของฉัน ฉันสงสัยว่าเป็นวิธีปฏิบัติที่ดีข้อมูลทั่วไปที่ควรจัดเก็บเป็นการอ้างสิทธิ์คืออะไร

4
มีสิ่งอำนวยความสะดวกด้านภาษาของเครื่องกำเนิดไฟฟ้าเช่น `yield 'เป็นความคิดที่ดีหรือไม่?
PHP, C #, Python และภาษาอื่น ๆ สองสามภาษามีyieldคำสำคัญที่ใช้ในการสร้างฟังก์ชั่นเครื่องกำเนิดไฟฟ้า ใน PHP: http://php.net/manual/en/language.generators.syntax.php ใน Python: https://www.pythoncentral.io/python-generators-and-yield-keyword/ ใน C #: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/yield ฉันกังวลว่าในฐานะคุณสมบัติทางภาษา / สิ่งอำนวยความสะดวกyieldแบ่งการประชุมบางส่วน หนึ่งในนั้นคือสิ่งที่ฉันจะอ้างถึงคือ "ความแน่นอน" มันเป็นวิธีการที่ส่งกลับผลลัพธ์ที่แตกต่างกันทุกครั้งที่คุณเรียกมัน ด้วยฟังก์ชั่นที่ไม่ใช่เครื่องกำเนิดไฟฟ้าปกติคุณสามารถเรียกมันได้และถ้ามันได้รับอินพุตเดียวกันมันก็จะส่งคืนเอาต์พุตเดียวกัน ด้วยผลผลิตจะส่งคืนเอาต์พุตที่ต่างกันตามสถานะภายใน ดังนั้นหากคุณสุ่มเรียกใช้ฟังก์ชันการสร้างโดยไม่ทราบสถานะก่อนหน้าคุณจะไม่สามารถคาดหวังว่าจะให้ผลลัพธ์ที่แน่นอน ฟังก์ชั่นเช่นนี้เหมาะสมกับกระบวนทัศน์ทางภาษาอย่างไร จริง ๆ แล้วมันเป็นการทำลายอนุสัญญาใด ๆ เป็นความคิดที่ดีที่จะมีและใช้คุณสมบัตินี้หรือไม่? (เพื่อเป็นตัวอย่างของสิ่งที่ดีและสิ่งที่ไม่ดีgotoเคยเป็นคุณสมบัติของหลายภาษาและยังคงเป็น แต่มันก็ถือว่าเป็นอันตรายและถูกกำจัดให้หมดไปจากบางภาษาเช่น Java) คอมไพเลอร์ภาษาโปรแกรม / ล่ามต้องแยกออกจากอนุสัญญาใด ๆ ที่จะใช้คุณลักษณะดังกล่าวตัวอย่างเช่นภาษาต้องใช้หลายเธรดสำหรับคุณลักษณะนี้ในการทำงานหรือสามารถทำได้โดยไม่ต้องเทคโนโลยีเกลียว?

7
หลีกเลี่ยงกฎในพ่อมดและนักรบ
ในบทความบล็อกชุดนี้ Eric Lippert อธิบายถึงปัญหาในการออกแบบเชิงวัตถุโดยใช้พ่อมดและนักรบเป็นตัวอย่างโดยที่: abstract class Weapon { } sealed class Staff : Weapon { } sealed class Sword : Weapon { } abstract class Player { public Weapon Weapon { get; set; } } sealed class Wizard : Player { } sealed class Warrior : Player { } แล้วเพิ่มกฎสองสามข้อ: …

7
ฉันทำให้ชั้นเรียนของฉันละเอียดเกินไปหรือไม่? หลักการความรับผิดชอบเดี่ยวควรถูกนำไปใช้อย่างไร
ฉันเขียนโค้ดจำนวนมากที่เกี่ยวข้องกับสามขั้นตอนพื้นฐาน รับข้อมูลจากที่อื่น แปลงข้อมูลนั้น วางข้อมูลนั้นไว้ที่ใดที่หนึ่ง ปกติแล้วฉันจะใช้คลาสสามประเภท - โดยได้แรงบันดาลใจจากรูปแบบการออกแบบที่เกี่ยวข้อง โรงงาน - เพื่อสร้างวัตถุจากทรัพยากรบางอย่าง ผู้ไกล่เกลี่ย - เพื่อใช้โรงงานทำการเปลี่ยนแปลงจากนั้นใช้ผู้บังคับบัญชา ผู้บังคับบัญชา - เพื่อใส่ข้อมูลนั้นไปที่อื่น ชั้นเรียนของฉันมักจะมีขนาดค่อนข้างเล็กมักเป็นวิธีเดียว (สาธารณะ) เช่นรับข้อมูลแปลงข้อมูลทำงานทำงานบันทึกข้อมูล สิ่งนี้นำไปสู่การเพิ่มจำนวนชั้นเรียน แต่โดยทั่วไปก็ใช้งานได้ดี ที่ฉันต้องดิ้นรนคือเมื่อฉันมาทดสอบฉันลงเอยด้วยการทดสอบที่รัดกุม ตัวอย่างเช่น; โรงงาน - อ่านไฟล์จากดิสก์ Commander - เขียนไฟล์ลงดิสก์ ฉันไม่สามารถทำการทดสอบได้หากไม่มีอันอื่น ฉันสามารถเขียนรหัส 'ทดสอบ' เพิ่มเติมเพื่อทำดิสก์อ่าน / เขียนได้ แต่จากนั้นฉันก็ทำซ้ำตัวเอง เมื่อดูที่. Net คลาสFileจะใช้วิธีการที่แตกต่างกันโดยจะรวมความรับผิดชอบของโรงงานและผู้บังคับบัญชาเข้าด้วยกัน มันมีฟังก์ชั่นสำหรับการสร้างลบอยู่และอ่านทั้งหมดในที่เดียว ฉันควรมองหาที่จะทำตามตัวอย่างของ. Net และการรวมกันโดยเฉพาะอย่างยิ่งเมื่อจัดการกับทรัพยากรภายนอก - คลาสของฉันด้วยกันไหม? รหัสนั้นยังคงอยู่คู่กัน แต่มันมีความตั้งใจมากกว่า - มันเกิดขึ้นที่การใช้งานดั้งเดิมมากกว่าในการทดสอบ ปัญหาของฉันที่นี่ที่ฉันได้ใช้หลักการความรับผิดชอบเดียวค่อนข้าง …

3
รูปแบบ C # เพื่อจัดการ "ฟังก์ชั่นฟรี" อย่างหมดจดหลีกเลี่ยงคลาสแบบคงที่ "ยูทิลิตี้ถุง" แบบคงที่
เมื่อไม่นานมานี้ฉันได้ตรวจสอบคลาสแบบคงที่ "ยูทิลิตี้กระเป๋า" คลาสแบบคงที่ที่ลอยอยู่รอบ ๆ โค้ดโค้ด C # ขนาดใหญ่บางตัวที่ฉันทำงานด้วย // Helpers.cs public static class Helpers { public static void DoSomething() {} public static void DoSomethingElse() {} } วิธีการเฉพาะที่ฉันตรวจสอบคือ ส่วนใหญ่ไม่เกี่ยวข้องกัน โดยไม่ต้องระบุสถานะชัดเจนตลอดการขอร้อง ขนาดเล็กและ แต่ละประเภทมีการบริโภคหลากหลายประเภท แก้ไข: ข้างต้นไม่ได้มีไว้เพื่อรายการปัญหาที่ถูกกล่าวหา นี่คือรายการลักษณะทั่วไปของวิธีการเฉพาะที่ฉันรีวิว เป็นบริบทที่ช่วยให้คำตอบนำเสนอโซลูชันที่เกี่ยวข้องมากขึ้น สำหรับคำถามนี้ฉันจะอ้างถึงวิธีการชนิดนี้เป็น GLUM (วิธีการใช้งานที่มีน้ำหนักเบาทั่วไป) ความหมายเชิงลบของ "กลัม" มีวัตถุประสงค์บางส่วน ฉันขอโทษถ้าสิ่งนี้เจอในฐานะปุนโง่ แม้แต่การทิ้งความสงสัยเริ่มต้นของฉันเองเกี่ยวกับ GLUMs ฉันไม่ชอบสิ่งต่อไปนี้เกี่ยวกับเรื่องนี้: คลาสแบบสแตติกกำลังถูกใช้เป็นเนมสเปซ แต่เพียงผู้เดียว ตัวระบุคลาสแบบสแตติกนั้นไม่มีความหมาย เมื่อเพิ่ม GLUM …

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

6
การทดสอบหน่วยควรครอบคลุมซอฟต์แวร์ 'ที่ใช้งานได้' เท่านั้น
เรากำลังใช้StructureMapในโครงการพัฒนาซอฟต์แวร์ใหม่ หนึ่งในสมาชิกในทีมได้ใช้การทดสอบหน่วยที่โดยทั่วไปแล้วทดสอบการกำหนดค่าคอนเทนเนอร์ของStructureMap ทำได้โดยทำสิ่งต่อไปนี้ นับจำนวนอินสแตนซ์ของแอสเซมบลีที่กำหนดค่าสำหรับคลาสใน namespace ของแอปพลิเคชันของเรา กำหนดอินสแตนซ์ที่คาดหวังในระดับชั้นเรียน ยืนยันว่าอินสแตนซ์ที่คาดหวังตรงกับอินสแตนซ์ที่พบทั้งหมด ยืนยันว่าอินสแตนซ์ที่คาดหวังตรงกับที่กำหนดไว้ในการทดสอบ ตัวอย่างของสิ่งนี้คือ; var repositories = container.GetAllInstances<IEnvironmentRepository>(); Assert.AreEqual(1, repositories .Count()); foundInstances = foundInstances + repositories .Count(); นอกจากนี้เรายังมี 'การทดสอบหน่วย' สำหรับคลาสต่อไปนี้ public MyClass(IEnvironmentRepository environmentRepository) { } ในการทดสอบเหล่านี้เราเยาะเย้ย IEnvironmentRepository ดังนั้นจะไม่ถูกฉีดจากภาชนะที่จะเกิดขึ้นในระบบสด เพื่อนร่วมงานเพิกเฉยต่อการทดสอบหน่วยในการกำหนดค่าโครงสร้างแผนผังพร้อมแสดงความคิดเห็นตามแนว "การทดสอบหน่วยเท่านั้นทดสอบการกำหนดค่าของตัวเอง" เห็นได้ชัดว่านี่คือจุดประสงค์ของการทดสอบและในความคิดของฉันก็ใช้ได้อย่างสมบูรณ์แบบ ฉันถามคนที่ไม่สนใจการทดสอบเพื่อลบการกำหนดค่าโครงสร้างแผนผังสำหรับIEnvironmentRepository(ด้วยการทดสอบยังคงถูกละเว้น) และเรียกใช้ชุดทดสอบเต็มหน่วยพวกเขาทั้งหมดผ่าน จากนั้นเราก็เรียกใช้แอปพลิเคชันและล้มลงเพราะการกำหนดค่าคอนเทนเนอร์ไม่ถูกต้อง ในความเห็นของฉันสิ่งนี้ได้พิสูจน์คุณค่าของการทดสอบแล้วเพื่อนร่วมงานของฉันยังไม่เห็นด้วย เขากล่าวเพียงว่าเราไม่ควรทำการทดสอบการกำหนดค่า แต่ฉันคิดว่านี่เป็นสิ่งที่ดีในการทดสอบหน่วย ดังนั้นคำถามมากมาย เป็นการทดสอบหน่วยที่ถูกต้อง - เรากำลังทดสอบการกำหนดค่าของคอนเทนเนอร์ของเราไม่ใช่ structuremap นั้นใช้งานได้ (แต่ฉันเห็นการทับซ้อนกัน) …

4
วิธี DDD ในการดำเนินงาน CRUD ขั้นพื้นฐานในแอปพลิเคชันโดเมนเป็นศูนย์กลางที่ซับซ้อน
บริษัท ของฉันกำลังเขียนเว็บแอปพลิเคชันของเราใหม่ตั้งแต่ต้น เป็นแอปพลิเคชันระดับองค์กรขนาดใหญ่ที่มีโดเมนที่ซับซ้อนในอุตสาหกรรมการเงิน เรากำลังใช้ ORM (Entity framework) เพื่อคงอยู่ ในสาระสำคัญครึ่งหนึ่งของศูนย์แอปพลิเคชันของเรามีการรวบรวมข้อมูลดิบจากผู้ใช้เก็บไว้และอีกครึ่งหนึ่งของแอปพลิเคชันที่มีตรรกะโดเมนจริงของเราส่วนใหญ่จะใช้ข้อมูลดิบนั้นเพื่อสร้างภาพโดเมนของเราซึ่งแตกต่างอย่างมากจากต้นฉบับ อินพุตดิบและส่งผ่านไปยังเครื่องยนต์ calc เรียกใช้ calcs และแยกผลลัพธ์ซึ่งจะแสดงต่อผู้ใช้ ในวิธี DDD โดยใช้เลเยอร์ดูเหมือนว่าการดำเนินการ CRUD จะผ่านชั้นโดเมน แต่อย่างน้อยในกรณีของเราสิ่งนี้ดูเหมือนจะไม่สมเหตุสมผล เมื่อผู้ใช้ไปที่หน้าจอแก้ไขเพื่อเปลี่ยนบัญชีการลงทุนเช่นเขตข้อมูลบนหน้าจอเป็นเขตข้อมูลที่แน่นอนที่เก็บไว้ในฐานข้อมูลไม่ใช่การแทนโดเมนที่ใช้ในการคำนวณในภายหลัง เหตุใดฉันจึงต้องโหลดการแทนโดเมนของบัญชีการลงทุนเมื่อหน้าจอแก้ไขต้องการการแสดงฐานข้อมูล (อินพุตดิบ) หลังจากที่ผู้ใช้คลิก "เสร็จสิ้น" บนหน้าจอบัญชีการลงทุนและมีการดำเนินการ POST กับคอนโทรลเลอร์ตอนนี้ผู้ควบคุมมีการแสดงฐานข้อมูลที่แน่นอนของบัญชีการลงทุนที่ต้องการบันทึก แต่ด้วยเหตุผลบางอย่างฉันควรโหลดการแทนโดเมนเพื่อทำการแก้ไขแทนการแมปโมเดลของคอนโทรลเลอร์โดยตรงกับโมเดลฐานข้อมูล (โมเดลเอนทิตีกรอบ) ดังนั้นโดยพื้นฐานแล้วฉันกำลังแมปโมเดลข้อมูลกับโมเดลโดเมนดังนั้นจึงสามารถแมปกลับไปยังตัวแบบข้อมูลเพื่อคงอยู่ได้ มันสมเหตุสมผลแค่ไหน?

4
ปกป้องอินพุตผู้ใช้ของนิพจน์ทั่วไปจากการถูกโจมตี
ฉันรับรู้ถึงการปฏิเสธการแสดงผลปกติ (ReDoS) มีวิธีที่สมเหตุสมผลหรือไม่ที่จะอนุญาตให้ผู้ใช้สร้าง regexes ที่กำหนดเองในขณะที่รับประกันได้ว่าพวกเขาไม่ได้ส่งรูปแบบที่ช้าแบบเอ็กซ์โปเนนเชียล?

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