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

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

11
เมื่อใดที่คุณต้องการอ้างอิงสองรายการไปยังวัตถุเดียวกัน
ใน Java โดยเฉพาะ แต่มีแนวโน้มในภาษาอื่นเช่นกัน: เมื่อใดจะมีประโยชน์ที่จะมีสองการอ้างอิงไปยังวัตถุเดียวกัน ตัวอย่าง: Dog a = new Dog(); Dob b = a; มีสถานการณ์ที่สิ่งนี้จะเป็นประโยชน์หรือไม่? ทำไมนี้จะเป็นทางออกที่ต้องการที่จะใช้aเมื่อใดก็ตามที่คุณต้องการที่จะมีปฏิสัมพันธ์กับวัตถุที่แสดงโดยa?

1
ข้อดีและข้อเสียของ namespaces vs รวม / ต้องการใน PHP?
ฉันเพิ่งเริ่มใช้ namespaces ใน PHP เมื่อฉันเห็นพวกเขาครั้งแรกฉันคิดว่าไวยากรณ์ของพวกเขาน่าเกลียดและฉันจะไม่ใช้มัน อย่างไรก็ตามฉันสร้าง autoloader (spl_autoload_register) ที่สร้างขึ้นเพื่อที่ฉันจะได้ไม่ต้องเขียนคำสั่ง include / ต้องการอีกครั้ง ฉันชอบเนมสเปซ แต่มีประโยชน์วัตถุประสงค์กว่ารวม / ต้องการงบหรือว่าพวกเขาเป็นวิธีเดียวกันเพื่อบรรลุเป้าหมายเดียวกันหรือไม่
20 php  namespace 

4
วิธีเอกสารโครงสร้างระดับสูงของโปรแกรม Java?
ความเป็นมา: ผู้ทำงานร่วมกันของฉันและฉันกำลังเขียนบทความสำหรับวารสารวิชาการ ในหลักสูตรการวิจัยของเราเราเขียนโปรแกรมจำลองใน Java เราต้องการให้โปรแกรมจำลองใช้ได้อย่างอิสระให้ผู้อื่นใช้ เราได้ตัดสินใจที่จะโฮสต์รหัสในที่เก็บ GitHub เพื่อให้ผู้อื่นใช้ง่ายขึ้นเราต้องการเขียนเอกสารที่ดีสำหรับโปรแกรมของเรารวมถึง: Javadocs สำหรับแต่ละชั้นเรียนและวิธีการ วิธีใช้รหัส อธิบายโครงสร้างระดับสูงของรหัส คำถามระดับสูงของฉันคือ: คุณสามารถให้ตัวอย่างที่ดีของคำและไดอะแกรมที่สามารถใช้อธิบายโครงสร้างระดับสูงของโปรแกรมได้หรือไม่? ซึ่งรวมถึงคำถามย่อย: เราจะแสดงคลาสที่มีอยู่ในแพ็คเกจใดได้อย่างไร เราจะแสดงสิ่งที่แพคเกจขึ้นอยู่กับแพคเกจอื่น ๆ ? เราจะแสดงให้เห็นว่าวัตถุ / คลาสในโปรแกรมทำงานร่วมกันได้อย่างไร เราพยายามใช้หลักการออกแบบที่เน้นการใช้โดเมนในการออกแบบรหัสของฉัน เราจะแสดงความสอดคล้องกันระหว่างวัตถุในโดเมนและไฟล์ซอร์สโค้ดเฉพาะที่เข้ารหัสวัตถุเหล่านี้ได้อย่างไร (ดูคำอธิบาย "ภาษาที่แพร่หลาย" ของโครงการด้านล่าง) สิ่งที่ฉันได้ทำไปแล้ว ภาษาที่แพร่หลาย เราใส่คำอธิบาย "ภาษาที่แพร่หลาย" ของรหัสลงในไฟล์ubiquitous-language.mdเนื้อหาด้านล่าง จุดประสงค์ของโครงการนี้คือการศึกษาว่านโยบายการเติมเต็มประสิทธิภาพในห่วงโซ่อุปทานแบบง่าย ๆ ด้วยศูนย์เดียวภายใต้ตัวเลือกระยะเวลาที่แตกต่างกันรายงานความล่าช้าและตัวแบบอุปสงค์ ในแต่ละช่วงเวลาเหตุการณ์ต่อไปนี้จะเกิดขึ้น: หากการจัดส่งมีกำหนดที่จะมาถึงโรงงานในช่วงเวลาปัจจุบันระดับสินค้าคงคลังของโรงงานจะเพิ่มขึ้นตามหน่วย X หากกำหนดการแสดงให้เห็นว่าในงวดปัจจุบันเป็นระยะเวลาที่รายงานจากนั้นสถานที่ยื่นรายงานไปยัง ผู้จัดจำหน่าย ซัพพลายเออร์ที่อาจได้รับรายงาน ทันทีหรือมีความล่าช้าหลายสัปดาห์ที่ผ่านมาตามที่ระบุโดยกำหนดการ หากซัพพลายเออร์ได้รับรายงานจากนั้นขึ้นอยู่กับ นโยบายการเติมเต็มมันจะคำนวณปริมาณการเติมเต็มของหน่วย X การจัดส่งหน่วย X ของผลิตภัณฑ์จะถูกกำหนดให้มาถึงหลังจากเวลานำของรอบระยะเวลา l ลูกค้ามาถึงโรงงานและต้องการหน่วย …

