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

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

2
วิธีการนำตัวจัดการกระบวนการไปใช้ในการจัดหากิจกรรม
ฉันกำลังทำงานกับแอปพลิเคชันตัวอย่างขนาดเล็กเพื่อเรียนรู้แนวคิดของ CQRS และการจัดหากิจกรรม ฉันมีการBasketรวมและการProductรวมซึ่งควรทำงานอย่างอิสระ นี่คือโค้ดหลอกบางอย่างที่จะแสดงการใช้งาน Basket { BasketId; OrderLines; Address; } // basket events BasketCreated { BasketId; } ItemAdded { BasketId; ProductId; Quantity } AddItemSucceeded { BasketId; ProductId; Quantity } AddItemRevoked { BasketId; ProductId; Quantity } ItemRemoved { BasketId; ProductId; Quantity } CheckedOut { BasketId; Address } Product { ProductId; …

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

2
ตอนนี้ไม่ใช่ว่าการประกาศเมธอดทั้งหมดใน Java Interface นั้นเป็นนามธรรมสาธารณะควรจะประกาศเมธอดด้วยตัวดัดแปลงเหล่านี้หรือไม่?
เริ่มต้นด้วย Java 8 defaultมีการนำวิธีการมาใช้ในอินเตอร์เฟส ได้อย่างมีประสิทธิภาพที่นี้หมายถึงว่าไม่ทุกวิธีการในการให้มีinterfaceabstract เริ่มต้นด้วย Java 9 (อาจ) privateวิธีการจะได้รับอนุญาต ซึ่งหมายความว่าไม่ทุกวิธีการในการให้มีinterfacepublic abstract คำถาม "ควรประกาศวิธีการในส่วนต่อประสาน Java โดยมีหรือไม่มีpublicตัวแก้ไขการเข้าถึงหรือไม่" ถูกถามที่ Stack Overflow ที่/programming/161633/should-methods-in-a-java-interface-be-declared-with-or-without-a-public-access-m คำตอบส่วนใหญ่แย้งว่าpublic abstractไม่ควรใช้เพราะไม่มีวิธีการใดที่interfaceสามารถเป็นอย่างอื่นpublic abstractได้ นี่ไม่ใช่กรณีอีกต่อไป ดังนั้นด้วยคุณสมบัติใหม่ของอินเทอร์เฟซเหล่านี้ควรใช้public abstractคีย์เวิร์ดในการประกาศเมธอดของอินเตอร์เฟส Java หรือไม่? ในสภาพแวดล้อมเฉพาะของฉันเราจะมีคนที่มีประสบการณ์วิศวกรซอฟต์แวร์ แต่ไม่เคยมีประสบการณ์ใน Java อ่านโค้ด Java เป็นครั้งคราว ฉันรู้สึกว่าการละทิ้งpublic abstractคำหลักจะสร้างจุดสับสนเพิ่มเติมสำหรับผู้ที่ไม่คุ้นเคยกับประวัติว่าอินเตอร์เฟสมีกฎแตกต่างกันสำหรับการใช้คำหลักเหล่านี้อย่างไร

