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

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

2
ฉันควรเปิดเผยค่า“ คำนวณ” เป็นคุณสมบัติหรือวิธีการหรือไม่?
ฉันมีคลาส C # ที่แสดงประเภทเนื้อหาในระบบการจัดการเนื้อหาเว็บ เรามีฟิลด์ที่อนุญาตให้แก้ไขเนื้อหาเว็บเพื่อป้อนเทมเพลต HTML สำหรับวิธีการแสดงวัตถุ โดยพื้นฐานแล้วมันใช้ไวยากรณ์แฮนด์บาร์สำหรับการแทนที่ค่าคุณสมบัติวัตถุลงในสตริง HTML: <h1>{{Title}}</h1><p>{{Message}}</p> จากมุมมองการออกแบบคลาสฉันควรแสดงสตริง HTML ที่จัดรูปแบบ (พร้อมการแทนที่) เป็นคุณสมบัติหรือวิธีการหรือไม่ ตัวอย่างเช่นคุณสมบัติ: public class Example { private string _template; public string Title { get; set; } public string Message { get; set; } public string Html { get { return this.ToHtml(); } protected set { } …

5
ประเภทของการทดสอบหน่วยตามประโยชน์
จากมุมมองค่าฉันเห็นการทดสอบหน่วยสองกลุ่มในทางปฏิบัติของฉัน: การทดสอบที่ทดสอบตรรกะบางอย่างที่ไม่สำคัญ การเขียนพวกเขา (ไม่ว่าจะก่อนนำไปใช้หรือหลัง) เปิดเผยปัญหา / ข้อบกพร่องที่อาจเกิดขึ้นและช่วยให้มั่นใจในกรณีที่ตรรกะเปลี่ยนไปในอนาคต การทดสอบที่ทดสอบตรรกะเล็กน้อยบางอย่าง การทดสอบเหล่านั้นเหมือนรหัสเอกสาร (โดยทั่วไปจะมี mocks) มากกว่าการทดสอบ เวิร์กโฟลว์การบำรุงรักษาของการทดสอบเหล่านั้นไม่ใช่ "ตรรกะบางอย่างเปลี่ยนไปการทดสอบกลายเป็นสีแดง - ขอบคุณพระเจ้าที่ฉันเขียนการทดสอบนี้" แต่ "การเปลี่ยนแปลงรหัสเล็กน้อยบางการทดสอบกลายเป็นลบเชิงลบ - ฉันต้องรักษา (เขียนใหม่) การทดสอบ . ส่วนใหญ่การทดสอบเหล่านั้นไม่คุ้มค่าที่จะรักษา และจากประสบการณ์ของฉันในหลาย ๆ ระบบการทดสอบเหล่านั้นก็เหมือนกับ 80% ของการทดสอบทั้งหมด ฉันพยายามค้นหาว่าคนอื่นคิดอย่างไรในหัวข้อการทดสอบแยกหน่วยตามค่าและวิธีการที่สอดคล้องกับการแยกของฉัน แต่สิ่งที่ฉันเห็นส่วนใหญ่ก็คือโฆษณาชวนเชื่อ TDD แบบเต็มเวลาหรือการทดสอบคือการโฆษณาชวนเชื่อที่ไร้ประโยชน์เพียงแค่เขียน - เขียน - โค้ด ฉันสนใจบางอย่างที่อยู่ตรงกลาง ความคิดของคุณเองหรือการอ้างอิงถึงบทความ / เอกสาร / หนังสือยินดีต้อนรับ
13 unit-testing  tdd 

