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

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

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

6
คุณสามารถปรับใช้อย่างต่อเนื่องกับโปรแกรมเมอร์อาวุโสได้หรือไม่?
มีช่วงเวลาที่คุณเริ่มเข้าใจว่าในสถาปัตยกรรม micro service มันน่ากลัวกว่าที่จะรอหนึ่งสัปดาห์ในการปรับใช้ micro services ทั้งหมดในครั้งเดียวเพื่อให้แน่ใจว่าทุกอย่างทำงานร่วมกันได้มากกว่าบังคับใช้ api versioning เขียนจำนวนมากโดยอัตโนมัติ การทดสอบ (แต่ละบิต: หน่วยและ exploratory, การรวม) และการปรับใช้อัตโนมัติเพื่อการผลิตทันทีที่การส่งผ่านของคุณเป็นการทดสอบบนเวที ตอนนี้ดูเหมือนว่าเป็นความคิดที่ดีตราบใดที่คุณจำได้ว่าต้องเขียนการทดสอบทดสอบการเปลี่ยนแปลงก่อนที่คุณจะรับรู้วิธีการใช้เวอร์ชัน API และคุณจะไม่ทิ้งฐานข้อมูลในสคริปต์อัพเดต db ส่วนเพิ่มของคุณ ไม่ใช่ปัญหาใหญ่เท่าที่ควรจะล้มเหลวบนเวที) แต่เป็นไปได้ไหมที่จะทำกับโปรแกรมเมอร์รุ่นพี่? บางทีฉันอาจจะต้องใช้สคีคำขอดึง สิ่งนี้จะทำให้การใช้งานต่อเนื่องน้อยลง (นั่นคือฉันเดา) ฉันหวังว่านี่จะไม่ใช่ความเห็นและฉันหวังว่าคุณจะแบ่งปันประสบการณ์ของคุณขอบคุณ โปรดทราบว่าฉันไม่ได้ถามเกี่ยวกับ CI หรือเกี่ยวกับการจัดส่งอย่างต่อเนื่อง เรามีสิ่งนั้นอยู่แล้ว สิ่งที่เราพยายามตอนนี้คือการทำให้ใช้งานได้อย่างต่อเนื่องซึ่งหมายถึงการใช้งานจริงทั้งหมดหลังจากการตรวจสอบโค้ด

