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

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

4
ฉันจะเก็บข้อมูลแบบอ่านอย่างเดียวเพื่อปรับใช้กับแอปพลิเคชันของฉันได้อย่างไร
ฉันกำลังพัฒนาแอปพลิเคชันบนเดสก์ท็อปและแอปพลิเคชันนี้ต้องการข้อมูลบางอย่างที่จะเรียกใช้ แต่ไม่เปลี่ยนแปลงข้อมูลใด ๆ (ข้อมูลจะต้องโหลดทุกครั้งที่เรียกใช้แอป แต่ไม่มีการเปลี่ยนแปลงข้อมูล) ข้อมูลจะต้องเก็บไว้ในคอมพิวเตอร์เครื่องเดียวกับที่แอพกำลังทำงานอยู่ (ที่เก็บข้อมูลฝั่งไคลเอ็นต์หรือไม่) นอกจากนี้ยังเป็นการดีกว่าหากผู้ใช้ไม่สามารถเปลี่ยนข้อมูลนี้ได้อย่างง่ายดาย (สมมติว่าพวกเขาไม่มีความรู้ด้านไอทีมาก) ฉันจะเก็บข้อมูลประเภทนี้ได้อย่างไร ฐานข้อมูลท้องถิ่น XML ที่ส่งมาพร้อมกับแอปพลิเคชันหรือไม่ ฉันใช้ WPF
17 c#  design  data  wpf 

1
RESTful HTTP และ websocket ในแอปพลิเคชันเดียวกันหรือไม่
หากแอปพลิเคชันเปิดWebSocketฟีดสดอยู่แล้วฉันควรใช้แอปพลิเคชันนั้นAJAXเพื่อการสื่อสารอื่น ๆ กับเซิร์ฟเวอร์หรือไม่ เนื่องจากการเชื่อมต่อเปิดอยู่แล้วเราควรใช้สำหรับการร้องขอที่Request/Responseไม่ใช่แบบเรียลไทม์หรือไม่ ฉันชอบRESTful HTTPคำขอมากกว่าเพราะฉันพบข้อผิดพลาดได้ง่ายกว่า คุณสามารถใช้เบราว์เซอร์ที่มี URL หรือหยิกเพื่อทดสอบว่า API ส่งคืนอะไร WebSocketคุณไม่จำเป็นต้องเขียนโค้ดเพื่อเปิด มันจะแปลกที่จะมีRESTful HTTP APIและWebSocketในการประยุกต์ใช้กันได้หรือไม่
17 rest  ajax  websockets 

1
ปั๊มรองพื้นคืออะไร? บางครั้งเรียกว่าอ่านรองพื้น
ฉันได้รับการสอนการแสดงออกและรูปแบบวิธีการในวันนี้ แน่นอนว่าชื่อนี้มาจากปั๊มเก่าที่ต้องเติมน้ำไว้ก่อนที่จะสูบน้ำได้ แต่ใครจะสนใจ? เรากำลังพูดถึงรหัสที่นี่ ตัวอย่างที่ดีจริง ๆ และคำอธิบายเกี่ยวกับรูปแบบที่สำเร็จจะได้รับการต้อนรับ รูปแบบนี้ได้รับการยกย่องในวันนี้อย่างไร รองพื้นบางครั้งจะได้รับการทำงานที่มีข้อบกพร่องห่วง แต่ค่าใช้จ่ายของแห้ง ดังนั้นอาจเป็นการหยุดสั้น ๆ ระหว่างทางไปสู่การออกแบบที่ดีกว่า นี่ถือว่าเป็นรูปแบบการต่อต้านหรือไม่? มีทางเลือกอื่นอีกไหม?

1
เหตุใด Math.min จึงทำงานกับอาร์เรย์องค์ประกอบเดียว
ตามMDN Math.min NaNยอมรับตัวเลขเท่านั้นและหากมีข้อโต้แย้งไม่ได้เป็นจำนวนก็จะกลับมา มันเป็นความจริงว่าถ้าเราผ่านอาร์เรย์มีหลายหมายเลขเราได้รับNaNเช่นนี้Math.min([1,2])แต่ถ้าเราใช้อาร์เรย์ที่มีเพียงหนึ่งหมายเลขจะกลับตัวเลขในอาร์เรย์เช่นในตัวอย่างนี้:Math.min Math.min([5])ใครบ้างมีความคิดว่าทำไมเราถึงเห็นพฤติกรรมที่ไม่มีเอกสารนี้
17 javascript  math 