8
นักออกแบบ UX ทำงานหนึ่ง Sprint ข้างหน้า
นักออกแบบ UX ของเรามักจะมีเรื่องราวใน Sprint X ที่ผู้พัฒนาจะนำไปใช้ใน Sprint X + 1 (นักออกแบบ UX และผู้พัฒนา / นักทดสอบอยู่ในทีมเดียว) ฉันคิดว่ามันสมเหตุสมผลเพราะถ้าคุณไม่มีภาพจำลองหน้าจอและข้อมูลจำเพาะที่ชัดเจนคุณไม่สามารถประมาณงานระหว่างการวางแผน Sprint ได้ อย่างไรก็ตามใน Scrum คุณควรจะมีเรื่องราวของผู้ใช้ที่ให้คุณค่ากับผู้ใช้เท่านั้น ในกรณีของเราเรื่องราวการออกแบบ UX ไม่ได้ให้คุณค่าเช่นนั้น นอกจากนี้โดยทั่วไปแล้วโค้ชของ Scrum ไม่แนะนำให้มีคุณสมบัติครบถ้วนก่อนเริ่ม Sprint ซึ่งเป็นคำแนะนำที่ฉันเข้าใจยาก ดังนั้นคุณเห็นข้อเสียในแนวทางของเราหรือไม่ ดูเหมือนว่าจะทำงานให้กับเรา แต่มันขัดกับหลักการแย่งชิงกันบ้าง

5
วิธีแก้ไขปัญหาการอ้างอิงแบบวงกลมด้วย JSON และ Entity
ฉันได้ทำการทดลองกับการสร้างเว็บไซต์ที่ใช้ประโยชน์จาก MVC กับ JSON สำหรับเลเยอร์งานนำเสนอและกรอบงานเอนทิตีสำหรับโมเดลข้อมูล / ฐานข้อมูล ปัญหาของฉันมาพร้อมกับการทำให้วัตถุโมเดลของฉันเป็นอนุกรมลงใน JSON ฉันใช้รหัสวิธีแรกในการสร้างฐานข้อมูลของฉัน เมื่อทำโค้ดวิธีแรกความสัมพันธ์แบบหนึ่งต่อหลายคน (parent / child) ต้องการให้เด็กมีการอ้างอิงกลับไปที่ parent (รหัสตัวอย่างของฉันเป็นตัวพิมพ์ผิด แต่คุณได้รับรูปภาพ) class parent { public List<child> Children{get;set;} public int Id{get;set;} } class child { public int ParentId{get;set;} [ForeignKey("ParentId")] public parent MyParent{get;set;} public string name{get;set;} } เมื่อส่งคืนวัตถุ "พาเรนต์" ผ่าน JsonResult ข้อผิดพลาดการอ้างอิงแบบวงกลมจะถูกส่งออกไปเนื่องจาก "child" มีคุณสมบัติของคลาสพาเรนต์ ฉันได้ลองใช้ …

2
ตารางเดี่ยวที่มีคอลัมน์เพิ่มเติมเทียบกับหลายตารางที่ทำซ้ำสคีมา
ฉันกำลังทำงานในโครงการที่บางจุดฉันจำเป็นต้องตัดสินใจว่าในฐานข้อมูลหรือไม่ฉันควรมีตารางเดียวที่มีหลายคอลัมน์ที่ไม่ใช่ทุกระเบียนที่ใช้หรือหลายตารางที่มีสคีมาซ้ำกัน ฉันกำลังสร้างแอปพลิเคชั่นข้อมูลกีฬาที่สามารถรองรับกีฬาหลายประเภท เราสามารถจัดการ NBA, NHL, MLB, NFL ได้ แต่ละกีฬามีแนวคิดที่คล้ายกันมาก - ทีม, ตารางเวลา, การบาดเจ็บ, ข้อมูลผู้เล่น .. แน่นอนแหล่งข้อมูลของเราไม่ได้ให้ข้อมูลแต่ละชิ้นในสคีมาเดียวกัน กีฬาแต่ละประเภทมีโครงสร้างที่แตกต่างกันซึ่งเราได้รับข้อมูลจากผู้ขายของเรา เนื่องจากมีเวลาไม่พอ (ความต้องการของลูกค้า) เพื่อทำการวิเคราะห์ข้อมูลล่วงหน้าเพื่อกำหนด commonalities ฉันจึงป้องกันการเดิมพันของฉันและใช้ 'เดิมพันที่ปลอดภัย' และสร้างตารางแยกสำหรับแต่ละกีฬาแต่ละชุดแทนที่จะเป็นหนึ่งชุดของตารางทั้งหมด กีฬาที่ใช้ ผลลัพธ์คือ schema ที่ซ้ำกันในหลายตารางและอินเทอร์เฟซที่ซ้ำซ้อนกับฐานข้อมูล (เช่น procs ที่เก็บไว้) เช่นกัน ฉันมีบางอย่างเช่น NBA_Game, NFL_Game, NBA_Team, NFL_Team และอื่น ๆ แต่ละตารางอาจมีคุณสมบัติบางอย่างที่อีกคนหนึ่งไม่ได้และอีกหลายคนที่ใช้ร่วมกัน มันพูดต่อไปประมาณ 5-10 ตารางจาก 4 หรือ 5 กีฬา ฉันยังไม่แน่ใจว่านี่เป็นสิ่งที่เลวร้ายหรือไม่ - ทางเลือกการมีตารางชุดเดียวซึ่งมีคุณสมบัติอยู่ในนั้นซึ่งไม่ใช่กีฬาทุกประเภทที่จะใช้อาจมีตัวของตัวเองที่เทอะทะเช่นกัน …

