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

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

7
การจัดการและจัดการจำนวนคลาสที่เพิ่มขึ้นอย่างมากหลังจากเปลี่ยนมาใช้ SOLID?
ในช่วงไม่กี่ปีที่ผ่านมาเราได้ค่อยๆเปลี่ยนไปใช้โค้ดที่ดีขึ้นอย่างค่อยเป็นค่อยไปในเวลาไม่กี่ก้าว ในที่สุดเราก็เริ่มที่จะเปลี่ยนไปใช้สิ่งที่คล้ายกับ SOLID อย่างน้อยที่สุด แต่เรายังไม่ถึงจุดนั้น นับตั้งแต่ทำการสลับหนึ่งในข้อร้องเรียนที่ใหญ่ที่สุดจากนักพัฒนาคือพวกเขาไม่สามารถยืนทบทวนและตรวจสอบไฟล์หลายสิบไฟล์ซึ่งก่อนหน้านี้ทุกงานต้องการเพียงผู้พัฒนาที่สัมผัส 5-10 ไฟล์ ก่อนที่จะเริ่มสวิตช์สถาปัตยกรรมของเราได้รับการจัดระเบียบอย่างดีดังต่อไปนี้ (ให้สิทธิ์โดยมีหนึ่งหรือสองไฟล์ที่มีขนาดมากกว่าหนึ่งคำสั่ง): Solution - Business -- AccountLogic -- DocumentLogic -- UsersLogic - Entities (Database entities) - Models (Domain Models) - Repositories -- AccountRepo -- DocumentRepo -- UserRepo - ViewModels -- AccountViewModel -- DocumentViewModel -- UserViewModel - UI ไฟล์ฉลาดทุกอย่างเป็นเส้นตรงและกะทัดรัดอย่างเหลือเชื่อ เห็นได้ชัดว่ามีการทำสำเนารหัสจำนวนมากการมีเพศสัมพันธ์อย่างแน่นหนาและปวดหัวอย่างไรก็ตามทุกคนสามารถเข้าไปสำรวจและคิดออกได้ สามเณรที่สมบูรณ์ผู้ที่ไม่เคยเปิด Visual Studio …

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

2
การปรับปรุง MVP ผ่าน MVC คืออะไร
ฉันได้อ่านสามวันเกี่ยวกับModel-View-Controller (MVC)และModel-View-Presenter (MVP)รูปแบบ และมีคำถามหนึ่งที่รบกวนจิตใจฉันอย่างมาก ทำไมนักออกแบบซอฟต์แวร์จึงคิดค้น MVP เมื่อมี MVC อยู่แล้ว พวกเขาประสบปัญหาอะไรบ้าง MVC ไม่ได้แก้ปัญหา (หรือแก้ไขไม่ดี) แต่ MVP สามารถแก้ไขได้ MVP ปัญหาใดที่ตั้งใจจะแก้ไข? ฉันได้อ่านบทความมากมายเกี่ยวกับประวัติและคำอธิบายของ MVP หรือเกี่ยวกับความแตกต่างระหว่าง MVC และ MVP แต่ไม่มีคำตอบที่ชัดเจนสำหรับคำถามของฉัน ในหนึ่งในบทความที่ฉันอ่านมันก็บอกว่า: ตอนนี้เข้าสู่ Model View Presenter ซึ่งเป็นการตอบสนองต่อความไม่เพียงพอของรูปแบบ MVC เมื่อนำไปใช้กับส่วนติดต่อผู้ใช้แบบกราฟิกที่ใช้องค์ประกอบที่ทันสมัย ในระบบ GUI ที่ทันสมัยส่วนประกอบของ GUI จะจัดการกับอินพุตของผู้ใช้เช่นการเคลื่อนไหวของเมาส์และการคลิกแทนที่จะเป็นตัวควบคุมส่วนกลาง ดังนั้นฉันจึงไม่เข้าใจ แต่จริง ๆ แล้วมันสามารถเป็นไปได้ในทางอื่นเช่นองค์ประกอบ GUI ไม่จัดการกับการป้อนข้อมูลของผู้ใช้ด้วยตัวเอง? และ "จัดการกับตัวเอง" หมายความว่าอย่างไร?

