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

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

3
หน่วยทดสอบคลาสที่ใช้ DI โดยไม่ต้องทดสอบภายใน
ฉันมีชั้นเรียนซึ่งได้รับการปรับโครงสร้างใหม่ใน 1 ชั้นหลักและชั้นเรียนขนาดเล็ก 2 ชั้น คลาสหลักใช้ฐานข้อมูล (เหมือนคลาสของฉัน) และส่งอีเมล ดังนั้นคลาสหลักจะมีIPersonRepositoryและแบบIEmailRepositoryที่เขาส่งไปยังคลาสที่เล็กกว่า 2 คลาส ตอนนี้ฉันต้องการทดสอบหน่วยหลักและเรียนรู้ที่จะไม่คัดลอกงานภายในของชั้นเรียนเพราะเราควรจะสามารถเปลี่ยนงานภายในโดยไม่ต้องทำการทดสอบหน่วย แต่เป็นชั้นใช้IPersonRepositoryและIEmailRepositoryผมมีการระบุ (จำลอง / จำลอง) IPersonRepositoryผลการค้นหาสำหรับวิธีการบางอย่างสำหรับ คลาสหลักจะคำนวณข้อมูลบางส่วนตามข้อมูลที่มีอยู่และส่งคืนข้อมูลนั้น ถ้าฉันต้องการทดสอบสิ่งนั้นฉันไม่เห็นว่าฉันจะเขียนแบบทดสอบได้อย่างไรโดยไม่ระบุว่าIPersonRepository.GetSavingsByCustomerIdผลตอบแทน x แต่จากนั้นการทดสอบหน่วยของฉัน 'รู้' เกี่ยวกับงานภายในเพราะ 'รู้' ว่าวิธีไหนที่จะเยาะเย้ยและไม่ทำ ฉันจะทดสอบคลาสที่ฉีดการพึ่งพาโดยไม่ต้องทดสอบรู้เกี่ยวกับ internals ได้อย่างไร พื้นหลัง: จากประสบการณ์ของฉันการทดสอบจำนวนมากเช่นนี้สร้าง mocks สำหรับที่เก็บข้อมูลจากนั้นให้ข้อมูลที่ถูกต้องสำหรับ mocks หรือทดสอบว่ามีการเรียกเมธอดเฉพาะระหว่างการดำเนินการหรือไม่ ทั้งสองวิธีการทดสอบรู้เกี่ยวกับ internals ตอนนี้ฉันได้เห็นการนำเสนอเกี่ยวกับทฤษฎี (ซึ่งฉันเคยได้ยินมาก่อน) ว่าการทดสอบไม่ควรรู้เกี่ยวกับการนำไปใช้ ก่อนอื่นเพราะคุณไม่ได้ทดสอบวิธีการทำงาน แต่ยังเพราะเมื่อคุณเปลี่ยนการใช้งานการทดสอบหน่วยทั้งหมดล้มเหลวเพราะพวกเขา 'รู้' เกี่ยวกับการใช้งาน ในขณะที่ฉันชอบแนวคิดของการทดสอบที่ไม่รู้ว่าจะนำไปใช้อย่างไรฉันก็ไม่รู้ว่าจะทำอย่างไร

4
มันไม่สมเหตุสมผลที่จะรวมความสัมพันธ์แบบหนึ่งต่อหนึ่งหรือไม่?
หากเรามีตาราง A ที่มีความสัมพันธ์แบบหนึ่งต่อหนึ่งกับตาราง B มันทำให้รู้สึกถึงความแตกต่างหรือไม่? หรือไม่เคยเจ็บที่จะรวมมันไว้ในตารางเดียว? ทำอย่างใดอย่างหนึ่งในสถานการณ์เหล่านี้ (สองตารางเทียบกับตารางที่รวมกันหนึ่งตาราง) ส่งผลต่อสิ่งใด ๆ ที่เกี่ยวกับรูปแบบปกติ (1NF, 2NF, 3NF ฯลฯ )

