มีหลักฐานว่าการใช้การฉีดพึ่งพาช่วยปรับปรุงผลลัพธ์ในวิศวกรรมซอฟต์แวร์หรือไม่?


18

แม้จะมีความนิยม แต่มีหลักฐานเชิงประจักษ์ที่แสดงให้เห็นว่าการพึ่งพาการฉีด (และ / หรือการใช้ภาชนะ DI) ช่วยพูดลดจำนวนข้อผิดพลาดปรับปรุงการบำรุงรักษาหรือเพิ่มความเร็วการพัฒนาในโครงการซอฟต์แวร์ในชีวิตจริง?


3
ซ้ำกันได้ของการพึ่งพาการฉีด: วิธีการขายมัน และก่อนที่คุณจะดูเฉพาะพาดหัวและคิดว่า "เฮ้นี่ไม่ใช่ตัวอักษร" - อ่านคำถามอื่น ๆ และคำตอบฉันคิดว่าพวกเขาเหมาะสมกับคำถามนี้มากที่นี่
Doc Brown

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

6
เทคนิคน้อยมากในการพัฒนาซอฟต์แวร์มาพร้อมกับหลักฐานทางวิทยาศาสตร์ซึ่งคุณสามารถชี้ไปที่รายงานการวิจัยและประกาศอย่างชัดเจนว่าเทคนิคนั้นมีค่า ดังนั้นพวกเราส่วนใหญ่ต้องอาศัยประสบการณ์และการวิเคราะห์ต้นทุน / ผลประโยชน์เพื่อตัดสินการตัดสินใจของเรา คุณเลือกเทคนิคเช่นการฉีดขึ้นอยู่กับว่าคุณต้องการผลประโยชน์ที่มอบให้และเพราะประโยชน์เหล่านั้นมีมากกว่าค่าใช้จ่าย เป็นที่ยอมรับกันว่าแคลคูลัสนั้นค่อนข้างเป็นอัตนัย
Robert Harvey

1
@DocBrown สุจริตฉันเห็นสิ่งนี้ไม่ซ้ำกันหรือเป็นนอกหัวข้อตัวเอง เหตุผลและความมีประสิทธิภาพของการปฏิบัติพัฒนาดูเหมือนมากที่เกี่ยวข้องกับ SE.SE. และฉันจะให้คำตอบ OP อาจจะไม่ชอบคำตอบของฉัน ... แต่ฉันคิดว่ามันคุ้มค่าที่จะมีคำตอบที่ตรงตามวัตถุประสงค์ (เกือบคำตอบ) ว่า TPO และ PMs สามารถคาดหวังว่าทีมของพวกเขาจะเพิ่มผลผลิตได้อย่างน่าอัศจรรย์หรือไม่ ทันทีที่มีคนตะโกนว่า "การฉีดพึ่งพา"
svidgen

3
@ คาดว่าน่าจะเริ่มต้นคำถามเมตาที่แตกต่างกันสำหรับคำถาม "หลักฐาน" ซึ่งถูกเพิ่มเข้าไปในขอบเขตของคำว่า meta "ทรัพยากรไซต์" ที่ได้รับคำตอบมานานหลังจากที่ฉันอัปเกรดแล้ว แน่นอนว่าการขอให้เราไปหาสถิติอาจไม่เป็นประโยชน์ แต่สาระสำคัญของคำถามนั้นสมเหตุสมผลอย่างสมบูรณ์ และสำหรับฉันมันฟังดูเหมือนความเกียจคร้านที่จะเรียกมันออกมาอย่างรวดเร็วหัวข้อ ความคิดเห็นที่นี่โดยเฉพาะให้ความประทับใจว่าเราเป็นกลุ่มนักปรัชญาที่ไม่สามารถปกป้องแนวปฏิบัติของเราได้ เราทำได้ และเราควร
svidgen

คำตอบ:


14

TLDR

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


และตอนนี้ด้วยความฟุ่มเฟื่อยมากขึ้น ...

มีหลักฐานเชิงประจักษ์หรือไม่?

