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

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


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

8
เหตุใดจึงมีการเข้ารหัส Unicode หลายตัว
ฉันคิดว่า Unicode ได้รับการออกแบบมาเพื่อแก้ไขปัญหาทั้งหมดของการเข้ารหัสที่แตกต่างกันมากมายเนื่องจากพื้นที่ที่อยู่ขนาดเล็ก (8 บิต) ในการพยายามก่อนหน้าส่วนใหญ่ (ASCII ฯลฯ ) ทำไมจึงมีการเข้ารหัส Unicode จำนวนมาก แม้แต่รุ่นเดียวกัน (เป็นหลัก) หลายรุ่นเช่น UTF-8, UTF-16 เป็นต้น

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

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

6
ฉันควรสร้างคลาสหรือไม่ถ้าฟังก์ชั่นของฉันซับซ้อนและมีตัวแปรมากมาย
คำถามนี้เป็นคำถามที่ค่อนข้างภาษาไม่เชื่อเรื่องพระเจ้า แต่ไม่สมบูรณ์ตั้งแต่โปรแกรมเชิงวัตถุ (OOP) อยู่ในที่แตกต่างกันเช่นJava , ซึ่งไม่ได้มีฟังก์ชั่นชั้นแรกมากกว่าที่เป็นอยู่ในหลาม กล่าวอีกนัยหนึ่งฉันรู้สึกผิดน้อยลงสำหรับการสร้างคลาสที่ไม่จำเป็นในภาษาเช่น Java แต่ฉันรู้สึกว่าอาจมีวิธีที่ดีกว่าในภาษาที่มีจำนวนต้นแบบน้อยลงเช่น Python โปรแกรมของฉันต้องทำการดำเนินการที่ค่อนข้างซับซ้อนหลายครั้ง การดำเนินการนั้นต้องใช้ "การบันทึกบัญชี" จำนวนมากต้องสร้างและลบไฟล์ชั่วคราวบางไฟล์ ฯลฯ นั่นเป็นเหตุผลที่มันยังต้องการเรียก "suboperations" อื่น ๆ อีกมากมาย - การใส่ทุกอย่างลงในวิธีการอันใหญ่โตนั้นไม่ได้ดีมากโมดุลอ่านได้ ฯลฯ ต่อไปนี้เป็นแนวทางที่อยู่ในใจของฉัน: 1. สร้างคลาสที่มีวิธีพับลิกเพียงวิธีเดียวเท่านั้นและรักษาสถานะภายในที่จำเป็นสำหรับการปฏิบัติการย่อยในตัวแปรอินสแตนซ์ มันจะมีลักษณะเช่นนี้: class Thing: def __init__(self, var1, var2): self.var1 = var1 self.var2 = var2 self.var3 = [] def the_public_method(self, param1, param2): self.var4 = param1 self.var5 …

15
มันไม่ได้ตั้งใจที่จะทำให้ฟังก์ชั่นที่เป็นหลักเปลี่ยนชื่อฟังก์ชั่นในตัวหรือไม่?
ฉันสับสนกับฟังก์ชั่นขั้นต่ำและสูงสุดในบางบริบท ในบริบทเดียวเมื่อคุณใช้ฟังก์ชั่นเพื่อรับค่าที่มากหรือน้อยกว่าสองค่าก็จะไม่มีปัญหา ตัวอย่างเช่น, //how many autographed CD's can I give out? int howManyAutographs(int CDs, int Cases, int Pens) { //if no pens, then I cannot sign any autographs if (Pens == 0) return 0; //I cannot give away a CD without a case or a case without a CD return …