5
วิธีการจัดระเบียบทรัพยากรสตริงการแปล
เรากำลังพัฒนาแอปพลิเคชั่นขนาดใหญ่ประกอบด้วยแพ็คเกจขนาดเล็กจำนวนมาก แต่ละแพ็คเกจมีชุดของไฟล์ทรัพยากรสำหรับการแปล วิธีที่ดีที่สุดในการจัดระเบียบและตั้งชื่อสตริงการแปลคืออะไร นี่คือความคิดของฉัน: การจัดการรายการที่ซ้ำกัน ข้อความเดียวกัน (พูดว่า "รหัสไปรษณีย์") อาจเกิดขึ้นหลายครั้งภายในแพ็คเกจที่กำหนด Programming สัญชาตญาณ (แห้ง) บอกฉันเพื่อสร้างทรัพยากรสายเดียวที่ใช้ร่วมกันโดยเกิดขึ้นทั้งหมด จากนั้นอีกครั้งนักแปลอาจต้องการเลือกการแปลที่ยาว ("Postleitzahl") ในบางแห่งและอีกอันที่สั้นกว่า ("PLZ") ในที่ที่มีพื้นที่น้อย หรือเราอาจตัดสินใจต่อท้ายเครื่องหมายจุดคู่กับเหตุการณ์บางอย่าง ("รหัสไปรษณีย์:") แต่ไม่ใช่สำหรับบางคน หรือเราอาจต้องการตัวพิมพ์ใหญ่ ("รหัสไปรษณีย์") ที่แตกต่างกันในบางสถานที่ ข้อโต้แย้งทั้งหมดเหล่านี้ชี้ไปที่การสร้างทรัพยากรต่อการใช้งานแม้ว่าเนื้อหาของพวกเขาเหมือนกัน การตั้งชื่อ ถ้าเรามุ่งมั่นที่จะกำจัดข้อมูลซ้ำมันทำให้รู้สึกไปยังแหล่งข้อมูลชื่อตามเนื้อหาอาจจะกระทบถึงชนิดของการใช้งานผ่านทางคำนำหน้า ดังนั้นเราอาจมีlabelOK= "ตกลง" , messageFileTooLarge= "ไฟล์เกินขนาดไฟล์สูงสุด" และlabelZipCode= "รหัสไปรษณีย์" การตั้งชื่อโดยเนื้อหานั้นมีข้อดีของการจัดการข้อโต้แย้งรูปแบบตามธรรมชาติ: ทรัพยากรmessageFileHas_0_MBWhileMaximumIs_1_MBใช้อาร์กิวเมนต์การจัดรูปแบบสองแบบอย่างชัดเจนขนาดไฟล์จริงและขนาดไฟล์สูงสุด อย่างไรก็ตามหากเราอนุญาตการซ้ำซ้อนการตั้งชื่อตามเนื้อหาเพียงอย่างเดียวไม่สมเหตุสมผล เพื่อให้ได้รับชื่อทรัพยากรที่ไม่ซ้ำกันเราจะต้องรวมถึงสถานที่การใช้งานในชื่อทรัพยากร ผลงานที่สำหรับการควบคุมกราฟิกแม้ว่าตัวระบุมีแนวโน้มที่จะได้รับบิตยาว: fileSelectionConfirmationButtonText= "OK" , customerDetailsTableColumnZipCode= "รหัสไปรษณีย์" อย่างไรก็ตามสำหรับไฟล์รหัสที่ไม่ใช่แบบเห็นภาพนั้นจะยากขึ้น คุณจะตั้งชื่อการใช้งานที่เฉพาะเจาะจงของสตริงได้อย่างไรหากคุณไม่รู้ว่ามันจะปรากฏที่ใดในที่สุด? โดยไฟล์รหัสและชื่อฟังก์ชั่น? ดูเหมือนจะค่อนข้างงุ่มง่ามและเปราะสำหรับฉัน โดยรวมแล้วฉันกำลังโน้มน้าวให้อนุญาตการทำซ้ำ แต่ฉันพยายามดิ้นรนเพื่อหารูปแบบการตั้งชื่อที่สอดคล้องซึ่งสนับสนุนสิ่งนี้ …

