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

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

3
คุณจะสร้างโครงสร้างใหม่อย่างปลอดภัยในภาษาที่มีขอบเขตแบบไดนามิกได้อย่างไร
สำหรับพวกคุณที่โชคดีที่ไม่ได้ทำงานในภาษาที่มีขอบเขตแบบไดนามิกให้ฉันขอทบทวนเล็กน้อยเกี่ยวกับวิธีการทำงาน ลองนึกภาพภาษาเทียมที่เรียกว่า "RUBELLA" ซึ่งมีลักษณะดังนี้: function foo() { print(x); // not defined locally => uses whatever value `x` has in the calling context y = "tetanus"; } function bar() { x = "measles"; foo(); print(y); // not defined locally, but set by the call to `foo()` } bar(); // prints "measles" …

4
mocks ละเมิดหลักการเปิด / ปิดหรือไม่?
เมื่อนานมาแล้วที่ฉันอ่านคำตอบสแต็คโอเวอร์โฟลว์ที่ฉันหาไม่พบประโยคที่อธิบายว่าคุณควรทดสอบ API สาธารณะและผู้เขียนบอกว่าคุณควรทดสอบอินเทอร์เฟซ ผู้เขียนอธิบายว่าหากมีการเปลี่ยนแปลงวิธีการใช้งานคุณไม่จำเป็นต้องแก้ไขกรณีทดสอบเนื่องจากการทำเช่นนี้จะเป็นการผิดสัญญาที่ทำให้ระบบภายใต้การทดสอบทำงานได้ กล่าวอีกนัยหนึ่งการทดสอบควรล้มเหลวหากวิธีการไม่ทำงาน แต่ไม่ใช่เพราะการใช้งานมีการเปลี่ยนแปลง สิ่งนี้เรียกร้องความสนใจของฉันเมื่อเราพูดถึงการล้อเลียน เนื่องจากการเยาะเย้ยต้องอาศัยการเรียกร้องอย่างคาดหวังจากระบบภายใต้การทดสอบของผู้ทดสอบดังนั้น mocks จึงผนวกเข้ากับการใช้งานอย่างแน่นหนามากกว่าอินเตอร์เฟส ในขณะที่ทำการค้นคว้าmock vs stubหลายบทความเห็นด้วยว่าควรใช้ต้นขั้วแทน mocks เนื่องจากไม่ต้องพึ่งพาความคาดหวังจากการพึ่งพาซึ่งหมายความว่าการทดสอบไม่จำเป็นต้องมีความรู้เกี่ยวกับระบบพื้นฐานภายใต้การใช้งานการทดสอบ คำถามของฉันจะเป็น: mocks ละเมิดหลักการเปิด / ปิดหรือไม่? มีบางสิ่งที่ขาดหายไปในการโต้แย้งเพื่อช่วยสตับในย่อหน้าสุดท้ายที่ทำให้สตับไม่ดีเทียบกับ mocks หรือไม่? ถ้าเป็นเช่นนั้นเมื่อไรจะเป็นกรณีการใช้งานที่ดีในการเยาะเย้ยและเมื่อไหร่จะเป็นกรณีการใช้งานที่ดีในการใช้สตับ

3
เป็นไปได้ไหมที่จะมีฟังก์ชั่นการแกงและการแปรผันในเวลาเดียวกัน?
ฉันกำลังคิดเกี่ยวกับการทำให้ฟังก์ชั่นการแกงและการเปลี่ยนแปลงทั้งสองมีอยู่ในภาษาการเขียนโปรแกรมฟังก์ชั่นแบบไดนามิก แต่ฉันสงสัยว่ามันเป็นไปได้หรือไม่ นี่คือรหัสเทียมบางส่วน: sum = if @args.empty then 0 else @args.head + sum @args.tail ซึ่งคาดว่าจะรวมข้อโต้แย้งของมันทั้งหมด แล้วถ้าตัวเองจะได้รับการรักษาเป็นจำนวนมากแล้วผลที่ได้คือsum 0ตัวอย่างเช่น, sum + 1 เท่ากับ 1 โดยสมมติว่า+สามารถใช้กับตัวเลขได้ อย่างไรก็ตามแม้sum == 0จะเป็นจริงsumจะยังคงรักษาคุณค่าและคุณสมบัติการทำงานของมันไม่ว่าจะมีอาร์กิวเมนต์เท่าใด (เช่น "นำไปใช้บางส่วน" และ "variadic" ในเวลาเดียวกัน) ตัวอย่างเช่นถ้าฉันประกาศ g = sum 1 2 3 จากนั้นgเท่ากับ6แต่เรายังคงสามารถใช้ต่อไปgได้ ตัวอย่างเช่นg 4 5 == 15เป็นจริง ในกรณีนี้เราไม่สามารถแทนที่วัตถุgด้วยตัวอักษร6เพราะแม้ว่าพวกเขาให้ค่าเดียวกันเมื่อถือว่าเป็นจำนวนเต็มพวกเขามีรหัสที่แตกต่างกันภายใน หากการออกแบบนี้ถูกใช้ในภาษาการเขียนโปรแกรมจริงมันจะทำให้เกิดความสับสนหรือความกำกวมหรือไม่?

4
มีการสนับสนุนการใช้ตัวแปรหนึ่งตัวอักษรหรือไม่? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว มีการใช้ตัวแปรหนึ่งตัวอักษรใน Java หรือไม่? ในตัวอย่างโค้ดหรือแบบฝึกหัดคุณมักจะเห็นมัน ฉันไม่สามารถจินตนาการได้ว่ามีการใช้งานสิ่งเหล่านี้เพราะมันทำให้โค้ดอ่านยากขึ้นและฉันไม่เคยเห็นมันถูกใช้ในภาษาการเขียนโปรแกรมอื่น!

2
ความซับซ้อนของ NPath นั้นมีความสมจริงมากกว่าสิบหกล้านหรือไม่ หรือฉันหักเครื่องมือหรือไม่
ฉันเพิ่งวัดโค้ด PHP ขนาดใหญ่ (1153 บรรทัด) โดยใช้ PHPMD ( http://phpmd.org/ ) และมันบอกรหัสว่ามีความซับซ้อนของ NPath เป็น 1624481875730340307783275782424 ดูเหมือนว่าเป็นจำนวนมากอย่างบ้าคลั่งสำหรับฉันชี้ให้เห็นว่าบางที PHPMD อาจจะพังในบางวิธี เป็นไปได้ไหมที่ชิ้นส่วนของโค้ดที่มนุษย์เขียนขึ้นมีความซับซ้อน NPath สูงเช่นนี้? ความซับซ้อนของวัฏจักรเท่ากับ 351 สองรายละเอียดที่สำคัญอาจ - นี่คือรหัสขั้นตอนผสมกับ HTML และ PHPMD จะวัดโค้ดเชิงวัตถุเท่านั้น ในการหลีกเลี่ยงปัญหานี้ฉันได้รวมไฟล์ทั้งหมดไว้ในชั้นเรียนด้วยฟังก์ชั่นเดียวซึ่งเป็นตัวแทนของการใช้งาน ไฟล์นี้ประกอบไปด้วยชุดของคำสั่งสวิตช์ที่ซ้อนกันและภายในนั้นมีคำสั่ง if ..else มากมาย - ดังนั้นมันค่อนข้างซับซ้อนอย่างแน่นอน แก้ไข ฉันต้องการชี้แจงว่าฉันไม่ได้ตั้งคำถามว่า PHPMD กำลังโกหกฉันหรือไม่ ฉันรู้ว่ารหัสเป็นระเบียบอันยิ่งใหญ่ฉันแค่สงสัยว่าเป็นไปได้หรือไม่ที่รหัสใด ๆ ดูเหมือนว่าคำตอบคือใช่มันเป็นไปได้มาก
13 php  code-quality 

3
GPL สามารถบอกเป็นนัยได้กับอนุพันธ์หรือไม่
มีสามโครงการซอฟต์แวร์: A, B และ C A เผยแพร่ให้ทุกคนและได้รับอนุญาตภายใต้ GPL B ขยาย A เผยแพร่เช่นกัน แต่ไม่มีข้อมูลใบอนุญาตหรือได้รับอนุญาตอย่างผิดพลาดภายใต้ LGPL โดยทั่วไปจะเป็นการละเมิดสิทธิ์การใช้งานของ A โดยไม่เป็น GPL ยังมีซอร์สโค้ดของ B อยู่ C ขยาย B สามารถเผยแพร่ C ภายใต้ GPL ได้หรือไม่ แรงจูงใจจะเป็น "A คือ GPL อนุพันธ์ใด ๆ จะต้องเป็น GPL ด้วยดังนั้น B คือ GPL และ C สามารถเป็น GPL ได้เช่นกัน"

2
ขั้นตอนวิธีฝูงมด
ฉันเป็นนักเรียนที่ทำงานเกี่ยวกับการจำลองฝูงมดสำหรับโครงการหลักสูตร อัลกอริทึมสำหรับมันคือ (เห็นได้ชัด) อัลกอริทึมมดอาณานิคม ฉันรู้ว่ามีอัลกอริทึมหลากหลายรูปแบบ แต่ทั้งหมดนั้นมีรายละเอียดทางคณิตศาสตร์มากเกินไปสำหรับเราดังนั้นเราจึงใช้วิธีการที่เรามี: มดเกิดที่อาณานิคมและต้องรวบรวมอาหารจากแหล่งต่าง ๆ เพื่อรักษาอาณานิคม มดทุกตัวมีความคล้ายคลึงกัน พื้นที่ที่มดเคลื่อนที่นั้นเป็นกริด 1,000x1000 ดังนั้นจุดกริดทุกจุดจะทำหน้าที่เป็นจุดที่ถูกต้องสำหรับมดที่จะเข้าครอบครอง ตอนนี้อัลกอริทึมทั้งหมดที่ฉันเจอเกี่ยวข้องกับการรักษาจุดยอดและขอบแยกต่างหาก แต่เนื่องจากเรา จำกัด การเคลื่อนไหวของมดเพียงสี่ทิศทาง (ขึ้น, ลง, ซ้าย, ขวา) ฉันคิดว่ามันไม่สำคัญว่าเราจะวางฟีโรโมนไว้ที่ไหน จุดกริดดังกล่าวข้างต้นเก็บฟีโรโมน มดจะปล่อยฟีโรโมนเฉพาะในกรณีที่ถืออาหาร สำหรับมดที่ตำแหน่ง (i, j) มันจะตัดสินใจว่าจะเคลื่อนที่ไปในขั้นตอนต่อไปโดยการรับฟีโรโมนในสี่โหนดที่อยู่ติดกันในบัญชีสูตรง่าย ๆ นั่นคือความน่าจะเป็นของการเดินทางไปยังโหนดโดย (จำนวนฟีโรโมนที่โหนดติดกันโดยเฉพาะ) / (จำนวนฟีโรโมนในจำนวน 4 โหนดติดกัน) มดไม่สามารถเดินทางกลับไปยังตำแหน่งที่เพิ่งมา มันสามารถทำได้ถ้ามันอยู่ในสถานที่ที่มีอาหารหรืออยู่ในอาณานิคม ตอนนี้ความกังวลของฉันคือ (และสิ่งที่เกิดขึ้นจริงในโปรแกรมของเรา) ว่าเมื่อมดคนแรกมาถึงตำแหน่งที่มีอาหารและหยิบขึ้นมาจากนั้นวิธีการทำงานของอัลกอริทึมของเรามันสามารถเคลื่อนย้ายได้ทุกที่! นี่เป็นเพราะมันจะทิ้งร่องรอยของฟีโรโมนไว้เท่านั้นเมื่อมันมีอาหารไม่ใช่ก่อนหน้านี้และมันเป็นมดตัวแรกไม่มีทางที่มีอยู่ ถ้ามดสามารถเคลื่อนที่ได้ทุกที่มดที่ไปถึงแหล่งอาหารหลังจากนั้นก็จะมีแนวโน้มที่จะติดตามมันเช่นกันแม้ว่ามันจะไม่เคลื่อนที่กลับไปยังอาณานิคม นี่เป็นการเอาชนะวัตถุประสงค์ของอัลกอริธึมทั้งหมด ดังนั้นคำถามของฉันคือ ข้อกังวลข้างต้นถูกต้องหรือไม่ ถ้าไม่เช่นนั้นทำไม ถ้าใช่แล้วจะจัดการกับมันอย่างไร? เราจำเป็นต้องทำการเปลี่ยนแปลงบางอย่างในความเข้าใจพื้นฐานของอัลกอริทึมเพื่อทำให้มันใช้งานได้จริงหรือไม่? อะไรคือสิ่งที่บอบบาง แต่สำคัญอื่น …

3
ใบอนุญาตโอเพนซอร์สประเภทใดที่ไม่สามารถใช้ภายใน บริษัท ได้ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว เมื่อเร็ว ๆ นี้ฉันได้เรียนรู้เกี่ยวกับเครื่องมือและไลบรารีของโอเพ่นซอร์สที่ยอดเยี่ยมมากมายสำหรับ Microsoft Visual Studio เครื่องมือนี้ช่วยให้คุณทำงานได้มากขึ้น ห้องสมุดจะเชื่อมโยงเข้ากับฐานรหัสองค์กร ฉันได้แสดงเครื่องมือและไลบรารีเจ๋ง ๆ เหล่านี้ไว้ในสเปรดชีตแล้วและฉันจะหมดประเภทของสัญญาอนุญาตที่แต่ละคนกำลังใช้งานอยู่ เพื่อให้ห่างไกลในหมู่ห้องสมุดเย็นของฉันฉันเห็นMIT , BSD , Apache ใบอนุญาตเวอร์ชั่น 2.0 อย่างไรก็ตามอาจมีมากขึ้นในอนาคต ฉันจะทราบได้อย่างไร (หรือดีกว่าคุณสามารถแสดงรายการ) ลิขสิทธิ์ที่ได้รับความนิยมซึ่งไม่สามารถใช้งานร่วมกับการใช้งานภายในองค์กรได้ (เพื่อไม่ให้เผยแพร่ภายนอก บริษัท ) และขอขอบคุณเป็นพิเศษคุณสามารถพูดหรือชี้ไปที่คำอธิบาย ฉันไม่ใช่นักกฎหมายและการอ่านใบอนุญาตที่ถูกต้องเหล่านี้ทำให้ฉันปวดหัว ฉันต้องการเตรียมพร้อมที่จะอธิบายว่าทำไมการใช้ใบอนุญาตที่อนุญาตนั้นใช้ได้

1
ทำไมคุณถึงต้องการประเภทที่สูงกว่า
บางภาษาอนุญาตให้มีการเรียนและฟังก์ชั่นที่มีพารามิเตอร์ชนิด (เช่นList<T>ที่Tอาจจะเป็นประเภทพล) ตัวอย่างเช่นคุณสามารถมีฟังก์ชั่นเช่น: List<S> Function<S, T>(List<T> list) อย่างไรก็ตามบางภาษาอนุญาตให้แนวคิดนี้ขยายได้สูงกว่าหนึ่งระดับช่วยให้คุณมีฟังก์ชั่นที่มีลายเซ็น: K<S> Function<K<_>, S, T>(K<T> arg) โดยที่K<_>ตัวเองเป็นประเภทเช่นList<_>นั้นมีพารามิเตอร์ประเภท "บางส่วนประเภท" นี้เรียกว่าตัวสร้างประเภท คำถามของฉันคือทำไมคุณถึงต้องการความสามารถนี้ มันสมเหตุสมผลที่จะมีรูปแบบเหมือนกันList<T>เพราะทุกอย่างList<T>เกือบจะเหมือนกัน แต่สิ่งที่K<_>แตกต่างกันอย่างสิ้นเชิง คุณสามารถมีOption<_>และ a List<_>ที่ไม่มีฟังก์ชั่นทั่วไปเลย

3
ควรใช้ฐานข้อมูล nosql เช่น mongodb ผ่าน mysql เมื่อใด
ฉันใหม่กับแนวคิดของฐานข้อมูล nosql และไม่เคยใช้มัน จากสิ่งที่ฉันได้อ่านและสิ่งเล็ก ๆ น้อย ๆ ที่ฉันเข้าใจฉันยังคงไม่เห็นว่ามันจะมีประโยชน์อย่างยิ่งหากคุณไม่สามารถอ้างอิงระหว่างข้อมูลได้หากไม่มีแนวคิดของคีย์ต่างประเทศ ฉันจะแลกเปลี่ยนตัวอย่างคำถามได้อย่างไรว่า 'ค้นหาความคิดเห็นทั้งหมดที่โพสต์โดยผู้ใช้นี้', 'ค้นหารูปภาพทั้งหมดที่เป็นของอัลบั้มขององค์กร' ฯลฯ ระบบ nosql ย้ายออกจากตัวแบบข้อมูลเชิงสัมพันธ์แบบคงที่ แต่ยังให้คุณสามารถติดตามการอ้างอิงดังกล่าวได้หรือไม่มีบางสิ่งที่คล้ายคลึงกับกุญแจต่างประเทศที่คุณสามารถใช้ในการสืบค้นได้หรือไม่?
13 mysql  nosql 

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

3
วิธีการเก็บรักษาอาร์กิวเมนต์นับเป็นวิธีที่ต่ำและยังคงแยกการพึ่งพาของบุคคลที่สามได้อย่างไร
ฉันใช้ห้องสมุดบุคคลที่สาม พวกเขาส่งPOJOให้ฉันซึ่งอาจนำไปใช้ในจุดประสงค์และวัตถุประสงค์ของเราเช่นนี้: public class OurData { private String foo; private String bar; private String baz; private String quux; // A lot more than this // IMPORTANT: NOTE THAT THIS IS A PACKAGE PRIVATE CONSTRUCTOR OurData(/* I don't know what they do */) { // some stuff } public String getFoo() …

7
มีรูปแบบสำหรับวิธีการ "เพิ่มความเป็นธรรมชาติ" ในการเพิ่มรายการลงในคอลเลกชันหรือไม่? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ฉันคิดว่าวิธีทั่วไปในการเพิ่มบางอย่างลงในคอลเลกชันคือการใช้Addวิธีการบางอย่างที่คอลเลกชันมีให้: class Item {} var items = new List<Item>(); items.Add(new Item()); และไม่มีอะไรผิดปกติเกี่ยวกับเรื่องนั้น ฉันสงสัยว่าทำไมเราไม่ทำแบบนี้: var item = new Item(); item.AddTo(items); มันดูเป็นธรรมชาติมากกว่าวิธีแรกเลย นี้จะมี andvantange ว่าเมื่อItemชั้นมีคุณสมบัติเช่นParent: class Item { public object Parent { get; private set; } } คุณสามารถทำให้สุนัขเซทเทอร์เป็นส่วนตัวได้ ในกรณีนี้แน่นอนคุณไม่สามารถใช้วิธีการขยายได้ แต่บางทีฉันผิดและฉันไม่เคยเห็นรูปแบบนี้มาก่อนเพราะมันผิดปกติเหรอ? คุณรู้หรือไม่ว่ามีรูปแบบดังกล่าวหรือไม่ ในC#วิธีการขยายจะเป็นประโยชน์สำหรับการที่ public static T …

3
อะไรคือจุดที่ทำให้เกิดความแตกต่างทางวากยสัมพันธ์ระหว่างชนิดมาตรฐานและแบบที่ผู้ใช้กำหนด?
แม้ว่าที่นี่ฉันจะอ้างถึงข้อตกลงการตั้งชื่อของ C ++ และBjarne Stroustrupโดยหลักการแล้วฉันเห็นว่าผู้คนใช้กฎที่คล้ายกันสำหรับภาษาอื่นที่นี่และที่นั่น ดังนั้นแนวคิดพื้นฐานคือควรจะแยกแยะชนิดมาตรฐานจากประเภทที่ผู้ใช้กำหนดในขณะที่อ่านโค้ด ตัวอย่างเช่น Bjarne Stroustrup แนะนำว่ามีการใช้ อักษรตัวใหญ่เริ่มต้นสำหรับประเภท (เช่น Square และกราฟ) ซึ่งคำนึงถึงว่า ภาษา C ++ และไลบรารีมาตรฐานไม่ใช้ตัวพิมพ์ใหญ่ อนุญาตให้บรรลุเป้าหมายดังกล่าวข้างต้น แต่ทำไมเราต้องทำเช่นนั้น? อะไรคือจุดประสงค์ของการแยกประเภทมาตรฐานและประเภทที่ผู้ใช้กำหนด? ฉันไม่สามารถหาเหตุผลของ Bjarne Stroustrup เกี่ยวกับเรื่องนั้นได้และนอกจากนี้ฉันเองก็คิดตรงกันข้าม : DI รู้ฉันรู้ "ฉันเป็นใครที่จะโต้แย้ง Stroustrup?" แต่ฟังคุณสมบัติของภาษา C ++ เช่นตัวดำเนินการโอเวอร์โหลดมีวัตถุประสงค์เพื่อให้ประเภทที่ผู้ใช้กำหนดมีระดับการสนับสนุนทางไวยากรณ์ที่คล้ายกันเป็นประเภทมาตรฐาน และทั้งหมดนี้ก็ทำให้งงงวยโดยวินัยการตั้งชื่อที่แตกต่างกัน ... ป.ล. ไม่ต้องพูดถึงว่าคำหนึ่งคำมักจะไม่เพียงพอที่จะตั้งชื่อคลาสและคำที่คั่นด้วยเครื่องหมายขีดล่างที่ขึ้นต้นด้วยตัวพิมพ์ใหญ่ที่ดูต่างชาติ

4
วิธีนี้ฉันเขียนโค้ดนี้สามารถทดสอบได้ แต่มีอะไรผิดปกติกับฉันหรือเปล่า
IContextฉันมีอินเตอร์เฟซที่เรียกว่า สำหรับวัตถุประสงค์นี้ไม่สำคัญว่าจะทำอะไรยกเว้นดังต่อไปนี้: T GetService<T>(); สิ่งที่วิธีนี้ทำคือดูที่ DI คอนเทนเนอร์ปัจจุบันของแอ็พพลิเคชันและพยายามแก้ไขการพึ่งพา ฉันคิดว่าค่อนข้างมาตรฐาน ในแอปพลิเคชัน ASP.NET MVC ของฉันคอนสตรัคของฉันมีลักษณะเช่นนี้ protected MyControllerBase(IContext ctx) { TheContext = ctx; SomeService = ctx.GetService<ISomeService>(); AnotherService = ctx.GetService<IAnotherService>(); } ดังนั้นแทนที่จะเพิ่มหลายพารามิเตอร์ในตัวสร้างสำหรับแต่ละบริการ (เพราะจะทำให้รำคาญและใช้เวลานานสำหรับนักพัฒนาที่ขยายแอปพลิเคชัน) ฉันใช้วิธีนี้เพื่อรับบริการ ตอนนี้ก็รู้สึกผิด แต่วิธีการที่ฉันกำลังเหตุผลมันอยู่ในหัวของฉันนี้ - ฉันจะเยาะเย้ยมัน ฉันสามารถ. IContextการทดสอบตัวควบคุมนั้นคงไม่ยาก ฉันจะต้องต่อไป: public class MyMockContext : IContext { public T GetService<T>() { if (typeof(T) == typeof(ISomeService)) …

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