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

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

8
มีข้อยกเว้นแนวคิด OOP หรือไม่
เมื่ออ่านโพสต์เมื่อวานนี้ฉันรู้ว่าฉันไม่รู้เกี่ยวกับที่มาของข้อยกเว้นมากนัก เป็นแนวคิดที่เกี่ยวข้องกับ OOP เท่านั้นหรือไม่ ฉันมักจะคิดว่ามันเป็น แต่อีกครั้งมีข้อยกเว้นฐานข้อมูล

5
คุณปลดอาวุธโคบาลคาวบอยได้อย่างไร [ปิด]
ฉันพบคำถาม (รหัสโคบาลของทีม) แต่มันเกี่ยวข้องกับ "Ninja Coder" มากกว่าปัญหาที่ฉันมี ฉันมีสมาชิกในทีมที่เป็นตัวอย่างชีวิตที่บริสุทธิ์ของ " คาวบอยโคเดอร์ " ฉันเข้าใจว่าไม่มีใครเปลี่ยนคนได้ แต่เป็นวิธีที่ทำให้เขาหยุดทำตัวเหมือน "โคบาลโคด" หรือไม่? เขาปฏิเสธที่จะฟังทีมและเมื่อเร็ว ๆ นี้เขาได้หยุดการตรวจสอบโค้ดการทดสอบหน่วยการแบ่งปันรายละเอียดการใช้งาน ฯลฯ ใช่เขา "รหัส" เร็ว แต่รหัสของเขาเป็นเพียงตัวสร้างบั๊ก สมาชิกในทีมคนอื่น ๆ และฉันอยู่ใน "ขั้นตอนการแก้ไขข้อบกพร่อง" และ 80% ของข้อบกพร่องมาจากรหัสของเขา ฉันไม่ต้องการแก้ไขข้อบกพร่องของเขา และผู้บริหารก็ตาบอดหรือไม่ต้องการเห็นสิ่งนี้หรือบางทีพวกเขาอาจชอบความเร็วของเขา มีวิธีใดบ้างที่ฉัน (ในฐานะเพื่อนร่วมงานอายุน้อยกว่าไม่ใช่เจ้านายของเขา) สามารถทำอะไรกับมันได้บ้าง? ฉันจะปลดอาวุธโคบาลโคบาลนี้ได้อย่างไร ฉันรู้สึกเหมือนฉันเป็นคนสุดท้ายที่ใส่ใจโครงการอย่างแท้จริง

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

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

3
ตารางอ้างอิงตนเองดีหรือไม่ดี [ปิด]
การเป็นตัวแทนของตำแหน่งทางภูมิศาสตร์ภายในแอปพลิเคชันการออกแบบตัวแบบข้อมูลอ้างอิงนั้นเสนอทางเลือกที่ชัดเจนสองทาง (หรืออาจมากกว่านั้น) ตารางหนึ่งที่มีคอลัมน์ parent_id อ้างอิงตนเอง uk - london (london parent id = UK id) หรือสองตารางที่มีความสัมพันธ์แบบหนึ่งต่อหลายโดยใช้คีย์ต่างประเทศ การตั้งค่าของฉันสำหรับตารางอ้างอิงตัวเองหนึ่งตารางเนื่องจากช่วยให้ขยายขอบเขตได้ง่ายตามต้องการ โดยทั่วไปแล้วคนออกไปจากตารางอ้างอิงตนเองหรือว่าพวกเขา A-OK?