7
วิธีการพิสูจน์ตัวตนผู้ใช้จากแอปพลิเคชันไคลเอนต์
ฉันพัฒนาแอพพลิเคชั่นซึ่งจะรองรับผู้ใช้หลายคน สิ่งที่ฉันไม่สามารถคิดออกวิธีการตรวจสอบลูกค้า / ผู้ใช้ ฉันกำลังสร้างแอพอย่างhttp://quickblox.com/ที่ฉันจะให้ข้อมูลประจำตัวแก่ผู้ใช้ของฉันและพวกเขาจะใช้แอปเหล่านี้เพื่อสร้างแอปพลิเคชั่นNที่พวกเขาไม่สามารถใส่ชื่อผู้ใช้และรหัสผ่านเพื่อรับรองความถูกต้อง สมมติว่ามันเป็นไปตาม(เหมือน QuickBlox) 1. ผู้ใช้สร้างบัญชีในเว็บไซต์ของฉัน 2. ผู้ใช้สามารถสร้างคีย์ N API และข้อมูลรับรองความลับ (สำหรับหลายแอพ) 3. ผู้ใช้จะใช้ข้อมูลรับรองเหล่านี้ในแอปพลิเคชัน (Android, iOS, Javascript ฯลฯ ... ) เพื่อพูดคุยกับ REST API ของฉัน (REST API มีการเข้าถึงแบบอ่านและเขียน) ความกังวลของฉัน? ผู้ใช้จะใส่ข้อมูลประจำตัว (คีย์ API และคีย์หลั่ง) ในแอปพลิเคชันที่พวกเขาสร้างจะเกิดอะไรขึ้นถ้ามีคนรับคีย์เหล่านี้และพยายามเลียนแบบผู้ใช้ (โดยการแยกข้อมูล APK หรือดูโค้ด JavaScript โดยตรง ฉันผิดตรงไหนเหรอ? ฉันสับสนในการออกแบบกลไกผู้ใช้สามระดับนี้

2
การบีบอัดวิดีโอสตรีมที่รวดเร็วและไม่สูญเสีย
ฉันมีวิดีโอที่มาจากกล้องนิ่ง ทั้งความละเอียดและ FPS ค่อนข้างสูง ข้อมูลที่ฉันได้รับอยู่ในรูปแบบไบเออร์และใช้ 10 บิตต่อพิกเซล เนื่องจากไม่มีชนิดข้อมูล 10 บิตบนแพลตฟอร์มของฉันข้อมูลต้นฉบับจะถูกเก็บไว้ในหน่วยความจำโดยใช้คำ 16 บิต ฉันต้องการใช้การบีบอัดข้อมูลแบบไม่สูญเสียข้อมูลบางอย่างก่อนส่งผ่านเครือข่าย กล้องไม่เคลื่อนไหวดังนั้นส่วนใหญ่ของเฟรมที่ต่อเนื่องกันเกือบจะเหมือนกัน - แต่ก็ยังไม่สมบูรณ์เนื่องจากเสียงที่หลีกเลี่ยงไม่ได้ (denoising ไม่ใช่ตัวเลือกเนื่องจากควรจะสูญเสียและไม่ควร "เสีย" แม้แต่เสียง ) เนื่องจาก FPS สูงแม้แต่ชิ้นส่วนที่เปลี่ยนจึงไม่เปลี่ยนแปลงมากนักระหว่างเฟรมต่อเนื่องสองเฟรม อย่างไรก็ตามดูเหมือนว่ากล้องจะสั่นเล็กน้อย น้อยมาก แต่ถึงกระนั้นแม้กระทั่งวัตถุที่อยู่กับที่ก็ยังไม่สมบูรณ์ในพื้นที่ภาพ การบีบอัดต้องทำได้อย่างรวดเร็วดังนั้นฉันจึงไม่สามารถรวบรวมเฟรมจำนวนมากและบีบอัดพวกมันทั้งหมดเข้าด้วยกัน แต่ฉันสามารถมองย้อนกลับไป 1 เฟรมและใช้เป็นข้อมูลอ้างอิงได้ ความคิดแรกของฉันคือการบีบอัดข้อมูลเพื่อให้บิตที่ซ้ำซ้อน 6 บิตเหล่านั้นไม่สูญเปล่าไปทุกคำ อย่างไรก็ตามฉันคิดว่าถ้าฉันใช้การเข้ารหัสเอนโทรปี (เช่น Huffman เป็นต้น) ความซ้ำซ้อนนั้นจะถูกนำมาพิจารณาโดยอัตโนมัติดังนั้นจึงไม่จำเป็นต้องมีการบรรจุเพิ่มเติม ดังนั้นฉันทำต่อไปนี้: ใช้ความแตกต่างแบบไบนารีระหว่างสองเฟรมที่ต่อเนื่องกัน ช่วงข้อมูลดั้งเดิมคือ 0 ~ 1023 (เช่น 10 บิตที่ไม่ได้ลงชื่อ) ข้อมูลที่แตกต่างจะถูกเซ็นชื่อและช่วงจะเพิ่มเป็น -1023 …