2
รูปแบบโดเมนที่ใช้ร่วมกันของสถาปัตยกรรม Microservice
สมมติว่าเรามีแอพพลิเคชั่น Spring Boot ที่ใช้สถาปัตยกรรมไมโครไซต์ แต่ละบริการมีรูปแบบโดเมนของตนเอง แต่แต่ละบริการต้องอ้างอิงวัตถุโดเมนผู้ใช้ อะไรจะเป็นวิธีที่ดีที่สุดในการแก้ไขปัญหานี้? แต่ละบริการจะมี userId ที่ดีกว่าหรือไม่จากนั้นเมื่อจำเป็นให้สอบถามผู้ใช้บริการเพื่อขอรายละเอียดของผู้ใช้หรือดีกว่าถ้ามีห้องสมุดโดเมนที่ใช้ร่วมกันสำหรับไมโครไซต์ทั้งหมด

1
อัลกอริทึมสำหรับการนั่ง Zoombinis บนเรือข้ามฟากของกัปตันคาจันหรือไม่
ฉันเพิ่งเล่นเกมThe Logical Journey of the Zoombinisเมื่อไม่นานมานี้และพยายามใช้อัลกอริธึมคอมพิวเตอร์บางอย่างที่สามารถไขปริศนาต่าง ๆ ได้ ฉันติดอยู่กับวิธีเข้าหาปริศนาเรือข้ามฟากของกัปตันคาจุน สำหรับผู้ที่ไม่คุ้นเคย Zoombini เป็นสิ่งมีชีวิตที่มี 4 คุณลักษณะ: ผม, ตา, จมูกและเท้า แต่ละแอตทริบิวต์เหล่านั้นมี 5 ค่าที่เป็นไปได้ ตัวอย่างเช่นเท้าของ Zoombini สามารถเป็นล้อโรลเลอร์สเกตรองเท้าผ้าใบสปริงหรือใบพัด นี่คือตัวอย่างของ Zoombini ที่มีผมยุ่งแว่นตาจมูกสีเขียวและรองเท้าผ้าใบ: ในจิ๊กซอว์แพขนานยนต์ภารกิจคือการจัดคอลเลคชั่น 16 Zoombinis บนที่นั่ง 16 ที่นั่งของเรือข้ามฟาก ข้อตกลงดังกล่าวจะต้องปฏิบัติตามกฎว่าจะต้องมี Zoombinis ซึ่งมีที่นั่งอย่างน้อยหนึ่งที่นั่งที่อยู่ติดกัน หาก Zoombinis สองคนมีผมที่แตกต่างกันดวงตาที่แตกต่างกันจมูกที่แตกต่างกันและเท้าที่แตกต่างจากกันพวกเขาอาจไม่ได้อยู่ติดกัน การจัดเรียงที่นั่งเปลี่ยนแปลงตามระดับ เพื่อความเป็นรูปเป็นร่างเรามามุ่งเน้นที่ระดับ "ยากมาก" ซึ่งมี 16 ที่นั่งที่จัดเรียงในตาราง 4-by-4 นี่คือตัวอย่างที่ 15 Zoombinis ถูกกฎหมายนั่ง แต่ …
12 algorithms 

6
แอพพลิเคชั่น JavaScript ขนาดใหญ่ควรมีโครงสร้างอย่างไร?
เมื่อเร็ว ๆ นี้ฉันได้แสดงปลั๊กอิน JavaScript บางรายการที่เขียนขึ้นสำหรับ OBIEE Mobile App Developer รวมถึงห้องสมุดที่กำหนดเองสำหรับโครงการต่างๆ มาจากพื้นหลังของ OOP ฉันสับสนเล็กน้อยเกี่ยวกับโครงสร้างของโครงการเหล่านี้ ฉันเห็นไฟล์ที่มีความยาวหลายพันบรรทัด ฉันคุ้นเคยกับการแยกสิ่งต่าง ๆ เป็นไฟล์และคลาส แต่ฉันเข้าใจว่านี่เป็นกรอบงานที่แตกต่างกัน - สำหรับขนาดไฟล์เป็นปัญหา - แต่ต้องมีวิธีที่ดีกว่าในการทำทั้งหมดหรือไม่ ความยาวของสคริปต์ไม่เพียงส่งผลต่อความสามารถในการอ่านและการบำรุงรักษา แต่ยังรวมถึงความเข้าใจโดยทั่วไปของบุคคลว่าโปรแกรมทำงานอย่างไร แอปพลิเคชันขนาดใหญ่มีโครงสร้างอย่างไร รูปแบบการออกแบบ OOP ทั่วไปสำหรับสิ่งนี้?