2
หลักการของความประหลาดใจน้อยที่สุด (POLA) และส่วนต่อประสาน
ไตรมาสที่ดีของศตวรรษที่ผ่านมาเมื่อฉันเรียนรู้ C ++ ฉันได้รับการสอนว่าอินเตอร์เฟสควรจะให้อภัยและเท่าที่เป็นไปได้ไม่สนใจเกี่ยวกับลำดับที่วิธีการนั้นถูกเรียกเนื่องจากผู้บริโภคอาจไม่สามารถเข้าถึงแหล่งข้อมูลหรือเอกสารแทน นี้. อย่างไรก็ตามเมื่อใดก็ตามที่ฉันให้คำปรึกษาผู้เขียนโปรแกรมรุ่นเยาว์และผู้พัฒนาระดับสูงจะได้ยินฉันพวกเขามีปฏิกิริยากับความประหลาดใจซึ่งทำให้ฉันสงสัยว่านี่เป็นเรื่องจริงหรือไม่ ชัดเจนเหมือนโคลน พิจารณาอินเทอร์เฟซด้วยวิธีการเหล่านี้ (สำหรับการสร้างไฟล์ข้อมูล): OpenFile SetHeaderString WriteDataLine SetTrailerString CloseFile ตอนนี้คุณสามารถแน่นอนเพียงไปถึงเหล่านี้ในการสั่งซื้อ แต่บอกว่าคุณไม่สนใจเกี่ยวกับชื่อไฟล์ (คิดว่าa.out) AddDataLineหรือสิ่งที่หัวและสตริงรถพ่วงถูกรวมคุณสามารถเพียงแค่โทร ตัวอย่างที่มีความรุนแรงน้อยกว่าอาจมองข้ามส่วนหัวและส่วนท้าย อาจมีอีกอย่างหนึ่งอาจตั้งค่าสตริงส่วนหัวและส่วนท้ายก่อนที่จะเปิดไฟล์ นี่เป็นหลักการของการออกแบบส่วนต่อประสานที่ได้รับการยอมรับหรือเป็นวิธี POLA ก่อนที่จะได้รับชื่อหรือไม่? NB ไม่จมลงในส่วนย่อยของอินเทอร์เฟซนี้มันเป็นเพียงตัวอย่างเพื่อประโยชน์ของคำถามนี้

8
ฉันจะเขียนการทดสอบกับบริการที่สอดคล้องกันในที่สุดได้อย่างไร
ฉันกำลังสร้างบริการที่อยู่ด้านบนของ Google App Engine Datastore ซึ่งเป็นที่เก็บข้อมูลที่สอดคล้องกันในที่สุด สำหรับแอปพลิเคชันของฉันนี่ใช้ได้ อย่างไรก็ตามฉันกำลังพัฒนาแบบทดสอบที่ทำสิ่งต่าง ๆ เช่นวัตถุ PUT จากนั้นรับวัตถุและตรวจสอบคุณสมบัติบนวัตถุที่ส่งคืน น่าเสียดายที่ในที่สุดเนื่องจากที่เก็บข้อมูลมีความสอดคล้องกันการทดสอบอย่างง่ายเหล่านี้จึงไม่สามารถทำซ้ำได้ คุณจะทดสอบบริการที่สอดคล้องกันได้อย่างไรในที่สุด?

5
ฟังก์ชั่นไม่บริสุทธิ์ทันทีหากใช้ฟังก์ชั่นเป็นพารามิเตอร์หรือไม่?
เนื่องจากความบริสุทธิ์ของพารามิเตอร์อินพุตนั้นไม่เป็นที่รู้จักจนกระทั่งรันไทม์เป็นฟังก์ชันที่ถือว่าไม่บริสุทธิ์ทันทีหากใช้ฟังก์ชันเป็นพารามิเตอร์อินพุตหรือไม่ ที่เกี่ยวข้อง: ถ้าฟังก์ชั่นใช้ฟังก์ชั่นบริสุทธิ์ที่กำหนดไว้ด้านนอกของฟังก์ชั่น แต่ไม่ได้ผ่านเป็นพารามิเตอร์มันยังคงบริสุทธิ์ถ้ามันเป็นไปตามเกณฑ์ของการไม่มีผลข้างเคียงและเอาท์พุทขึ้นอยู่กับอินพุตเท่านั้น? สำหรับบริบทฉันกำลังเขียนโค้ดฟังก์ชันใน JavaScript