1
ส่วนขยายฟรีของ monad และปฏิกิริยามีความสัมพันธ์อย่างไร
ฉันมาจากพื้นหลัง C # ที่ LINQ พัฒนาเป็น Rx.NET แต่มีความสนใจใน FP เสมอ หลังจากที่ได้รู้จักกับ monads และบางโครงการใน F # ฉันก็พร้อมที่จะลองและก้าวไปอีกระดับ ตอนนี้หลังจากพูดคุยเกี่ยวกับ monad ฟรีจากผู้คนจาก Scala และการเขียนหลายครั้งใน Haskell หรือ F # ฉันได้พบไวยากรณ์พร้อมล่ามเพื่อความเข้าใจที่คล้ายกับIObservableโซ่ ใน FRP คุณเขียนคำจำกัดความการดำเนินการจากชิ้นส่วนเฉพาะของโดเมนที่เล็กลงรวมถึงผลข้างเคียงและความล้มเหลวที่อยู่ในห่วงโซ่ ใน monad ฟรีถ้าฉันเข้าใจอย่างถูกต้องคุณทำเช่นเดียวกันโดยทำให้การทำงานของคุณเป็น functors และยกพวกเขาโดยใช้ coyoneda อะไรคือความแตกต่างระหว่างทั้งสองที่เอียงเข็มไปทางใดก็ได้ อะไรคือความแตกต่างพื้นฐานเมื่อกำหนดบริการหรือโปรแกรมของคุณ

3
สนับสนุนการพัฒนาระบบปฏิบัติการรุ่นเก่า
ฉันกำลังบำรุงรักษารหัสมรดกส่วนใหญ่เขียนด้วยภาษาซีรหัสนี้ถูกเขียนขึ้นครั้งแรกเพื่อเป็น comiled กับ Windows 3 สำหรับ Workgroups และรุ่นที่ใหม่กว่าสำหรับ NT ถูกสร้างขึ้น แอปพลิเคชั่นรุ่นเก่านี้ยังคงใช้งานได้ในปัจจุบันทำงานอย่างสนุกสนานบนเวิร์กสเตชัน 3.11 และ NT จากต้นยุค 90 มันใช้งานได้และทำในสิ่งที่ควรทำและเหตุผลที่พวกเขายังคงใช้งานอยู่คือไดรเวอร์สำหรับฮาร์ดแวร์ที่กำหนดเองซึ่งเป็นของโซลูชันไม่เข้ากันได้กับ Windows ในภายหลัง นอกจากนี้ยังมีแอปพลิเคชั่นอื่นที่ฉันยืนยันว่าด้วยเหตุผลเดียวกันนี้ใช้งานได้กับ Win2k เท่านั้น อย่างไรก็ตามในขณะที่สิ่งต่าง ๆ ดำเนินต่อไปมันก็ยากที่จะเรียกใช้สภาพแวดล้อมแบบดั้งเดิมเหล่านี้ ตอนนี้ฉันเก็บเครื่องทางกายภาพไว้กับซอฟต์แวร์การพัฒนาที่ติดตั้งดังนั้นฉันจึงสามารถทำงานกับฮาร์ดแวร์ดั้งเดิมได้ แต่สิ่งเหล่านี้อาจตายได้ตลอดเวลา (พวกเขามีอายุ 25 ปี) ดังนั้นคำถามของฉันคือเมื่อเห็นว่าเป็นปี 2559 อะไรคือตัวเลือกของฉันสำหรับการรักษาสภาพแวดล้อมโบราณนี้ในวิธีที่มีเสถียรภาพมากขึ้น? คุณสามารถย้าย 3.11 ไปยังโฮสติ้งคลาวด์ได้หรือไม่ ฉันลองใช้การจำลองเสมือน แต่เนื่องจากลักษณะเฉพาะของการตั้งค่าฉันไม่สามารถใช้งานได้กับไดรเวอร์อุปกรณ์ดังนั้นฉันคิดว่าอาจต้องทำให้ภาพเต็มของระบบปฏิบัติการตามที่เป็นอยู่แล้วจึงเรียกใช้งานใน VM เพื่อพัฒนาซอฟต์แวร์หรือไม่ สิ่งนี้เป็นไปได้หรือไม่สำหรับแขกระบบปฏิบัติการรุ่นเก่าที่เป็น Win3 และ NT มีประสบการณ์ในการรักษาแพลตฟอร์มเก่า ๆ เช่นนี้เพื่อการพัฒนาหรือไม่ แต่ในแบบที่ทันสมัยกว่าและปลอดภัยกว่าที่ฉันสามารถดึงดูดได้ เป้าหมายของฉันคือการกำจัดเครื่องเก่าออกและย้ายไปยังระบบเสมือนจริง
14 c  windows  legacy 

