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

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

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

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

3
ใช้ PUT โดยมีผลกระทบด้านข้างที่ยอมรับได้ (REST)
ฉันต้องการสร้างประวัติการเลิกทำเมื่อใดก็ตามที่ผู้ใช้อัปเดตฟอร์ม เนื่องจากเป็นการอัปเดตฉันต้องการใช้คำขอ PUT แต่ผมอ่านที่ความต้องการนำไปไม่มีผลข้างเคียง เป็นที่ยอมรับหรือไม่ที่จะใช้ PUT ที่นี่ มีทางเลือกที่ดีกว่านี้ไหม? PUT /person/F02E395A235 { time: 1234567, fields: { name: 'John', age: '41' } } ในเซิร์ฟเวอร์ doPut('person/:personId', // create a new person snapshot ) แก้ไข: ผู้ใช้จะสามารถเห็นประวัติได้การเรียกหลายครั้งจะทำให้หลายเวอร์ชัน วิธีแก้ไขคือการตรวจสอบว่าเป็นรุ่นที่ไม่ซ้ำกันก่อนที่จะสร้างมัน

4
การตรวจสอบความสอดคล้องของธุรกรรมด้วย DDD
ฉันเริ่มต้นด้วย DDD และเข้าใจว่ามีการใช้รากรวมเพื่อรับรองความมั่นคงข้ามชาติ เราไม่ควรแก้ไขการรวมหลายรายการในบริการแอปพลิเคชันเดียว ฉันต้องการทราบวิธีจัดการกับสถานการณ์ต่อไปนี้ ฉันมีรูทรวมที่เรียกว่าผลิตภัณฑ์ นอกจากนี้ยังมีรูทรวมที่เรียกว่ากลุ่ม ทั้งสองมีรหัสและสามารถแก้ไขได้อย่างอิสระ ผลิตภัณฑ์หลายรายการสามารถชี้ไปที่กลุ่มเดียวกัน ฉันมีบริการแอปพลิเคชันที่สามารถเปลี่ยนกลุ่มของผลิตภัณฑ์: ProductService.ChangeProductGroup(string productId, string groupId) ตรวจสอบกลุ่มที่มีอยู่ รับผลิตภัณฑ์จากพื้นที่เก็บข้อมูล ตั้งค่ากลุ่ม เขียนผลิตภัณฑ์กลับไปที่ที่เก็บ ฉันยังมีบริการแอปพลิเคชันที่สามารถลบกลุ่มได้: GroupService.DeleteGroup(string groupId) 1. รับผลิตภัณฑ์จากที่เก็บซึ่ง groupId ถูกตั้งค่าเป็น groupId ที่ระบุตรวจสอบให้แน่ใจว่าการนับเป็น 0 หรือยกเลิก 2. ลบกลุ่มจากที่เก็บกลุ่ม 3. บันทึกการเปลี่ยนแปลง คำถามของฉันคือสถานการณ์ต่อไปนี้จะเกิดอะไรขึ้นถ้า: ใน ProductService.ChangeProductGroup เราจะตรวจสอบกลุ่มที่มีอยู่ (เช่นนั้น) จากนั้นหลังจากการตรวจสอบนี้ผู้ใช้ที่แยกต่างหากจะลบ productGroup (ผ่าน GroupService.DeleteGroup อื่น) ในกรณีนี้เราตั้งค่าการอ้างอิงถึงผลิตภัณฑ์ที่เพิ่งถูกลบ? นี่เป็นข้อบกพร่องในการออกแบบของฉันที่ฉันควรใช้การออกแบบโดเมนที่แตกต่างกัน (เพิ่มองค์ประกอบเพิ่มเติมถ้าจำเป็น) หรือฉันจะต้องใช้การทำธุรกรรม?

4
ทำไม REST Api ไม่ทำตามรูปแบบการออกแบบ Facade
ในการเปรียบเทียบ REST [api] โครงสร้างกับโมเดล OO ฉันเห็นความคล้ายคลึงกันเหล่านี้: ทั้งสอง: กำลังมุ่งเน้นข้อมูล REST = ทรัพยากร OO = วัตถุ ล้อมรอบการดำเนินงานรอบข้อมูล REST = ล้อมรอบ VERBS (รับ, โพสต์, ... ) รอบ ๆ แหล่งข้อมูล OO = ส่งเสริมการดำเนินการรอบ ๆ วัตถุโดยห่อหุ้ม อย่างไรก็ตามแนวปฏิบัติที่ดีของ OO นั้นไม่ได้อยู่บน REST apis เสมอเมื่อพยายามใช้รูปแบบซุ้มเช่นใน REST คุณไม่มีตัวควบคุม 1 ตัวที่จะจัดการกับคำร้องขอทั้งหมดและคุณจะไม่ซ่อนความซับซ้อนของวัตถุภายใน ในทางตรงกันข้าม REST ส่งเสริมการเผยแพร่ทรัพยากรของความสัมพันธ์ทั้งหมดกับทรัพยากรและอื่น ๆ ในรูปแบบอย่างน้อยสองรูปแบบ: ผ่านความสัมพันธ์ลำดับชั้นของทรัพยากร (ผู้ติดต่อของ id 43 …
9 http  rest  definition 

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

1
เป็นไปได้หรือไม่ที่จะสร้างพอร์ตจากแอปพลิเคชัน C ++ ไปยัง Java ผ่าน LLVM
มันทำงานได้อย่างไรกับพอร์ตแอปพลิเคชัน C ++ ไปยัง Java bytecode โดยใช้ LLVM (ฉันเดา LLJVM) สิ่งที่เป็นอยู่ในปัจจุบันคือเรามีกระบวนการเขียนใน C ++ แต่ไคลเอนต์ใหม่ได้รับคำสั่งให้สามารถรันโปรแกรมในรูปแบบที่หลากหลายโดยใช้ Java Virtual Machine ที่ไม่มีรหัสพื้นเมือง (ไม่มี JNI) แนวคิดคือสามารถนำ jar ที่สร้างขึ้นมาและคัดลอกไปยังระบบอื่น (Linux, Win, 32 bits - 64 bits) และควรใช้งานได้ มองไปรอบ ๆ ดูเหมือนว่ามันเป็นไปได้ที่จะรวบรวมรหัส C ++ กับ LLVM IR และจากนั้นรหัสไปยัง java bytecode ไม่จำเป็นต้องใช้รหัสที่สร้างขึ้นเพื่อให้สามารถอ่านได้ ฉันมีการทดสอบเล็กน้อยกับสิ่งที่คล้ายกันโดยใช้ emscripten นี้ใช้รหัส C ++ และรวบรวมไปยัง JavaScript …
9 java  c++  porting 

2
การบำรุงรักษา OpenJDK ทำงานอย่างไรในทางปฏิบัติ
โดยเฉพาะฉันต้องการทำความเข้าใจความแตกต่างระหว่าง JDK ของ Oracle และ OpenJDK ในแง่ของการแก้ไขข้อบกพร่องและโปรแกรมแก้ไขอื่น ๆ สาขาใดได้รับการแก้ไขเป็นอันดับแรกและ Oracle มีนิสัยชอบทำแพตช์ที่ไม่เคยทำให้ OpenJDK
9 java 

3
ฉันสามารถอ้างสิทธิ์นี้เป็นโครงการของฉันเองได้หรือไม่หากฉันได้รับความช่วยเหลือทางออนไลน์ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว โดยทั่วไปฉันยังใหม่กับการเขียนโปรแกรมเครือข่ายใน Python ดังนั้นฉันจึงไปสอนออนไลน์เพื่อหาข้อมูลเกี่ยวกับมัน ใช้สิ่งที่สอนในบทช่วยสอน (การสร้างซ็อกเก็ตการเชื่อมต่อพอร์ต ฯลฯ ) ฉันแก้ไขโค้ดเพื่อที่ฉันจะสร้างโปรแกรมที่คอมพิวเตอร์สองเครื่องสามารถส่งข้อความถึงกันได้ หากฉันต้องสมัครงานและแสดงให้ผู้สัมภาษณ์ของฉันทราบรหัสทางเทคนิคจะเป็นของฉันหรือไม่ มันยุติธรรมที่จะบอกว่าฉันไม่ได้แก้ไขรหัสโดยมาก อย่างไรก็ตามถ้าฉันดัดแปลงมันเป็นเกม tic-tac-toe ที่ผู้ใช้สองคนเล่นกันจากพีซีที่ต่างกันรหัสนั้นจะเป็นของฉันหรือไม่ ฉันแค่ไม่อยากดูเหมือนคนลอกเลียนแบบดังนั้นทำไมฉันถึงถาม

1
อัลกอริทึม“ Bad apple” หรือกระบวนการขัดข้อง sandbox ที่ใช้ร่วมกัน
ฉันกำลังมองหาอัลกอริทึมในการจัดการปัญหาต่อไปนี้ซึ่งตอนนี้ฉันกำลังเรียกอัลกอริทึม "แอปเปิ้ลไม่ดี" ปัญหา ฉันมี N โพรเซสที่ทำงานในแซนด์บ็อกซ์ M โดยที่ >> N มันเป็นไปไม่ได้เลยที่จะให้แต่ละกระบวนการเป็น sandbox ของตัวเอง อย่างน้อยหนึ่งในกระบวนการเหล่านั้นมีพฤติกรรมไม่ดีและนำลงสู่ sandbox ทั้งหมดดังนั้นจึงฆ่ากระบวนการอื่นทั้งหมดใน sandbox เดียวกัน หากเป็นกระบวนการที่ประพฤติตัวไม่ดีเพียงครั้งเดียวฉันสามารถใช้การแบ่งครึ่งแบบง่าย ๆ เพื่อใส่กระบวนการครึ่งหนึ่งลงในแซนด์บ็อกซ์หนึ่งและอีกครึ่งหนึ่งในแซนด์บ็อกซ์อื่นจนกว่าฉันจะพบคนผิดปกติ คำถาม หากมีมากกว่าหนึ่งกระบวนการที่มีพฤติกรรมไม่ดี - รวมถึงความเป็นไปได้ที่พวกเขาทั้งหมดมีพฤติกรรมไม่ดี - อัลกอริทึมไร้เดียงสานี้ใช้งานได้หรือไม่? มันรับประกันว่าจะทำงานภายในขอบเขตที่เหมาะสมหรือไม่? simplifications เพื่อประโยชน์ในการโต้แย้งลองสมมติว่ากระบวนการที่ไม่ดีจะทำลายกล่องทรายของมันทันทีและกระบวนการที่ดีไม่เคยทำ

1
ฟังก์ชั่นมาโคร vs. คงที่ในส่วนหัว
สำหรับงานด่วนจำนวนมากที่สามารถใช้ฟังก์ชั่นf(x,y)ได้ใน C ธรรมดาจะใช้มาโคร ฉันต้องการถามเฉพาะเกี่ยวกับกรณีเหล่านี้ซึ่งสามารถแก้ไขได้โดยการเรียกใช้ฟังก์ชัน (เช่นมาโครที่ใช้สำหรับฟังก์ชั่นอินไลน์ไม่ใช่สำหรับการขยายโค้ดของรหัสที่กำหนดเอง) โดยทั่วไปฟังก์ชั่น C จะไม่ถูกแทรกเนื่องจากมันอาจถูกลิงค์ไปจากไฟล์ C อื่น ๆ อย่างไรก็ตามฟังก์ชั่นคงที่ C สามารถมองเห็นได้จากภายในไฟล์ C ที่มีการกำหนดไว้ดังนั้นพวกเขาสามารถ inline โดยคอมไพเลอร์ ฉันได้ยินมาว่าควรมีการเปลี่ยนมาโครเป็นจำนวนมากโดยเปลี่ยนเป็นฟังก์ชั่นแบบคงที่เพราะจะทำให้รหัสปลอดภัยยิ่งขึ้น มีบางกรณีที่นี่ไม่ใช่ความคิดที่ดีหรือไม่? อีกครั้ง: ไม่ถามเกี่ยวกับมาโครการผลิตรหัสด้วย ## โครงสร้างที่เหมือนกันซึ่งไม่สามารถแสดงเป็นฟังก์ชันได้เลย
9 c 

3
การจัดการกับปิรามิดของ node.js
ฉันเพิ่งเริ่มใช้โหนดและสิ่งหนึ่งที่ฉันสังเกตเห็นได้อย่างรวดเร็วก็คือการโทรกลับอย่างรวดเร็วสามารถสร้างการเยื้องระดับที่บ้าบิ่นได้อย่างไร: doStuff(arg1, arg2, function(err, result) { doMoreStuff(arg3, arg4, function(err, result) { doEvenMoreStuff(arg5, arg6, function(err, result) { omgHowDidIGetHere(); }); }); }); คู่มือสไตล์อย่างเป็นทางการกล่าวว่าจะนำแต่ละโทรกลับในฟังก์ชั่นที่แยกกัน แต่ที่ดูเหมือนว่ามากเกินไปข้อ จำกัด ในการใช้งานของการปิดและทำให้วัตถุเดียวที่ประกาศในระดับบนสุดที่มีหลายชั้นลงเป็นวัตถุจะต้องมีการผ่านทั้งหมด การเรียกกลับระดับกลาง การใช้ขอบเขตฟังก์ชั่นช่วยได้หรือไม่? ใส่ฟังก์ชั่นการโทรกลับทั้งหมดที่ต้องการเข้าถึงวัตถุ Global-ish ภายในฟังก์ชั่นที่ประกาศวัตถุนั้นดังนั้นมันจึงปิดลง? function topLevelFunction(globalishObject, callback) { function doMoreStuffImpl(err, result) { doMoreStuff(arg5, arg6, function(err, result) { callback(null, globalishObject); }); } doStuff(arg1, arg2, doMoreStuffImpl); } …

2
การทดสอบ RSpec + Selenium สำหรับ. NET บน Windows
ฉันเป็นนักพัฒนา Rails ที่กำลังทำ TDD บน Mac ด้วย RSpec, Capybara และ Selenium webdriver ตอนนี้ บริษัท ของฉันถูกขอให้ฉันใช้วิธีนี้สำหรับ. NET บนระบบปฏิบัติการ Windows วิธีที่ดีที่สุดในการทำเช่นนี้คืออะไร? ฉันสามารถติดตั้ง Ruby และใช้ RSPEC, Capybara และ Selenium webdriver สำหรับการทดสอบการรวมระบบ แต่สิ่งที่เกี่ยวกับการทดสอบหน่วย? ฉันดูที่NSpecด้วย แต่ฉันไม่แน่ใจว่าฉันสามารถรวมเข้ากับ Capybara หรือ Selenium เพื่อทดสอบการรวมเข้าด้วยกันได้หรือไม่ อะไรจะเป็นแนวทางที่ดีที่นี่
9 .net 

3
จะเกิดอะไรขึ้นหากฉันไม่ได้ระบุอย่างชัดเจนว่า“ โปรแกรมนี้ไม่มีการรับประกัน”
และสมมติว่าแอปพลิเคชันของฉันเป็นโปรแกรมอ่านฟีดง่าย แอพของฉันต้องมีการแจ้งการรับประกันหรือไม่?
9 legal 

2
REST หรือคิวข้อความในระบบที่ต่างกันหลายระดับ?
ฉันออกแบบ API REST สำหรับระบบสามชั้นเช่น: Client application-> ->Front-end API cloud serveruser's home API server (Home) Homeเป็นอุปกรณ์บ้านและควรจะรักษาเชื่อมต่อFront-endผ่าน WebSocket หรือโพลล์ยาว(นี้เป็นสถานที่แรกที่เรากำลังละเมิด REST. จะได้รับก็แย่ภายหลัง) Front-endช่องสัญญาณส่วนใหญ่Clientร้องขอการHomeเชื่อมต่อและจัดการการโทรบางตัว บางครั้งส่งการแจ้งเตือนไปยังHomeClient Front-endและHomeมี API เดียวกันโดยทั่วไป Clientอาจเชื่อมต่อHomeโดยตรงผ่าน LAN ในกรณีนี้Homeจำเป็นต้องลงทะเบียนClientการกระทำบางอย่างกับFront-endตัวเอง ข้อดีสำหรับ REST ในระบบนี้คือ: REST สามารถอ่านได้โดยมนุษย์ ส่วนที่เหลือมีการทำแผนที่กริยาที่กำหนดไว้อย่างดี (เช่น CRUD) คำนามและรหัสการตอบสนองกับวัตถุโปรโตคอล; มันทำงานผ่าน HTTP และส่งผ่านผู้รับมอบฉันทะที่เป็นไปได้ทั้งหมด; ส่วนที่เหลือ REST คือ: เราไม่เพียง แต่ต้องการสไตล์การสื่อสารที่ตอบสนองการร้องขอเท่านั้น รหัสข้อผิดพลาด HTTP อาจไม่เพียงพอสำหรับจัดการข้อผิดพลาดการสื่อสารสามระดับ Front-endอาจจะกลับ202 Acceptedไปโทร async …

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