10
การบังคับใช้หลักการความรับผิดชอบเดี่ยว
ฉันเพิ่งมาโดยปัญหาสถาปัตยกรรมที่ดูเหมือนเล็กน้อย ฉันมีพื้นที่เก็บข้อมูลอย่างง่ายในรหัสของฉันที่ถูกเรียกเช่นนี้ (รหัสเป็น C #): var user = /* create user somehow */; _userRepository.Add(user); /* do some other stuff*/ _userRepository.SaveChanges(); SaveChanges เป็น wrapper ง่ายๆที่ยอมรับการเปลี่ยนแปลงในฐานข้อมูล: void SaveChanges() { _dataContext.SaveChanges(); _logger.Log("User DB updated: " + someImportantInfo); } หลังจากนั้นครู่หนึ่งฉันจำเป็นต้องใช้ตรรกะใหม่ที่จะส่งการแจ้งเตือนทางอีเมลทุกครั้งที่ผู้ใช้ถูกสร้างขึ้นในระบบ เนื่องจากมีการโทรเข้า_userRepository.Add()และออกSaveChangesจากระบบจำนวนมากฉันจึงตัดสินใจอัปเดตSaveChangesดังนี้: void SaveChanges() { _dataContext.SaveChanges(); _logger.Log("User DB updated: " + someImportantInfo); foreach (var newUser …

10
อะไรคือสิ่งที่เลวร้ายมากเมื่อเทียบกับ goto เมื่อใช้กับกรณีที่ชัดเจนและเกี่ยวข้อง
ฉันได้รู้จักกันเสมอว่าgotoเป็นสิ่งที่ไม่ดีถูกขังอยู่ในห้องใต้ดินที่ใดที่หนึ่งไม่เคยที่จะมองเห็นได้ดี gotoแต่ผมวิ่งเข้าไปในตัวอย่างรหัสในวันนี้ว่าทำให้รู้สึกดีกับการใช้งาน ฉันมี IP ที่ฉันต้องตรวจสอบว่าอยู่ในรายการ IP หรือไม่จากนั้นดำเนินการกับรหัสต่อไปมิฉะนั้นจะเกิดข้อยกเว้น <?php $ip = '192.168.1.5'; $ips = [ '192.168.1.3', '192.168.1.4', '192.168.1.5', ]; foreach ($ips as $i) { if ($ip === $i) { goto allowed; } } throw new Exception('Not allowed'); allowed: ... ถ้าฉันไม่ได้ใช้gotoฉันก็ต้องใช้ตัวแปรบางอย่างเช่น $allowed = false; foreach ($ips as $i) { if ($ip === …
40 php  goto 

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

9
ฉันควรยอมรับคอลเลกชันที่ว่างเปล่าในวิธีการของฉันที่ทำซ้ำมากกว่าพวกเขา
ฉันมีวิธีการที่ตรรกะทั้งหมดจะดำเนินการภายในวง foreach ที่ iterates มากกว่าพารามิเตอร์ของวิธีการ: public IEnumerable<TransformedNode> TransformNodes(IEnumerable<Node> nodes) { foreach(var node in nodes) { // yadda yadda yadda yield return transformedNode; } } ในกรณีนี้การส่งคอลเล็กชันว่างเปล่าจะส่งผลให้เกิดคอลเล็กชันที่ว่างเปล่า แต่ฉันสงสัยว่ามันไม่ฉลาด ตรรกะของฉันที่นี่คือถ้าใครบางคนกำลังเรียกวิธีนี้พวกเขาตั้งใจจะส่งผ่านข้อมูลและจะส่งเฉพาะคอลเลกชันที่ว่างเปล่าไปยังวิธีการของฉันในสถานการณ์ที่ผิดพลาด ฉันควรจะตรวจจับพฤติกรรมนี้และทิ้งข้อยกเว้นไว้หรือเป็นวิธีที่ดีที่สุดในการส่งคืนคอลเลกชันที่ว่างเปล่า?

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

3
ผู้ช่วยคืออะไร? มันเป็นรูปแบบการออกแบบหรือไม่? มันเป็นอัลกอริทึมหรือไม่?
อาจจะเป็นเรื่องเล็ก ๆ น้อย ๆ ที่แก้ม แต่ฉันไม่สามารถหาคำตอบได้ทุกที่ผ่านทาง Google ดังนั้นเพื่อให้แน่ใจว่าคำตอบด้านวิศวกรรมซอฟต์แวร์มีคำตอบ: ผู้ช่วยคืออะไร? ฉันได้เห็นชื่อที่ใช้ทุกที่ (ชื่อโมดูลชื่อคลาสชื่อเมธอด) ราวกับว่าความหมายนั้นลึกซึ้งและมีความหมาย แต่ในบริบทของวิทยาศาสตร์คอมพิวเตอร์ (แม้ว่าฉันจะไม่ได้รับปริญญา) ไม่เคยเห็นคำอธิบายหรือคำนิยามใด ๆ ! มันเป็นรูปแบบการออกแบบหรือไม่? มันเป็นอัลกอริทึมหรือไม่? ฉันเคยทำงานในโปรแกรมที่ทั้งโมดูลและคลาสเรียกว่าsomethingsomethinghelper (ซึ่งsomethingsomethingนั้นค่อนข้างสามัญด้วยเช่นกัน) และฉันเปลี่ยนชื่อเป็นบางสิ่งที่สมเหตุสมผลสำหรับฉัน แต่ฉันรู้สึกว่าฉันขาดอะไรบางอย่างที่นี่!

3
อะไรที่อ้างอิงถึง DDD บริบทที่ล้อมรอบคืออะไร
เมื่อทำงานผ่านหนังสือ "การใช้การออกแบบโดเมนขับเคลื่อน" โดย Vaughn Vernon ฉันไม่สามารถเข้าใจอย่างถ่องแท้ว่าบริบทที่แท้จริงนั้นเป็นอย่างไร หนังสือกำหนดบริบทที่มีขอบเขตว่า "ขอบเขตความคิดที่สามารถใช้โมเดลโดเมนได้มีภาษา Ubiquitous ที่พูดโดยทีมงาน คำจำกัดความนี้จะทำให้ดูเหมือนกับบริบทที่ล้อมรอบคือรูปแบบและภาษาของโดเมนย่อยซึ่งโดเมนย่อยนั้นอาจเป็นโดเมนหลัก (ซึ่งดูเหมือนว่าควรจะเรียกว่า "โดเมนย่อยหลัก" แต่นั่นคือ การสนทนาอื่น ... ) สิ่งนี้ยังทำให้เกิดความคลุมเครือเกี่ยวกับบริบทที่ จำกัด ไว้ มันคือการจัดกลุ่มของหนึ่งหรือมากกว่าโดเมนย่อย? หากมีโดเมนย่อยเพียงโดเมนเดียวที่สอดคล้องกับบริบทที่ถูกล้อมบริบทบริบทที่บอกเราคืออะไร? อย่างไรก็ตามบทที่ 3 ของหนังสือเล่มเดียวกันหมายถึงเทคนิคการรวมระหว่างบริบทที่ล้อมรอบ อย่างไรก็ตามสิ่งนี้ดูเหมือนจะบ่งบอกว่าบริบทที่ล้อมรอบนั้นเป็นระบบซอฟต์แวร์หรือสิ่งประดิษฐ์ที่มีความหลากหลาย มาร์ตินฟาวเลอร์กล่าวถึงแนวคิดบริบทที่ล้อมรอบสั้น ๆ ( http://martinfowler.com/bliki/BoundedContext.html ) แต่ไม่ได้ชี้แจงปัญหาอย่างแท้จริง ในตอนท้ายของวันที่สิ่งที่เป็นบริบทที่ล้อมรอบ? มันคือการจัดกลุ่มของโดเมนย่อยหรือไม่? รูปแบบและภาษาสำหรับโดเมนย่อยหรือไม่ การใช้งานของโดเมนย่อยหรือไม่? ดูเหมือนจะยากที่จะเข้าใจวิธีแยกย่อยพื้นที่ปัญหาในชีวิตจริงออกเป็นบริบทที่ล้อมรอบ

9
เราจำเป็นต้องทำการบันทึกเมื่อทำ TDD หรือไม่?
เมื่อทำการ Red, Green & Refactor cycle เราควรเขียนโค้ดขั้นต่ำเพื่อผ่านการทดสอบ นี่คือวิธีที่ฉันได้รับการสอนเกี่ยวกับ TDD และวิธีที่หนังสือเกือบทั้งหมดบรรยายกระบวนการ แต่สิ่งที่เกี่ยวกับการเข้าสู่ระบบ? จริงๆแล้วฉันไม่ค่อยได้ใช้การบันทึกในแอพพลิเคชั่นเว้นแต่มีบางสิ่งที่ซับซ้อนจริงๆที่เกิดขึ้นอย่างไรก็ตามฉันได้เห็นโพสต์มากมายที่พูดถึงความสำคัญของการบันทึกที่เหมาะสม ดังนั้นนอกเหนือจากการบันทึกข้อยกเว้นฉันไม่สามารถพิสูจน์ความสำคัญที่แท้จริงของการบันทึกในแอปพลิเคชันที่ผ่านการทดสอบที่เหมาะสม (การทดสอบหน่วย / การรวม / การยอมรับ) ดังนั้นคำถามของฉันคือ: เราจำเป็นต้องเข้าสู่ระบบหากเรากำลังทำ TDD อยู่หรือไม่? การทดสอบที่ล้มเหลวจะไม่เปิดเผยว่ามีอะไรผิดปกติกับแอปพลิเคชันหรือไม่ เราควรเพิ่มการทดสอบสำหรับกระบวนการบันทึกในแต่ละวิธีในแต่ละคลาสหรือไม่ หากระดับการบันทึกบางส่วนถูกปิดใช้งานในสภาพแวดล้อมการผลิตเช่นนั้นจะไม่แนะนำการพึ่งพาระหว่างการทดสอบและสภาพแวดล้อมหรือไม่? ผู้คนพูดถึงวิธีที่ง่ายในการดีบัก แต่หนึ่งในข้อดีหลักเกี่ยวกับ TDD คือฉันมักจะรู้ว่ามีอะไรผิดปกติเนื่องจากการทดสอบที่ล้มเหลว มีบางอย่างที่ฉันพลาดไปไหม

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