แน่นอนว่าอาจ หรืออย่างน้อยก็อาจ แต่ใครจะสนล่ะ? มันไม่เกี่ยวข้อง

การวิเคราะห์ต้นทุนและผลประโยชน์ทางสถิติของ DI อาจน่าสนใจทางวิชาการ แต่ก็ไม่จำเป็นต้องทำนายความสำเร็จของแต่ละคน ผลลัพธ์โดยรวมซ่อนความสำเร็จและความล้มเหลวของแต่ละบุคคล และฉันอาจยืนยันว่าข้อมูลเกี่ยวกับการปฏิบัติ "ผู้เผยแพร่ศาสนา" นั้นเป็นพิษโดยเฉพาะอย่างยิ่ง สาขาวิชาเหล่านี้มีแนวโน้มที่จะดึงดูดทั้ง zealots และคนโง่ซึ่งทั้งคู่ปิดบังผลกระทบสุทธิของการใช้งาน "บริสุทธิ์" และสิ่งใดสิ่งหนึ่งที่คุณอาจเป็น!

ดังนั้นเราจะรู้ได้อย่างไรว่าการพึ่งพาการฉีดมีค่าเลย?

คำถามที่ดี! คำถามที่ยอดเยี่ยมจริงๆแล้ว และฉันอยู่กับคุณ - ฉันเกลียดการเสียเวลาและความพยายามทางจิตในการ“ ปฏิบัติที่ดีที่สุด” ที่ไร้เหตุผลซึ่งไม่มีใครพิสูจน์ได้ ดังนั้นฉันดีใจที่คุณถาม

เอ่อ แต่นี่เป็นปัญหาที่น่าอาย ... ในทั่วไปข้อตกลงที่คุณไม่ทราบ และยิ่งน่าอายรหัสของคุณอาจไม่ได้ดีขึ้นในทางใดทางหนึ่งโดยการแนะนำ DI


หอบ!

    ⊙▃⊙     . . .      (╯°□°)╯︵ ┻━┻

...


ดังนั้นบางทีตอนนี้คุณสงสัย ...

ทำไมฉันถึงต้องรำคาญ 'สิ่งที่เกี่ยวกับการแข่งขันที่ไม่ได้รับการพิสูจน์ว่าเป็นจริง'!

ก่อนอื่นขอทั้งหมด - ทุกด้านของการอภิปราย - ปักหลัก ฉันขอรับรองกับคุณว่าระหว่างลัทธิความหยิ่งยโสและความสงสัยนั้นเป็นสวรรค์อันงดงามของเหตุผลและความมุ่งมั่นในระดับ (และโพสต์ SE.SE ผิดปกติเป็นครั้งคราว) และ POAP สามารถพาคุณไปที่นั่นได้

... โดยที่ฉันหมายถึงหลักการของการประยุกต์ใช้หลักการ :

หลักการรูปแบบและการปฏิบัติไม่ใช่จุดประสงค์สุดท้าย การประยุกต์ใช้ที่ดีและเหมาะสมของแต่ละคนจึงได้รับแรงบันดาลใจและถูก จำกัดโดยวัตถุประสงค์ที่เหนือกว่า

คุณต้องเข้าใจว่าทำไมคุณถึงทำสิ่งที่คุณทำ!

(POAP ไม่ได้รับการยกเว้นจาก POAP)

(ฉันบอกว่า "เน้นของฉัน" แต่มาจาก "บล็อก" ของฉันเองอยู่ดีดังนั้นมันเป็นของฉันทั้งหมด !)

ฉันขอย้ำประเด็นหลักที่นั่น: คุณต้องเข้าใจว่าทำไมคุณถึงทำสิ่งที่คุณทำ

และบางทีอาจจะต้องอธิบายให้กระจ่างก็มักจะไม่เหมาะสมที่จะรับ "บางสิ่ง" (เช่น Dependency Injection) และใช้งานโดยที่ไม่เข้าใจปัญหาที่แก้ได้ - สำหรับคุณโดยเฉพาะ หากคุณเข้าใจปัญหาของคุณและการทำงานของ "บางสิ่ง" (เช่น DI) มันจะค่อนข้าง "ชัดเจน" ว่า "บางอย่าง" นั้นมีประโยชน์เพียงใดโดยไม่คำนึงถึงข้อมูลเชิงประจักษ์ทั่วไป