7
เมื่อใดฉันจึงควรใช้ DBIx :: Class ของ Perl
DBIx :: ชั้นเป็นอินเตอร์เฟซ Perl นิยมไปยังฐานข้อมูลใด ๆ ที่คุณสามารถเชื่อมต่อผ่านDBI มีเอกสารที่ดีสำหรับรายละเอียดทางเทคนิค แต่มีข้อมูลเกี่ยวกับการใช้งานที่เหมาะสม (รวมถึงสถานการณ์ที่คุณอาจไม่ต้องการ) ในหลาย ๆ สถานการณ์ผู้คนจะเข้าถึงมันอย่างถี่ถ้วนเพราะพวกเขาคิดว่าพวกเขาควรใช้มันสำหรับทุกสิ่งที่เกี่ยวข้องกับฐานข้อมูล อย่างไรก็ตามฉันมักจะเห็นว่ามันใช้ผิดวัตถุประสงค์จนถึงจุดที่มันกลายเป็นจุดปวด คำถามของฉันในระหว่างการตรวจสอบโค้ดและสถาปัตยกรรมอยู่เสมอ "อะไรคือประโยชน์ที่ฟูให้คุณ?" บ่อยครั้งที่นักพัฒนาที่ฉันเห็นในสถานการณ์เหล่านี้ไม่สามารถสร้างคำตอบที่สอดคล้องกันได้ แต่บ่อยครั้งที่พวกเขาไม่เข้าใจ SQL อย่างง่าย ในช่วงสองสามเดือนที่ผ่านมาฉันถามคนอื่นว่า "ทำไมคุณถึงใช้ DBIx :: Class?" และได้รับคำตอบที่ดีเพียงคำเดียวเท่านั้น (และบุคคลนั้นก็สามารถตอบกลับการติดตาม "เมื่อใดที่คุณจะไม่ใช้") Peter Rabbitson ผู้พัฒนานำได้ใกล้กับคำตอบในการสัมภาษณ์ของเขาเกี่ยวกับFLOSS Weeklyแต่มันถูกฝังอยู่เล็กน้อยในระหว่างการสัมภาษณ์ ดังนั้นฉันจะตัดสินใจได้อย่างไรว่าการใช้ DBIx :: Class นั้นเหมาะสมกับโครงการหรือไม่?
17 perl 

4
ประโยชน์ของรูปแบบ IO monad สำหรับการจัดการผลข้างเคียงทางวิชาการล้วนๆหรือไม่?
ขออภัยสำหรับคำถามข้างเคียงอีกคำถามของ FP + แต่ฉันไม่พบคำถามที่มีอยู่ซึ่งตอบคำถามนี้ให้ฉันได้ ความเข้าใจของฉัน (จำกัด ) ของการเขียนโปรแกรมเชิงฟังก์ชันคือผลกระทบของรัฐ / ผลข้างเคียงควรถูกย่อให้เล็กสุดและแยกจากตรรกะไร้สัญชาติ ฉันยังรวบรวมวิธีการของ Haskell เพื่อทำสิ่งนี้ IO monad ประสบความสำเร็จในการทำสิ่งนี้ด้วยการห่อตัวการกระทำแบบ stateful ไว้ในคอนเทนเนอร์เพื่อการดำเนินการในภายหลังโดยพิจารณานอกขอบเขตของโปรแกรม ฉันพยายามที่จะเข้าใจรูปแบบนี้ แต่จริงๆแล้วเพื่อตรวจสอบว่าจะใช้ในโครงการ Python หรือไม่ดังนั้นต้องการหลีกเลี่ยง Haskell ถ้ามี ตัวอย่างที่เข้ามาหยาบ หากโปรแกรมของฉันแปลงไฟล์ XML เป็นไฟล์ JSON: def main(): xml_data = read_file('input.xml') # impure json_data = convert(xml_data) # pure write_file('output.json', json_data) # impure ไม่ใช่วิธีการของ IO monad ในการทำสิ่งนี้อย่างมีประสิทธิภาพ: steps …