4
รูปแบบสำหรับอัลกอริทึมที่แสดงคำอธิบายถึงวิธีการแก้ปัญหาเมื่อจำเป็น
สถานการณ์ต่อไปนี้เกิดขึ้นกับฉันหลายครั้ง ฉันตั้งโปรแกรมอัลกอริทึมที่แก้ปัญหาบางอย่าง มันทำงานได้ดีและค้นหาวิธีแก้ไขที่ถูกต้อง ตอนนี้ฉันต้องการมีตัวเลือกในการบอกอัลกอริทึม "เขียนคำอธิบายโดยละเอียดเกี่ยวกับวิธีการแก้ปัญหา" เป้าหมายของฉันคือสามารถใช้อัลกอริทึมในการสาธิตออนไลน์ชั้นเรียนกวดวิชาและอื่น ๆ ฉันยังต้องการมีตัวเลือกในการเรียกใช้อัลกอริทึมแบบเรียลไทม์โดยไม่มีคำอธิบาย รูปแบบการออกแบบที่ดีที่จะใช้คืออะไร? ตัวอย่าง: สมมติว่าผมใช้วิธีนี้ในการหาตัวหารร่วมมาก วิธีที่ใช้ในปัจจุบันส่งกลับคำตอบที่ถูกต้อง แต่ไม่มีคำอธิบาย ฉันต้องการมีตัวเลือกสำหรับวิธีการอธิบายการกระทำของมันเช่น: Initially, a=6 and b=4. The number of 2-factors, d, is initialized to 0. a and b are both even, so we divide them by 2 and increment d by 1. Now, a=3 and b=2. a is …

4
รูปแบบความรับผิดชอบเดี่ยวควรมีรูปแบบเฉพาะสำหรับชั้นเรียนอย่างไร
ตัวอย่างเช่นสมมติว่าคุณมีโปรแกรมเกมคอนโซลซึ่งมีวิธีอินพุต / เอาต์พุตทุกชนิดเข้าและออกจากคอนโซล มันจะเป็นสมาร์ทเพื่อให้พวกเขาทั้งหมดในครั้งเดียวinputOutputชั้นเรียนหรือทำลายพวกเขาลงไปเรียนที่เฉพาะเจาะจงมากขึ้นเช่นstartMenuIO, inGameIO, playerIO, gameBoardIOฯลฯ ดังกล่าวว่าแต่ละชั้นจะมีประมาณ 1-5 วิธี? และเมื่อทราบเหมือนกันถ้ามันจะดีกว่าที่จะทำลายพวกเขาลงมันจะเป็นสมาร์ทที่จะวางไว้ในIOnamespace จึงทำให้เรียกพวกเขาเล็ก ๆ น้อย ๆ มากขึ้นอย่างละเอียดเช่น: IO.inGameฯลฯ ?