หาก DI มีประโยชน์หรือไม่ช่วยเหลือคุณอย่างเห็นได้ชัดหรืออย่างน้อยก็เกินอำนาจการให้เหตุผลของคุณคุณอาจไม่เข้าใจ DI หรือคุณไม่เข้าใจปัญหาของคุณเอง


ลองพิจารณาคำอุปมาเรื่องโลกแห่งความจริง

เราจำเป็นต้องสร้างกล่อง เรามีไม้ เรามีเล็บ และเรามีสองเครื่องมือ: กรงเล็บค้อนมาตรฐานและไขควง

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

และถ้าคุณเคยเห็นใครบางคนเคยใช้เครื่องมืออย่างใดอย่างหนึ่งมาก่อนและถ้าคุณเข้าใจว่ากล่องมีลักษณะอย่างไร

จิต!

เอ่อ ... อืม ...


ใช่แล้วการพึ่งพาการฉีดจะแก้ปัญหาอะไรได้บ้าง

มันทำงานเพื่อป้องกันไม่ให้แข็งยกเลิกการกำหนดรหัสซึ่งมักจะเป็นจึงยกเลิกการทดสอบ

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

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

ดังนั้นสงครามครูเสดที่กระตือรือร้นสำหรับการฉีดพึ่งพา ...

เค แต่ฉันสามารถผ่านการโต้แย้งได้ดี ทำไมกรอบ ?

ตามที่ฉันเข้าใจแล้ว DI Frameworksส่วนใหญ่จะแก้ปัญหาการสะสมของ boilerplate (เนื่องจาก overzealous DI, IMO) โดยเฉพาะอย่างยิ่งเมื่อมีการพึ่งพา "ค่าเริ่มต้น" มาตรฐานสำหรับโมดูลทั้งหมดที่ต้องการ กรอบ DI ทำสิ่งมหัศจรรย์ (อาจซุกซน!) ที่จะลื่นการพึ่งพาเริ่มต้นเหล่านั้นในเมื่อพวกเขาไม่ได้ผ่านอย่างชัดเจน ณ จุดที่ขอร้อง (มีผลเหมือนกับผู้ให้บริการเมื่อใช้ในลักษณะนี้โปรดทราบ!)

การพึ่งพาการฉีดในฐานะ "วินัย" เป็นจริงยากที่จะได้รับสิทธิ มันไม่ใช่เรื่องของการใช้ DI หรือไม่ มันเป็นเรื่องของการรู้ซึ่งอ้างอิงมีแนวโน้มที่จะเปลี่ยนแปลงหรือต้องเยาะเย้ยและฉีดเหล่านั้น แล้วมันเป็นเรื่องของการตัดสินใจว่า DI เหมาะกับทางเลือกที่ดีกว่าเช่นตำแหน่งบริการ ...

แต่ผมขอแนะนำให้คุณใช้ Google มันอาจจะดูคำตอบนี้จึงอาจจะพูดคุยกับนักพัฒนาซุปเปอร์ประสบการณ์และประสบความสำเร็จในอุตสาหกรรมของคุณและตัวอย่างเฉพาะโพสต์ไปCR.SE


4
คุณดมกาว @ @ CandiedOrange บ้างไหม? +1 สำหรับหลักการของวัตถุประสงค์ที่นำไปใช้
Robert Harvey

1
@ RobertHarvey หวังว่าฉันจะบอกว่าฉันใหม่ซึ่งกาวที่เรากำลังพูดถึง! ฉันมีความพยาบาทมายาวนานกับวิศวกรรมความเชื่อ ... ถ้าคุณไม่พูดถึงเรื่องเล่า - อาจเป็นเรื่องตลกเลย - ธรรมชาติของโพสต์?
svidgen