3
แนะนำนโยบายการแยกการควบคุมเวอร์ชันให้กับทีมเล็ก ๆ
ฉันเป็นผู้รับเหมาที่เพิ่งเริ่มต้นกับ บริษัท ทีมคือนักพัฒนา 3 คนซึ่งประกอบด้วยผู้พัฒนา 2 คนถึงระดับกลางและอีกคนในระดับเดียวกันเริ่มเร็ว ๆ นี้และตัวฉันเอง (6 ปี xp) สำหรับนักพัฒนาทั้งสองที่มีอยู่มันเป็นงานแรกของพวกเขาที่ออกจากมหาวิทยาลัย / วิทยาลัยและพวกเขาไม่เคยมีนักพัฒนาอาวุโสที่ดูแลงานของพวกเขามาก่อน ไม่มีนโยบายการควบคุมเวอร์ชันที่ชัดเจน นักพัฒนาทำการพัฒนาทั้งหมดบนลำตัวแล้วนำไปใช้กับการผลิตโดยตรงจากเครื่องพัฒนาของพวกเขา ทีมที่มีอยู่ไม่คุ้นเคยกับการแตกแขนง ฉันกำลังเปลี่ยนแปลงทั้งหมดนี้และแนะนำเซิร์ฟเวอร์ CI, การทดสอบ TDD / การจัดเตรียม / การผลิต ฯลฯ พร้อมกับนโยบายการควบคุมเวอร์ชันเพื่อชมเชยสิ่งนี้ ระบบควบคุมแหล่งที่มาคือ TFS ซึ่งฉันไม่เคยใช้มาก่อน มันถูกกำหนดค่าให้เป็นแหล่งเก็บข้อมูลขนาดยักษ์ ฉันได้เขียนพอยน์เตอร์ให้กับพวกเขาแล้ว แต่มีอะไรอีกบ้างที่ฉันควรเพิ่ม / แก้ไขโดยคำนึงถึงประสบการณ์ของทีม นโยบายการควบคุมเวอร์ชัน การพัฒนาจะทำบนลำต้น หากการเปลี่ยนแปลงคาดว่าจะใช้เวลานานกว่าหนึ่งสัปดาห์ก็ควรจะทำในสาขาที่มีการผสานปกติจากลำตัวเข้าไปในสาขาเพื่อหยุดทั้งสองออกจากซิงค์ สร้างสาขาย่อยสำหรับรหัสการผลิต สาขานั้นควรมีรหัสที่มั่นคงเท่านั้น เราสามารถมีสาขาย่อยหนึ่งสาขาที่ได้รับการอัพเดตจากลำตัวหนึ่งครั้งต่อการวิ่งหรือเราสามารถสร้างสาขาย่อยแยกต่างหากสำหรับแต่ละสัปดาห์ หากจำเป็นต้องแก้ไขข้อบกพร่องเร่งด่วนที่มีผลกระทบต่อรหัสการผลิตรหัสนั้นจะถูกสร้างขึ้นในสาขาที่วางจำหน่ายและผสานกลับเข้าไปในลำต้น หากเรานำกลยุทธ์การเปิดตัวสาขาหนึ่งมาใช้ลำต้นจะถูกรวมเข้ากับสาขาที่วางจำหน่ายหนึ่งครั้งต่อการวิ่งไปยังจุดสิ้นสุดของการวิ่ง ถ้าเราใช้สาขาแยกต่อกลยุทธ์การปล่อยแล้วลำตัวไม่เคยถูกรวมเข้ากับสาขาการปล่อย ในบางสถานการณ์อาจจำเป็นต้องทำการแก้ไขข้อบกพร่องสองครั้งในสาขาที่แตกต่างกันหากสาขาแยกกันมากเกินไป หากเรากำลังวิ่งสั้น ๆ สิ่งนี้ไม่ควรเกิดขึ้นบ่อยเกินไป ฉันวางแผนที่จะมีสามเซิร์ฟเวอร์ …