7
สองโครงสร้างที่มีสมาชิกเดียวกัน แต่ตั้งชื่อต่างกันมันเป็นความคิดที่ดีใช่ไหม
ฉันกำลังเขียนโปรแกรมที่เกี่ยวข้องกับการทำงานกับพิกัดเชิงขั้วและคาร์ทีเซียน มันสมเหตุสมผลหรือไม่ที่จะสร้างสองโครงสร้างที่แตกต่างกันสำหรับแต่ละประเภทของคะแนนซึ่งเป็นหนึ่งเดียวกับXและYสมาชิกและอีกหนึ่งเป็นด้วยRและThetaสมาชิก หรือมันมากเกินไปและดีกว่าถ้ามีโครงสร้างเดียวfirstและsecondเป็นสมาชิก สิ่งที่ฉันกำลังเขียนนั้นง่ายและจะไม่เปลี่ยนแปลงมากนัก แต่ฉันอยากรู้ว่าอะไรจะดีไปกว่านี้ในมุมมองของการออกแบบ ฉันคิดว่าตัวเลือกแรกดีกว่า ดูเหมือนว่าอ่านได้มากขึ้นและฉันจะได้รับประโยชน์จากการตรวจสอบประเภท
49 design 

11
“ ง่ายต่อการให้เหตุผล” - นั่นหมายความว่าอย่างไร [ปิด]
ฉันเคยได้ยินหลายครั้งเมื่อนักพัฒนาซอฟต์แวร์รายอื่นใช้วลีนั้นเพื่อ "โฆษณา" รูปแบบบางอย่างหรือพัฒนาแนวทางปฏิบัติที่ดีที่สุด ส่วนใหญ่วลีนี้จะใช้เมื่อคุณกำลังพูดถึงประโยชน์ของการเขียนโปรแกรมการทำงาน วลี "เหตุผลง่าย ๆ เกี่ยวกับ" ถูกนำมาใช้อย่างที่เป็นอยู่โดยไม่มีคำอธิบายหรือตัวอย่างโค้ด ดังนั้นสำหรับฉันมันจะกลายเป็นเหมือน "buzz" ถัดไปซึ่งเป็นคำที่นักพัฒนา "มีประสบการณ์" ใช้ในการเจรจา คำถาม: คุณสามารถยกตัวอย่างบางส่วนของ "ไม่ง่ายที่จะให้เหตุผลเกี่ยวกับ" ดังนั้นจึงสามารถนำมาเปรียบเทียบกับตัวอย่าง "ง่ายต่อการเหตุผล"

10
เราควรหลีกเลี่ยงวัตถุที่กำหนดเองเป็นพารามิเตอร์?
สมมติว่าฉันมีวัตถุที่กำหนดเองนักเรียน : public class Student{ public int _id; public String name; public int age; public float score; } และคลาส, หน้าต่างที่ใช้เพื่อแสดงข้อมูลของนักเรียน : public class Window{ public void showInfo(Student student); } มันดูค่อนข้างปกติ แต่ฉันพบว่าWindowนั้นไม่ง่ายที่จะทำการทดสอบเป็นรายบุคคลเพราะมันต้องการออบเจ็กต์Studentจริงเพื่อเรียกใช้ฟังก์ชัน ดังนั้นฉันจึงพยายามปรับเปลี่ยน showInfo เพื่อที่จะไม่ยอมรับวัตถุนักเรียนโดยตรง: public void showInfo(int _id, String name, int age, float score); เพื่อให้ง่ายต่อการทดสอบหน้าต่างแยกต่างหาก: showInfo(123, "abc", 45, 6.7); แต่ฉันพบว่าเวอร์ชันที่แก้ไขมีปัญหาอื่น: …