4
ต้องทำอย่างไรเมื่อ บริษัท ของคุณไม่ได้เข้ารหัสรหัสผ่าน
พื้นหลัง ฉันได้รับสัญญาเพื่อช่วย บริษัท ดูแลเซิร์ฟเวอร์ของพวกเขา ฉันทำงานกับโปรเจค PHP บางตัว แต่ก็ยังดูปัญหาด้านประสิทธิภาพและเมื่อเร็ว ๆ นี้สแกนบันทึกการแฮ็กเกอร์ พวกเหล่านี้ใช้เซิร์ฟเวอร์มาระยะหนึ่งและมีสิ่งที่ฉันจะเรียกว่าแอปพลิเคชันรุ่นเก่าที่ขาสุดท้าย มันใช้คำพูดเวทมนต์ตัวแปรทั่วโลก (ซึ่งอนุญาตให้$idเขียนทับโดย$_GET['id']) ใช้. htaccess เป็นความปลอดภัยเพียงอย่างเดียวในบางกรณีคุณตั้งชื่อมัน ฝันร้ายด้านความปลอดภัยและการเขียนโปรแกรม เราเคยถูกแฮ็กในอดีตโดยส่วนใหญ่ใช้ SQL injections ซึ่งจะรันSLEEP(99999999)คำสั่งและทำหน้าที่เหมือนโจมตี DOS โชคดีที่พวกเขาไม่ได้เรียกใช้ "โต๊ะบ๊อบบี้น้อย" XKCD: http://xkcd.com/327/ ดังนั้นฉันจึงเขียนคำสั่ง SQL ที่มีช่องโหว่จากmysql_query()(ไม่ใช่ mysqli) ไปยังธุรกรรม PDO ฉันยังวิเคราะห์การค้นหาSLEEPและUNIONที่เราไม่ได้ใช้ แต่การฉีดมี จนถึงตอนนี้ดีมาก ฉบับล่าสุด เมื่อเร็ว ๆ นี้เราได้รับการบอกว่ามีการเปลี่ยนแปลงบันทึกในฐานข้อมูลสำหรับผู้ใช้เช่นที่อยู่อีเมลของพวกเขาไปเป็นข้อมูลที่ผู้ส่งอีเมลขยะทำ ฉันสังเกตเห็นคอลัมน์ของพวกเขาไม่มีlast_modifiedคอลัมน์ดังนั้นเราจึงไม่สามารถรู้ได้ว่าเมื่อใดที่มีการเปลี่ยนแปลง ฉันเพิ่มคอลัมน์นั้น แต่มันแทบจะไม่เป็นขั้นตอนแรก เมื่อฉันดูตารางนี้ฉันสังเกตว่ารหัสผ่านไม่ได้ถูกใส่เกลือหรือถูกแฮชเพียงบันทึกเป็นข้อความธรรมดา การสื่อสารลูกค้า ฉันจะเข้าใกล้พวกเขาเกี่ยวกับสถานการณ์ทั้งหมดในฐานะผู้รับเหมาโดยไม่ล้มแขนของฉันเหมือนคนบ้าได้อย่างไร คำแนะนำใด ๆ? ฉันกำลังคิดวิธีสงบ ปัญหา # …
13 php  apache  security  mysql 