2
ข้อกำหนดสิทธิการใช้งานเมื่อทำการย้ายซอฟต์แวร์ฟรีเป็นภาษาอื่น
ฉันกำลังสำรวจความคิดในการโอนย้ายชุดซอฟต์แวร์ที่มีอยู่ไปยังภาษาอื่น มันเผยแพร่ภายใต้Apache License 2.0และเผยแพร่ฟรี แต่มีความแตกต่างใหญ่ระหว่างการใช้ไลบรารีกับการสร้างสำเนา แน่นอนฉันจะให้เครดิตเต็มและซื่อสัตย์เกี่ยวกับที่มาและแน่นอนฉันไม่ได้วางแผนที่จะทำเงินจากพอร์ตเพียงใช้ในโครงการอื่น ๆ ฉันได้อ่านใบอนุญาตของหลักสูตรซึ่งพูดว่า: การให้สิทธิ์ใช้งานลิขสิทธิ์ ภายใต้ข้อกำหนดและเงื่อนไขของใบอนุญาตนี้ผู้ให้การสนับสนุนแต่ละรายในที่นี้จะให้สิทธิ์แก่คุณทั่วโลกไม่ผูกขาดไม่มีค่าใช้จ่ายไม่มีค่าลิขสิทธิ์ลิขสิทธิ์ที่เพิกถอนไม่ได้ในการทำซ้ำจัดเตรียมงานดัดแปลงที่เผยแพร่ต่อสาธารณชน ใบอนุญาตช่วงและแจกจ่ายงานและงานดัดแปลงดังกล่าวในรูปของแหล่งที่มาหรือวัตถุ [ ... ] แจกจ่าย คุณสามารถทำซ้ำและแจกจ่ายสำเนาของงานหรืองานดัดแปลงในสื่อใด ๆ ที่มีหรือไม่มีการดัดแปลงและในรูปของแหล่งที่มาหรือวัตถุโดยมีเงื่อนไขว่าคุณปฏิบัติตามเงื่อนไขต่อไปนี้: คุณต้องให้สำเนาของสัญญาอนุญาตนี้แก่ผู้รับผลงานหรืองานดัดแปลง และ b. คุณต้องทำให้ไฟล์ที่ถูกแก้ไขใด ๆ มีการแจ้งเตือนที่เด่นชัดโดยระบุว่าคุณเปลี่ยนแปลงไฟล์; และ ค. คุณต้องเก็บไว้ในรูปแบบแหล่งที่มาของงานอนุพันธ์ใด ๆ ที่คุณแจกจ่ายลิขสิทธิ์สิทธิบัตรเครื่องหมายการค้าและคำบอกแหล่งที่มาจากรูปแบบแหล่งที่มาของงานไม่รวมถึงประกาศที่ไม่เกี่ยวข้องกับส่วนใด ๆ ของงานอนุพันธ์; และ d หากงานมีไฟล์ข้อความ "ประกาศ" เป็นส่วนหนึ่งของการเผยแพร่งานดัดแปลงใด ๆ ที่คุณแจกจ่ายจะต้องมีสำเนาของประกาศที่มีลักษณะที่สามารถอ่านได้ที่อยู่ในไฟล์ประกาศดังกล่าว [... ] คุณอาจเพิ่มคำแถลงลิขสิทธิ์ของคุณเองในการแก้ไขของคุณและอาจให้ข้อกำหนดและเงื่อนไขสิทธิ์ใช้งานเพิ่มเติมหรือแตกต่างกันสำหรับการใช้การทำซ้ำหรือการแจกจ่ายการดัดแปลงของคุณหรือสำหรับงานดัดแปลงใด ๆ มิฉะนั้นงานจะเป็นไปตามเงื่อนไขที่ระบุไว้ในใบอนุญาตนี้ ซึ่งฟังดูเหมือนพอร์ต (ในฐานะ "งานดัดแปลง") ที่ได้รับอนุญาตทั้งหมดโดยมีหรือไม่ได้รับอนุญาตจากผู้เขียนหากฉันเก็บสำเนาใบอนุญาตอย่างขยันขันแข็งประกาศเกี่ยวกับลิขสิทธิ์ที่มีอยู่ ฯลฯ แต่นั่นไม่ได้หมายความว่าฉันเข้าใจความหมายทั้งหมดของมัน ตัวอย่างเช่นพอร์ตจำเป็นต้องแชร์ใบอนุญาตเดียวกันกับต้นฉบับหรือไม่ …