2
ความแตกต่างระหว่างการทดสอบกับข้อมูลจำเพาะ
ฉันมีปัญหาเกี่ยวกับแนวคิด ณ จุดนี้และฉันไม่สามารถหาข้อมูลใด ๆ เกี่ยวกับความแตกต่างระหว่างการทดสอบ (UnitTest ฯลฯ ) เทียบกับ Spec (Rspec ฯลฯ ) เท่าที่ฉันรู้รายละเอียดคือการทดสอบการรวมและการทดสอบเป็น UnitTest แต่เพียงแค่นั้น คุณช่วยอธิบายความแตกต่างได้อย่างไร

4
เป็นการปฏิบัติที่ไม่ถูกต้องหรือไม่ที่จะใช้พารามิเตอร์วิธีการซ้ำ
มีบางครั้งที่ฉันจะต้องแก้ไขค่าที่ส่งผ่านไปยังเมธอดจากภายในเมธอดเอง ตัวอย่างจะทำให้บริสุทธิ์สตริงเช่นวิธีนี้ที่นี่: void SanitizeName(string Name) { Name = Name.ToUpper(); //now do something here with name } สิ่งนี้ไม่เป็นอันตรายอย่างNameแท้จริงเนื่องจากอาร์กิวเมนต์ไม่ได้ถูกส่งผ่านโดยการอ้างอิง อย่างไรก็ตามถ้าด้วยเหตุผลบางอย่างผู้พัฒนาในอนาคตตัดสินใจที่จะให้ค่าทั้งหมดผ่านโดยอ้างอิงการฆ่าล้างของสตริงจะส่งผลกระทบต่อค่านอกวิธีการที่อาจมีผลเป็นอันตราย ดังนั้นแทนที่จะกำหนดใหม่ให้กับข้อโต้แย้งตัวเองฉันมักจะสร้างสำเนาท้องถิ่นเช่น: void SanitizeName(string Name) { var SanitizedName = Name.ToUpper(); //now do something here with name } สิ่งนี้ทำให้มั่นใจได้ว่าการเปลี่ยนแปลงค่าที่ส่งผ่านจะไม่ส่งผลกระทบต่อการดำเนินการด้านนอกวิธีการ แต่ฉันสงสัยว่าฉันกำลังหวาดระแวงเกี่ยวกับเรื่องนี้มากเกินไป

2
โปรแกรมคุยกับไดรเวอร์อุปกรณ์ได้อย่างไร
ดังนั้นฉันจึงสับสนว่าพวกเราในฐานะโปรแกรมเมอร์พูดคุยกับอุปกรณ์บนคอมพิวเตอร์อย่างไร ตอนนี้ฉันไม่ได้พูดถึงความคิดที่ยิ่งใหญ่ ฉันรู้ว่ามีไดรเวอร์อุปกรณ์ที่นั่งบนฮาร์ดแวร์เพื่อให้โปรแกรมที่แตกต่างสามารถใช้คุณสมบัติ แต่โดยทั่วไปแล้วใครจะพูดกับผู้ขับขี่อย่างแน่นอน? โปรแกรมเมอร์เขียนแอปพลิเคชันที่รับผิดชอบในการเรียกใช้ฟังก์ชั่นในไดรเวอร์หรือไม่? หรือโปรแกรมเมอร์เรียกฟังก์ชั่นผ่านระบบปฏิบัติการซึ่งจัดการกับการเรียกไปยังไดรเวอร์หรือไม่?
12 hardware  drivers 

2
รูปแบบสำหรับการรักษาความสอดคล้องในระบบเหตุการณ์ที่แจกจ่ายแบบกระจาย?
ฉันได้อ่านเกี่ยวกับการจัดหากิจกรรมเมื่อเร็ว ๆ นี้และชอบความคิดที่อยู่เบื้องหลัง แต่ติดอยู่กับปัญหาต่อไปนี้ สมมติว่าคุณมีกระบวนการที่เกิดขึ้นพร้อมกัน N กระบวนการซึ่งรับคำสั่ง (เช่นเว็บเซิร์ฟเวอร์) สร้างเหตุการณ์เป็นผลลัพธ์และเก็บไว้ในที่จัดเก็บส่วนกลาง สมมติว่าสถานะแอพพลิเคชั่นชั่วคราวทั้งหมดนั้นถูกเก็บรักษาไว้ในหน่วยความจำของแต่ละกระบวนการโดยการใช้เหตุการณ์ตามลำดับจากที่จัดเก็บ ตอนนี้สมมติว่าเรามีกฎเกณฑ์ทางธุรกิจดังต่อไปนี้ผู้ใช้แต่ละคนต้องมีชื่อผู้ใช้ที่ไม่ซ้ำกัน หากทั้งสองกระบวนการได้รับคำสั่งการลงทะเบียนผู้ใช้สำหรับชื่อผู้ใช้ X เดียวกันพวกเขาทั้งคู่ตรวจสอบว่า X ไม่ได้อยู่ในรายการชื่อผู้ใช้กฎจะตรวจสอบความถูกต้องของกระบวนการทั้งสองและพวกเขาทั้งสองเก็บเหตุการณ์ "ผู้ใช้ใหม่ . ขณะนี้เราได้ป้อนสถานะโกลบอลที่ไม่สอดคล้องกันเนื่องจากละเมิดกฎธุรกิจ (มีผู้ใช้สองรายที่แตกต่างกันด้วยชื่อผู้ใช้เดียวกัน) ในเซิร์ฟเวอร์ N แบบดั้งเดิม <-> 1 ระบบสไตล์ RDBMS ฐานข้อมูลจะใช้เป็นจุดศูนย์กลางของการซิงโครไนซ์ซึ่งช่วยป้องกันความไม่สอดคล้องดังกล่าว คำถามของฉันคือโดยทั่วไปแล้วเหตุการณ์ที่มาจากระบบจะแก้ไขปัญหานี้ได้อย่างไร พวกเขาเพียงแค่ประมวลผลทุกคำสั่งตามลำดับ (เช่น จำกัด จำนวนของกระบวนการที่สามารถเขียนไปยังร้านค้าถึง 1)?

3
จะทำอย่างไรเมื่อการทำงานที่สำคัญของผู้ที่ต้องพึ่งพาเสียและเป็นอุปสรรคต่อการพัฒนา
เมื่อวานนี้ฉันกำลังทำงานกับโครงการ Rails 5 API ซึ่งใช้ห้องสมุดทำหน้าที่เป็นแท็กableบนอนุญาตให้สิ่งต่าง ๆ มีแท็ก (เช่นคำถามใน SE) Rails 5 รองรับการใช้งานในตอนนี้ ขณะนี้มี PR เพื่อแก้ไขข้อผิดพลาดที่รอการรวมเข้ากับต้นแบบ ข้อผิดพลาดทำให้สาขาคุณลักษณะของฉันหยุดชะงักไปครึ่งทางจนเสร็จ - ฉันไม่สามารถใช้งานฟังก์ชั่นใด ๆ ของห้องสมุดได้เนื่องจากการโหลดไม่สมบูรณ์ เป็นการแก้ไขด่วนฉันเพียงโคลน repo แก้ไขปัญหาด้วยรหัสเดียวกันกับที่ PR มีและชี้ Gemfile ของฉัน (ไฟล์อ้างอิงเวอร์ชันการควบคุม) ไปยัง Github fork ของฉันเองจนกว่าข้อผิดพลาดจะรวมกันกลับเป็นหลัก ฉันโชคดีที่การแก้ไขนั้นง่าย ( และมีคนทำไปแล้ว ) ดังนั้นฉันจึงสามารถแก้ไขปัญหาได้ แต่ถ้าห้องสมุดนี้มีความสำคัญต่อการพัฒนาแอปพลิเคชันของฉัน จะเกิดอะไรขึ้นถ้าการแก้ไขข้อผิดพลาดที่หยุดการพัฒนาของฉันไม่ใช่ปัญหาที่แพร่หลายสำหรับคนอื่นดังนั้นการแก้ไขจึงไม่เกิดขึ้นอย่างรวดเร็วเหมือนครั้งนี้ ลองนึกภาพว่าคุณสมบัตินี้จำเป็นต้องทำให้เสร็จก่อนที่จะพัฒนาคุณสมบัติที่ต้องพึ่งพาอื่น ๆ - คุณทำอะไรในสถานการณ์นั้น จะเกิดอะไรขึ้นถ้าสำหรับฉันการติดแท็กนั้นมีความสำคัญอย่างยิ่งต่อวลีถัดไปของการพัฒนาซึ่งทุกอย่างจะขึ้นอยู่กับมัน - แต่การพึ่งพาการติดแท็กนั้นมีข้อบกพร่อง เราจะทำอย่างไรเมื่อการทำงานที่สำคัญของการพึ่งพาเป็นอุปสรรคต่อการพัฒนาคุณสมบัติ (a) และแน่นอนว่าการฟันดาบบนเก้าอี้สำนักงานหลายชั่วโมงหรือหลายวันก็ไม่ใช่ทางเลือก ...

2
เหตุใดอาร์เรย์ความยาวผันแปรจึงเป็นทางเลือกใน C 2011
เมื่อ VLA เปิดตัวในปี 1999 ฉันคิดว่ามันเป็นนวัตกรรมที่ยอดเยี่ยมสำหรับภาษา อย่างไรก็ตามหลังจากที่ได้เรียนรู้ว่ามันเป็นตัวเลือกใน C 2011 ฉันสงสัยว่าสิ่งใดที่นำไปสู่การเปลี่ยนแปลงสถานะและถ้ามันหมายความว่าฟีเจอร์นั้นมุ่งไปที่ความล้าสมัย ถ้าเป็นเช่นนั้นมีความคิดเทียบเท่ากับการจัดการอัตโนมัติของข้อมูลที่มีขนาดแบบไดนามิกที่กำลังพิจารณาที่จะแทนที่หรือไม่? ฉันพยายามค้นหาเอกสารเหตุผล C 2011 แต่ดูเหมือนยังไม่ได้เผยแพร่

5
การสืบทอด vs คุณสมบัติเพิ่มเติมที่มีค่า Null
สำหรับคลาสที่มีฟิลด์เป็นตัวเลือกจะดีกว่าถ้าใช้การสืบทอดหรือคุณสมบัติที่เป็นโมฆะ? ลองพิจารณาตัวอย่างนี้: class Book { private String name; } class BookWithColor extends Book { private String color; } หรือ class Book { private String name; private String color; //when this is null then it is "Book" otherwise "BookWithColor" } หรือ class Book { private String name; private Optional<String> color; //when …
12 java  inheritance  class  null 

1
Google หมายถึงอะไรที่นี่เมื่อพวกเขาพูดว่า“ อย่าคัดลอกและวางรหัสนี้”
นี่คือข้อความที่ตัดตอนมาจากโค้ดจาก recaptcha API ของ Google ( https://www.google.com/recaptcha/api.js ): /* PLEASE DO NOT COPY AND PASTE THIS CODE. */ (function() { if (!window['___grecaptcha_cfg']) { window['___grecaptcha_cfg'] = {}; }; if (!window['___grecaptcha_cfg']['render']) { window['___grecaptcha_cfg']['render'] = 'onload'; }; window['__google_recaptcha_client'] = true; var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://www.gstatic.com/recaptcha/api2/r20160314182818/recaptcha__it.js'; …

3
แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้สาธารณะการป้องกันส่วนตัวหรือไม่
มันยุติธรรมที่จะบอกว่ามันเป็นวิธีที่ดีในการเริ่มต้นทุกอย่างให้privateล่วงหน้าเมื่อเขียนโค้ดบางอย่าง? จากนั้นอัปเกรดprotectedเป็นคลาสย่อยเท่านั้นpublicหากต้องการคลาสอื่นหรือไม่

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

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