6
ในการต่อสู้ใครยืนยันว่า "เสร็จสิ้น"
ฉันเป็นผู้จัดการ QA / ทดสอบในองค์กรของฉันและจนถึงวันนี้ฉันตรวจสอบคุณภาพของซอฟต์แวร์ (การทดสอบที่เขียนและดำเนินการและแก้ไขข้อบกพร่อง) ใครจะตรวจสอบสิ่งนี้ในการต่อสู้ ฉันจะรู้ได้อย่างไรว่าทีมเขียนและดำเนินการทดสอบที่ถูกต้องทั้งหมด? ในทางกลับกันฉันกลัวว่าถ้าฉันทำการตรวจสอบต่อไปทีมจะไม่รู้สึกว่ามีพลังเพียงพอ แต่ฉันต้องการกระบวนการตรวจสอบบางอย่างที่ "เสร็จสิ้น" นั้นเป็น "เสร็จสิ้น" คุณแนะนำอะไร?
13 scrum 

2
เหตุใดจึงต้องแยกชั้นเรียน CommandHandler พร้อมหมายเลขอ้างอิง () แทนวิธีการจัดการใน Command เอง
ฉันมีส่วนหนึ่งของรูปแบบ CQRS ที่นำมาใช้โดยใช้สถาปัตยกรรม S # arpดังนี้: public class MyCommand { public CustomerId { get; set; } // some other fields } public class MyCommandHandler<MyCommand> : ICommandHandler<MyCommand, CommandResult> { Handle(MyCommand command) { // some code for saving Customer entity return CommandResult.Success; } } ฉันสงสัยว่าทำไมไม่เพียงแค่มีคลาสCommandที่มีทั้งข้อมูลและวิธีการจัดการ? มันเป็นข้อดีของการทดสอบที่คุณต้องทดสอบตรรกะการจัดการคำสั่งแยกต่างหากจากคุณสมบัติคำสั่งหรือไม่? หรือมันเป็นบางอย่างที่ต้องการทางธุรกิจบ่อยครั้งที่คุณจำเป็นต้องมีคำสั่งอย่างใดอย่างหนึ่งจัดการโดยการใช้งานที่แตกต่างกันของICommandHandler<MyCommand, CommandResult>?

5
วิธีจำลอง REST API ได้อย่างไร
ฉันกำลังทำงานในโครงการใหม่ซึ่งจะสืบค้นข้อมูลจาก API REST ของบุคคลที่สาม นี่เป็นฟีดข้อมูลกีฬาแบบเรียลไทม์ดังนั้นฟีดจะใช้งานได้เฉพาะเมื่อมีเกมเกิดขึ้นจริง แม้ว่าบุคคลที่สามจะให้เอกสารที่ดี (XSD ฯลฯ ) พวกเขาไม่มีวิธีจำลองเกมที่เกิดขึ้นและเพื่อทดสอบรหัสที่ฉันเขียนกับ API นี้ฉันจะต้องรอให้เกมเกิดขึ้นจริง การขอความช่วยเหลือเพียงอย่างเดียวของฉันคือการเขียนรหัสเพื่อจำลองเกมด้วยตัวเอง แต่ดูเหมือนว่าจะทำงานได้มากมาย คุณจะเข้าใกล้สิ่งนี้อย่างไร
13 api  rest 