6
การพิมพ์แบบค่อยเป็นค่อยไป:“ เกือบทุกภาษาที่มีระบบพิมพ์แบบสแตติกยังมีระบบพิมพ์แบบไดนามิก”
การอ้างสิทธิ์โดยAleks Bromfieldระบุว่า: เกือบทุกภาษาที่มีระบบพิมพ์แบบสแตติกก็มีระบบพิมพ์แบบไดนามิกเช่นกัน นอกเหนือจาก C ฉันไม่สามารถคิดถึงข้อยกเว้นได้ นี่คือการอ้างสิทธิ์ที่ถูกต้องหรือไม่ ฉันเข้าใจว่าด้วยคลาส Reflection หรือ Loading ที่รันไทม์ Java จะมีลักษณะเช่นนี้ - แต่สามารถขยายความคิดของ 'การพิมพ์ทีละส่วน' เป็นภาษาจำนวนมากได้หรือไม่?

6
มีภาษาระดับสูงพิเศษออกไปไหม [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัพเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน5 ปีที่ผ่านมา ในอดีต HLL มีลักษณะคล้าย C, Fortran หรือ Pascal และ VHLL เป็นอะไรที่เหมือน Ruby หรือ Python ฉันคุ้นเคยกับคำศัพท์ 4GL, 5GL, DSL และ LOP และผู้ที่ไม่ควรอ่าน Wikipedia สำหรับคำจำกัดความ ฉันกำลังมองหา UHLL คำถามของฉันคือ: มีภาษาคอมพิวเตอร์ใดบ้างที่มีลำดับความสำคัญเพิ่มมากขึ้นและมีใครทำงานกับพวกเขาหรือไม่ ประสิทธิผลมากขึ้นหมายถึงโค้ดที่ถูกเขียนน้อยลงและเวลาโปรแกรมเมอร์น้อยลงเพื่อให้ได้ผลลัพธ์ผลลัพธ์ข้อผิดพลาดน้อยลงและการดีบักน้อยลงการเชื่อมโยงแนวคิดที่ใกล้ชิดระหว่างโค้ดและข้อกำหนดมากขึ้น โดเมนหลักที่ฉันสนใจคือแอพพลิเคชั่นทางธุรกิจและผู้บริโภคทั่วไปพร้อมหน้า GUI หรือเบราว์เซอร์การคงอยู่ของข้อมูลและการเชื่อมต่อกับระบบอื่นเช่นการพิมพ์และอีเมล คนอื่นอาจโฟกัสที่อื่นดี ฉันรู้ว่าภาษาเหล่านั้นบางอย่างอาจเฉพาะโดเมนและพวกเขาอาจจะน้อยกว่าความสามารถในการกำหนดค่าของแอปพลิเคชันขนาดใหญ่และมีความสามารถ สเปรดชีต Excel จัดอยู่ในหมวดหมู่นี้ ฉันรับรู้ว่าบางภาษาเหล่านั้นอาจปรากฏทั่วไป แต่อาจยังแคบในขอบเขตและไม่เหมาะสมกับปัญหามากมาย ตัวอย่างเช่น Matlab …

2
ทำไม Java จึงไม่ใส่ชื่อไฟล์ลงไป?
ใน C และ C ++, วิธีการหลักเก็บชื่อไฟล์ในตำแหน่งแรกของอาร์เรย์ที่ argv [0] อย่างไรก็ตามใน Java ชื่อไฟล์จะไม่รวมอยู่ในอาร์เรย์สตริง args มีเหตุผลในทางปฏิบัติสำหรับสิ่งนี้หรือไม่? ฉันเข้าใจว่าสิ่งนี้ทำให้การวนซ้ำผ่านอาร์กิวเมนต์บรรทัดคำสั่ง 0-based แทน 1-based แต่มีประโยชน์ไหม? ชื่อไฟล์นั้นถือว่าไร้ประโยชน์หรือไม่?
20 java  c++  c 

4
ควรใช้รูปแบบพื้นที่เก็บข้อมูลเมื่อใด
ฉันได้อ่านเมื่อเร็ว ๆ นี้ว่าไม่ใช่วิธีปฏิบัติที่ดีในการใช้รูปแบบพื้นที่เก็บข้อมูลร่วมกับ ORM จากความเข้าใจของฉันนี้เป็นเพราะนามธรรมที่พวกเขาให้มากกว่าฐานข้อมูล SQL รั่วไหลเกินกว่าที่จะอยู่ในรูปแบบ ฉันมีคำถามสองสามข้อเกี่ยวกับเรื่องนี้: คุณจะทำอย่างไรถ้าคุณต้องการเปลี่ยน ORM คุณจะมีรหัสเฉพาะ ORM ในแอปพลิเคชันของคุณหากคุณไม่มีในที่เก็บ รูปแบบที่เก็บยังคงใช้ได้เมื่อไม่ได้ใช้ ORM และคุณใช้ ADO.NET สำหรับการเข้าถึงข้อมูลและการเติมข้อมูลวัตถุด้วยตัวเอง? หากคุณใช้ ORM แต่ไม่ใช่รูปแบบที่เก็บที่คุณเก็บแบบสอบถามที่ใช้บ่อย จะเป็นการดีหรือไม่ที่จะแสดงแต่ละแบบสอบถามเป็นคลาสและมีโรงงานแบบสอบถามบางประเภทเพื่อสร้างอินสแตนซ์

7
วิธีการป้องกันที่ดีที่สุดจาก 0 ผ่านไปยัง std :: พารามิเตอร์สตริง?
ฉันเพิ่งรู้ว่ามีอะไรรบกวน ทุกครั้งที่ฉันได้เขียนวิธีการที่ยอมรับstd::stringว่าเป็นพารามิเตอร์ฉันได้เปิดตัวเองเพื่อพฤติกรรมที่ไม่ได้กำหนด ตัวอย่างเช่นสิ่งนี้ ... void myMethod(const std::string& s) { /* Do something with s. */ } ... สามารถเรียกได้ว่าเป็นแบบนี้ ... char* s = 0; myMethod(s); ... และไม่มีอะไรที่ฉันสามารถทำได้เพื่อป้องกันมัน (ที่ฉันรู้) ดังนั้นคำถามของฉันคือ: มีคนป้องกันตัวเองจากสิ่งนี้ได้อย่างไร วิธีการเดียวที่อยู่ในใจคือการเขียนวิธีการสองแบบที่ยอมรับstd::stringเป็นพารามิเตอร์ดังนี้: void myMethod(const std::string& s) { /* Do something. */ } void myMethod(char* s) { if (s == 0) { throw …
20 c++ 

3
ความยากลำบากในการใช้ TDD และการสร้างใหม่ (หรือ - ทำไมจึงเจ็บปวดกว่าที่ควรจะเป็น)
ฉันต้องการสอนตัวเองให้ใช้วิธีการของ TDD และฉันก็มีโครงการที่ฉันอยากจะทำอยู่พักหนึ่ง มันไม่ใช่โครงการขนาดใหญ่ดังนั้นฉันคิดว่ามันจะเป็นตัวเลือกที่ดีสำหรับ TDD อย่างไรก็ตามฉันรู้สึกว่ามีบางอย่างผิดปกติ ขอยกตัวอย่าง: ในระดับสูงโครงการของฉันเป็นส่วนเสริมสำหรับ Microsoft OneNote ที่จะให้ฉันติดตามและจัดการโครงการได้ง่ายขึ้น ตอนนี้ฉันยังต้องการให้ตรรกะทางธุรกิจสำหรับสิ่งนี้แยกออกจาก OneNote มากที่สุดในกรณีที่ฉันตัดสินใจที่จะสร้างที่เก็บข้อมูลที่กำหนดเองของฉันเองและกลับมาสิ้นสุดวันหนึ่ง ก่อนอื่นฉันเริ่มต้นด้วยการทดสอบการยอมรับคำธรรมดาเบื้องต้นเพื่อสรุปสิ่งที่ฉันต้องการให้คุณสมบัติแรกของฉันทำ ดูเหมือนบางสิ่งนี้ (ทำให้ลดความกระชับลง): ผู้ใช้คลิกสร้างโครงการ ผู้ใช้พิมพ์ชื่อเรื่องของโครงการ ตรวจสอบว่าโครงการสร้างขึ้นอย่างถูกต้อง ข้ามสิ่งที่ UI และการวางแผนตัวกลางฉันมาทดสอบหน่วยแรกของฉัน: [TestMethod] public void CreateProject_BasicParameters_ProjectIsValid() { var testController = new Controller(); Project newProject = testController(A.Dummy<String>()); Assert.IsNotNull(newProject); } จนถึงตอนนี้ดีมาก สีแดงเขียว refactor ฯลฯ เอาล่ะตอนนี้มันต้องการบันทึกของจริง ตัดขั้นตอนที่นี่ฉันปิดท้ายด้วยสิ่งนี้ [TestMethod] public void CreateProject_BasicParameters_ProjectMatchesExpected() { …

4
อินเตอร์เฟสว่างเพื่อรวมหลายอินเตอร์เฟส
สมมติว่าคุณมีสองอินเตอร์เฟส: interface Readable { public void read(); } interface Writable { public void write(); } ในบางกรณีวัตถุที่ใช้งานสามารถรองรับหนึ่งในสิ่งเหล่านี้ แต่ในหลายกรณีการใช้งานจะสนับสนุนทั้งสองอินเตอร์เฟส ผู้ใช้อินเทอร์เฟซจะต้องทำสิ่งที่ชอบ: // can't write to it without explicit casting Readable myObject = new MyObject(); // can't read from it without explicit casting Writable myObject = new MyObject(); // tight coupling to actual implementation …

5
ทำไมคอมไพล์จึงไม่บรรจุชื่อสาขาที่สร้างขึ้น?
เมื่อทำงานกับคอมไพล์ในทีมที่ใช้ฟีเจอร์บรานช์ฉันมักจะพบว่ามันยากที่จะเข้าใจโครงสร้างสาขาในประวัติศาสตร์ ตัวอย่าง: สมมติว่ามีฟีเจอร์ branch / make-coffeeฟีเจอร์และการแก้ไขข้อผิดพลาดยังคงดำเนินต่อไปบนมาสเตอร์ขนานกับฟีเจอร์ branch ประวัติอาจมีลักษณะเช่นนี้: * merge feature/make-coffee |\ | * small bugfix | | * | fix bug #1234 | | | * add milk and sugar | | * | improve comments | | * | fix bug #9434 | | | * make coffe …
20 git  branching 

4
ฉันควรใช้ข้อยกเว้นเมื่อใดและอย่างไร
การตั้งค่า ฉันมักจะมีปัญหาในการกำหนดเวลาและวิธีใช้ข้อยกเว้น ลองพิจารณาตัวอย่างง่ายๆ: สมมติว่าฉันกำลังขูดหน้าเว็บให้พูดว่า " http://www.abevigoda.com/ " เพื่อพิจารณาว่า Abe Vigoda ยังมีชีวิตอยู่หรือไม่ ในการทำสิ่งนี้สิ่งที่เราต้องทำคือดาวน์โหลดหน้าและค้นหาเวลาที่วลี "Abe Vigoda" ปรากฏขึ้น เรากลับมาปรากฏตัวครั้งแรกเนื่องจากมีสถานะของ Abe ตามแนวคิดแล้วจะมีลักษณะดังนี้: def get_abe_status(url): # download the page page = download_page(url) # get all mentions of Abe Vigoda hits = page.find_all_mentions("Abe Vigoda") # parse the first hit for his status status = parse_abe_status(hits[0]) # …

2
วิธีการใช้โปรแกรมแบบโต้ตอบ (เช่นเกม / การจำลอง) โดยใช้การเขียนโปรแกรมเชิงตรรกะ?
ฉันได้ยินมาว่าการเขียนโปรแกรมเชิงตรรกะสามารถใช้เป็นทางเลือกทั่วไปสำหรับกระบวนทัศน์การเขียนโปรแกรมอื่นเช่น OO หรือการเขียนโปรแกรมเชิงฟังก์ชัน (เนื่องจาก Prolog เสร็จสมบูรณ์แล้วจึงต้องเป็นเช่นนี้!) อย่างไรก็ตามฉันมีปัญหาในการดูว่าจะใช้โปรแกรมอินเทอร์แอคทีฟได้อย่างไรเช่นเกมคอนโซลกราฟิกที่เรียบง่ายใน Prolog หรือภาษาที่คล้ายกัน คุณมีข้อเท็จจริงกฎที่สามารถรับข้อเท็จจริงเพิ่มเติมและแบบสอบถามที่ดึงข้อเท็จจริง มันง่ายที่จะดูว่าคุณสามารถใช้องค์ประกอบพื้นฐานเหล่านั้นเพื่อสร้างบางสิ่งเช่นตัวแก้ซูโดกุได้อย่างไร แต่วิธีการเกี่ยวกับแพคแมนหรือมากกว่านั้นอย่างง่ายพงษ์? โปรดทราบ:ฉันไม่ได้มองหารายละเอียดในระดับต่ำ แต่เป็นภาพรวมแนวคิด (ตัวอย่างเช่น: ในเงื่อนไขระดับสูงคุณจะจัดการ I / O อย่างไรคุณจะเก็บสถานะของเกมอย่างไรคุณจะใช้บางอย่างเช่น "วนรอบหลัก" อย่างไรคุณจะวัดและตอบสนองต่อเวลาที่ผ่านไปอย่างไร )

5
อ็อบเจ็กต์สถาปัตยกรรมเอนทิตีคอมโพเนนต์ระบบถูกวางแนวโดยนิยามหรือไม่?
เป็นสถาปัตยกรรมระบบตัวแทน Entityเชิงวัตถุโดยความหมาย? ดูเหมือนว่าฉันหรือขั้นตอนการทำงานมากขึ้น ความคิดเห็นของฉันคือมันไม่ได้ป้องกันคุณจากการใช้งานในภาษา OO แต่มันจะไม่เป็นเรื่องแปลกที่จะทำเช่นนั้นในทาง OO อย่างแข็งขัน ดูเหมือนว่า ECS จะแยกข้อมูล (E & C) ออกจากพฤติกรรม (S) เป็นหลักฐาน : แนวคิดคือไม่มีวิธีการฝังเกมในเอนทิตี และ : ส่วนประกอบประกอบด้วยชุดข้อมูลขั้นต่ำที่จำเป็นสำหรับวัตถุประสงค์เฉพาะ ระบบคือฟังก์ชั่นวัตถุประสงค์เดียวที่ใช้ชุดของเอนทิตีที่มีองค์ประกอบเฉพาะ ฉันคิดว่านี่ไม่ใช่เชิงวัตถุเพราะส่วนใหญ่ของการมุ่งเน้นวัตถุคือการรวมข้อมูลและพฤติกรรมของคุณเข้าด้วยกัน เป็นหลักฐาน : ในทางตรงกันข้ามวิธีการเชิงวัตถุสนับสนุนให้โปรแกรมเมอร์วางข้อมูลที่ไม่สามารถเข้าถึงได้โดยตรงโดยส่วนที่เหลือของโปรแกรม แต่จะเข้าถึงข้อมูลได้โดยการเรียกฟังก์ชั่นที่เขียนขึ้นเป็นพิเศษโดยทั่วไปเรียกว่าเมธอดซึ่งรวมอยู่ในข้อมูล ในทางกลับกัน ECS ดูเหมือนจะเป็นเรื่องเกี่ยวกับการแยกข้อมูลของคุณออกจากพฤติกรรมของคุณ

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

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