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

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

5
มันสมเหตุสมผลหรือไม่ที่จะ "โปรแกรมไปยังส่วนต่อประสาน" ใน Java?
ฉันได้เห็นการอภิปรายในคำถามนี้เกี่ยวกับวิธีการที่คลาสที่ใช้จากอินเทอร์เฟซจะถูกยกตัวอย่าง ในกรณีของฉันฉันกำลังเขียนโปรแกรมขนาดเล็กมากใน Java ที่ใช้อินสแตนซ์ของTreeMapและตามความเห็นของทุกคนที่นั่นควรมีอินสแตนซ์เช่น: Map<X> map = new TreeMap<X>(); ในโปรแกรมของฉันฉันกำลังเรียกใช้ฟังก์ชั่นmap.pollFirstEntry()ซึ่งไม่ได้ประกาศในMapอินเทอร์เฟซ (และอีกสองสามคนที่อยู่ในMapอินเทอร์เฟซด้วย) ฉันจัดการเพื่อทำสิ่งนี้ได้โดยการส่งไปยังTreeMap<X>ทุกที่ที่ฉันเรียกวิธีนี้เช่น someEntry = ((TreeMap<X>) map).pollFirstEntry(); ฉันเข้าใจถึงข้อดีของแนวทางการเริ่มต้นตามที่อธิบายไว้ข้างต้นสำหรับโปรแกรมขนาดใหญ่อย่างไรก็ตามสำหรับโปรแกรมขนาดเล็กมากที่วัตถุนี้จะไม่ถูกส่งผ่านไปยังวิธีอื่นฉันคิดว่ามันไม่จำเป็น แต่ถึงกระนั้นฉันกำลังเขียนโค้ดตัวอย่างนี้เป็นส่วนหนึ่งของการสมัครงานและฉันไม่ต้องการให้รหัสของฉันดูไม่ดีหรือรก สิ่งที่จะเป็นทางออกที่หรูหราที่สุด? แก้ไข: TreeMapผมอยากจะชี้ให้เห็นว่าฉันสนใจมากขึ้นในการเข้ารหัสการปฏิบัติที่ดีในวงกว้างแทนของการประยุกต์ใช้ฟังก์ชั่นที่เฉพาะเจาะจง เนื่องจากคำตอบบางข้อได้ชี้ให้เห็นแล้ว (และฉันได้ทำเครื่องหมายเป็นคำตอบแรกให้ทำ) ควรใช้ระดับนามธรรมที่สูงขึ้นโดยไม่สูญเสียฟังก์ชันการทำงาน

2
การออกแบบคลาสยกเว้น
ฉันกำลังเขียนโค้ดไลบรารีขนาดเล็กและฉันมีปัญหากับการออกแบบการจัดการข้อยกเว้น ฉันต้องบอกว่าฉันยังคงสับสนกับคุณสมบัติของภาษา C ++ และพยายามอ่านให้มากที่สุดเท่าที่จะเป็นไปได้เพื่อทำความเข้าใจกับสิ่งที่ฉันต้องทำเพื่อทำงานกับคลาสยกเว้นอย่างเหมาะสม ฉันตัดสินใจใช้system_errorวิธีการที่ได้แรงบันดาลใจจากการใช้งาน STL ของfuture_errorชั้นเรียน ฉันมีการแจงนับที่มีรหัสข้อผิดพลาด: enum class my_errc : int { error_x = 100, error_z = 101, error_y = 102 }; และคลาสข้อยกเว้นเดียว (สำรองตามerror_categoryประเภทของโครงสร้างและทุกอย่างอื่นที่จำเป็นโดยsystem_errorรุ่น): // error category implementation class my_error_category_impl : public std::error_category { const char* name () const noexcept override { return "my_lib"; } std::string message …