3
REST API - API ควรส่งคืนอ็อบเจ็กต์ JSON ที่ซ้อนกันหรือไม่
เมื่อพูดถึง API ของ JSON เป็นวิธีปฏิบัติที่ดีในการแผ่การตอบสนองออกและหลีกเลี่ยงวัตถุ JSON ที่ซ้อนกันหรือไม่ ตัวอย่างเช่นสมมติว่าเรามี API คล้ายกับ IMDb แต่สำหรับวิดีโอเกม มีหน่วยงานคู่เกมแพลตฟอร์ม ESRBRating และ GamePlatformMap ซึ่งทำแผนที่เกมและแพลตฟอร์ม สมมติว่าคุณร้องขอ / เกม / 1 ซึ่งดึงข้อมูลเกมด้วย ID 1 และส่งคืนออบเจ็กต์เกมด้วยแพลตฟอร์มและการซ้อนทับซ้อน { "id": 1, "title": "Game A", "publisher": "Publisher ABC", "developer": "Developer DEF", "releaseDate": "2015-01-01", "platforms": [ {"id":1,"name":"Xbox"}, {"id":2,"name":"Playstation"} ], "esrbRating": { "id": 1, "code": …
37 design  rest  api-design  json 

9
มีวิธีในการแยกแยะความเห็นข้อมูลจากรหัสความคิดเห็นออก?
ตลอดหลักสูตรการเขียนโปรแกรมคุณจะพบกับความคิดเห็นบางส่วนที่อธิบายรหัสและความคิดเห็นบางส่วนที่นำรหัสออก: // A concise description const a = Boolean(obj); //b = false; มีวิธีที่ดีในการแยกวิเคราะห์อย่างรวดเร็วว่าอันไหน ฉันเล่นรอบโดยใช้ 3 /และ/** */สำหรับความคิดเห็นอธิบาย ฉันยังใช้ปลั๊กอิน VSCode เพื่อเน้น//TODO:และ//FIXME:

14
วิธีกำหนด“ หรือ” ตามหลักเหตุผล
เมื่อเร็ว ๆ นี้ฉันเจอปัญหาที่ทำให้ฉันต้องกำหนดตัวดำเนินการเชิงตรรกะ "หรือ" โดยทางโปรแกรม แต่ไม่ได้ใช้ตัวดำเนินการเอง สิ่งที่ฉันคิดไว้คือ: OR(arg1, arg2) if arg1 = True and arg2 = True return True else if arg1 = True and arg2 = False return True else if arg1 = False and arg2 = True return True else: return False ตรรกะนี้ถูกต้องหรือฉันพลาดอะไรไป?

15
คุณจะแข่งขันกับโครงการโอเพ่นซอร์สอย่างมีประสิทธิภาพได้อย่างไร
บริษัท ที่มีโครงการโอเพนซอร์ซที่แข็งแกร่งแข่งขันกับผลิตภัณฑ์โอเพนซอร์ซแบบดั้งเดิม ฉันอ่านบทความนี้ที่ผู้เขียนวางสถานการณ์นี้: สมมติว่าเราสามารถแบ่งตลาดซอฟต์แวร์ - กล่าวว่าการจัดการเครือข่าย - ระหว่างสองผลิตภัณฑ์ หนึ่งทำทุกอย่างที่เป็นไปได้และค่าใช้จ่าย $ 1 ล้านและอื่น ๆ ทำเพียง 10% มาก แต่ฟรีและเปิด ป้ายราคาของโซลูชันเชิงพาณิชย์จะกรองผู้ใช้จำนวนมากโดยอัตโนมัติและคนเหล่านั้นจะต้องหันไปหาโอเพ่นซอร์ส แต่ผู้ใช้บางคนจะพึงพอใจกับฟังก์ชั่น 10% และเลือกมันทันที ตัวอย่างเช่นฉันมีคอมพิวเตอร์ Macintosh ดั้งเดิมบนโต๊ะของฉัน มันรันโปรแกรมประมวลผลคำที่เรียกว่า MacWrite มันทำทุกอย่างยกเว้นการตรวจตัวสะกดฉันต้องใช้โปรแกรมประมวลผลคำ ฉันสามารถจัดรูปแบบย่อหน้าเลือกแบบอักษรทำให้ข้อความเป็นตัวหนาหรือเอียงและแม้แต่วางในรูปภาพและกราฟ ทั้งหมดในส่วนติดต่อผู้ใช้ "สิ่งที่คุณเห็นคือสิ่งที่คุณได้รับ" ใช้พื้นที่ดิสก์ 76K ขึ้นไป นั่นคือ "K" เช่นเดียวกับใน "กิโลไบต์" เปรียบเทียบกับ Microsoft Word ฉันคิดว่าครั้งสุดท้ายที่ฉันติดตั้งเพียง Word มันมีขนาดประมาณ 30MB ซึ่งใหญ่กว่า MacWrite หลายเท่า แต่ฉันไม่ได้ใช้มากกว่าที่ฉันใช้ MacWrite เช่นเดียวกับฉันผู้ใช้หลายคนมีความสุขกับฟังก์ชั่นพื้นฐาน …

5
มันเพียงพอสำหรับวิธีการที่จะโดดเด่นเพียงแค่ชื่ออาร์กิวเมนต์ (ไม่พิมพ์)?
มันเพียงพอสำหรับวิธีการที่จะโดดเด่นเพียงแค่ชื่ออาร์กิวเมนต์ (ไม่พิมพ์) หรือมันจะดีกว่าที่จะตั้งชื่ออย่างชัดเจนมากขึ้น? ยกตัวอย่างเช่นVST Find<T>(int id)T FindById<T>(int id) มีเหตุผลที่ดีที่จะตั้งชื่ออย่างชัดเจนยิ่งขึ้น (เช่นการเพิ่มById) และการเก็บชื่ออาร์กิวเมนต์เพียงอย่างเดียวหรือไม่ เหตุผลหนึ่งที่ฉันคิดได้ก็คือเมื่อลายเซ็นของวิธีการเหมือนกัน แต่มีความหมายแตกต่างกัน FindByFirstName(string name) และ FindByLastName(string name)

3
"การรวมตัวกับการสืบทอด" ละเมิด "หลักการที่แห้ง" หรือไม่?
ตัวอย่างเช่นลองพิจารณาฉันมีคลาสสำหรับคลาสอื่นเพื่อขยาย: public class LoginPage { public String userId; public String session; public boolean checkSessionValid() { } } และคลาสย่อยบางส่วน: public class HomePage extends LoginPage { } public class EditInfoPage extends LoginPage { } ในความเป็นจริง subclass ไม่มีวิธีการใด ๆ ที่จะแทนที่ฉันจะไม่เข้าถึง HomePage ด้วยวิธีทั่วไปเช่น: ฉันจะไม่ทำสิ่งที่ชอบ: for (int i = 0; i < loginPages.length; i++) { …

5
การกำหนดว่าวิธีใดสามารถแทนที่ข้อผูกพันที่แข็งแกร่งกว่าการกำหนดวิธีการที่สามารถเรียกได้
จาก: http://www.artima.com/lejava/articles/designprinciples4.html Erich Gamma: ฉันยังคงคิดว่ามันเป็นความจริงแม้หลังจากผ่านไปสิบปี การสืบทอดเป็นวิธีที่ยอดเยี่ยมในการเปลี่ยนพฤติกรรม แต่เรารู้ว่ามันเปราะบางเนื่องจากคลาสย่อยสามารถตั้งสมมติฐานเกี่ยวกับบริบทที่มีการเรียกเมธอดแทนที่ได้ง่าย มีการเชื่อมต่ออย่างแน่นหนาระหว่างคลาสฐานและคลาสย่อยเนื่องจากบริบทโดยปริยายซึ่งโค้ดคลาสย่อยที่ฉันเสียบเข้าจะถูกเรียก องค์ประกอบมีคุณสมบัติที่ดีกว่า การมีเพศสัมพันธ์จะลดลงเพียงแค่มีสิ่งเล็ก ๆ ที่คุณเสียบเข้าไปกับสิ่งที่ใหญ่กว่าและวัตถุที่ใหญ่กว่าก็เรียกวัตถุที่เล็กกว่ากลับมา จากมุมมองของ API ที่กำหนดว่าวิธีการใด ๆ ที่สามารถแทนที่ได้คือความมุ่งมั่นที่แข็งแกร่งกว่าการกำหนดวิธีการที่สามารถเรียกได้ ฉันไม่เข้าใจสิ่งที่เขาหมายถึง ใครช่วยอธิบายหน่อยได้ไหม

7
อะไรคือสิ่งที่เทียบเท่าการทำงานของคำสั่งทำลายความจำเป็นและการตรวจสอบวงอื่น ๆ ?
สมมติว่าฉันเป็นตรรกะด้านล่าง วิธีการเขียนในฟังก์ชั่นการเขียนโปรแกรม? public int doSomeCalc(int[] array) { int answer = 0; if(array!=null) { for(int e: array) { answer += e; if(answer == 10) break; if(answer == 150) answer += 100; } } return answer; } ตัวอย่างในบล็อกบทความส่วนใหญ่ ... ฉันเห็นเพียงแค่อธิบายกรณีง่าย ๆ ของฟังก์ชันทางคณิตศาสตร์ตรงไปข้างหน้าหนึ่งคำว่า 'ผลรวม' แต่ฉันมีเหตุผลคล้ายกับที่เขียนไว้ข้างต้นใน Java และต้องการย้ายที่ไปยังรหัสการทำงานใน Clojure หากเราไม่สามารถทำตามข้างต้นใน FP ดังนั้นการส่งเสริมการขายประเภท FP ไม่ได้ระบุไว้อย่างชัดเจน …

2
ทำไมเมธอดที่รับพารามิเตอร์ไม่ จำกัด จำนวนมักกำหนดโอเวอร์โหลดด้วยพารามิเตอร์ที่น้อยลง
ตัวอย่างเช่นSystem.IO.Path.Combineวิธีการใน. NET มีการโอเวอร์โหลดดังต่อไปนี้: Combine(params String[]) Combine(String, String) Combine(String, String, String) Combine(String, String, String, String) จุดสามจุดสุดท้ายคืออะไร? คนแรกจะครอบคลุมพวกเขาทั้งหมดราวกับว่าคุณดูอย่างใกล้ชิดมันใช้paramsคำหลัก อาร์กิวเมนต์ของความเข้ากันได้ย้อนหลังจะครอบคลุมเฉพาะCombine(String, String)ตัวแปรเนื่องจากเป็นรุ่นเดียวจนถึง. NET 4

8
ความสามารถของวัตถุควรถูกระบุโดยอินเทอร์เฟซที่ใช้หรือไม่
isโอเปอเรเตอร์ของ C # และโอเปอเรเตอร์ของ Java instanceofช่วยให้คุณสามารถแยกสาขาบนอินเทอร์เฟซได้ เหมาะสมหรือไม่ที่จะใช้คุณสมบัตินี้ในการแยกสาขาในระดับสูงตามความสามารถที่อินเตอร์เฟสจัดให้? หรือคลาสฐานควรให้ตัวแปรบูลีนเพื่อให้อินเทอร์เฟซเพื่ออธิบายความสามารถของวัตถุที่มี? ตัวอย่าง: if (account is IResetsPassword) ((IResetsPassword)account).ResetPassword(); else Print("Not allowed to reset password with this account type!"); เมื่อเทียบกับ if (account.CanResetPassword) ((IResetsPassword)account).ResetPassword(); else Print("Not allowed to reset password with this account type!"); มีข้อผิดพลาดใด ๆ ในการใช้งานส่วนต่อประสานเพื่อระบุความสามารถหรือไม่? ตัวอย่างนี้เป็นเพียงตัวอย่างเท่านั้น ฉันสงสัยเกี่ยวกับแอปพลิเคชันทั่วไปที่มากขึ้น

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