2
หมายเหตุด้านผู้ downvoters ไม่มีอะไรเติมฉันด้วยความมั่นใจในการตัดสินใจที่จะตอบคำถามมากกว่าการลงคะแนนเสียงที่สมดุลและดีขึ้น! ... มันคงจะดีถ้าได้เห็นการวิพากษ์วิจารณ์ของคุณในความคิดเห็นแม้ว่า ...
svidgen

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

เริ่มการแก้ไขเพื่อรวมรายละเอียดเพิ่มเติมเกี่ยวกับ DI โดยเฉพาะและทำให้ TLDR เป็นฟองขึ้นไปด้านบน จากนั้นเด็ก ๆ ก็เริ่มงุนงงดังนั้นฉันจึงกดบันทึก ... ถ้าฉันเผลอสูญเสียสาระสำคัญของสิ่งที่คุณโหวตไป (สำหรับคนที่ทำ) โปรดแจ้งให้เราทราบ!
svidgen

12

ฉันค้นหา Google, Google Scholar, ACM และ IEEE นี่คือเอกสารที่ฉันสามารถหาได้:

  • กรอบการฉีดพึ่งพา: การปรับปรุงเพื่อทดสอบได้? . มันระบุว่า "testability" สามารถกำหนดเป็น "การทำงานร่วมกันต่ำ" มันระบุว่า DI นำไปสู่การทำงานร่วมกันที่ต่ำกว่าการทำงานร่วมกันที่ต่ำกว่ามีความสัมพันธ์กับการครอบคลุมการทดสอบที่สูงขึ้นและที่ครอบคลุมการทดสอบที่สูงขึ้นมีความสัมพันธ์กับข้อบกพร่องที่พบมากขึ้น มันบอกว่าบนพื้นฐานนี้ DI ปรับปรุงความสามารถในการทดสอบ

    ฉันไม่ชอบสิ่งนี้ด้วยเหตุผลสองประการ ก่อนอื่นมันบอกว่า "A มีความสัมพันธ์กับ B, B มีความสัมพันธ์กับ C ดังนั้น A สาเหตุ C" ซึ่งเป็นสองขั้นตอนในตรรกะที่ฉันไม่เห็นว่าได้รับการสนับสนุนอย่างดีจากกระดาษ ประการที่สองยอมรับว่าเป็นเพียงการวัด "ส่วนย่อยของความสามารถในการทดสอบ" และ "ความสามารถในการทดสอบ" โดยทั่วไปนั้นไม่ใช่สิ่งที่กำหนดได้ง่าย ในที่สุดการวัดความสามารถในการทดสอบของพวกเขาถูกกำหนดในแง่ของจำนวนการขึ้นต่อกันของการฉีด!

  • ผลของการฉีดพึ่งพาต่อการดูแลรักษา . พวกเขาเปรียบเทียบโครงการที่ใช้ DI กับโครงการที่ไม่ได้ใช้ DI ที่พบใน SourceForge และดูว่ามีความแตกต่างในตัวชี้วัดการทำงานร่วมกันหรือไม่ เพื่อลดอคติพวกเขาจับคู่โปรเจ็กต์ให้คล้ายกันมากที่สุด ในที่สุดพวกเขาเห็นสัญญาณว่าโครงการที่มี DI จำนวนมากนั้นน้อยกว่าโครงการที่มี DI เพียงเล็กน้อยเท่านั้น อย่างไรก็ตามดูเหมือนว่าไม่มีความแตกต่างอย่างมีนัยสำคัญในการทำงานร่วมกันระหว่างโครงการ DI และคู่ที่ไม่ใช่ของพวกเขาดังนั้นมันอาจเป็นผลมาจากโดเมนที่เฉพาะเจาะจง พวกเขาระบุว่า "ไม่มีความสัมพันธ์" เป็นผลลัพธ์หลักและอาจจะช่วยได้บ้างหรือ? เป็นหัวข้อสำหรับการศึกษาเพิ่มเติม

  • สังเกตุการประเมินผลกระทบของการฉีดพึ่งพาการพัฒนาโปรแกรมบริการเว็บ นามธรรมไม่ได้อธิบายสิ่งที่พวกเขากำลังมองหา ฉันขุดและอ่าน preprint และเท่าที่ฉันสามารถบอกได้ว่าจริง ๆ แล้วเกี่ยวกับวิธีการใช้เครื่องมืออัตโนมัติที่สามารถค้นพบบริการ บริการที่เขียนในรูปแบบ DI ถูกค้นพบได้ง่ายขึ้น นอกจากนี้ยังอ้างถึงการศึกษาก่อนหน้านี้ที่ฉันระบุว่าเป็นหลักฐานเชิงประจักษ์ที่ DI ลดการมีเพศสัมพันธ์ซึ่งตรงข้ามกับสิ่งที่อ้างว่าเป็นเอกสาร