1
อะไรคือความสัมพันธ์ระหว่าง“ ฟลักซ์” และการเขียนโปรแกรมปฏิกิริยาที่ใช้งานได้จริง?
Flux เท่าที่ฉันเข้าใจเป็นเทคนิคเกี่ยวกับการจัดการกับดาต้าโฟลว์ของแอปพลิเคชั่นทิศทางเดียวทำให้สถานะแยกออกจากส่วนที่เหลือของโปรแกรมใน "ร้านค้า" แบบอ่านอย่างเดียวที่มีอยู่ในตัวเองซึ่งสามารถเปลี่ยนสถานะของตนเองได้ "การกระทำ" ที่ถูกปล่อยออกมาจากการดูและส่งโดยผู้มอบหมายงาน หรือในระยะสั้น - วิธีการควบคุมสถานะ ถ้ามันถูกต้องมันจะสัมพันธ์กับฟังก์ชั่นการตอบโต้การเขียนโปรแกรมได้อย่างไร? เนื่องจาก FRP มีการควบคุมที่แข็งแกร่งเป็นอย่างมากฉันจึงเดาว่านี่เป็นเทคนิคพิเศษที่ไม่เหมือนกันซึ่งแก้ปัญหาเดียวกันได้จริง ดังนั้นหากใช้ไลบรารี FRP (เช่น Elm) แสดงว่า Flux มีประโยชน์เล็กน้อย ถูกต้องหรือไม่

