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

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

2
แบบจำลองโดเมนแอนดี้และการฉีดบริการโดเมน
รูปแบบโดเมนโรคโลหิตจางจะอธิบายว่าการต่อต้านรูปแบบในการออกแบบโดเมนขับเคลื่อนโดยมาร์ตินฟาวเลอร์ เพื่อให้มีตรรกะทางธุรกิจในรูปแบบโดเมนมักจะใช้บริการโดเมน แต่การฉีดบริการโดเมนลงในแบบจำลองโดเมนนั้นถือว่าเป็นอันตรายโดย Vaughn Vernon (ดู "การใช้การออกแบบที่ขับเคลื่อนด้วยโดเมน, หน้า 387) ในความคิดของฉันความคิดเห็นเหล่านั้นขัดแย้งกันจริงหรือไม่? จะพิจารณาทั้งสองประเด็นได้อย่างไร มันเป็นรูปแบบโดเมนที่สมบูรณ์จริง ๆกับบริการโดเมนฉีดกับแบบจำลองโดเมน anemic และบริการโดเมนปกติหรือไม่

1
Akka obsolesce โบรกเกอร์ข้อความ JMS / AMQP หรือไม่ [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ฉันใช้เวลาหนึ่งสัปดาห์ในการดำน้ำลึกเข้าไปในเอกสาร Akkaและในที่สุดก็เข้าใจว่าระบบของนักแสดงคืออะไรและปัญหาที่พวกเขาแก้ไข ความเข้าใจของฉัน(และประสบการณ์กับ) โบรกเกอร์ข้อความ JMS / AMQP ดั้งเดิมคือพวกเขามีตัวตนเพื่อให้สิ่งต่อไปนี้: การประมวลผลแบบอะซิงโครนัสระหว่างผู้ผลิตและผู้บริโภค และ การรับประกันการส่งข้อความรวมถึงการคงอยู่การลองใหม่และการย้อนกลับ แต่ Akka ไม่ได้ให้สิ่งนี้โดยไม่มีโครงสร้างพื้นฐานที่จำเป็นและค่าใช้จ่ายในการดำเนินงานทั้งหมดหรือไม่ ใน Akka การสื่อสารของนักแสดงทั้งหมดไม่ตรงกันและไม่ปิดกั้น และ ใน Akka SupervisorStrategiesมีอยู่เพื่อบรรลุการลองใหม่อีกครั้งทางเลือกและการเพิ่มระดับ นักแสดงสามารถกำหนดค่าให้คงอยู่กับร้านค้าแทบทุกประเภทหากเป็นข้อกำหนดเช่นกัน นี่ทำให้ฉันสงสัยว่า: หากแอปของฉันใช้ Akka ฉันจำเป็นต้องนำโบรกเกอร์ JMS / AMQP (เช่น ActiveMQ, RabbitMQ, Kafka) เข้ามาในรูปภาพหรือไม่? กล่าวอีกนัยหนึ่งเคยมีกรณีการใช้งานที่แอพที่ใช้ Akka ใหม่จะรับประกันการเปิดตัวของกลุ่มโบรกเกอร์ JMS / AMQP ใหม่หรือไม่ ทำไมหรือทำไมไม่? อาร์กิวเมนต์เดียวอาจเป็นได้ว่าแอป …

2
ลิขสิทธิ์ Ghostscript ในผลิตภัณฑ์เชิงพาณิชย์
เรากำลังศึกษาถึงโอกาสในการใช้ Ghostscript ในผลิตภัณฑ์เชิงพาณิชย์ (แอปพลิเคชันเดสก์ท็อป Windows) ฉันอ่านเกี่ยวกับการเพิกถอนสิทธิ์ใช้งาน GS ทั้งหมดโดยเพียงแค่แนะนำผู้ใช้ว่าพวกเขาสามารถดาวน์โหลดและติดตั้ง GS ด้วยตนเองเพื่อปรับปรุงประสบการณ์ของพวกเขา (ซอฟต์แวร์ใช้งานได้จริงหากไม่มีเช่นกัน แต่ผู้ใช้ส่วนใหญ่ต้องการแสดง / โหลดเอกสาร PDF) ดังนั้นสมมติว่าเราไม่ได้ส่ง Ghostscript ด้วยตัวเอง แต่ให้ทำการตรวจสอบความพร้อมใช้งานของซอฟต์แวร์และในกรณีที่ไม่มีอยู่แนะนำวิธีรับ (ข้อความอธิบายสั้น ๆ และลิงก์ไปยังหน้าดาวน์โหลด) ในกรณีที่ติดตั้งโปรแกรมจะใช้ Ghostscript API สำหรับฉันแล้วมันถูกกฎหมายในขณะที่ Artifex พูดว่า "คุณไม่ได้รับอนุญาตให้ส่ง GS หากใบสมัครของคุณไม่ตรงตามเงื่อนไข" ใครบ้างที่จะแบ่งปันความเห็นเกี่ยวกับเรื่องนี้?
19 licensing 

3
ฐานข้อมูลเชิงสัมพันธ์และการพัฒนาซ้ำ
ในหลาย ๆ แนวทางในการพัฒนาซอฟต์แวร์เช่นวิธีการที่คล่องตัวการออกแบบที่ขับเคลื่อนด้วยโดเมนและการวิเคราะห์และออกแบบเชิงวัตถุเราได้รับการสนับสนุนให้ใช้วิธีการหนึ่งซ้ำเพื่อการพัฒนา ดังนั้นเราไม่ควรที่จะทำให้โมเดลโดเมนของเราถูกต้องในครั้งแรกที่เราเริ่มทำงานในโครงการ แต่เมื่อเวลาผ่านไปเราจะปรับโครงสร้างโมเดลใหม่เนื่องจากเราได้รับความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับโดเมนปัญหาด้วยเวลา นอกเหนือจากนั้นแม้ว่าเราจะพยายามทำให้ได้แบบอย่างที่สมบูรณ์แบบซึ่งฉันเชื่อแล้วว่ามันยากมากความต้องการอาจเปลี่ยนแปลงได้ ดังนั้นหลังจากที่ซอฟแวร์ได้ถูกนำไปใช้เพื่อการผลิต, ผู้ใช้อาจสังเกตเห็นว่าเป็นความต้องการบางอย่างก็ไม่ได้เข้าใจอย่างสมบูรณ์หรือเลว, ความต้องการบางอย่างที่ขาดหายไป ประเด็นตรงนี้คือเราอาจจำเป็นต้องเปลี่ยนรุ่นหลังจากที่ซอฟต์แวร์ได้รับการปรับใช้ หากสิ่งนี้เกิดขึ้นเรามีปัญหา: ฐานข้อมูลการผลิตมีข้อมูลของผู้ใช้ซึ่งมีความสำคัญและติดตั้งในรูปแบบสำหรับรุ่นเก่าแล้ว การอัปเดตรหัสอาจเป็นเรื่องยากหากรหัสไม่ได้รับการออกแบบมาอย่างดีและหากระบบมีขนาดใหญ่ แต่มันสามารถทำได้เมื่อเวลาผ่านไปเรามีเครื่องมือเช่น Git ซึ่งช่วยให้เราทำเช่นนั้นได้โดยไม่สร้างความเสียหายกับเวอร์ชันที่พร้อมใช้งานจริง ในทางกลับกันถ้าโมเดลเปลี่ยนแปลงหากคุณสมบัติของคลาสหายไปหรืออะไรก็ตามฐานข้อมูลก็ควรเปลี่ยนเช่นกัน แต่เรามีปัญหา: มีข้อมูลอยู่ที่นั่นซึ่งไม่สามารถสูญหายได้ซึ่งได้รับการจัดรูปแบบสำหรับรุ่นเก่าแล้ว ดูเหมือนว่าฐานข้อมูลเชิงสัมพันธ์ที่นี่เป็นอุปสรรคที่ขัดขวางเราจากการพัฒนาซ้ำ ๆ และแม้แต่การอัพเดตซอฟต์แวร์เมื่อผู้ใช้ปลายทางต้องการ วิธีหนึ่งที่ฉันเคยใช้คือการเขียนรหัสคลาสพิเศษที่แมปตารางฐานข้อมูลเก่ากับรายการใหม่ ดังนั้นคลาสเหล่านี้จึงเลือกข้อมูลในรูปแบบเก่าแปลงเป็นรูปแบบที่ใช้โดยโมเดลใหม่และบันทึกลงในตารางใหม่ วิธีการนี้ดูเหมือนจะไม่เป็นวิธีที่ดีที่สุด คำถามของฉันที่นี่คือ: มีวิธีใดที่รู้จักกันดีและแนะนำในการกระทบยอดการพัฒนาซ้ำกับฐานข้อมูลเชิงสัมพันธ์?

4
การมีตัวแปรอินสแตนซ์มากเกินไปนำไปสู่การทำซ้ำรหัสได้อย่างไร
ตามRefactoring เพื่อรูปแบบ : เมื่อคลาสพยายามทำมากเกินไปมันมักจะแสดงตัวแปรอินสแตนซ์มากเกินไป เมื่อคลาสมีตัวแปรอินสแตนซ์มากเกินไปรหัสที่ซ้ำกันจะไม่สามารถล้าหลังได้ การมีตัวแปรอินสแตนซ์มากเกินไปนำไปสู่การทำซ้ำรหัสได้อย่างไร

3
ข้อยกเว้น -“ เกิดอะไรขึ้น” กับ“ จะทำอย่างไร”
เราใช้ข้อยกเว้นเพื่อให้ผู้ใช้รหัสสามารถจัดการกับพฤติกรรมที่ไม่คาดคิดในวิธีที่มีประโยชน์ โดยปกติแล้วข้อยกเว้นจะถูกสร้างขึ้นรอบ ๆ สถานการณ์ "เกิดอะไรขึ้น" เช่นFileNotFound(เราไม่พบไฟล์ที่คุณระบุ) หรือZeroDivisionError(เราไม่สามารถดำเนิน1/0การได้) เกิดอะไรขึ้นถ้ามีความเป็นไปได้ที่จะระบุพฤติกรรมที่คาดหวังของผู้บริโภค? ตัวอย่างเช่นสมมติว่าเรามีfetchทรัพยากรซึ่งดำเนินการคำขอ HTTP และส่งคืนข้อมูลที่ดึงมา และแทนที่จะมีข้อผิดพลาดเช่นServiceTemporaryUnavailableหรือRateLimitExceededเราจะยกระดับการRetryableErrorแนะนำผู้บริโภคว่าควรลองใหม่อีกครั้งและไม่สนใจความล้มเหลวที่เฉพาะเจาะจง ดังนั้นเราจึงแนะนำการกระทำให้กับผู้โทรโดยทั่วไป - "สิ่งที่ต้องทำ" เราไม่ได้ทำเช่นนี้บ่อยครั้งเพราะเราไม่รู้ว่าการใช้งานของผู้บริโภคทั้งหมดเป็นอย่างไร แต่ลองจินตนาการว่านี่เป็นส่วนประกอบเฉพาะที่เรารู้ดีที่สุดในการกระทำสำหรับผู้โทรดังนั้นเราควรใช้วิธีการ "ควรทำอย่างไร"?
19 exceptions 

3
มันเป็นสิ่งที่มีเหตุผลหรือไม่ที่จะส่งคืนสตรีมทุกครั้งที่เราจะคืนคอลเล็คชั่น?
ในขณะที่การพัฒนา API ของฉันที่ไม่ได้เชื่อมโยงกับรหัสดั้งเดิมใด ๆ ฉันมักจะพบว่าตัวเองเขียนวิธีการที่ Streams หมดจดไปป์ไลน์โดยการรวบรวมผลลัพธ์ ชอบสิ่งนี้: ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfThing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey) .collect(MyCustomCollectors.toImmutableSet()); } ตอนนี้ลูกค้าส่วนใหญ่ของคลาสนี้มักจะต้องการคอลเล็กชัน (ในกรณีนี้คือ ImmutableSet) เพื่อค้นหาองค์ประกอบและวนซ้ำ แต่ลูกค้าบางรายอาจได้รับประโยชน์จากการมีสตรีมดังนั้นพวกเขาจึงสามารถดำเนินการเพิ่มเติมได้ สตรีมโดยไม่จำเป็นต้องรับสตรีมใหม่จากคอลเล็กชัน ดังนั้นการส่งคืนสตรีมจะให้ตัวเลือกที่เหนือกว่าที่พวกเขามีหากพวกเขาเพิ่งมีการสะสม (หลังจากทั้งหมดพวกเขาสามารถcollect()สตรีมได้เสมอ: Stream<T> deriveSomethingMeaningfulFromPrivateState() { return myPrivateThingies.stream() .map(this::ownerOfthing) .map(Owner::socialStatus) .filter(SocialStatus::isHeAFineMatey); // No collect } วิธีการนี้ดึงดูดให้ฉันลองเพราะฉันไม่เห็นข้อบกพร่องใด ๆ ที่อาจเกิดขึ้น อย่างไรก็ตามฉันไม่เคยเห็นวิธีการนี้ในห้องสมุดใด ๆ (อาจเพราะไม่มีห้องสมุดจำนวนมากที่เผยแพร่หลังจากการปรากฏตัวของ Java 8) ดังนั้นฉันกลัวที่จะยอมรับมัน คลาสไลบรารีที่มีอยู่มักจะส่งคืนคอลเล็กชันเมื่อได้รับบางสิ่งจากสถานะส่วนตัว มีบางสิ่งที่ไม่ดีที่อาจเกิดขึ้นได้หรือไม่หากฉันตัดสินใจคืนสตรีมในที่ใดก็ตามที่ตัวเอง pre-Java-8 …

4
วิธีการทดสอบเมื่อการจัดเรียงข้อมูลยุ่งยากเกินไป?
ฉันกำลังเขียนโปรแกรมแยกวิเคราะห์และเป็นส่วนหนึ่งของที่ฉันมีExpanderชั้นเรียนที่ "ขยาย" คำสั่งที่ซับซ้อนเดียวในงบง่าย ๆ หลาย ๆ ตัวอย่างเช่นมันจะขยายสิ่งนี้: x = 2 + 3 * a เป็น: tmp1 = 3 * a x = 2 + tmp1 ตอนนี้ฉันกำลังคิดเกี่ยวกับวิธีการทดสอบคลาสนี้โดยเฉพาะวิธีการจัดเรียงการทดสอบ ฉันสามารถสร้างแผนภูมิไวยากรณ์อินพุตด้วยตนเองได้: var input = new AssignStatement( new Variable("x"), new BinaryExpression( new Constant(2), BinaryOperator.Plus, new BinaryExpression(new Constant(3), BinaryOperator.Multiply, new Variable("a")))); หรือฉันสามารถเขียนเป็นสตริงและแยกมัน var input = new …


2
เมื่อใดที่จะใช้ [บริสุทธิ์] บนตัวสร้าง?
ฉันกำลังเรียนรู้เกี่ยวกับสัญญารหัสใน. NET และฉันพยายามเข้าใจแนวคิดของผู้สร้างที่บริสุทธิ์ สัญญารหัสเอกสารฯ : วิธีการทั้งหมดที่เรียกว่าภายในสัญญาจะต้องบริสุทธิ์ นั่นคือพวกเขาจะต้องไม่ปรับปรุงสถานะก่อนหน้าใด ๆ วิธีบริสุทธิ์ได้รับอนุญาตให้แก้ไขวัตถุที่สร้างขึ้นหลังจากเข้าสู่วิธีบริสุทธิ์ และPureAttributeเอกสารประกอบฯ : บ่งชี้ว่าชนิดหรือเมธอดนั้นบริสุทธิ์นั่นคือมันไม่ได้ทำการเปลี่ยนแปลงสถานะใด ๆ ที่มองเห็นได้ ฉันเข้าใจข้อความเหล่านี้เมื่อพูดถึงวิธีการ แต่สิ่งที่เกี่ยวกับตัวสร้าง สมมติว่าคุณมีชั้นเรียนเช่นนี้: public class Foo { public int Value { get; set; } public Foo(int value) { this.Value = value; } } คอนสตรัคเตอร์นี้เห็นได้ชัดว่ามีผลต่อสถานะของFooวัตถุใหม่แต่ไม่มีผลข้างเคียงอื่น ๆ (เช่นมันไม่ได้ใช้พารามิเตอร์ใด ๆ หรือเรียกวิธีการที่ไม่บริสุทธิ์) เป็นผู้สมัคร[Pure]หรือไม่? อะไรคือความสำคัญของการวางแอ[Pure]ททริบิวต์ลงในคอนสตรัคเตอร์และเมื่อไหร่ที่ฉันควรทำสิ่งนี้ในโค้ดของตัวเอง?

4
“ ใช้แผนที่แทนคลาสเพื่อแสดงข้อมูล” -Rich Hickey
ในวิดีโอนี้โดย Rich Hickeyผู้สร้าง Clojure เขาแนะนำให้ใช้แผนที่เพื่อแสดงข้อมูลแทนการใช้คลาสเพื่อเป็นตัวแทนของมันดังที่ทำใน Java ฉันไม่เข้าใจว่ามันจะดีกว่านี้ได้อย่างไรเนื่องจากผู้ใช้ API จะรู้ได้อย่างไรว่าปุ่มป้อนข้อมูลคืออะไรหากมีการแสดงเป็นแผนที่ ตัวอย่าง : PersonAPI { Person addPerson(Person obj); Map<String, Object> addPerson(Map<String, Object> personMap); } ในฟังก์ชั่นที่สองผู้ใช้ API จะรู้ได้อย่างไรว่าอินพุตใดที่จะสร้างบุคคล
19 java  design  class  clojure  map 

4
ทำไมเราต้องพูดถึงชนิดข้อมูลของตัวแปรใน C
โดยปกติใน C เราต้องบอกคอมพิวเตอร์ถึงชนิดของข้อมูลในการประกาศตัวแปร เช่นในโปรแกรมต่อไปนี้ฉันต้องการพิมพ์ผลรวมของตัวเลขทศนิยมสองตัว X และ Y #include<stdio.h> main() { float X=5.2; float Y=5.1; float Z; Z=Y+X; printf("%f",Z); } ฉันต้องบอกคอมไพเลอร์ถึงชนิดของตัวแปร X คอมไพเลอร์ไม่สามารถระบุประเภทของXตัวเองได้หรือไม่ ใช่มันสามารถทำได้ถ้าฉันทำสิ่งนี้: #define X 5.2 ตอนนี้ฉันสามารถเขียนโปรแกรมโดยไม่บอกคอมไพเลอร์Xว่าเป็น: #include<stdio.h> #define X 5.2 main() { float Y=5.1; float Z; Z=Y+X; printf("%f",Z); } ดังนั้นเราจะเห็นว่าภาษา C มีคุณสมบัติบางอย่างที่ใช้ซึ่งสามารถกำหนดประเภทของข้อมูลด้วยตัวเอง ในกรณีของฉันมันกำหนดว่าXเป็นประเภทลอย ทำไมเราต้องพูดถึงประเภทของข้อมูลเมื่อเราประกาศบางสิ่งใน main ()? ทำไมถึงไม่สามารถคอมไพเลอร์กำหนดชนิดข้อมูลของตัวแปรในตัวของมันเองเช่นเดียวกับในmain()#define

8
เป็นเรื่องปกติหรือไม่ที่โปรแกรมเมอร์จะไม่มีความคมชัด 100% เหนือรหัสของตัวเองในบางครั้ง? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ฉันไม่ใช่โปรแกรมเมอร์ผู้เชี่ยวชาญดังนั้นนี่อาจเป็นเหตุผล แต่ฉันสังเกตว่าเมื่อใดก็ตามที่ฉันสร้างรหัสที่ซับซ้อน (เช่นเกมหมากรุกที่ฉันเพิ่งทำ) ฉันสามารถเขียนรหัสที่ถูกต้องเพื่อให้โปรแกรมทำงานได้ แม้ว่าฉันจะพบว่าหลังจากนั้น - หรือหลังจากนั้นไม่กี่วินาที! - ฉันมักจะต้องหยุดและคิดว่ามันใช้งานได้อย่างไร? ไม่เพียงแค่นั้น แต่ฉันก็มักจะไม่คิดเกี่ยวกับรหัสและฉันเพิ่งพิมพ์ออกไป ตัวอย่างเช่นในเกมหมากรุกของฉันฉันตัดสินใจที่จะใช้อาเรย์ห้ามิติสำหรับการประมวลผลการเคลื่อนไหวและฉันพบว่าฉันสามารถทำได้โดยไม่ต้องคิดอย่างมีสติ อย่างไรก็ตามเมื่อฉันหยุดและอ่านมันฉันพบว่ามันท้าทายที่จะทำให้ฉันเข้าใจแนวคิดห้ามิติทั้งหมดและฉันใช้เวลาสองสามนาทีในการทำความเข้าใจสิ่งที่ฉันทำและวิธีการทำงานของรหัส เป็นเรื่องปกติหรือไม่ที่โปรแกรมเมอร์เมื่อเขียนโค้ดที่ซับซ้อนเพื่อไม่เข้าใจสิ่งที่พวกเขากำลังทำอยู่ครึ่งเวลา?

5
เป็นความคิดที่ดีหรือไม่ที่จะ“ #define me (* this)”?
แมโครนี้สามารถกำหนดในส่วนหัวร่วมบางส่วนหรือดีกว่าเป็นพารามิเตอร์บรรทัดคำสั่งคอมไพเลอร์: #define me (*this) และตัวอย่างการใช้งาน: some_header.h: inline void Update() { /* ... */ } main.cpp: #include "some_header.h" class A { public: void SetX(int x) { me.x = x; me.Update(); } void SomeOtherFunction() { ::Update(); } /* 100 or more lines ... */ void Update() { // ... } int x; …
19 c++ 

1
การใช้ชนิดที่เป็นเอกลักษณ์เพื่อสร้างความเท่าเทียมที่ปลอดภัย
ฉันสนใจประเภทที่เป็นเอกลักษณ์ซึ่งเป็นทางเลือกแทนพระในภาษาที่ใช้งานได้จริงในบางครั้ง โชคไม่ดีที่นี่เป็นพื้นที่ลึกลับของการวิจัย CS และแหล่งข้อมูลออนไลน์เกี่ยวกับการเขียนโปรแกรมที่มีประเภทที่ไม่ซ้ำใคร เห็นได้ชัดว่าประเภทที่ไม่ซ้ำกันอาจถูกนำมาใช้ในการใช้โครงสร้างข้อมูลแบบรัฐเช่นการอ้างอิง ("กล่อง") และอาร์เรย์ได้อย่างไรแม้ว่ามันจะช่วยฉันได้อย่างไรว่าคุณจะใช้โครงสร้างข้อมูลแบบรัฐอื่น ๆ ร่วมกันอย่างไร มันเป็นไปได้ที่จะใช้เช่นล็อคด้วยประเภทที่ไม่ซ้ำกัน? สามารถใช้ประเภทที่ไม่ซ้ำกันเพื่อแชร์ข้อมูลที่ไม่แน่นอนในเธรดได้หรือไม่? เป็นไปได้หรือไม่ที่จะใช้ชนิดที่ไม่ซ้ำกันเพื่อสร้างการซิงโครไนซ์ดั้งเดิม (เช่น mutexes) หรือจำเป็นต้องส่งข้อความ

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