6
คำขอขนาดเล็กจำนวนมากเทียบกับคำขอขนาดใหญ่จำนวนน้อย (การออกแบบ API)
ฉันกำลังทำงานในโครงการกับองค์กรดังต่อไปนี้: ไคลเอ็นต์ - รับข้อมูลจากเซิร์ฟเวอร์หลักผ่าน REST api เซิร์ฟเวอร์ - ร้องขอข้อมูลจากเซิร์ฟเวอร์อื่น ๆ ผ่าน API ของบุคคลที่สาม API ของบุคคลที่สาม - บริการอยู่นอกเหนือการควบคุมของฉันที่ให้ข้อมูลกับเซิร์ฟเวอร์ (Reddit, Hackernews, Quora ฯลฯ ) เพื่อประโยชน์ในการโต้แย้งสมมติว่าลูกค้าต้องการรายการจาก API บุคคลที่สามแต่ละรายการก่อน จากรายการนี้รายการจะถูกเลือก ณ จุดที่ลูกค้าต้องการดูเนื้อหาทั้งหมดของรายการรวมถึงการตอบกลับ (เช่นความคิดเห็น) ไปยังรายการ ฉันพยายามตัดสินใจระหว่างสามตัวเลือก: อาหารตามสั่ง ในวิธีการนี้ฉันจะมีจุดสิ้นสุด 3 จุดแยกกันบนเซิร์ฟเวอร์ของฉัน: รายการหนึ่งเพื่อรับรายการรายการหนึ่งรายการเพื่อรับเนื้อหาหลักสำหรับรายการและอีกรายการหนึ่งเพื่อรับการตอบกลับของรายการ ข้อดี: ฉันไม่เคยขอมากกว่าที่ต้องการการร้องขอควรมีขนาดเล็กดังนั้นโดยทั่วไปพวกเขาควรจะเร็วกว่า ข้อด้อย: ฉันต้องขอจำนวนมาก หลังจากเลือกรายการจากรายการผู้ใช้อาจต้องรอก่อนเห็นเนื้อหาหลักจากนั้นรออีกนานเพื่อดูการตอบกลับ แคชฝั่งเซิร์ฟเวอร์ ในคำขอนี้ฉันจะโทรหาเซิร์ฟเวอร์ของฉันเพื่อ "ดึง" ข้อมูลทั้งหมดสำหรับแหล่งที่มาทั้งหมด ข้อมูลจะถูกแคชบนเซิร์ฟเวอร์ จากนั้นไคลเอ็นต์จะมีจุดสิ้นสุด REST แบบเดิมเหมือนกันยกเว้นจะไม่มีการรอระหว่างการโทรเนื่องจากเซิร์ฟเวอร์ของฉันมีข้อมูลอยู่แล้วและจะต้องป้อนให้กับลูกค้า ข้อดี: …

3
C ++ พิมพ์ typedef อย่างยิ่ง
ฉันพยายามคิดวิธีประกาศ typedefs พิมพ์อย่างยิ่งเพื่อจับระดับหนึ่งของข้อบกพร่องในขั้นตอนการรวบรวม มันมักจะเป็นกรณีที่ฉันจะพิมพ์ int ลงในรหัสหลายประเภทหรือเวกเตอร์ไปยังตำแหน่งหรือความเร็ว: typedef int EntityID; typedef int ModelID; typedef Vector3 Position; typedef Vector3 Velocity; สิ่งนี้สามารถทำให้เจตนาของรหัสชัดเจนยิ่งขึ้น แต่หลังจากการเขียนโค้ดคืนหนึ่งอาจทำให้เกิดข้อผิดพลาดที่โง่เขลาเช่นการเปรียบเทียบรหัสต่าง ๆ หรือเพิ่มตำแหน่งให้กับความเร็ว EntityID eID; ModelID mID; if ( eID == mID ) // <- Compiler sees nothing wrong { /*bug*/ } Position p; Velocity v; Position newP = p + …
49 c++  c++11  type-safety 