สำหรับเอกสารทั้งสามนี้ (และสำหรับการศึกษาเชิงประจักษ์ในการใช้งานการพึ่งพาการฉีดใน Javaซึ่งเป็นเรื่องเกี่ยวกับการตรวจจับเท่านั้น) ฉันได้ติดตามงานวิจัยทั้งหมดที่อ้างถึงพวกเขาไม่มีการพิจารณาประสิทธิผลของ DI จากทั้งหมดนี้ฉันมั่นใจที่จะบอกว่าไม่เรายังไม่มีหลักฐานเชิงประจักษ์เกี่ยวกับว่า DI ปรับปรุงคุณภาพของซอฟต์แวร์หรือไม่


2
คำถามนี้ตอบคำถามโดยตรง +1
Matthew James Briggs

3
@ MatthewJamesBriggs ฉันไม่ใช่ผู้ลงคะแนน แต่จะตอบคำถามโดยตรงหรือไม่หากคำตอบนั้นทำให้เข้าใจผิดหรือไม่สมบูรณ์ ???
svidgen

@svidgen ฉันไม่เห็นว่าคำตอบนั้นไม่สมบูรณ์ คำถามคือ "เรามีหลักฐานเชิงประจักษ์ที่ DI ใช้งานได้หรือไม่" และคำตอบคือ "ไม่" มันไม่ได้บอกว่ามันใช้งานได้หรือเปล่าแค่นั้นก็ไม่มีงานวิจัยเกี่ยวกับมัน
Hovercouch

1
คำตอบที่ไม่สมบูรณ์และทำให้เข้าใจผิดว่าคุณตอบ จำกัด ขอบเขตของ "หลักฐาน" ถึง "เอกสารที่คุณ (sic) สามารถค้นหา" และครอบคลุมถึง "ประสิทธิผล" โดยไม่เคารพต่อวัตถุประสงค์ที่แท้จริงของ DI และคุณมี ดังนั้นจึงสรุปได้ว่าคำตอบคือ "ไม่" โดยไม่มีคุณสมบัติ ... ฉันขอยืนยันว่าถ้าคุณจะตอบคำถามโดยตรงเช่น @MatthewJamesBriggs แสดงว่าคุณมีความรับผิดชอบอย่างหนักที่จะขุดลึกลงไปและเป็น สามารถแสดงให้เห็นได้ด้วยความมั่นใจสูงที่คุณได้สำรวจลู่ทางทั้งหมด ...
svidgen

1
และผมคิดว่าเมื่อรวมที่มีการประเมินความรีบร้อนของคุณทรัพยากรหนึ่งที่คุณไม่กล่าวถึงผมอาจจะได้เรียกคำตอบนี้มากที่ทำให้เข้าใจผิด เนื่องจากนอกเหนือจากหลักฐานที่เป็นไปได้ทั้งหมดที่คุณเพิกเฉยแล้วคุณยังได้รับเอกสารที่เป็นหลักฐานและลดราคาทันทีด้วยเหตุผลที่ไม่ได้อธิบายอย่างครบถ้วน ... ถ้าฉันจะอ้างเช่น "ไม่มีหลักฐานว่าเราตกลงบนดวงจันทร์" เพราะ "แค่" กระดาษที่ฉันเคยอ่านเรื่องนี้มาจากตำรา "คัดค้าน" ที่ฉันไม่ได้แก้ไข ความไว้วางใจผมหวังว่าคุณจะเชื่อในวิธีการของฉัน ...
svidgen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.