5
อะไรทำให้ภาษาโปรแกรมเชิงฟังก์ชั่นมีความหมายต่างกับความจำเป็น?
ในหลาย ๆ บทความที่อธิบายถึงประโยชน์ของการเขียนโปรแกรมเชิงปฏิบัติฉันได้เห็นภาษาโปรแกรมที่ใช้งานได้เช่น Haskell, ML, Scala หรือ Clojure เรียกว่า "ภาษาที่ประกาศ" ซึ่งแตกต่างจากภาษาที่จำเป็นเช่น C / C ++ / C # / Java คำถามของฉันคือสิ่งที่ทำให้ภาษาโปรแกรมการทำงานประกาศเมื่อเทียบกับความจำเป็น คำอธิบายที่พบบ่อยซึ่งอธิบายถึงความแตกต่างระหว่างการเขียนโปรแกรมเชิงประกาศและเชิงบังคับคือในการเขียนโปรแกรมเชิงบังคับคุณต้องบอกคอมพิวเตอร์ว่า "ทำอย่างไร" ซึ่งต่างจาก "สิ่งที่ต้องทำ" ในภาษาที่ประกาศ ปัญหาที่ฉันมีกับคำอธิบายนี้คือคุณกำลังทำทั้งสองอย่างในภาษาการเขียนโปรแกรมทั้งหมด แม้ว่าคุณจะลงไปที่แอสเซมบลีระดับต่ำสุดที่คุณยังบอกคอมพิวเตอร์ว่า "สิ่งที่ต้องทำ" คุณบอกซีพียูเพื่อเพิ่มตัวเลขสองตัวคุณไม่ได้บอกวิธีการเพิ่ม ถ้าเราไปที่ปลายอีกด้านหนึ่งของภาษาที่มีฟังก์ชั่นบริสุทธิ์ระดับสูงอย่าง Haskell คุณกำลังบอกคอมพิวเตอร์ว่าจะทำภารกิจเฉพาะอย่างได้อย่างไร นั่นคือสิ่งที่โปรแกรมของคุณเป็นลำดับของคำแนะนำเพื่อให้ได้งานเฉพาะซึ่งคอมพิวเตอร์ไม่ทราบว่าจะบรรลุผลได้อย่างไร ฉันเข้าใจว่าภาษาเช่น Haskell, Clojure ฯลฯ มีระดับที่สูงกว่า C / C ++ / C # / Java อย่างเห็นได้ชัดและมีคุณสมบัติเช่นการประเมินแบบขี้เกียจโครงสร้างข้อมูลที่ไม่เปลี่ยนรูปแบบฟังก์ชันที่ไม่ระบุชื่อการปิดบังโครงสร้างข้อมูลถาวร ฟังก์ชั่นการเขียนโปรแกรมเป็นไปได้และมีประสิทธิภาพ …

4
หลักการความรับผิดชอบเดี่ยวใช้กับฟังก์ชันได้หรือไม่
อ้างอิงจากโรเบิร์ตซี. มาร์ติน SRP ระบุว่า: ไม่ควรมีเหตุผลมากกว่าหนึ่งข้อในการเปลี่ยนชั้นเรียน อย่างไรก็ตามในClean Codeในหนังสือของเขาบทที่ 3: ฟังก์ชั่นเขาแสดงบล็อคของรหัสต่อไปนี้: public Money calculatePay(Employee e) throws InvalidEmployeeType { switch (e.type) { case COMMISSIONED: return calculateCommissionedPay(e); case HOURLY: return calculateHourlyPay(e); case SALARIED: return calculateSalariedPay(e); default: throw new InvalidEmployeeType(e.type); } } แล้วสหรัฐฯ: มีปัญหาหลายอย่างกับฟังก์ชั่นนี้ อย่างแรกคือมันมีขนาดใหญ่และเมื่อมีการเพิ่มประเภทพนักงานใหม่ก็จะเพิ่มขึ้น ประการที่สองมันชัดเจนมากกว่าสิ่งหนึ่ง ประการที่สามมีการละเมิด Single รับผิดชอบหลักการ (SRP) เพราะมีมากกว่าเหตุผลหนึ่งที่ทำให้มันมีการเปลี่ยนแปลง [เน้นเหมือง] ก่อนอื่นฉันคิดว่า SRP ถูกกำหนดไว้สำหรับคลาส …