4
วิธี "เริ่มต้นใหม่" ใน GitHub ได้อย่างไร
ฉันวางแผนที่จะเขียนใหม่ทั้งหมดของโครงการของฉันโดยใช้เฟรมเวิร์กอื่นเป็นต้นมันเป็นการดีที่จะเก็บรหัสเก่ารวมถึงประวัติสำหรับการอ้างอิง วิธีที่ดีที่สุดในการทำเช่นนี้คือเพื่อหลีกเลี่ยงความเสี่ยงความสับสนและความประหลาดใจ ความคิดของฉันคือการสร้างสาขาใหม่แทนที่ทุกอย่างและรับพื้นฐาน "รุ่นใหม่" ที่ใช้งานอยู่ติดแท็กต้นแบบ "เก่า" ตัวสุดท้ายจากนั้นผสานสาขาเข้ากับต้นแบบ เสียงนี้สมเหตุสมผลหรือไม่
14 git  github 

4
Monads แก้ปัญหาการเขียนโปรแกรมอะไรบ้าง? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน3 ปีที่ผ่านมา ฉันได้อ่านบทความจำนวนมากที่อธิบายว่าพระสงฆ์คืออะไรอย่างไรunitและbindทำงานอย่างไรบ้างบางคนก็ถกเถียงกันในทฤษฎีหมวดหมู่อย่างเป็นนามธรรมดังนั้น (อย่างน้อยสำหรับฉัน) ที่ทำให้ตาตกบางคนไม่สนใจสิ่งเหล่านั้น burritos กล่องและสิ่งที่ไม่ หลังจากสองสามสัปดาห์ของการศึกษาและเซลล์ประสาททอดจำนวนมาก (ฉันคิดว่า) ฉันเข้าใจว่า Monads ทำงานอย่างไร แต่ยังมีอีกสิ่งหนึ่งที่หนีความเข้าใจของฉันไปสิ่งที่โพสต์ไม่กี่สัมผัสจริง ๆ (ยกเว้น IO และรัฐ): ทำไม? ทำไม Monads ถึงมีความสำคัญ? ทำไมพวกเขาถึงสำคัญ? ปัญหาที่พวกเขากำลังแก้ไขคืออะไร ปัญหาเหล่านั้นสามารถแก้ไขได้เฉพาะกับ Monads หรือมีวิธีอื่นบ้างไหม?

3
ฉันควรเพิ่มแหล่งที่มาของห้องสมุดแทนที่จะเชื่อมโยงไปยังพวกเขาหรือไม่
ฉันค่อนข้างใหม่กับ C ++ ดังนั้นฉันไม่แน่ใจว่าฉันควรจัดการกับการอ้างอิงขนาดเล็กได้ดีที่สุดอย่างไร (เช่นภาษาสคริปต์หรือ JSON / YAML / XML Parser) ฉันควรสร้างโครงการแยกต่างหากและเชื่อมโยงเป็นห้องสมุดแบบคงที่หรือมีข้อเสียเพียงวางไฟล์. h / .cpp ลงในโครงการหลักของฉัน หลังดูง่ายกว่ามากเพราะฉันใช้เวลาหลายชั่วโมงในการจัดการกับไลบรารีที่เข้ากันไม่ได้ (การตั้งค่าคอมไพเลอร์ที่แตกต่างกันเมื่อสร้างห้องสมุด) แต่ฉันไม่ต้องการเริ่มต้นเรียนรู้ C ++ ในทางที่ผิด หากการเก็บไว้เป็นไลบรารี่แยกกันฉันจะเก็บแฟล็กการรวบรวมให้ตรงกันได้อย่างไรเพื่อให้ไฟล์. lib / .a เชื่อมโยงกับแอปพลิเคชันของฉันสำเร็จ (ตอนนี้ฉันทำงานกับ MSVC 2015 แต่เป้าหมายคือการคอมไพล์บน Mac OS X และ iOS โดยใช้ XCode / clang ดังนั้นฉันต้องจัดการกับไลบรารีที่แตกต่างกันอย่างน้อย 3 ประเภท (Win x86, Mac x64, ARM) )
14 c++  linking 