2
ประเภทถูกลบใน Haskell หรือไม่
Haskell มีความคิดเกี่ยวกับ "ฟังก์ชั่นทั่วไป" ที่มีความคล้ายคลึงกันชัดเจนกับเสียงกระเพื่อมทั่วไป - หากไม่มีประสบการณ์กับ Haskell หรือด้วยเสียงกระเพื่อมสามัญฉันอาจจะประมาณที่นี่มาก ซึ่งหมายความว่าเราสามารถกำหนดเครื่องมือto_stringอำนวยความสะดวกทั่วไปเพื่อกำหนดการแสดงสตริงสำหรับทุกประเภท แน่นอนว่าสถานที่จะต้องมีการกำหนดไว้ในกรณีพิเศษ แต่มีฟังก์ชั่นที่มีลายเซ็นto_stringα → string ประเภทจะถูกลบใน Haskell เหมือนกับที่อยู่ใน OCaml หรือไม่ ถ้าใช่การนำไปปฏิบัติของ“ ฟังก์ชั่นทั่วไป” ใน Haskell แตกต่างจากเสียงกระเพื่อมทั่วไปชนิดใดที่เป็นแบบไดนามิกและไม่ถูกลบ? ฉันเข้าใจว่ารายละเอียดการใช้งานเป็นสิ่งที่เฉพาะเจาะจงสำหรับคอมไพเลอร์ แต่อาจมีข้อกำหนดทั่วไปสำหรับการใช้งานจำนวนมากหรือทั้งหมด