2
การจัดหากิจกรรมและส่วนที่เหลือ
ฉันเจอการออกแบบการจัดหากิจกรรมและฉันต้องการใช้ในแอปพลิเคชันที่ต้องการให้ไคลเอ็นต์ REST (RESTful แม่นยำ) อย่างไรก็ตามฉันล้มเหลวในการเชื่อมต่อสิ่งเหล่านี้เข้าด้วยกันเนื่องจาก REST ค่อนข้างคล้ายกับ CRUD และการจัดหากิจกรรมเป็นงานที่ต้องทำ ฉันสงสัยว่าคุณจะออกแบบการสร้างคำสั่งตามคำขอไปยังเซิร์ฟเวอร์ REST ได้อย่างไร ลองพิจารณาตัวอย่างนี้: ด้วย REST คุณสามารถกำหนดสถานะใหม่ให้กับทรัพยากรที่เรียกว่าไฟล์ ในคำขอเดียวคุณสามารถส่งชื่อไฟล์ใหม่คุณสามารถเปลี่ยนโฟลเดอร์หลักและ / หรือเปลี่ยนเจ้าของไฟล์และอื่น ๆ วิธีสร้างเซิร์ฟเวอร์เพื่อให้ฉันสามารถใช้การจัดหากิจกรรมได้ ฉันคิดถึงความเป็นไปได้เหล่านี้: ตรวจสอบบนเซิร์ฟเวอร์ซึ่งสาขาที่มีการเปลี่ยนแปลงและสร้างคำสั่งที่เหมาะสม ( RenameFileCommand, MoveFileCommand, ChangeOwnerCommand, ... ) และจัดส่งเหล่านี้ที อย่างไรก็ตามในการตั้งค่านี้แต่ละคำสั่งสามารถล้มเหลวในการปล่อยให้ผู้อื่นออกจากการทำธุรกรรมและจากการเปลี่ยนแปลง "atomic" เป็นทรัพยากร ส่งเพียงหนึ่งคำสั่ง ( UpdateFileCommand) และในการจัดการคำสั่งอย่างแม่นยำมากขึ้นในการรวม, ตรวจสอบว่ามีการเปลี่ยนแปลงเขตและส่งแต่ละเหตุการณ์แทน ( FileRenamedEvent, FileMovedEvent, OwnerChangedEvent, ... ) อันนี้ฉันไม่ชอบเลย: ในคำขอไปยังเซิร์ฟเวอร์ฉันจะระบุในส่วนหัวของคำสั่งที่จะใช้เพราะ UI ยังคงเป็นงานที่ใช้ (การสื่อสารจะทำผ่าน REST) …

5
enums สร้างส่วนต่อประสานที่บอบบางหรือไม่?
ลองพิจารณาตัวอย่างด้านล่าง การเปลี่ยนแปลงใด ๆ กับ ColorChoice enum จะส่งผลกระทบต่อคลาสย่อย IWindowColor ทั้งหมด enums มีแนวโน้มที่จะทำให้เกิดการเชื่อมต่อที่เปราะหรือไม่? มีอะไรดีไปกว่า Enum ที่จะยอมให้มีความยืดหยุ่นแบบ polymorphic มากขึ้นหรือไม่? enum class ColorChoice { Blue = 0, Red = 1 }; class IWindowColor { public: ColorChoice getColor() const=0; void setColor( const ColorChoice value )=0; }; แก้ไข: ขออภัยที่ใช้สีเป็นตัวอย่างของฉันนั่นไม่ใช่สิ่งที่เป็นคำถาม นี่คือตัวอย่างอื่นที่หลีกเลี่ยงปลาเฮอริ่งแดงและให้ข้อมูลเพิ่มเติมเกี่ยวกับสิ่งที่ฉันหมายถึงโดยความยืดหยุ่น enum class CharacterType { orc = …

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