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

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

3
ทำสำเนาค่าคงที่ระหว่างการทดสอบและรหัสการผลิตหรือไม่
การทำซ้ำข้อมูลระหว่างการทดสอบและรหัสจริงดีหรือไม่ดี ตัวอย่างเช่นสมมติว่าฉันมีคลาส Python FooSaverที่บันทึกไฟล์ด้วยชื่อเฉพาะลงในไดเรกทอรีที่กำหนด: class FooSaver(object): def __init__(self, out_dir): self.out_dir = out_dir def _save_foo_named(self, type_, name): to_save = None if type_ == FOOTYPE_A: to_save = make_footype_a() elif type == FOOTYPE_B: to_save = make_footype_b() # etc, repeated with open(self.out_dir + name, "w") as f: f.write(str(to_save)) def save_type_a(self): self._save_foo_named(a, "a.foo_file") def save_type_b(self): …

4
ค่า“ ความทรงจำ” ในการโปรแกรมเชิงฟังก์ชัน
ฉันตัดสินใจที่จะทำหน้าที่ของการเรียนรู้การเขียนโปรแกรมการทำงาน จนถึงตอนนี้มันช่างระเบิดและฉันก็ 'เห็นแสงสว่าง' เหมือนเดิม น่าเสียดายที่ฉันไม่รู้จักโปรแกรมเมอร์ที่ใช้งานจริงใด ๆ ที่ฉันสามารถตอบคำถามได้ ขอแนะนำ Stack Exchange ฉันกำลังเรียนหลักสูตรการพัฒนาเว็บ / ซอฟต์แวร์ แต่ผู้สอนของฉันไม่คุ้นเคยกับการเขียนโปรแกรมที่ใช้งานได้ เขาสบายดีกับฉันที่ใช้มันและเขาแค่ขอให้ฉันช่วยให้เขาเข้าใจว่ามันทำงานอย่างไรเพื่อให้เขาสามารถอ่านรหัสของฉันได้ดีขึ้น ฉันตัดสินใจว่าวิธีที่ดีที่สุดในการทำเช่นนี้คือการแสดงฟังก์ชั่นทางคณิตศาสตร์อย่างง่ายเช่นการเพิ่มคุณค่าให้กับพลัง ในทางทฤษฎีฉันสามารถทำได้อย่างง่ายดายด้วยฟังก์ชันที่สร้างไว้ล่วงหน้า แต่นั่นจะเอาชนะวัตถุประสงค์ของตัวอย่างได้ อย่างไรก็ตามฉันมีปัญหาในการหาวิธีการเก็บค่า ตั้งแต่นี่คือการเขียนโปรแกรมการทำงานฉันไม่สามารถเปลี่ยนตัวแปร หากฉันต้องเขียนโค้ดแบบนี้มันจะมีลักษณะดังนี้: (ต่อไปนี้เป็นรหัสเทียมทั้งหมด) f(x,y) { int z = x; for(int i = 0, i < y; i++){ x = x * z; } return x; } ในการเขียนโปรแกรมการใช้งานฉันไม่แน่ใจ นี่คือสิ่งที่ฉันมาด้วย: f(x,y,z){ if z …

8
มีวิธีที่ง่ายกว่าในการทดสอบการตรวจสอบอาร์กิวเมนต์และการเริ่มต้นฟิลด์ในวัตถุที่ไม่เปลี่ยนรูปแบบหรือไม่?
โดเมนของฉันประกอบด้วยคลาสที่ไม่เปลี่ยนรูปแบบง่าย ๆ มากมายเช่นนี้ public class Person { public string FullName { get; } public string NameAtBirth { get; } public string TaxId { get; } public PhoneNumber PhoneNumber { get; } public Address Address { get; } public Person( string fullName, string nameAtBirth, string taxId, PhoneNumber phoneNumber, Address address) { …
20 c#  unit-testing 

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

5
ทำไมประเภทจะควบคู่ไปกับการสร้าง?
ฉันเพิ่งลบคำตอบjavaของฉันในการตรวจสอบรหัสที่เริ่มต้นเช่นนี้: private Person(PersonBuilder builder) { หยุด. ธงแดง PersonBuilder จะสร้างบุคคล มันรู้เกี่ยวกับบุคคล คลาส Person ไม่ควรรู้อะไรเกี่ยวกับ PersonBuilder - เป็นเพียงประเภทที่ไม่เปลี่ยนรูป คุณสร้างคัปปลิ้งแบบวงกลมตรงนี้โดยที่ A ขึ้นอยู่กับ B ซึ่งขึ้นอยู่กับ A บุคคลนั้นควร จำกัด พารามิเตอร์ของตน ลูกค้าที่เต็มใจสร้างบุคคลโดยไม่สร้างมันควรจะสามารถทำเช่นนั้นได้ ฉันถูกตบด้วย downvote และบอกว่า (อ้างถึง) การตั้งค่าสถานะสีแดงทำไม? การใช้งานที่นี่มีรูปร่างเดียวกับที่ Joshua Bloch แสดงในหนังสือ "Effective Java" ของเขา (รายการ # 2) ดังนั้นดูเหมือนว่าวิธีที่ถูกต้องในการนำรูปแบบการสร้างมาใช้ใน Java คือการสร้างชนิดซ้อน (นี่ไม่ใช่สิ่งที่คำถามนี้เกี่ยวกับว่า) และจากนั้นสร้างผลิตภัณฑ์ (คลาสของวัตถุที่ถูกสร้างขึ้น ) ใช้การพึ่งพาผู้สร้างเช่นนี้ private …

3
อะไรคือสาเหตุที่ทำให้สแต็ก Java / Linux ล้มเหลวที่จะ "เรียลไทม์"?
ฉันเคยได้ยินนักพัฒนาพูดถึงว่า Java ไม่สามารถ " ทำแบบเรียลไทม์ " ซึ่งหมายความว่าแอป Java ที่ทำงานบน Linux ไม่สามารถตอบสนองความต้องการของระบบเรียลไทม์ที่กำหนดขึ้นเช่นสิ่งที่รันบน RIOT-OS เป็นต้น ฉันกำลังพยายามที่จะเข้าใจว่าทำไม SWAGของฉันบอกฉันว่านี่อาจเป็นเพราะส่วนใหญ่ของ Garbage Collector ของ Java ซึ่งสามารถทำงานได้ตลอดเวลาและหยุดระบบโดยสิ้นเชิง และถึงแม้ว่าจะมีสิ่งที่เรียกว่า "GCS ที่หยุดชั่วคราว" แต่ฉันก็ไม่จำเป็นต้องเชื่อโฆษณาของพวกเขาและยังไม่มีอินสแตนซ์ $ 80K-per-JVM เพื่อแยกโครงการงานอดิเรก! ผมยังอ่านบทความนี้เกี่ยวกับการใช้ซอฟแวร์เสียงหึ่งๆบน Linux ในบทความนั้นผู้เขียนอธิบายสถานการณ์ที่ลีนุกซ์เกือบทำเสียงขึ้นจมูกชนเข้ากับรถ: ฉันเรียนรู้บทเรียนที่ยากลำบากหลังจากเลือกที่จะทำลูปควบคุมระดับต่ำ (PIDs) บน Pi - พยายามที่จะฉลาดฉันตัดสินใจใส่บันทึกการเขียนที่อยู่ตรงกลางของลูปสำหรับการดีบั๊ก - Quad เริ่มต้นดี แต่แล้ว Linux ก็ตัดสินใจ ใช้เวลา 2 วินาทีในการเขียนบันทึกรายการหนึ่งและรูปสี่เหลี่ยมเกือบชนเข้ากับรถของฉัน! ตอนนี้ถึงแม้ว่าผู้เขียนคนนั้นเขียนซอฟต์แวร์เสียงพึมพำของเขาใน C ++ แต่ฉันนึกภาพว่าแอป Java …
20 java  linux  real-time 

4
การใช้ไฟล์แฟลตเทียบกับฐานข้อมูล / API เป็นการขนส่งระหว่างส่วนหน้าและส่วนหลัง
ฉันมีแอปพลิเคชั่นที่สร้างการสนทนาที่ค่อนข้างร้อนแรงระหว่างนักพัฒนาสองคน โดยทั่วไปจะแบ่งเป็นเลเยอร์เว็บและเลเยอร์แบ็กเอนด์ เลเยอร์เว็บรวบรวมข้อมูลโดยแบบฟอร์มเว็บอย่างง่ายหยุดข้อมูลนี้เป็นเอกสาร JSON (แท้จริงไฟล์. json) ลงในโฟลเดอร์เฝ้าดูที่ใช้โดยส่วนหลัง ส่วนหลังทำการสำรวจโฟลเดอร์นี้ทุกสองสามวินาทีหยิบไฟล์ขึ้นมาและทำหน้าที่ของมัน ตัวไฟล์เองนั้นง่ายมาก (เช่นข้อมูลสตริงทั้งหมด, ไม่มีการซ้อน), และประมาณ 1-2k ที่ใหญ่ที่สุด, โดยระบบใช้เวลาส่วนใหญ่ในการใช้งาน (แต่การกระจายข้อความสูงสุด 100 ข้อความในเวลาใดก็ตาม) ขั้นตอนการประมวลผลส่วนหลังใช้เวลาประมาณ 10 นาทีต่อข้อความ ข้อโต้แย้งเกิดขึ้นเมื่อผู้พัฒนารายหนึ่งแนะนำว่าการใช้ระบบไฟล์เป็นเลเยอร์การส่งข้อความเป็นวิธีแก้ปัญหาที่ไม่ดีเมื่อบางสิ่งเช่นฐานข้อมูลเชิงสัมพันธ์ (MySQL), ฐานข้อมูล noSQL (Redis) หรือแม้แต่การเรียก REST API ธรรมดาควรใช้แทน ควรสังเกตว่า Redis ถูกใช้ที่อื่นในองค์กรสำหรับการจัดการข้อความที่อยู่ในคิว ข้อโต้แย้งที่ฉันได้ยินแตกออกเป็นดังนี้ ในความโปรดปรานของไฟล์แบน: ไฟล์แบบเรียบมีความน่าเชื่อถือมากกว่าโซลูชันอื่น ๆ เนื่องจากไฟล์จะถูกย้ายจากโฟลเดอร์ "เฝ้าดู" ไปยังโฟลเดอร์ "กำลังดำเนินการ" หลังจากที่รับแล้วและท้ายที่สุดไปยังโฟลเดอร์ "เสร็จสิ้น" เมื่อเสร็จสิ้น ไม่มีความเสี่ยงของข้อความที่จะหายไปยกเว้นข้อผิดพลาดในระดับต่ำมากซึ่งจะทำลายสิ่งอื่น ๆ อย่างไรก็ตาม ไฟล์แบบแฟลตต้องการความซับซ้อนทางเทคนิคที่น้อยกว่าในการทำความเข้าใจ - เพียงแค่catมัน …

5
กรณีพิเศษที่มีทางเลือกล้มเหลวละเมิดหลักการทดแทน Liskov หรือไม่?
สมมติว่าฉันมีอินเทอร์เฟซFooInterfaceที่มีลายเซ็นต่อไปนี้: interface FooInterface { public function doSomething(SomethingInterface something); } และคลาสรูปธรรมConcreteFooที่ใช้ส่วนต่อประสานนั้น: class ConcreteFoo implements FooInterface { public function doSomething(SomethingInterface something) { } } ฉันต้องการConcreteFoo::doSomething()ทำสิ่งที่ไม่ซ้ำกันหากผ่านSomethingInterfaceวัตถุชนิดพิเศษ(สมมติว่ามันถูกเรียกว่าSpecialSomething) มันเป็นการละเมิด LSP อย่างแน่นอนถ้าฉันเพิ่มเงื่อนไขของวิธีการหรือสร้างข้อยกเว้นใหม่ แต่มันจะเป็นการละเมิด LSP หรือไม่ถ้าฉันใส่SpecialSomethingวัตถุพิเศษในขณะที่ให้ทางเลือกสำหรับSomethingInterfaceวัตถุทั่วไป? สิ่งที่ต้องการ: class ConcreteFoo implements FooInterface { public function doSomething(SomethingInterface something) { if (something instanceof SpecialSomething) { // Do SpecialSomething magic } …

1
ความแตกต่างระหว่าง <คืออะไร ขยาย Foo> และ <Foo>
ฉันดูเหมือนจะมีความเข้าใจผิดเกี่ยวกับความแตกต่างระหว่างและ&lt;Foo&gt; &lt;? extends Foo&gt;จากความเข้าใจของฉันถ้าเรามี ArrayList&lt;Foo&gt; foos = new ArrayList&lt;&gt;(); สิ่งนี้บ่งชี้ว่าวัตถุประเภทFooสามารถเพิ่มในรายการอาร์เรย์นี้ เนื่องจากคลาสย่อยของFooยังเป็นประเภทFooจึงสามารถเพิ่มได้โดยไม่มีข้อผิดพลาดตามที่แสดงใน ArrayList&lt;Foo&gt; foos = new ArrayList&lt;&gt;(); foos.add(new Foo()); foos.add(new Bar()); Bar extends Fooที่ไหน ตอนนี้พูดว่าฉันได้กำหนดไว้foosเป็น ArrayList&lt;? extends Foo&gt; foos = new ArrayList&lt;&gt;(); some unknown type that extends Fooเข้าใจในปัจจุบันของฉันคือเป็นการแสดงออกที่ว่านี้ ฉันใช้สิ่งนี้เพื่อหมายความว่าวัตถุใด ๆ ที่เป็น subclass ของFooสามารถเพิ่มลงในรายการนี้; หมายความว่ามีความแตกต่างระหว่างไม่มีและArrayList&lt;Foo&gt;ArrayList&lt;? extends Foo&gt; เพื่อทดสอบสิ่งนี้ฉันพยายามเขียนรหัสต่อไปนี้ ArrayList&lt;? extends Foo&gt; subFoos …
20 java  generics 

1
มาตรฐานในการจัดการกับ pluralia tantum ในรหัสของคุณคืออะไร [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว เมื่อใช้ตัวแปรที่มีพหูพจน์และเอกพจน์เหมือนกันคุณจะตั้งชื่อพวกเขาอย่างไร มีมาตรฐานออกมาบ้างไหม? ตัวอย่างเช่น: Series[] series // Plural Series series // Singular ลึก: หากต้องการเจาะจงชุดของฉันจะต้องเรียกว่าชุด (เนื่องจากการจัดรูปแบบ JSON) คุณจะพิจารณาตั้งชื่อรูปแบบเอกพจน์ของซีรี่ส์ที่เพิ่มเข้าไปในคอลเลกชันSeries sหรือไม่ ในขณะที่: List&lt;Series&gt; series = new List&lt;Series&gt;(); Series s; while (someBool) { s = new Series(); s.Name = "Name"; while (anotherBool) { s.AddValue(someValue); } series.Add(s); }

3
วิธีจัดเก็บข้อมูลที่สั่งซื้อในฐานข้อมูลเชิงสัมพันธ์
ฉันพยายามที่จะเข้าใจวิธีการจัดเก็บข้อมูลที่สั่งซื้ออย่างถูกต้องในฐานข้อมูลเชิงสัมพันธ์ ตัวอย่าง: สมมติว่าฉันมีเพลย์ลิสต์ประกอบด้วยเพลง ภายในฐานข้อมูลเชิงสัมพันธ์ของฉันฉันมีสารบัญPlaylistsประกอบด้วยข้อมูลเมตาบางส่วน (ชื่อผู้สร้าง ฯลฯ ) ฉันยังมีตารางที่เรียกว่าSongsที่มีข้อมูลplaylist_idรวมถึงข้อมูลเฉพาะเพลง (ชื่อศิลปินระยะเวลา ฯลฯ ) ตามค่าเริ่มต้นเมื่อมีการเพิ่มเพลงใหม่ลงในเพลย์ลิสต์เพลงจะถูกต่อท้าย เมื่อสั่งซื้อบน Song-ID (น้อยไปหามาก) คำสั่งซื้อจะเป็นลำดับของการเพิ่ม แต่ถ้าหากผู้ใช้สามารถสั่งซื้อเพลงในรายการเพลงได้อีกครั้ง ฉันคิดไอเดียสองสามข้อแต่ละข้อมีข้อดีและข้อเสีย: คอลัมน์เรียกว่าorderซึ่งเป็นจำนวนเต็ม เมื่อเพลงถูกย้ายลำดับของเพลงทั้งหมดระหว่างตำแหน่งเก่าและตำแหน่งใหม่จะเปลี่ยนไปเพื่อให้สอดคล้องกับการเปลี่ยนแปลง ข้อเสียของเรื่องนี้คือต้องมีการค้นหาจำนวนมากในแต่ละครั้งที่มีการย้ายเพลงและอัลกอริทึมการย้ายนั้นไม่สำคัญกับตัวเลือกอื่น ๆ คอลัมน์ที่เรียกว่าorderซึ่งเป็นทศนิยม ( NUMERIC) เมื่อเพลงถูกย้ายมันจะถูกกำหนดค่าจุดลอยตัวระหว่างตัวเลขสองตัวที่อยู่ติดกัน ข้อเสียเปรียบ: เขตข้อมูลทศนิยมใช้เนื้อที่มากขึ้นและอาจเป็นไปได้ที่จะใช้ความแม่นยำจนหมดเว้นแต่จะได้รับการดูแลเพื่อกระจายช่วงใหม่หลังจากการเปลี่ยนแปลงทุกครั้ง อีกวิธีหนึ่งก็คือการมีpreviousและnextฟิลด์ที่อ้างอิงเพลงอื่น ๆ (หรือเป็น NULL ในกรณีของเพลงแรก, resp. เพลงสุดท้ายในเพลย์ลิสต์ในขณะนี้โดยทั่วไปคุณสร้างรายการที่ลิงก์ ) ข้อเสียเปรียบ: ข้อความค้นหาเช่น 'find Xth Song ในรายการ' ไม่ใช่เวลาคงที่อีกต่อไป แต่จะเป็นเวลาเชิงเส้นแทน ขั้นตอนใดที่ใช้บ่อยที่สุดในการปฏิบัติ? ขั้นตอนใดที่เร็วที่สุดสำหรับฐานข้อมูลขนาดกลางถึงขนาดใหญ่ มีวิธีอื่นอีกไหมในการเก็บเรื่องนี้? แก้ไข:เพื่อความง่ายในตัวอย่างเพลงเป็นของเพลย์ลิสต์เดียวเท่านั้น (ความสัมพันธ์แบบหนึ่งต่อหนึ่ง) แน่นอนเราสามารถใช้ …

3
Generics vs อินเตอร์เฟสทั่วไป?
ฉันจำไม่ได้เมื่อฉันเขียนชั้นเรียนทั่วไปครั้งที่แล้ว ทุกครั้งที่ฉันคิดว่าฉันต้องการมันหลังจากที่ฉันคิดว่าจะทำข้อสรุปที่ฉันทำไม่ได้ คำตอบที่สองสำหรับคำถามนี้ทำให้ฉันต้องขอคำชี้แจง (เนื่องจากฉันยังไม่สามารถแสดงความคิดเห็นได้ฉันจึงได้ตั้งคำถามใหม่) ดังนั้นลองใช้โค้ดที่ได้รับเป็นตัวอย่างของกรณีที่ใครต้องการยาชื่อสามัญ: public class Repository&lt;T&gt; where T : class, IBusinessOBject { T Get(int id) void Save(T obj); void Delete(T obj); } มันมีข้อ จำกัด ประเภท: IBusinessObject วิธีคิดตามปกติของฉันคือคลาสมีข้อ จำกัด ในการใช้IBusinessObjectดังนั้นคลาสที่ใช้สิ่งนี้Repositoryคือ พื้นที่เก็บข้อมูลเก็บลูกค้าเหล่านี้IBusinessObjectส่วนใหญ่ของสิ่งนี้Repositoryจะต้องการรับและใช้วัตถุผ่านIBusinessObjectอินเตอร์เฟซ ดังนั้นทำไมไม่เพียงเพื่อ public class Repository { IBusinessOBject Get(int id) void Save(IBusinessOBject obj); void Delete(IBusinessOBject obj); } ถึงแม้ว่าตัวอย่างจะไม่ดีเนื่องจากเป็นเพียงคอลเล็กชันอื่นและคอลเล็กชันทั่วไปคือคลาสสิก ในกรณีนี้ประเภทของข้อ จำกัด …

2
ทำไมสวิฟต์ไม่ต้องใช้เครื่องหมายอัฒภาค? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว ปกติฉันเขียนโค้ดใน c # หรือ Objective-C และเมื่อเร็ว ๆ นี้ฉันได้เรียนรู้ภาษาการเขียนโปรแกรมใหม่ของ Apple - Swift สิ่งแรกที่ฉันสังเกตเห็นคือคุณไม่จำเป็นต้องเพิ่มเครื่องหมายอัฒภาคเพื่อจบบรรทัดใน Swift แต่ถ้าคุณทำอย่างน้อยจากสิ่งที่ฉันทดสอบ - มันไม่รบกวนคอมไพเลอร์ เมื่อฉันเขียน: int someNumber = 0; ใน Objective-C เครื่องหมายอัฒภาคจะบอกโปรแกรมว่าบรรทัดนั้นสิ้นสุดลงและจะไม่ผ่านไปยังบรรทัดถัดไป ด้วย Swift ฉันสามารถประกาศตัวแปรด้วย var someNumber:Int = 5 และไม่เพิ่มเซมิโคลอนและระบบรู้ว่านี่คือจุดสิ้นสุดของบรรทัด อะไรทำให้บางภาษาทำสิ่งนี้และคนอื่น ๆ ไม่ได้? ทำไมไม่เก็บระบบที่เป็นรูปแบบเดียวกันของการเพิ่มเครื่องหมายอัฒภาคไว้ที่ท้าย?

1
Haskell สร้างและสร้างสภาพแวดล้อมที่คล้ายคลึงกับ Maven
ฉันเคยเป็นนักพัฒนา Java มานาน แต่เมื่อเร็ว ๆ นี้ฉันเข้าร่วมทีม Haskell ในโลกของจาวาถ้าคุณมีโครงการขนาดใหญ่โดยมีหลายทีมที่ทำงานอยู่วิธีการทั่วไปคือการใช้เซิร์ฟเวอร์สิ่งประดิษฐ์เช่น Maven เพื่อความสะดวกและรวดเร็วในการพัฒนา เครื่องมือสร้างจำนวนมากเช่น Ant, Maven, Gradle สามารถสร้างโครงการและอัปโหลดไฟล์ jar ไปยังเซิร์ฟเวอร์สิ่งประดิษฐ์ที่สามารถใช้งานโดยส่วนที่เหลือของทีมโดยไม่มีความเจ็บปวด ดังนั้นโดยการแยกโครงการออกเป็นโครงการย่อยขนาดเล็กเวลาสร้างจะลดลงอย่างมาก ในด้านของ Haskell เราใช้cabalเพื่อสร้างโครงการ โครงการของเราใช้เวลาในการสร้างประมาณ 10-15 นาทีโดยไม่มีการเพิ่มประสิทธิภาพ ใช้เวลาสองสามชั่วโมงหากเปิดการปรับแต่งคอมไพเลอร์ซึ่งเป็นเรื่องเจ็บปวด ฉันสงสัยว่าเราจะทำสิ่งเดียวกันกับที่เราทำใน Java ที่นี่ได้อย่างไร มีวิธีง่าย ๆ ในการรวบรวมและอัปโหลดไบนารีของแพ็คเกจ (ไลบรารี) ไปยังเซิร์ฟเวอร์สิ่งประดิษฐ์และใช้ไบนารีที่สร้างไว้ล่วงหน้าในเวลาบิลด์หรือไม่ ฉันรู้ว่าเนื่องจาก Haskell สร้างรหัสเครื่อง (แทนที่จะเป็นรหัสไบต์ใน Java) อาจมีปัญหาความเข้ากันได้ แต่เราอาจมีไบนารีต่างกันสำหรับสถาปัตยกรรม / ระบบปฏิบัติการต่าง ๆ ที่เก็บไว้ในเซิร์ฟเวอร์ส่วน

1
ความแตกต่างระหว่าง API เกตเวย์และ ESB หรือไม่ [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัพเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน5 ปีที่ผ่านมา บริษัท ที่ฉันทำงานอยู่กำลังประเมินโซลูชันมิดเดิลแวร์สำหรับการวัดการวัดและความปลอดภัยของบริการบนเว็บ ขณะนี้เรากำลังใช้ Enterprise Service Bus (ESB) เพื่อจุดประสงค์นี้ แต่มีผู้บริหารที่ยอดเยี่ยมบางคนตัดสินใจว่าพวกเขาจะปรับใช้ API Management Middleware บางส่วน ฉันค้นคว้าข้อมูลเล็กน้อยเกี่ยวกับโซลูชันการจัดการ API (หรือที่รู้จักว่าเกตเวย์ API) แต่ไม่พบความแตกต่างระหว่างสิ่งเหล่านี้กับ ESB จริง ฉันประเมินเอกสารสีขาวจาก Mule, WSO2, Oracle เป็นต้น แต่คุณสมบัติที่นำเสนอโดยผลิตภัณฑ์ทั้งสองดูเหมือนจะใกล้เคียงกัน คำถามคือสิ่งที่การจัดการ API สามารถทำสิ่งที่ ESB ไม่สามารถทำได้และในทางกลับกัน? สามารถเพิ่มมูลค่าอะไรลงในโครงสร้างพื้นฐานด้านไอทีโดยแทนที่ ESB สำหรับ API เกตเวย์

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