4
รูปแบบของผู้เข้าชมใช้ได้ในสถานการณ์นี้หรือไม่
เป้าหมายของงานของฉันคือการออกแบบระบบขนาดเล็กที่สามารถเรียกใช้งานที่เกิดขึ้นซ้ำตามกำหนดเวลา งานที่เกิดซ้ำเป็นเหมือน "ส่งอีเมลไปยังผู้ดูแลระบบทุกชั่วโมงตั้งแต่ 8:00 น. ถึง 17:00 น. วันจันทร์ถึงวันศุกร์" ฉันได้เรียนฐานที่เรียกว่าRecurringTask public abstract class RecurringTask{ // I've already figured out this part public bool isOccuring(DateTime dateTime){ // implementation } // run the task public abstract void Run(){ } } และฉันมีหลายชั้นเรียนซึ่งได้รับมาจากRecurringTask หนึ่งในนั้นคือเรียกว่าSendEmailTask public class SendEmailTask : RecurringTask{ private Email email; public SendEmailTask(Email …

3
ดีกว่าที่จะเขียนไลบรารี. NET ของคุณด้วยข้อ จำกัด COM ในใจหรือแยกไลบรารี. NET ของคุณออกจาก Interop
ฉันเจอบทความที่น่าสนใจนี้: ฉันจะรัก COM การทำงานร่วมกันใน CodeProject ได้อย่างไรซึ่งทำให้ฉันคิดว่า ... ผู้เขียนระบุว่าพวกเขาไม่ต้องการ COM-ities ใด ๆ ในไลบรารี. NET ของพวกเขาเพราะมันไม่ได้อยู่ในความสวยงามของไลบรารี. NET ของพวกเขา แต่พวกเขาต้องการเขียนไลบรารี Interop แยกที่แสดงไลบรารี. NET ของพวกเขาไปที่ COM แทน ไลบรารี Interop นี้จะจัดการกับความจริงที่ว่า COM ไม่สนับสนุนคอนสตรัคเตอร์ที่มีพารามิเตอร์ และในขณะที่ฉันคิดว่ามันเป็นเรื่องแปลกใหม่มันไม่เพียงรวบรวมโครงการหรือไม่ ตอนนี้คุณต้องทำการทดสอบหน่วย. ไลบรารี NET ของคุณและไลบรารี Interop ตอนนี้คุณต้องใช้เวลาในการหาวิธีการทำงานกับไลบรารี. NET ที่สวยงามของคุณและเปิดให้ COM คุณต้องนับจำนวนชั้นเรียนอย่างมีประสิทธิภาพสองหรือสามเท่า ฉันสามารถเข้าใจได้อย่างแน่นอนว่าคุณต้องการห้องสมุดของคุณเพื่อสนับสนุนทั้ง COM และไม่ใช่ COM อย่างไรก็ตามหากคุณต้องการใช้ COM เพียงอย่างเดียวการออกแบบประเภทนี้ให้ประโยชน์ที่ฉันไม่เห็นหรือไม่ คุณได้รับประโยชน์จากภาษา C # เท่านั้นหรือไม่ …

1
วิธีที่ดีที่สุดในการเร่งการเข้าถึงข้อมูลไปยังคลังข้อมูลสองแห่งคืออะไร?
ฉันกำลังดำเนินโครงการข่าวกรองธุรกิจซึ่งจะต้องมีการเข้าถึงข้อมูลที่เป็นนามธรรมไปยังคลังข้อมูลที่มีอยู่สองแห่ง ฉันต้องออกแบบสถาปัตยกรรมแอปพลิเคชันเพื่อให้ระบบธุรกิจอัจฉริยะแบบบริการตนเองเข้าร่วมข้อมูลและให้มุมมองเดียวกับคลังสินค้าที่มีอยู่สองแห่ง ฉันเกิดอะไรขึ้นกับสิ่งนี้: ฉันกำลังดิ้นรนกับชิ้นส่วนเสมือนจริง / แคชและสงสัยว่ามีรูปแบบการออกแบบองค์กรใด ๆ เพื่อแก้ปัญหาของฉันหรือไม่ สถาปัตยกรรมแบบนี้สามารถใช้ได้กับแผนผังดาวนามธรรมในคลังข้อมูลหรือไม่ ฉันกำลังดูผลิตภัณฑ์เช่นRed Hat JBoss Data VirtualizationและRed Hat JBoss Data Grid (รวมถึงอื่น ๆ ) เราไม่ได้ใช้ Hibernate ในปัจจุบันและความเข้าใจของฉันเกี่ยวกับ Data Grids คือพวกเขาเป็นที่เก็บคีย์ - ค่าหรือที่เก็บวัตถุและดังนั้นจึงไม่เหมาะสมสำหรับการแคชโมเดลเชิงสัมพันธ์ ฉันควรจะพูดถึงว่าเรามีความกระตือรือร้นที่จะใช้ผลิตภัณฑ์ของผู้จัดจำหน่ายสำหรับส่วนแดชบอร์ดบริการตนเอง แต่เราอาจลงเอยด้วยการสร้างแบบกำหนดเองบางอย่างในพื้นที่นี้หากผู้ขายไม่สามารถเสนอสิ่งที่เราต้องการทุกอย่าง

3
เรามาเต็มวงกลมด้วย microservices ย้อนกลับไปยังโรงเรียนเก่า
ในแง่ของสถาปัตยกรรมซอฟต์แวร์และการออกแบบ microservices "stack up" (เล่นสำนวนเจตนา) กับมิดเดิลแวร์อย่างไร ฉันมาจาก Java และดูเหมือนว่าเมื่อคุณย้ายออกจาก REST แบบตรงเป็น API และแยกแยะเลเยอร์และพารามิเตอร์การเชื่อมต่อต่าง ๆ อย่างน้อยที่สุดใน Java คุณเกือบจะกลับมาที่ความคิดเก่า ๆ . เราได้กลับมาสู่การจำลองเสมือน ... ซึ่ง JVM นั้นเสมือนจริงอยู่แล้ว ด้วยวิธีที่ไม่เชื่อเรื่องพระเจ้าคุณสามารถและฉันจะเถียงข้อได้เปรียบที่เป็นนามธรรม, สงบเงียบ API กับ CORBA หรือในทางที่มีจาวาเป็นศูนย์กลางมากกว่า JMS หรือ MDB ในครั้งเดียว EJB เป็นเรื่องใหญ่ใน Java แล้วมันได้รับการยอมรับว่าเป็นกลุ่มของคลัสเตอร์ แต่ตอนนี้เรากลับไปที่จุดเริ่มต้นหรือไม่? หรือ microservices เสนอสิ่งที่ CORBA หรือดีกว่า MDB ขาดหรือไม่ เมื่อฉันอ่าน (TLDR) มาร์ตินฟาวเลอร์อธิบายการใช้ไมโครไซต์มันจะทำให้ฉันเป็นทางออกที่ดีสำหรับปัญหาที่ไม่ดีถ้าคุณต้องการ หรือค่อนข้างเป็นวิธีการปิดที่เปิดใจซึ่งนำเสนอระดับของความซับซ้อนเพียงผลักดันปัญหาไปรอบ …

3
ใช้อินเทอร์เฟซสำหรับประเภทข้อมูลเป็นแบบป้องกันหรือไม่
สมมติว่าฉันมีเอนทิตีต่าง ๆ ในแบบจำลองของฉัน (โดยใช้ EF), พูดว่าผู้ใช้ผลิตภัณฑ์ใบแจ้งหนี้และใบสั่ง ฉันกำลังเขียนตัวควบคุมผู้ใช้ที่สามารถพิมพ์บทสรุปของเอนทิตีวัตถุในแอปพลิเคชันของฉันซึ่งเป็นรายการที่กำหนดไว้ล่วงหน้าในกรณีนี้ฉันบอกว่าสรุปของผู้ใช้และผลิตภัณฑ์สามารถสรุปได้ บทสรุปจะมีเพียง ID และคำอธิบายเท่านั้นดังนั้นฉันจึงสร้างอินเทอร์เฟซอย่างง่ายสำหรับสิ่งนี้: public interface ISummarizableEntity { public string ID { get; } public string Description { get; } } จากนั้นสำหรับเอนทิตีที่มีปัญหาฉันสร้างคลาสบางส่วนที่ใช้อินเทอร์เฟซนี้: public partial class User : ISummarizableEntity { public string ID { get{ return UserID.ToString(); } } public string Description { get{ return …

5
เหตุใดจึงควรใช้ HashMap (ในฟังก์ชั่น) เพื่อกำหนดค่าที่จะส่งคืน (สำหรับคีย์) เมื่อโครงสร้าง if อื่นสามารถทำงานได้ในเวลาที่ดีกว่า
ขณะที่ฉันทำงานกับ บริษัท ใหญ่เมื่อไม่นานมานี้ฉันสังเกตเห็นว่าโปรแกรมเมอร์ที่นั่นปฏิบัติตามรูปแบบการเข้ารหัสนี้: สมมติว่าฉันมีฟังก์ชั่นที่ส่งกลับ 12 ถ้าอินพุตเป็น A, 21 ถ้าอินพุตเป็น B และ 45 ถ้าอินพุตเป็น C ดังนั้นฉันสามารถเขียนฟังก์ชั่นลายเซ็นเป็น: int foo(String s){ if(s.equals("A")) return 12; else if(s.equals("B")) return 21; else if(s.equals("C")) return 45; else throw new RuntimeException("Invalid input to function foo"); } แต่ในการตรวจสอบรหัสฉันถูกขอให้เปลี่ยนฟังก์ชั่นต่อไปนี้: int foo(String s){ HashMap<String, Integer> map = new HashMap<String, Integer>(); map.put("A", …

1
วิธีแจ้งการเติมข้อความอัตโนมัติของ WebStorm เกี่ยวกับ WebGLRenderingContext
ฉันกำลังทำงานในโครงการที่เกี่ยวข้องกับ WebGL และใช้ WebStorm เพื่อทำการพัฒนา ปัญหาหนึ่งของโฟลว์การพัฒนาคือ WebStorm ไม่สามารถเติมข้อมูลอัตโนมัติที่เกี่ยวข้องกับ WebGL ได้ โดยเฉพาะอย่างยิ่งถ้าฉันใส่หมายเหตุเป็นค่าที่เป็นประเภทWebGLRenderingContext /** @type {!WebGLRenderingContext} */ var gl; WebStorm บ่นว่า WebGLRenderingContext เป็นตัวแปรที่ไม่ได้รับการแก้ไข นอกจากนี้ยังบ่นเกี่ยวกับการใช้วิธีการglเตือนว่าไม่สามารถหาวิธีการเหล่านั้นได้ดังนั้นจึงอาจไม่มีอยู่ วิธีแก้ปัญหาปัจจุบันของฉัน (นอกเหนือจากเพียงแค่ปิดคำเตือน) คือการระบุประเภทของบันทึกเช่น: * @type {{ * texParameteri: function, * TEXTURE_WRAP_T: *, * ... * }} var gl; แต่เห็นได้ชัดว่ามันค่อนข้างงี่เง่าที่จะแสดงรายการสมาชิกมาตรฐานหลายสิบคนแบบนี้ทุกครั้งที่ฉันต้องการใช้บริบทการแสดงผล มีวิธีที่ง่ายกว่านี้ไหม?
9 webgl 

3
จำนวนสตริงเมื่อแต่ละตัวละครจะต้องเกิดขึ้นแม้แต่ครั้ง
ฉันตีหัวกะโหลกที่ปัญหานี้มาระยะหนึ่งแล้วและมันเริ่มทำให้ฉันหงุดหงิดจริงๆ ปัญหาคือ: ฉันมีชุดของตัวอักษร, A, B, และC Dฉันต้องบอกว่าสตริงสามารถสร้างจากตัวละครเหล่านี้ได้กี่วิธีเมื่อความยาวเป็นnและตัวละครแต่ละตัวจะต้องเกิดขึ้นซ้ำ ๆ ตัวอย่างเช่นคำตอบสำหรับn = 2คือ 4: AA BB CC DD คำตอบn = 4คือ 40 สตริงที่ใช้ได้บางส่วนคือ: AAAA AABB CACA DAAD BCCB ฉันติดอยู่กับตรรกะ ฉันรู้สึกว่าอาจมีวิธีแก้ปัญหา DP สำหรับสิ่งนี้ การบังคับให้ฉันผ่านสิ่งนี้ออกมาจากคำถาม: จำนวนโซลูชันเติบโตอย่างรวดเร็วเป็นจำนวนมหาศาล ฉันได้ลองวาดไอเดียต่าง ๆ ลงบนกระดาษแล้วก็ไม่มีประโยชน์ ฉันต้องทิ้งความคิดเหล่านั้นเกือบทั้งหมดเนื่องจากความซับซ้อนของมันใหญ่เกินไป n = 10^4การแก้ปัญหาควรจะมีประสิทธิภาพสำหรับ หนึ่งในความคิดของฉันคือไม่ต้องติดตามสายอักขระที่แท้จริง แต่เฉพาะว่าตัวละครแต่ละตัวนั้นปรากฏตัวหรือแม้แต่ช่วงเวลาคี่ ฉันไม่สามารถหาวิธีที่จะใช้ตรรกะนี้ได้ มีใครช่วยฉันบ้าง

1
ความสัมพันธ์ระหว่างสายแคชและหน้าหน่วยความจำ
หากฉันถูกต้องหน้าในหน่วยความจำหลักเป็นหน่วยที่เล็กที่สุดสำหรับการถ่ายโอนข้อมูลระหว่างหน่วยความจำหลักและอุปกรณ์เก็บข้อมูลภายนอกเช่นฮาร์ดดิสก์ บรรทัดแคชของหน่วยความจำหลักเป็นหน่วยที่เล็กที่สุดสำหรับการถ่ายโอนข้อมูลระหว่างหน่วยความจำหลักและ cpu แคช ฉันสงสัยว่าขนาดหน้ากระดาษอยู่เสมอหรือดีที่สุดที่จะเป็นขนาดแคชของจำนวนบรรทัดปกติหรือไม่ หากขนาดบรรทัดแคชคือ 64 ไบต์และขนาดหน้าหน่วยความจำคือ 4KB ดังนั้นแต่ละหน้าจะมี 4KB / 64 ไบต์ == 64 บรรทัดแคชในนั้น หน้าและบรรทัดแคชทั้งวัตถุคงที่ในหน่วยความจำหรือไม่? หรือพวกเขาเป็นเพียงบล็อกที่ต่อเนื่องกันของหน่วยความจำขนาดหนึ่งซึ่งสามารถเริ่มต้นและลอยได้ทุกที่ภายในหน่วยความจำ เป็นเสมอหรือไม่ที่บรรทัดแคชไม่สามารถขยายได้มากกว่าหนึ่งหน้านั่นคือส่วนหนึ่งของบรรทัดแคชอยู่ในหน้าหนึ่งและอีกส่วนหนึ่งของบรรทัดแคชอยู่ในหน้าอื่นหรือไม่ ขอบคุณ
9 memory  caching 

4
วิธีที่มีประสิทธิภาพที่สุดในการสร้างการสืบทอดทั้งหมดของโหนดทั้งหมดในทรี
ฉันกำลังมองหาอัลกอริทึมที่มีประสิทธิภาพที่สุดในการดึงทรี (จัดเก็บเป็นรายการขอบหรือเป็นรายการของการแมปจากโหนดแม่ไปยังรายการโหนดย่อย) และสร้างสำหรับโหนด EVERY รายการของโหนดทั้งหมดที่สืบเชื้อสายมาจากมัน (ระดับใบและระดับที่ไม่ใช่ใบ) การดำเนินการจะต้องผ่านลูปแทนการผสมเนื่องจากขนาด และควรเป็น O (N) คำถาม SO นี้ครอบคลุมโซลูชันมาตรฐานที่เห็นได้ชัดเจนพอสมควรสำหรับการค้นหาคำตอบสำหรับหนึ่งโหนดในทรี แต่เห็นได้ชัดว่าการทำซ้ำอัลกอริทึมนั้นในโหนดต้นไม้ทุกโหนดไม่มีประสิทธิภาพสูง (จากส่วนหัวของฉัน O (NlogN) ถึง O (N ^ 2) รู้จักรากของต้นไม้ ต้นไม้มีรูปร่างตามอำเภอใจอย่างแน่นอน (เช่นไม่ใช่ N-nary ไม่สมดุลในทางใดรูปร่างหรือรูปแบบไม่ลึกสม่ำเสมอ) - บางโหนดมีลูก 1-2 คนบางคนมีลูก 30K ในระดับปฏิบัติ (แม้ว่าจะไม่ส่งผลกระทบต่ออัลกอริทึม) ต้นไม้มีโหนด ~ 100K-200K

4
เหตุใดจึงต้องใช้ฟังก์ชันว่าง
ฉันเริ่มเรียนรู้หลามและฉันสงสัยว่าทำไมฟังก์ชันว่างจึงจำเป็นต้องใช้ในภาษาการเขียนโปรแกรม เช่นในหลาม: def empty_func(): pass แม้ในเชลล์สคริปต์ฟังก์ชันว่างฟังก์ชันว่างมี ความเข้าใจและคำถามของฉัน: ทำไมภาษาการเขียนโปรแกรมจำเป็นต้องมีฟังก์ชั่นที่ว่างเปล่า? มันเป็นเพียงการเล่นกับภาษาโปรแกรมหรือไม่มีอะไรที่สำคัญจริงๆ? หากมีวัตถุประสงค์ใครสามารถอธิบายกรณีการใช้งานหรือให้ตัวอย่างจริงของการใช้ฟังก์ชันว่างเปล่าได้หรือไม่ หรือมีประเพณีของภาษาการเขียนโปรแกรมที่ช่วยให้ฟังก์ชั่นที่ว่างเปล่า? แก้ไข (สิ่งที่ฉันได้จากการอ่านคำตอบของคุณ): สำหรับขั้นตอนวิธีการร่างหรือฟังก์ชั่นบทคัดย่อ สำหรับการส่งแบบฟอร์มโดยไม่ต้องดำเนินการใด ๆ ตัวยึดสำหรับการดำเนินการบังคับบางอย่าง

5
ชั้นเรียนในภาษา OOP และประเภท
ในทฤษฎีการเขียนโปรแกรมภาษาประเภทคือชุดของค่า เช่น type "int" คือชุดของค่าจำนวนเต็มทั้งหมด ในภาษา OOP คลาสเป็นประเภทใช่หรือไม่ เมื่อชั้นเรียนมีสมาชิกมากกว่าหนึ่งคนเช่น class myclass{ int a; double b; } เมื่อเราพูดถึงชั้นเรียนเราหมายถึง " (a,b)อยู่ที่ไหนaint และbเป็นสองเท่า" หรือ "{ (x,y)| xis int ใด ๆ , ydouble ใด ๆ }"? ตัวอย่างmyclassหมายถึงอะไร " (a,b)อยู่ที่ไหนaint และbเป็นสองเท่า" หรือ วัตถุที่ใช้พื้นที่หน่วยความจำและที่ (ไม่จำเป็นต้องเช่นว่างเปล่า) ร้านค้า(x,y)ที่xใด int และyเป็นคู่ใด ๆ

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