6
สิ่งนี้จะถูกโปรแกรมใน non-OO ได้อย่างไร? [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา การอ่านบทความที่เหยียดหยามเกี่ยวกับข้อเสียของ OOP เพื่อสนับสนุนกระบวนทัศน์อื่น ๆ ที่ฉันพบเจอตัวอย่างที่ฉันไม่สามารถหาข้อผิดพลาดได้มากเกินไป ฉันต้องการที่จะเปิดให้มีการโต้แย้งของผู้เขียนและแม้ว่าฉันสามารถเข้าใจประเด็นทางทฤษฎีของพวกเขาตัวอย่างหนึ่งโดยเฉพาะอย่างยิ่งฉันมีเวลายากที่จะลองจินตนาการว่ามันจะนำมาใช้ที่ดีขึ้นในการพูดภาษา FP จาก: http://www.smashcompany.com/technology/object-oriented-programming-is-an- ราคา-disaster-which-must-end // Consider the case where “SimpleProductManager” is a child of // “ProductManager”: public class SimpleProductManager implements ProductManager { private List products; public List getProducts() { return products; } public void increasePrice(int percentage) { …

3
วิธีจัดการพารามิเตอร์ส่วนกลางอย่างถูกต้องสำหรับการทดสอบหน่วยในงูใหญ่?
เรากำลังใช้อัลกอริทึมมากมายซึ่งโดยทั่วไปจะมีพารามิเตอร์ที่แชร์สาธารณะรู้จักและความปลอดภัย ปัจจุบันเราใช้คลาสที่เก็บพารามิเตอร์ทั้งหมดและวัตถุโกลบอลที่กำหนดไว้ล่วงหน้าสองรายการ: class PublicParams(object): p = q = 0 def __init__(self, p, q): self.p = p self.q = q # used for tests publicParams_test = PublicParams(15,7) # Some 2048 bit numbers for example publicParams_secure = PublicParams(128378947298374928374,128378947298374928374) จากนั้นอัลกอริธึมนำPublicParamsวัตถุเป็นอาร์กิวเมนต์ที่เป็นค่าเริ่มต้นไปยังการผลิตpublicParams_secure def AlgoOne(n, publicParams = publicParams_secure): # do stuff with publicParams.p # ... AlgoTwo(x, …

3
สถาปัตยกรรมซอฟต์แวร์กับสถาปัตยกรรมของระบบเทียบกับคลาสไดอะแกรม?
ฉันค่อนข้างสับสนเกี่ยวกับเงื่อนไขดังต่อไปนี้: สถาปัตยกรรมซอฟต์แวร์ สถาปัตยกรรมแอปพลิเคชันซอฟต์แวร์เป็นกระบวนการของการกำหนดโซลูชันที่มีโครงสร้างที่ตรงตามข้อกำหนดทางเทคนิคและการดำเนินงานทั้งหมดในขณะที่ปรับแต่งคุณสมบัติคุณภาพทั่วไปเช่นประสิทธิภาพความปลอดภัยและความสามารถในการจัดการ มันเกี่ยวข้องกับชุดของการตัดสินใจบนพื้นฐานของปัจจัยที่หลากหลายและการตัดสินใจแต่ละครั้งอาจมีผลกระทบอย่างมากต่อคุณภาพประสิทธิภาพการบำรุงรักษาและความสำเร็จโดยรวมของแอปพลิเคชัน ( microsoft ) ระบบสถาปัตยกรรม สถาปัตยกรรมระบบเป็นรูปแบบแนวคิดที่กำหนดโครงสร้างพฤติกรรมและมุมมองเพิ่มเติมของระบบ 1คำอธิบายสถาปัตยกรรมเป็นคำอธิบายอย่างเป็นทางการและเป็นตัวแทนของระบบการจัดระเบียบในลักษณะที่สนับสนุนการให้เหตุผลเกี่ยวกับโครงสร้างและพฤติกรรมของระบบ ( wiki ) คลาสไดอะแกรม ในวิศวกรรมซอฟต์แวร์คลาสไดอะแกรมใน Unified Modeling Language (UML) เป็นไดอะแกรมโครงสร้างแบบสแตติกที่อธิบายโครงสร้างของระบบโดยการแสดงคลาสของระบบคุณลักษณะการดำเนินงาน (หรือเมธอด) และความสัมพันธ์ระหว่างวัตถุ ( วิกิ ) ถ้าฉันอ่านคำอธิบายเหล่านี้ทั้งหมดอธิบายการโต้ตอบระหว่างโมดูลต่าง ๆ ของแอปพลิเคชัน อย่างไรก็ตามความแตกต่างระหว่างสิ่งเหล่านี้คืออะไร? สิ่งที่ฉันคิด / พยายามเปรียบเทียบคำเหล่านี้ : คลาสไดอะแกรมไม่ใช่รูปแบบของสถาปัตยกรรมระบบเนื่องจากคำอธิบายข้างต้น ( structure, behavior, and more views of a system) บอกเป็นนัยว่าไม่มีรายละเอียดการนำไปปฏิบัติในสถาปัตยกรรมในขณะที่แผนภาพคลาสอธิบายถึงการนำไปปฏิบัติและอาจเป็นไปในทิศทางของการออกแบบมากกว่าสถาปัตยกรรม? ฉันคิดว่าสถาปัตยกรรมของระบบเป็นสถาปัตยกรรมที่มีการโต้ตอบภายนอก (เช่นฐานข้อมูล) ในขณะที่สถาปัตยกรรมซอฟต์แวร์มุ่งเน้นไปที่แอปพลิเคชันเอง

6
การต่อสู้และการพัฒนาที่มั่นคงสร้างความขัดแย้งหรือไม่?
ฉันเป็นส่วนหนึ่งของกลุ่มพัฒนา 5 ทีมรวมนักพัฒนาประมาณ 40 คน เรากำลังติดตามวิธีการแย่งชิงกันโดยใช้เวลา 3 สัปดาห์ เรามีการตั้งค่าการรวมระบบอย่างต่อเนื่อง (เจนกินส์) โดยมีขั้นตอนการสร้างใช้เวลาหลายชั่วโมง (เนื่องจากการทดสอบอัตโนมัติที่กว้างขวาง) โดยทั่วไปกระบวนการพัฒนาทำงานได้ดี อย่างไรก็ตามเราสังเกตว่าหลังจากสองสามวันไปสู่การวิ่งใหม่งานสร้างของเรามักจะไม่เสถียรและยังคงสั่นคลอนจนสิ้นสุดการวิ่ง "หยุดทำ" ผลข้างเคียงของสิ่งนี้คือการสร้างขั้นตอนไกลไปป์ไลน์โดยเฉพาะอย่างยิ่ง UI- / การทดสอบทางเว็บจะไม่ถูกดำเนินการเป็นเวลาหลายวัน ดังนั้นข้อผิดพลาดที่แนะนำใหม่มักตรวจพบได้ช้ามากในการวิ่ง การยืนยันแต่ละครั้งจะถูกตรวจสอบกับชุดการทดสอบพื้นฐาน เมื่อตรวจสอบแล้วการเปลี่ยนแปลงจะถูกส่งไปยังต้นแบบหลังจากตรวจสอบโค้ด (Gerrit) การทดสอบหน่วยพื้นฐานทำงานทุก 30 นาทีระยะเวลาน้อยกว่า 10 นาที การทดสอบการรวมจะทำงานทุก 2 ชั่วโมงและระยะเวลา 1 ชั่วโมง UI- / Webtests ทำงานบนการทดสอบการรวมที่ประสบความสำเร็จใช้เวลาหลายชั่วโมง ขึ้นอยู่กับว่าใครเป็นผู้รับผิดชอบในการสร้างความมั่นคงในระหว่างการวิ่ง (ความรับผิดชอบนั้นจะถูกส่งต่อการวิ่ง) อาจจะมีระดับกลางโฆษณาเฉพาะกิจ "คอมมิชชันหยุด" เพื่อให้ได้งานสร้างกลับมาที่มั่นคง ดังนั้นเราต้องการ: ทีมนักพัฒนาของเราในการพัฒนาและกระทำการเปลี่ยนแปลงในระหว่างการวิ่งไม่ จำกัด กระบวนการสร้างของเราที่จะละทิ้งหากขั้นตอนการสร้างล้มเหลวเนื่องจากผลการสร้างต่อมามีความหมายน้อย กระบวนการสร้างของเราเพื่อให้ข้อเสนอแนะในการพัฒนาคุณภาพแก่นักพัฒนาในเวลาที่เหมาะสม รับ (2) คะแนน …

1
บริการ REST เป็นแอปพลิเคชันเซิร์ฟเวอร์สำหรับเครื่องไคลเอนต์ 2000+ เครื่อง มันเป็นความคิดที่ดีหรือไม่?
เราจะสร้างระบบด้วย UI ใน javaFx ที่จะนำไปใช้กับเครื่องมากกว่า 2000 เครื่อง (ขั้นต่ำคือ 2000 แต่จะมีมากขึ้น - สามารถเข้าถึงเครื่องได้ 5,000 เครื่อง) ด้วยเหตุผล / ข้อ จำกัด อื่น ๆ จะต้องติดตั้งบนเครื่องดังนั้นเราจึงไม่สามารถทำได้ด้วยเว็บเบราว์เซอร์อินเตอร์เฟส เครื่องจักรกว่า 2,000 เครื่องจะอยู่ในกลุ่มที่ตั้งทางภูมิศาสตร์ที่แตกต่างกัน โดยทั่วไปแล้วการเชื่อมต่อนั้นดี แต่อาจไม่ดีในสถานที่ห่างไกล แทนที่จะเข้าถึงฐานข้อมูลโดยตรงฉันกำลังคิดถึงการสร้างคลัสเตอร์เซอร์วิส REST ด้วย Spring + Spring Boot + Spring Data (java) เซอร์วิส REST จะยอมรับและส่งคืน Json ฉันคิดว่ามันเป็นความคิดที่ดีเพราะ: บริการจะทำหน้าที่เป็นกลุ่มการเชื่อมต่อฐานข้อมูล (ฉันคิดว่าการเชื่อมต่อ 2000+ บนฐานข้อมูลอาจทำให้เกิดปัญหา); เป็นไปได้ที่จะมีฐานข้อมูลพร้อมบันทึกการจัดส่งไปยังฐานข้อมูลแบบอ่านอย่างเดียวอื่น ๆ มันจะขยายขนาดได้ดีขึ้นเนื่องจากเราสามารถเพิ่มเครื่องจักรให้ทำงานบริการ REST …
11 java  design  rest  spring 

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

4
จะระบุ precondition (LSP) ในอินเตอร์เฟสใน C # ได้อย่างไร?
สมมติว่าเรามีส่วนต่อไปนี้ - interface IDatabase { string ConnectionString{get;set;} void ExecuteNoQuery(string sql); void ExecuteNoQuery(string[] sql); //Various other methods all requiring ConnectionString to be set } เงื่อนไขก่อนกำหนดคือ ConnectionString จะต้องตั้งค่า / intialized ก่อนที่จะสามารถเรียกใช้วิธีการใด ๆ เงื่อนไขนี้สามารถทำได้ค่อนข้างโดยผ่านการเชื่อมต่อสายผ่านตัวสร้างถ้า IDatabase เป็นระดับนามธรรมหรือคอนกรีต - abstract class Database { public string ConnectionString{get;set;} public Database(string connectionString){ ConnectionString = connectionString;} public void ExecuteNoQuery(string …

3
วิธีการตรวจสอบอินพุตโดยไม่มีข้อยกเว้นหรือความซ้ำซ้อน
เมื่อฉันพยายามสร้างส่วนต่อประสานสำหรับโปรแกรมเฉพาะฉันมักจะพยายามหลีกเลี่ยงการโยนข้อยกเว้นที่ขึ้นอยู่กับอินพุตที่ไม่ผ่านการตรวจสอบ ดังนั้นสิ่งที่มักจะเกิดขึ้นคือฉันคิดว่าโค้ดบางส่วนเช่นนี้ (นี่เป็นเพียงตัวอย่างเพื่อประโยชน์ของตัวอย่างไม่ต้องสนใจฟังก์ชั่นที่ใช้งานตัวอย่างใน Java): public static String padToEvenOriginal(int evenSize, String string) { if (evenSize % 2 == 1) { throw new IllegalArgumentException("evenSize argument is not even"); } if (string.length() >= evenSize) { return string; } StringBuilder sb = new StringBuilder(evenSize); sb.append(string); for (int i = string.length(); i < evenSize; i++) …

2
CQRS ที่ไม่มี DDD และไม่มี (หรือมี?) ES - โมเดลการเขียนคืออะไรและโมเดลการอ่านคืออะไร
เท่าที่ฉันเข้าใจแนวคิดที่สำคัญเบื้องหลัง CQRS คือมีตัวแบบข้อมูล 2 แบบสำหรับจัดการคำสั่งและแบบสอบถาม สิ่งเหล่านี้เรียกว่า "write model" และ "read model" ลองพิจารณาตัวอย่างของการโคลนใบสมัคร Twitter นี่คือคำสั่ง: ผู้ใช้สามารถลงทะเบียนด้วยตนเอง CreateUserCommand(string username)ส่งเสียงUserCreatedEvent ผู้ใช้สามารถติดตามผู้ใช้รายอื่น FollowUserCommand(int userAId, int userBId)ส่งเสียงUserFollowedEvent ผู้ใช้สามารถสร้างโพสต์ CreatePostCommand(int userId, string text)ส่งเสียงPostCreatedEvent ขณะที่ฉันใช้คำว่า "เหตุการณ์" ด้านบนฉันไม่ได้หมายถึงเหตุการณ์ 'การจัดหากิจกรรม' ฉันแค่หมายถึงสัญญาณที่ทริกเกอร์อ่านการอัพเดตโมเดล ฉันไม่มีที่เก็บเหตุการณ์และจนถึงตอนนี้ต้องการที่จะมีสมาธิกับ CQRS เอง และนี่คือแบบสอบถาม: ผู้ใช้ต้องเห็นรายการโพสต์ GetPostsQuery(int userId) ผู้ใช้ต้องการดูรายชื่อผู้ติดตาม GetFollowersQuery(int userId) ผู้ใช้ต้องการดูรายชื่อผู้ใช้ที่ติดตาม GetFollowedUsersQuery(int userId) ผู้ใช้ต้องการเห็น "ฟีดเพื่อน" - บันทึกกิจกรรมของเพื่อนทั้งหมด ("เพื่อนของคุณจอห์นเพิ่งสร้างโพสต์ใหม่") …
11 cqrs  read-model 

6
การตั้งชื่อ: คุณควรสังเวยบทสรุปเพื่อความชัดเจนหรือไม่
ตัวอย่างเช่นฟังก์ชั่นต่อไปนี้ลูปผ่านอาร์เรย์ซึ่งมีชื่อและข้อผิดพลาดของช่องใส่ มันเป็นเช่นนี้โดยการตรวจสอบชื่อของเขตข้อมูลที่ตรวจสอบแล้วผลักดันข้อมูลข้อผิดพลาดไปยังอาร์เรย์ฟิลด์ที่ไม่ถูกต้อง ดีกว่าที่จะเป็นบทสรุปและเขียนนี้: addInvalidField (field, message) { const foundField = this.invalidFields.find(value => { return value.name === field.name }) const errors = foundField.errors if (!errors.some(error => error.name === message)) { errors.push({ name: message, message }) } }, หรือเฉพาะเจาะจงมากขึ้นเช่นนี้? addInvalidField (validatingField, message) { const foundField = this.invalidFields.find(invalidField => { return validatingField.name === …

2
การแยกตรรกะทางธุรกิจออกจาก DB- ตรรกะด้วยธุรกรรม
เรามีสามชั้นในใบสมัครของเรา ชั้นบริการเพื่อให้ API ภายนอก เลเยอร์ BO สำหรับตรรกะทางธุรกิจของเราและเลเยอร์ DAO สำหรับการเชื่อมต่อฐานข้อมูลของเรา สมมติว่าทุกครั้งที่เราอัปเดตไฟล์เราต้องการเปลี่ยนบางอย่างในโฟลเดอร์เช่น 'วันที่แก้ไขล่าสุด' ต้องทำสิ่งนี้ในการทำธุรกรรม อาจประสบความสำเร็จและทั้งไฟล์และโฟลเดอร์ได้รับการแก้ไข หรือมีความล้มเหลวและธุรกรรมได้รับการย้อนกลับดังนั้นวัตถุทั้งสองอยู่ในสถานะก่อนหน้า "แก้ไขโฟลเดอร์เมื่อไฟล์ได้รับการแก้ไข" - ปฏิกิริยาเป็นตรรกะทางธุรกิจอย่างแท้จริง นี่ก็หมายความว่ามันอยู่ในเลเยอร์ BO อย่างไรก็ตามเราใช้ Objectify สำหรับฐานข้อมูลของเราดังนั้นในการเริ่มต้นธุรกรรมที่เราต้องเรียก ofy (). transact (... ) ถ้าเราเรียกใช้ฟังก์ชันนี้ในเลเยอร์ BO สิ่งนี้จะหยุดการออกแบบของเราเนื่องจากจะมีการเรียกเฉพาะฐานข้อมูล (Objectify) ในชั้นธุรกิจของเรา อะไรจะเป็นทางออกที่สะอาดสำหรับปัญหานี้

3
Entity Framework และการหลีกเลี่ยง Anemic Domain Model
ในตรรกะทางธุรกิจของเราบางครั้งเรามีวิธีการที่กำหนดไว้ดังนี้: User.ResetCourse(Course courseToReset) ปัญหาคือทั้งผู้ใช้และหลักสูตรเป็นวัตถุพร็อกซี Entity Framework ซึ่งหมายความว่าเมื่อเราเข้าสู่คุณสมบัติการนำทางทั้งผู้ใช้หรือหลักสูตรมันสามารถทำให้เกิดความนิยมอย่างมากในฐานข้อมูลเพราะวัตถุเหล่านั้นไม่ได้เป็น IQueryable ดังนั้นจึงวนซ้ำผ่านพวกเขาตามปกติ เพื่อแก้ปัญหานี้เราเปลี่ยนลายเซ็นเป็น: User.ResetCourse(MyDBContext db, Course courseToReset) ซึ่งหมายความว่าเราสามารถสอบถามฐานข้อมูลโดยตรงเพื่อทำการเปลี่ยนแปลงที่เราต้องการอย่างมีประสิทธิภาพ แต่การส่งบริบทฐานข้อมูลไปยังวัตถุทางธุรกิจดูเหมือนจะผิดพลาด หลังจากนั้นเราย้ายไปยังชั้นบริการที่ให้ผู้ใช้ซึ่งหมายความว่าเรามีสิ่งที่ชอบ: CourseService.ResetForUser(Course courseToReset, User forUser) บริการนี้มีการอ้างอิงถึง DBContext ที่ถูกสร้าง แต่ตอนนี้วัตถุธุรกิจของเราเป็นเพียงถุงข้อมูลที่ไม่มีพฤติกรรม (เช่นรุ่น Anemic Domain Model) เราจะหลีกเลี่ยงสิ่งนี้ได้อย่างไร

5
ความล้มเหลวเดียวควรล้มเหลวในการดำเนินการเป็นกลุ่ม?
ใน API ฉันทำงานอยู่มีการดำเนินการลบจำนวนมากซึ่งยอมรับอาร์เรย์ของ ID: ["1000", ..., "2000"] ฉันมีอิสระที่จะใช้การดำเนินการลบตามที่ฉันเห็นสมควรดังนั้นฉันตัดสินใจที่จะทำธุรกรรมทั้งหมด: นั่นคือถ้า ID เดียวไม่ถูกต้องคำขอทั้งหมดล้มเหลว ฉันจะเรียกสิ่งนี้ว่าโหมดเข้มงวด try{ savepoint = conn.setSavepoint(); for(id : IDs) if( !deleteItem(id) ){ conn.rollback(savepoint); sendHttp400AndBeDoneWithIt(); return; } conn.commit(); } ทางเลือก (นำไปใช้ที่อื่นในชุดซอฟต์แวร์ของเรา) คือทำสิ่งที่เราทำได้ในแบ็กเอนด์และรายงานความล้มเหลวในอาเรย์ ส่วนหนึ่งของซอฟต์แวร์นั้นเกี่ยวข้องกับคำขอที่น้อยลงดังนั้นการตอบสนองจึงไม่ได้กลายเป็นอาร์เรย์ขนาดใหญ่ ... ในทางทฤษฎี ข้อผิดพลาดล่าสุดที่เกิดขึ้นในเซิร์ฟเวอร์ที่มีทรัพยากรต่ำทำให้ฉันดูรหัสอีกครั้งและตอนนี้ฉันตั้งคำถามกับการตัดสินใจเดิมของฉัน - แต่คราวนี้ฉันมีแรงจูงใจมากขึ้นตามความต้องการทางธุรกิจมากกว่าแนวทางปฏิบัติที่ดีที่สุด ตัวอย่างเช่นถ้าฉันล้มเหลวในการร้องขอทั้งหมดผู้ใช้จะต้องลองอีกครั้งในขณะที่หากมีการลบรายการจำนวนหนึ่งผู้ใช้สามารถดำเนินการให้เสร็จสิ้นแล้วขอให้ผู้ดูแลระบบทำส่วนที่เหลือ (ในขณะที่ฉันแก้ไขข้อผิดพลาด !) นี่จะเป็นโหมดที่ได้รับอนุญาต ฉันพยายามหาคำแนะนำเกี่ยวกับเรื่องนี้ทางออนไลน์ แต่ฉันกลับมามือเปล่า ดังนั้นฉันมาหาคุณ: สิ่งที่คาดหวังมากที่สุดจากการดำเนินการเป็นจำนวนมากในลักษณะนี้? ฉันควรจะเข้มงวดมากขึ้นหรือฉันควรจะได้รับอนุญาตมากขึ้น?

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