5
การเขียน object oriented C เป็นสิ่งที่ดีหรือไม่? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฉันมักจะเขียนโค้ดใน C ที่ส่วนใหญ่เป็นเชิงวัตถุดังนั้นพูดว่าฉันมีไฟล์ต้นฉบับหรือสิ่งที่ฉันจะสร้าง struct แล้วผ่านตัวชี้ไปที่ struct นี้เพื่อฟังก์ชั่น (วิธีการ) เป็นเจ้าของโครงสร้างนี้: struct foo { int x; }; struct foo* createFoo(); // mallocs foo void destroyFoo(struct foo* foo); // frees foo and its things นี่คือการปฏิบัติที่ไม่ดีหรือไม่? ฉันจะเรียนรู้วิธีการเขียน C ใน "วิธีการที่เหมาะสม" ได้อย่างไร
14 c 

1
หน่วยทดสอบไคลเอนต์และห่อหุ้ม API
ฉันวนเวียนวนไปรอบ ๆ เพื่อหาวิธีที่ดีที่สุดในการทดสอบหน่วยห้องสมุดลูกค้า API ที่ฉันกำลังพัฒนา ห้องสมุดที่มีClientระดับซึ่งโดยทั่วไปมี 1: การทำแผนที่ 1 กับ API และอีกชั้นซึ่งมีอินเตอร์เฟซที่ใช้งานง่ายขึ้นกว่าด้านบนของWrapperClient Wrapper --> Client --> External API ก่อนอื่นฉันเขียนการทดสอบทั้งคู่ClientและWrapperทดสอบอย่างมีประสิทธิภาพว่าจะส่งต่อไปยังฟังก์ชันที่เหมาะสมของสิ่งที่ทำงาน ( WrapperทำงานClientและClientทำงานกับการเชื่อมต่อ HTTP) ฉันเริ่มรู้สึกอึดอัดกับสิ่งนี้เพราะฉันรู้สึกว่าฉันกำลังทดสอบการใช้งานคลาสเหล่านี้มากกว่าที่จะเป็นส่วนต่อประสาน ในทางทฤษฎีฉันสามารถเปลี่ยนคลาสให้มีการใช้งานที่ถูกต้องสมบูรณ์แบบอื่น แต่การทดสอบของฉันจะล้มเหลวเพราะฟังก์ชั่นที่ฉันคาดว่าจะเรียกไม่ถูกเรียก ฟังดูเหมือนการทดสอบที่เปราะบางสำหรับฉัน หลังจากนี้ฉันคิดถึงอินเทอร์เฟซของคลาส การทดสอบควรตรวจสอบว่าชั้นเรียนทำงานตามที่ตั้งใจจริงมากกว่าที่จะทำ แล้วฉันจะทำสิ่งนี้ได้อย่างไร สิ่งแรกที่ควรคำนึงถึงคือการขัดคำขอ API ภายนอก อย่างไรก็ตามฉันกังวลใจเกี่ยวกับการขยายบริการภายนอก ตัวอย่างของ API ที่ถูก stubbed จำนวนมากที่ฉันเคยเห็นเพียงแค่ให้การตอบกลับสำเร็จรูปซึ่งดูเหมือนเป็นวิธีที่ง่ายมากที่จะทดสอบว่าโค้ดของคุณทำงานได้อย่างถูกต้องกับ API ปลอมของคุณ ทางเลือกคือการเยาะเย้ยบริการซึ่งเป็นไปไม่ได้และจะต้องได้รับการปรับปรุงให้ทันสมัยอยู่เสมอเมื่อใดก็ตามที่มีการเปลี่ยนแปลงการบริการจริง - ซึ่งรู้สึกว่าเกินความเป็นจริงและเสียเวลา ในที่สุดฉันอ่านข้อความนี้จากคำตอบอื่นของโปรแกรมเมอร์ SE : งานของไคลเอนต์ API ระยะไกลคือการออกสายบางอย่าง - …

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