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

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

6
คลาสใดควรได้รับการ autowired โดย Spring (เมื่อใช้การฉีดพึ่งพา)
ฉันได้ใช้การพึ่งพาการฉีดในฤดูใบไม้ผลิมาระยะหนึ่งแล้วและฉันเข้าใจว่ามันทำงานอย่างไรและข้อดีและข้อเสียของการใช้มันคืออะไร อย่างไรก็ตามเมื่อฉันสร้างคลาสใหม่ฉันมักจะสงสัย - คลาสนี้ควรจัดการโดย Spring IOC Container หรือไม่ และฉันไม่ต้องการพูดถึงความแตกต่างระหว่างคำอธิบายประกอบ @Autowired, การกำหนดค่า XML, การฉีด setter, การฉีดคอนสตรัคเตอร์ ฯลฯ คำถามของฉันคือคำถามทั่วไป สมมติว่าเรามีบริการที่มีตัวแปลง: @Service public class Service { @Autowired private Repository repository; @Autowired private Converter converter; public List<CarDto> getAllCars() { List<Car> cars = repository.findAll(); return converter.mapToDto(cars); } } @Component public class Converter { public CarDto …

5
อนุญาตการวนซ้ำของเวกเตอร์ภายในโดยไม่มีการรั่วไหลของการใช้งาน
ฉันมีชั้นเรียนที่แสดงถึงรายชื่อของผู้คน class AddressBook { public: AddressBook(); private: std::vector<People> people; } ฉันต้องการอนุญาตให้ลูกค้าทำซ้ำเวกเตอร์ของผู้คน ความคิดแรกที่ฉันมีก็คือ: std::vector<People> & getPeople { return people; } แต่ฉันไม่ต้องการที่จะรั่วไหลรายละเอียดการดำเนินการให้กับลูกค้า ฉันอาจต้องการรักษาค่าคงที่บางอย่างเมื่อมีการแก้ไขเวกเตอร์และฉันสูญเสียการควบคุมค่าคงที่เหล่านี้เมื่อฉันรั่วการใช้งาน วิธีที่ดีที่สุดในการอนุญาตให้ทำซ้ำโดยไม่รั่วไหลภายในคืออะไร?
32 c++ 

7
ทำไมรูปแบบการออกแบบวิธีการจากโรงงานจึงมีประโยชน์มากกว่าการมีคลาสและเรียกพวกมันทีละรายการ
จากรูปแบบการออกแบบ "Gang of Four" มีวิธี Factory: class Factory(product) case product when a new A when b new B when c new C end new Factory(a) นี่คือเหตุผลที่มีประโยชน์มากขึ้นกว่าที่มีสามชั้นa, bและcและเรียกพวกเขาที?

5
เหตุใด C # และ Java จึงใช้การอ้างอิงที่เท่าเทียมกันเป็นค่าเริ่มต้นสำหรับ '=='
ฉันได้รับการขบคิดในขณะที่ว่าทำไม Java และ C # (และฉันแน่ใจว่าภาษาอื่น ๆ ) ==เริ่มต้นความเสมอภาคอ้างอิงสำหรับ ในการเขียนโปรแกรมที่ฉันทำ (ซึ่งแน่นอนเป็นเพียงส่วนเล็ก ๆ ของปัญหาการเขียนโปรแกรม) ฉันมักจะต้องการความเสมอภาคเชิงตรรกะเมื่อเปรียบเทียบวัตถุแทนการอ้างอิงความเท่าเทียมกัน ฉันพยายามคิดว่าเพราะเหตุใดทั้งสองภาษานี้จึงใช้เส้นทางนี้แทนการย้อนกลับและมี==ความเท่าเทียมทางตรรกะและใช้.ReferenceEquals()เพื่อความเท่าเทียมกันในการอ้างอิง เห็นได้ชัดว่าการใช้ความเท่าเทียมกันของข้อมูลอ้างอิงนั้นง่ายมากที่จะนำไปใช้และมันก็มีพฤติกรรมที่สอดคล้องกันมาก ฉันไม่ต้องการที่จะรู้ปัญหาของการพยายามเปรียบเทียบเชิงตรรกะและมันจะต้องถูกนำไปใช้ในทุกชั้น ฉันยังตระหนักว่าภาษาเหล่านี้ได้รับการออกแบบมานานแล้ว แต่คำถามทั่วไปยืนอยู่ มีประโยชน์ที่สำคัญของการเริ่มต้นสิ่งนี้ที่ฉันเพิ่งหายไปหรือไม่หรือดูเหมือนว่ามีเหตุผลว่าพฤติกรรมเริ่มต้นควรเป็นความเท่าเทียมกันทางตรรกะและการเริ่มต้นกลับไปอ้างอิงความเท่าเทียมกันมันไม่มีความเสมอภาคเชิงตรรกะสำหรับชั้นเรียน?

2
บรรทัดที่ 14 ของ The Zen of Python อ้างอิงถึง Dijkstra หรือไม่?
Python Zenกล่าวในบรรทัดที่ 14 ว่า: แม้ว่าวิธีนี้อาจไม่ชัดเจนในตอนแรกเว้นแต่ว่าคุณเป็นชาวดัตช์ นี่เป็นการอ้างอิงถึงEdsger W. Dijkstraนักวิทยาศาสตร์คอมพิวเตอร์ชาวดัตช์ที่มีชื่อเสียงหรือไม่
32 history 

7
ฟังก์ชั่นการเขียนโปรแกรมเปรียบเทียบกับ OOP กับคลาส
ฉันได้รับความสนใจในบางแนวคิดของการเขียนโปรแกรมการทำงานเมื่อเร็ว ๆ นี้ ฉันใช้ OOP มาระยะหนึ่งแล้ว ฉันเห็นว่าฉันจะสร้างแอพที่ค่อนข้างซับซ้อนใน OOP ได้อย่างไร แต่ละวัตถุจะรู้วิธีการทำสิ่งที่วัตถุนั้นทำ หรืออะไรก็ได้ที่คลาสพ่อแม่ทำก็เช่นกัน ดังนั้นฉันสามารถบอกPerson().speak()ให้คนพูดได้ แต่ฉันจะทำสิ่งที่คล้ายกันในฟังก์ชั่นการเขียนโปรแกรมได้อย่างไร ฉันเห็นว่าฟังก์ชั่นเป็นรายการชั้นหนึ่ง แต่ฟังก์ชั่นนั้นทำสิ่งหนึ่งที่เฉพาะเจาะจงเท่านั้น ฉันจะมีsay()วิธีการลอยไปรอบ ๆ และเรียกมันว่ามีPerson()ข้อโต้แย้งที่เทียบเท่าเพื่อให้ฉันรู้ว่าสิ่งที่พูดอะไรบางอย่าง? ดังนั้นฉันสามารถเห็นสิ่งต่าง ๆ ง่ายๆฉันจะเปรียบเทียบ OOP และวัตถุในการเขียนโปรแกรมเชิงหน้าที่ได้อย่างไรฉันจึงสามารถทำให้เป็นโมดูลและจัดระเบียบรหัสฐานได้หรือไม่ สำหรับการอ้างอิงประสบการณ์หลักของฉันกับ OOP คือ Python, PHP และ C # บางอย่าง ภาษาที่ฉันกำลังดูที่มีคุณสมบัติการใช้งานคือ Scala และ Haskell แม้ว่าฉันจะเอนไปทางสกาล่า ตัวอย่างพื้นฐาน (Python): Animal(object): def say(self, what): print(what) Dog(Animal): def say(self, what): super().say('dog barks: …

4
ประเภทข้อมูลบทคัดย่อและโครงสร้างข้อมูล
มันค่อนข้างยากสำหรับฉันที่จะเข้าใจเงื่อนไขเหล่านี้ ฉันค้นหาใน google และอ่านวิกิพีเดียเล็กน้อย แต่ก็ยังไม่แน่ใจ ฉันตัดสินใจแล้วว่า: Abstract Data Typeเป็นคำนิยามของชนิดใหม่อธิบายคุณสมบัติและการดำเนินงานของมัน โครงสร้างข้อมูลเป็นการใช้งาน ADT ADT หลายตัวสามารถนำไปใช้กับโครงสร้างข้อมูลเดียวกันได้ ถ้าฉันคิดว่าถูกต้องอาเรย์เป็น ADT หมายถึงการรวบรวมองค์ประกอบและเป็นโครงสร้างข้อมูลการจัดเก็บในหน่วยความจำ สแต็คคือ ADT ที่มีการดำเนินการแบบพุชและป๊อป แต่เราสามารถพูดเกี่ยวกับโครงสร้างข้อมูลสแต็คได้หรือไม่ถ้าฉันหมายความว่า และทำไมฮีปจึงไม่ใช่ ADT มันสามารถนำมาใช้เป็นต้นไม้หรืออาร์เรย์

7
วิธีการค้นหารายการสตริง / ระเบียนที่มีขนาดใหญ่มากอย่างรวดเร็วบนฐานข้อมูล
ฉันมีปัญหาดังต่อไปนี้: ฉันมีฐานข้อมูลที่มีมากกว่า 2 ล้านบันทึก แต่ละระเบียนมีเขตข้อมูลสตริง X และฉันต้องการแสดงรายการของระเบียนที่เขตข้อมูล X ประกอบด้วยสตริงที่แน่นอน แต่ละระเบียนมีขนาดประมาณ 500 ไบต์ เพื่อให้เป็นรูปธรรมมากขึ้น: ใน GUI ของแอปพลิเคชันของฉันฉันมีช่องข้อความที่ฉันสามารถป้อนสตริงได้ ด้านบนของฟิลด์ข้อความฉันมีตารางที่แสดงเรคคอร์ด (N แรกเช่น 100) ที่ตรงกับสตริงในฟิลด์ข้อความ เมื่อฉันพิมพ์หรือลบอักขระหนึ่งตัวในฟิลด์ข้อความเนื้อหาของตารางจะต้องได้รับการอัปเดตทันที ฉันสงสัยว่ามีวิธีที่มีประสิทธิภาพในการทำเช่นนี้โดยใช้โครงสร้างดัชนีที่เหมาะสมและ / หรือแคช ตามที่อธิบายไว้ข้างต้นฉันต้องการแสดงเฉพาะรายการแรกที่ตรงกับแบบสอบถาม ดังนั้นสำหรับ N ที่มีขนาดเล็กพอก็ไม่ควรเป็นปัญหาใหญ่ในการโหลดไอเท็มที่ตรงกันจากฐานข้อมูล นอกจากนี้การแคชรายการในหน่วยความจำหลักสามารถทำให้การดึงข้อมูลเร็วขึ้น ฉันคิดว่าปัญหาหลักคือวิธีค้นหารายการที่ตรงกันอย่างรวดเร็วโดยกำหนดสตริงรูปแบบ ฉันสามารถใช้สิ่งอำนวยความสะดวกบางอย่างของ DBMS หรือฉันต้องสร้างดัชนีในหน่วยความจำด้วยตัวเองบ้างไหม? ความคิดใด ๆ แก้ไข ฉันได้ทำการทดลองครั้งแรก ฉันแบ่งระเบียนออกเป็นไฟล์ข้อความต่างๆ (ไม่เกิน 200 รายการต่อไฟล์) และวางไฟล์ในไดเรกทอรีต่าง ๆ (ฉันใช้เนื้อหาของเขตข้อมูลเดียวเพื่อกำหนดโครงสร้างไดเรกทอรี) ฉันจบด้วยไฟล์ประมาณ 50,000 ไฟล์ในไดเรกทอรีประมาณ 40000 ฉันได้เรียกใช้ …

9
เมื่อ refactor
ฉันได้อ่านหนังสือ Refactoring ส่วนใหญ่ของ Fowler แล้วและได้ทำการปรับเปลี่ยนแอปพลิเคชั่นมากมายในอดีตและปัจจุบัน หนึ่งในสิ่งที่ยากที่ฉันจะสอนคือ "เมื่อ" เพื่อ refactor ฉันมักจะทำสิ่งนี้ขึ้นอยู่กับความรู้สึกทางเดินอาหารซึ่งทำให้ฉันดีขึ้นอย่างมากในอดีต อย่างไรก็ตามเมื่อมีการพูดคุยกับผู้คนเกี่ยวกับว่าควรจะวางรหัสไว้ตามลำพังหรือได้รับการปรับสภาพใหม่ในตอนนี้มันยากที่จะยืนอยู่ข้าง "การตรวจสอบลำไส้" ฉันรู้สึกว่าควรจะมีวิธีการที่เข้มงวดมากขึ้นในเรื่องนี้ แต่ฉันไม่แน่ใจว่าพวกเขาเป็นอย่างไร ฉันเข้าใจ "กลิ่น - โค้ด", ความคิดสีแดง - เขียว - refactor และอื่น ๆ แต่บ่อยครั้งฉันรู้สึกว่าเวลาที่ดีที่สุดในการ refactor ไม่ใช่ครั้งแรกที่คุณเขียนรหัส แต่ครั้งที่สองหรือสามคุณใช้รหัสและตระหนักถึง จริง ๆ แล้วมันเป็นปัญหาและใช้งานจริง

8
เป็นวิธีปฏิบัติที่ดีหรือไม่ที่จะใช้ชนิดข้อมูลที่เล็กลงสำหรับตัวแปรเพื่อบันทึกหน่วยความจำ?
เมื่อฉันเรียนรู้ภาษา C ++ เป็นครั้งแรกที่ฉันได้เรียนรู้ว่านอกเหนือจาก int, float ฯลฯ รุ่นข้อมูลขนาดเล็กหรือใหญ่กว่านั้นมีอยู่ในภาษา ตัวอย่างเช่นฉันสามารถเรียกตัวแปร x int x; or short int x; ความแตกต่างที่สำคัญคือการที่ short int ใช้หน่วยความจำ 2 ไบต์ในขณะที่ int ใช้ 4 ไบต์และ short int มีค่าน้อยกว่า แต่เราสามารถเรียกสิ่งนี้ว่าทำให้มันเล็กลงได้: int x; short int x; unsigned short int x; ซึ่ง จำกัด มากยิ่งขึ้น คำถามของฉันคือถ้าเป็นแนวปฏิบัติที่ดีที่จะใช้ชนิดข้อมูลแยกต่างหากตามค่าตัวแปรที่คุณใช้ภายในโปรแกรม เป็นความคิดที่ดีที่จะประกาศตัวแปรตามชนิดข้อมูลเหล่านี้หรือไม่?

19
แอปพลิเคชันในโลกแห่งความเป็นจริงจะต้องใช้พื้นที่ที่อยู่แบบ 128 บิตหรือไม่
นี่เป็นบิต "หนึ่งเมกะไบต์ควรเพียงพอสำหรับทุกคน" แต่ ... พื้นที่ที่อยู่แบบ 64 บิตช่วยให้มีพื้นที่มากถึง 4.3ish billion เท่าของพื้นที่ที่อยู่แบบ 32 บิต นั่นคือ 17,179,869,184 GiB เห็นได้ชัดว่าการเปลี่ยนจาก 8 บิตเป็น 16 บิตนั้นค่อนข้างเร็ว (ฉันกำลังดูสิ่งต่าง ๆ ในช่วงวัยรุ่นในช่วงยุค 80 โดยไม่สนใจเมนเฟรมและมิมส์เหล่านั้นทั้งหมดเพราะพวกเขาไม่สามารถวิ่งผ่านพอร์ตของ Elite) การเปลี่ยนจาก 16 บิตเป็น 32 บิตใช้เวลานานขึ้นเล็กน้อยและจริง ๆ แล้ว 32 บิตกินเวลานาน ตอนนี้เรามี 64 บิตมันจะโง่ที่จะพูดว่า "17,179,869,184 GiB น่าจะเพียงพอสำหรับทุกคน" นี่คือคำถามโปรแกรมเมอร์เพราะฉันมีมุมมองการเขียนโปรแกรมในใจ แม้ว่าคอมพิวเตอร์ในแต่ละวันจะมีหน่วยความจำในการทำงานที่ดูเหมือนไม่มีที่สิ้นสุด แต่นั่นไม่ได้หมายความว่าแอปพลิเคชันจะต้องดูพื้นที่ที่อยู่แบบไม่ จำกัด ที่ดูเหมือนไม่มีที่สิ้นสุด โดยพื้นฐานแล้วเราสามารถเขียนโปรแกรมให้ถอนหายใจด้วยความโล่งอกแล้วพูดว่า "เอาล่ะไม่ว่าจะเป็นจำนวนเต็มหรือลอยอย่างน้อยที่สุดฉันก็ไม่ต้องกังวลเกี่ยวกับพอยน์เตอร์ที่เพิ่มขึ้นอีกแล้ว"

5
Javascript modularity, MVC ที่ใช้เซิร์ฟเวอร์และความเป็นจริงทางธุรกิจ
ฉันเข้าใจว่านี่เป็นคำถามที่กว้างขวางมากแต่ฉันได้ทำงานกับแง่มุมต่าง ๆ ของปัญหานี้เป็นรายบุคคลและฉันกำลังดิ้นรนเพื่อนำแนวคิดและเทคโนโลยีทั้งหมดมารวมกัน ฉันต้องการระบุว่าคำตอบควรมีเทคโนโลยีเหล่านี้: C # MVC 3 w / มีดโกน Javascript ด้วย jQuery สิ่งใดที่เหนือกว่าสิ่งใด (เช่นBackbone.js , Entity Frameworkฯลฯ ) ยินดีต้อนรับเป็นคำแนะนำหากพวกเขาช่วยตอบคำถามซึ่งก็คือ: การใช้เทคโนโลยีที่ระบุไว้ข้างต้นเป็นกลยุทธ์ที่ดีที่สุดสำหรับการจัดระเบียบรหัสและตรรกะในขณะที่รักษาความสามารถในการปรับขนาดได้และความสามารถในการสร้าง UI ที่สมบูรณ์รวดเร็วและสะอาด โดยหลักแล้วควรเน้นไปที่โซลูชันที่ปรับใช้ในสภาพแวดล้อมทางธุรกิจ / องค์กร ในหมายเหตุนั้นรายการเทคโนโลยีข้างต้นจะไม่เปลี่ยนแปลงดังนั้นโปรดอย่าเสนอวิธีแก้ปัญหาด้วย "คุณควรใช้xxxแทนyyyที่คุณใช้อยู่ตอนนี้" พื้นหลัง ฉันทำงานกับ jQuery ทุกวันได้ใช้ MVC ของ ASP.NET และทำงานกับ C # เป็นเวลานาน ดังนั้นคุณสามารถนำเสนอวิธีแก้ปัญหาโดยสมมติว่าความรู้ระดับกลางถึงระดับสูงของเทคโนโลยีเหล่านั้น ฉันจะจัดระเบียบคำถามเป็นส่วนย่อย ๆเพื่อให้ง่ายต่อการตอบสนองต่อ: 1. โครงสร้างโครงการ ให้ฉันทำงานกับ ASP.NET MVC (ในVisual Studio …

6
Agile แตกต่างจาก XP อย่างไร
ฉันอ่านบทความบนเว็บเพื่อค้นหาว่า Agile, XP, Scrum, การเขียนโปรแกรมคู่แตกต่างกันอย่างไร / เกี่ยวข้องกันและฉันได้รับบรรทัดต่อไปนี้: Scrum และ XP เกือบจะเหมือนกัน XP มีระยะเวลาเผยแพร่สั้นกว่า Scrum การเขียนโปรแกรมคู่ใช้ทั้งวิธี Agile และ XP แต่ฉันไม่สามารถระบุได้ว่า Agile นั้นแตกต่างจาก XP อย่างไร มากกว่าให้ URL ฉันยินดีที่จะอ่านประสบการณ์และความคิดของคุณเกี่ยวกับเรื่องนี้

3
ถ้าฉันใช้อินเทอร์เฟซจะเรียกว่าการสืบทอด?
ถ้าชั้นเรียนของฉันimplementsมีอินเตอร์เฟซฉันจะบอกได้ไหมว่าฉันกำลังติดตามมรดกอยู่? ฉันรู้ว่าเมื่อเรียนextendsอีกชั้นหนึ่งแล้วมันเป็นมรดก

2
เหตุใดซอฟต์แวร์จึงใช้ชื่อ Win32
หากซอฟต์แวร์ / ห้องสมุดมีการสนับสนุนบางอย่างสำหรับแพลตฟอร์ม Windows win32พวกเขามักจะตั้งชื่อไดเรกทอรีและตัวแปรของพวกเขาเป็น นี่เป็นที่แพร่หลายมากที่สุดในโครงการ C / C ++ แม้MinGWwin32โครงการเป้าหมายการใช้สาม มีเหตุผลสำหรับสิ่งนี้หรือไม่? ทำไมไม่ใช้ชื่อที่เหมาะสมเช่น Windows หรือ Microsoft Windows มีอุปสรรค์ทางกฎหมายรอบตัวเลือกการตั้งชื่อหรือไม่ คำถามนี้ไม่เกี่ยวกับ API แต่ใช้หลักการตั้งชื่อ เมื่อห้องสมุดสนับสนุนระบบปฏิบัติการอื่น ๆ ที่พวกเขามักจะใช้ชื่อที่เหมาะสมเช่นlinux, freebsdหรืออะไรก็ตามที่สนับสนุนพิเศษที่จำเป็น แต่เมื่อพูดถึง Windows มักจะมีคำย่อwin32ที่ดูแปลก ๆ เมื่อเทียบกับที่เหลือ

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