4
วิธีใดที่จะยุติการอ่านลูปเป็นวิธีที่ต้องการ
เมื่อคุณต้องย้ำผู้อ่านที่ไม่ทราบจำนวนรายการที่จะอ่านและวิธีเดียวที่จะทำคือการอ่านต่อไปจนกว่าจะถึงจุดสิ้นสุด นี่เป็นสถานที่ที่คุณต้องการวนซ้ำไม่รู้จบ มีเสมอtrueที่ระบุว่าจะต้องมีbreakหรือreturnคำสั่งบางแห่งในบล็อก int offset = 0; while(true) { Record r = Read(offset); if(r == null) { break; } // do work offset++; } มีวิธีอ่านลูปสองครั้ง Record r = Read(0); for(int offset = 0; r != null; offset++) { r = Read(offset); if(r != null) { // do work } } …

6
การเขียนโปรแกรมตามสัญญาและการทดสอบหน่วย
ฉันเป็นโปรแกรมเมอร์ที่ค่อนข้างป้องกันและเป็นแฟนตัวยงของ Microsoft Code Contracts ตอนนี้ฉันไม่สามารถใช้ C # และในภาษาส่วนใหญ่เครื่องมือเดียวที่ฉันมีคือการยืนยัน ดังนั้นฉันมักจะจบลงด้วยรหัสเช่นนี้: class { function() { checkInvariants(); assert(/* requirement */); try { /* implementation */ } catch(...) { assert(/* exceptional ensures */); } finally { assert(/* ensures */); checkInvariants(); } } void checkInvariants() { assert(/* invariant */); } } อย่างไรก็ตามกระบวนทัศน์นี้ (หรือสิ่งที่คุณจะเรียกว่า) นำไปสู่ความยุ่งเหยิงของรหัสจำนวนมาก ฉันเริ่มสงสัยว่ามันคุ้มค่ากับความพยายามจริง …

1
เหตุใดการผนวกรายการใน Scala จึงมีความซับซ้อนของเวลา O (n)
ฉันเพิ่งอ่านว่าเวลาดำเนินการของการดำเนินการผนวกสำหรับList(+) Listเติบโตขึ้นเป็นเส้นตรงกับขนาดของ การต่อท้ายListดูเหมือนจะเป็นการดำเนินการทั่วไปที่ค่อนข้างสวย เหตุใดจึงควรใช้วิธีการนี้เพื่อเตรียมส่วนประกอบจากนั้นจึงย้อนรายการ มันไม่สามารถเป็นความล้มเหลวในการออกแบบเนื่องจากการใช้งานอาจเปลี่ยนแปลงได้ทุกเมื่อ จากมุมมองของฉันทั้งการเตรียมและการต่อท้ายควรเป็น O (1) มีเหตุผลที่ถูกต้องสำหรับสิ่งนี้หรือไม่?

2
ติดตั้งคลาส Haskell ด้วยอินเตอร์เฟส C #
ฉันพยายามที่จะเปรียบเทียบคลาสประเภทของ Haskell และอินเทอร์เฟซของ C # Functorสมมติว่ามี Haskell: class Functor f where fmap :: (a -> b) -> f a -> f b วิธีการใช้คลาสประเภทนี้เป็นอินเตอร์เฟซใน C #? สิ่งที่ฉันได้ลอง: interface Functor<A, B> { F<B> fmap(Func<A, B> f, F<A> x); } นี้คือการดำเนินการที่ไม่ถูกต้องและฉัน stucked จริงกับทั่วไปประเภทที่ควรจะส่งกลับโดยF fmapควรกำหนดไว้อย่างไรและที่ไหน? มันเป็นไปไม่ได้ที่จะใช้Functorใน C # และทำไม? หรืออาจมีแนวทางอื่น
13 c#  haskell 

6
วิธีการฝึกการเขียนโปรแกรมเชิงวัตถุ? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ปิดให้บริการใน6 ปีที่ผ่านมา ล็อคแล้ว คำถามและคำตอบของคำถามนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ฉันได้รับการตั้งโปรแกรมในภาษาเชิงปฏิบัติอยู่เสมอและขณะนี้ฉันกำลังมุ่งไปสู่การวางแนวของวัตถุ ปัญหาหลักที่ฉันเผชิญคือฉันไม่เห็นวิธีฝึกการวางแนววัตถุอย่างมีประสิทธิภาพ ฉันจะอธิบายประเด็นของฉัน เมื่อฉันเรียนรู้ PHP และ C มันเป็นเรื่องง่ายที่จะฝึกฝน: มันเป็นเรื่องของการเลือกบางสิ่งบางอย่างและคิดเกี่ยวกับอัลกอริทึมสำหรับสิ่งนั้น ตัวอย่างเช่นใน PHP มันเป็นเรื่องสำคัญที่ระบบปฏิบัติการต้องนั่งลงและคิดว่า: "ดีแค่ฝึกให้ฉันสร้างแอปพลิเคชั่นเดียวด้วยเขตการปกครองซึ่งผู้คนสามารถเพิ่มผลิตภัณฑ์ได้" มันค่อนข้างง่ายมันเป็นเรื่องของการคิดถึงอัลกอริทึมในการลงทะเบียนผู้ใช้บางคนเข้าสู่ระบบผู้ใช้และเพื่อเพิ่มผลิตภัณฑ์ การรวมสิ่งเหล่านี้เข้ากับฟีเจอร์ PHP มันเป็นวิธีที่ดีในการฝึกฝน ตอนนี้ในการวางแนววัตถุเรามีสิ่งเพิ่มเติมมากมาย มันไม่ได้เป็นเพียงแค่การคิดเกี่ยวกับอัลกอริทึม แต่การวิเคราะห์ความต้องการที่ลึกกว่าการเขียนกรณีการใช้งานการหาไดอะแกรมระดับคุณสมบัติและวิธีการการตั้งค่าการฉีดพึ่งพาและหลายสิ่งหลายอย่าง ประเด็นหลักคือในวิธีที่ฉันได้เรียนรู้การวางแนววัตถุดูเหมือนว่าการออกแบบที่ดีนั้นสำคัญมากในขณะที่ภาษาที่ใช้ในขั้นตอนหนึ่งความคิดที่คลุมเครือก็เพียงพอแล้ว ฉันไม่ได้บอกว่าในภาษาเชิงปฏิบัติเราสามารถเขียนซอฟต์แวร์ที่ดีโดยไม่มีการออกแบบเพียงเพื่อประโยชน์ในการฝึกปฏิบัติมันเป็นไปได้ในขณะที่ในการวางแนววัตถุดูเหมือนว่าเป็นไปไม่ได้หากไม่มีการออกแบบที่ดี สิ่งนี้ดูเหมือนจะเป็นปัญหาเพราะถ้าทุกครั้งที่ฉันจะฝึกฉันต้องเข้าใจความต้องการจำนวนมากใช้เคสและอื่น ๆ ดูเหมือนว่าจะไม่ใช่วิธีที่ดีในการวางแนววัตถุให้ดีขึ้นเพราะสิ่งนี้ต้องการ ฉันมีความคิดทั้งหมดสำหรับแอปทุกครั้งที่ฉันจะฝึก เพราะเหตุใดจึงเป็นวิธีที่ดีในการฝึกวางแนววัตถุ

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