8
มีเหตุผลที่จะมีประเภทด้านล่างในภาษาการเขียนโปรแกรมหรือไม่?
ประเภทด้านล่างเป็นโครงสร้างที่ปรากฏในทฤษฎีประเภทคณิตศาสตร์เป็นหลัก มันจะเรียกว่าประเภทที่ว่างเปล่า มันเป็นประเภทที่ไม่มีค่า แต่เป็นประเภทย่อยของทุกประเภท หากประเภทส่งคืนของฟังก์ชันเป็นประเภทด้านล่างแสดงว่าไม่ส่งคืน ระยะเวลา บางทีมันอาจจะวนซ้ำไปตลอดกาลหรืออาจจะเป็นข้อยกเว้น อะไรคือสิ่งที่มีประเภทแปลก ๆ นี้ในภาษาการเขียนโปรแกรม? มันไม่ใช่เรื่องธรรมดา แต่มีอยู่ในบางอย่างเช่น Scala และ Lisp

5
เหตุใดฟังก์ชัน <algorithm> ทั้งหมดจึงมีเพียงช่วงเท่านั้นไม่ใช่คอนเทนเนอร์?
มีฟังก์ชั่นที่มีประโยชน์มากมาย&lt;algorithm&gt;แต่ทุกฟังก์ชั่นทำงานใน"ลำดับ" - คู่ของตัววนซ้ำ เช่นถ้าฉันมีที่เก็บและต้องการที่จะใช้std::accumulateมันฉันต้องเขียน: std::vector&lt;int&gt; myContainer = ...; int sum = std::accumulate(myContainer.begin(), myContainer.end(), 0); เมื่อทั้งหมดที่ฉันตั้งใจจะทำคือ: int sum = std::accumulate(myContainer, 0); ในสายตาของฉันซึ่งอ่านได้ชัดเจนขึ้น ตอนนี้ฉันเห็นแล้วว่าอาจมีบางกรณีที่คุณต้องการใช้งานเฉพาะในส่วนของคอนเทนเนอร์ดังนั้นจึงมีประโยชน์อย่างมากที่จะมีตัวเลือกในการผ่านช่วง แต่อย่างน้อยในประสบการณ์ของฉันนั่นเป็นกรณีพิเศษที่หายาก ฉันมักจะต้องการที่จะทำงานบนภาชนะทั้งหมด มันง่ายที่จะเขียนฟังก์ชั่น wrapper ซึ่งใช้คอนเทนเนอร์และการโทรbegin()และend()บนมัน แต่ฟังก์ชั่นความสะดวกสบายนั้นไม่รวมอยู่ในไลบรารี่มาตรฐาน ฉันต้องการทราบเหตุผลที่อยู่เบื้องหลังตัวเลือกการออกแบบ STL นี้

6
วิธีแก้ปัญหาสำหรับข้อยกเว้นที่ตรวจสอบด้วย Java
ฉันขอขอบคุณฟีเจอร์ Java 8 ใหม่มากมายเกี่ยวกับ lambdas และอินเตอร์เฟสเมธอดดีฟอลต์ แต่ฉันยังคงเบื่อกับข้อยกเว้นที่ตรวจสอบ ตัวอย่างเช่นหากฉันต้องการแสดงรายการเขตข้อมูลที่มองเห็นได้ทั้งหมดของวัตถุที่ฉันต้องการจะเขียนสิ่งนี้: Arrays.asList(p.getClass().getFields()).forEach( f -&gt; System.out.println(f.get(p)) ); แต่เนื่องจากgetวิธีการอาจมีข้อยกเว้นการตรวจสอบซึ่งไม่เห็นด้วยกับConsumerสัญญาอินเตอร์เฟซดังนั้นฉันต้องจับข้อยกเว้นนั้นและเขียนรหัสต่อไปนี้: Arrays.asList(p.getClass().getFields()).forEach( f -&gt; { try { System.out.println(f.get(p)); } catch (IllegalArgumentException | IllegalAccessException ex) { throw new RuntimeException(ex); } } ); อย่างไรก็ตามในกรณีส่วนใหญ่ฉันแค่ต้องการยกเว้นจะถูกโยนเป็นRuntimeExceptionและให้โปรแกรมจัดการหรือไม่ยกเว้นโดยไม่มีข้อผิดพลาดในการรวบรวม ดังนั้นฉันต้องการแสดงความคิดเห็นของคุณเกี่ยวกับวิธีแก้ไขปัญหาการโต้เถียงของฉันสำหรับการตรวจสอบข้อยกเว้นที่น่ารำคาญ ด้วยเหตุนี้ฉันจึงสร้างส่วนต่อประสานConsumerCheckException&lt;T&gt;และฟังก์ชั่นยูทิลิตี้rethrow( อัปเดตตามความต้องการของความคิดเห็นของ Doval ) ดังต่อไปนี้: @FunctionalInterface public interface ConsumerCheckException&lt;T&gt;{ void accept(T elem) throws Exception; …

3
จุดของรูปแบบ PImpl คืออะไรในขณะที่เราสามารถใช้ส่วนต่อประสานเพื่อจุดประสงค์เดียวกันใน C ++
ฉันเห็นซอร์สโค้ดจำนวนมากซึ่งใช้ PImpl idiom ใน C ++ ฉันถือว่ามันมีวัตถุประสงค์เพื่อซ่อนข้อมูลส่วนตัว / ประเภท / การใช้งานเพื่อให้สามารถลบการพึ่งพาและลดปัญหาการรวบรวมเวลาและส่วนหัวรวมถึงปัญหา แต่อินเทอร์เฟซ / คลาสเพียว - นามธรรมใน C ++ ยังมีความสามารถนี้พวกเขายังสามารถใช้เพื่อซ่อนข้อมูล / ประเภท / การใช้งาน และเพื่อให้ผู้โทรเห็นส่วนต่อประสานเมื่อสร้างวัตถุเราสามารถประกาศเมธอดจากโรงงานในส่วนหัวของส่วนต่อประสาน การเปรียบเทียบคือ: ราคา : ค่าใช้จ่ายในการใช้อินเตอร์เฟสลดลงเนื่องจากคุณไม่จำเป็นต้องใช้ฟังก์ชั่น wrapper สาธารณะซ้ำvoid Bar::doWork() { return m_impl-&gt;doWork(); }คุณเพียงแค่ต้องกำหนดลายเซ็นในอินเตอร์เฟส เข้าใจดี : เทคโนโลยีอินเทอร์เฟซเป็นที่เข้าใจกันดีกว่าโดยนักพัฒนา C ++ ทุกคน ประสิทธิภาพ : วิธีการเชื่อมต่อประสิทธิภาพไม่เลวร้ายยิ่งกว่าสำนวน PImpl ทั้งการเข้าถึงหน่วยความจำเพิ่มเติม ฉันถือว่าประสิทธิภาพเหมือนกัน ต่อไปนี้เป็นรหัสเทียมเพื่อแสดงคำถามของฉัน: // Forward …

9
วิธีการขายการพัฒนา Agile ให้กับลูกค้า (น้ำตก)
ร้านค้าพัฒนาของเราต้องการทำโครงการที่คล่องตัวมากขึ้น แต่เรามีปัญหาในการรับลูกค้าบนเรือ ลูกค้าหลายคนต้องการงบประมาณและกำหนดเวลา เป็นการยากที่จะขายลูกค้าในโครงการที่คล่องตัวเมื่อคู่แข่งของเราเกิดขึ้นกับกำหนดเวลาตายตัวอิงน้ำตกและราคาคงที่ เราทราบว่าหมายเลขที่แน่นอนของพวกเขานั้นไม่ดี แต่ลูกค้าไม่ทราบ ดังนั้นเราจึงมองหาลูกค้าที่ไม่ดีเพราะเราไม่สามารถกำหนดราคาหรือกำหนดเวลาได้ แต่คู่แข่งของเราสามารถทำได้ ดังนั้นวิธีที่คุณจะได้รับแรงขายของคุณประสบความสำเร็จในการขายโครงการที่ใช้วิธีการพัฒนาแบบว่องไวหรือผลิตภัณฑ์ที่ได้รับการพัฒนาโดยใช้วิธีการดังกล่าว? ข้อมูลทั้งหมดที่ฉันพบดูเหมือนว่าจะมุ่งเน้นไปที่การจัดการโครงการและนักพัฒนา
49 agile 

1
ทำไมจึงมี "ใหม่" ใน Go
ฉันยังงงเหมือนว่าทำไมเราถึงnewไปกัน เมื่อคุณต้องการสร้างอินสแตนซ์ของโครงสร้างให้ทำ t := Thing{} และคุณสามารถรับตัวชี้ไปยังอินสแตนซ์ใหม่โดยการทำ t := &amp;Thing{} แต่ยังมีความเป็นไปได้นี้: t := new(Thing) อันสุดท้ายดูเหมือนว่าคนต่างด้าวตัวเล็ก ๆ กับภาษาที่เหลือ &amp;Thing{}มีความชัดเจนและรัดกุมเหมือนกันnew(Thing)และใช้โครงสร้างที่คุณมักใช้ที่อื่นเท่านั้น นอกจากนี้ยังขยายมากขึ้นในขณะที่คุณอาจจะเปลี่ยนไปหรือ&amp;Thing{3} &amp;Thing{Feets:7} ในความคิดของฉันการมีคำหลักเสริม1นั้นมีค่าใช้จ่ายสูงมันทำให้ภาษามีความซับซ้อนมากขึ้นและเพิ่มในสิ่งที่คุณต้องรู้ และมันอาจปิดบังผู้มาใหม่ว่ามีอะไรอยู่เบื้องหลังอินสแตนซ์ของโครงสร้าง นอกจากนี้ยังทำให้คำที่สงวนไว้อีกหนึ่งคำ ดังนั้นเหตุผลที่อยู่เบื้องหลังnewคืออะไร? บางครั้งมันมีประโยชน์หรือไม่ เราควรใช้มันหรือไม่? 1 : ใช่ฉันรู้ว่าไม่ใช่คำหลักในระดับไวยากรณ์คุณสามารถเงาได้แต่นั่นไม่ได้เปลี่ยนความจริงสำหรับนักพัฒนาที่เหมาะสมคำที่สงวนไว้
49 go 

12
ฉันจะจัดการการอภิปรายทางเทคนิคเกี่ยวกับ WCF กับ Web API ได้อย่างไร
ตอนนี้ฉันกำลังจัดการทีมงานของนักพัฒนาประมาณ 15 คนและเราติดอยู่ที่จุดหนึ่งในการเลือกเทคโนโลยีซึ่งทีมถูกแบ่งออกเป็นสองทีมตรงข้ามกันโดยสิ้นเชิงโต้วาทีการใช้ WCF กับเว็บ API ทีม A ที่รองรับการใช้งาน Web API นำมาซึ่งเหตุผลเหล่านี้: Web API เป็นวิธีการบริการการเขียนที่ทันสมัย ​​( Wikipedia ) WCF เป็นโอเวอร์เฮดสำหรับ HTTP มันเป็นทางออกสำหรับ TCP และ Net Pipes และโปรโตคอลอื่น ๆ รุ่น WCF ไม่ใช่ POCO เนื่องจาก [DataContract] &amp; [DataMember] และแอตทริบิวต์เหล่านั้น SOAP ไม่สามารถอ่านได้และมีประโยชน์เท่ากับ JSON SOAP เป็นค่าใช้จ่ายสำหรับเครือข่ายเมื่อเทียบกับ JSON (การส่งผ่าน HTTP) ไม่มีวิธีการมากไป ทีม B ที่รองรับการใช้ WCF …
49 wcf  decisions  web-api 

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