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

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

1
microservices ควรเป็นผู้ใช้หรือไม่
เรากำลังพยายามหาวิธีที่ดีที่สุดในการอนุญาตผู้ใช้ในสถาปัตยกรรม microservice ในขณะที่มั่นใจว่า microservices มีสิทธิ์ จำกัด สถาปัตยกรรมของเราใช้บริการการอนุญาตจากส่วนกลางเพื่อจัดการการออกโทเค็น JWT เรามีข้อกำหนดดังต่อไปนี้: ผู้ใช้ควรถูก จำกัด ให้ดำเนินบทบาทบางอย่าง เช่นผู้ใช้ควรสามารถสร้าง / แก้ไข / อ่านเนื้อหาที่เขาเป็นเจ้าของได้เท่านั้น Microservices ควร จำกัด เฉพาะการอนุญาตที่จำเป็นเท่านั้น เช่นบริการไมโครเว็บที่เพียงต้องการอ่านข้อมูลจากบริการอื่นควรถูกห้ามอย่างชัดเจนจากการเขียนข้อมูลไปยังบริการนั้น ตัวอย่างเช่นสมมติว่าเรามีระบบที่ผู้ใช้สามารถอัปโหลดรูปภาพไปยังบริการเก็บรูปภาพ เรามีบริการติดแท็กที่ติดแท็กรูปภาพด้วยตำแหน่งโดยอัตโนมัติ ผู้ใช้สามารถ CRUD ภาพของตัวเอง บริการติดแท็กสามารถอ่านภาพใด ๆ จากบริการเก็บรูปภาพอย่างไรก็ตามไม่ควรแก้ไข / ลบ เป็นวิธีที่ดีในการบรรลุเป้าหมายข้างต้นโดยใช้โทเค็น JWT คืออะไร? วิธีแก้ปัญหาบางอย่างที่เรากล่าวถึงคือ: บริการเก็บรูปภาพแสดง 2 APIs หนึ่งที่พร้อมใช้งานภายนอก (ให้สิทธิ์การเข้าถึง CRUD ผู้ใช้) และอีกหนึ่งที่พร้อมใช้งานภายใน (ให้การเข้าถึงแบบอ่านอย่างเดียวภายใน) ดูเหมือนว่าไม่ยืดหยุ่น - จะเกิดอะไรขึ้นถ้าบริการภายในอื่นต้องการการเข้าถึงเพื่ออ่าน / เขียนภาพทั้งหมด …

3
จะทำให้การทดสอบอัตโนมัติเป็นที่นิยมได้อย่างไร [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน2 ปีที่ผ่านมา ฐานรหัสของเราเติบโตขึ้นเป็นเวลา 20 ปีแล้ว เราทำงานประมาณ 10 devs + sqa กับ 500kloc เมื่อไม่นานมานี้ทีมเล็ก ๆ ของเรา (2 devs หนึ่งจาก sqa) เริ่มทำงานกับโปรแกรมทดสอบอัตโนมัติ ปัจจุบันการวิ่งหนึ่งครั้งใช้เวลา 11 ชั่วโมงและเป็นการทดสอบการรวมระบบ เรากำลังดำเนินการเพื่อแก้ไขปัญหานี้และลดผลบวกปลอมและกำลังดำเนินการต่อไป แต่รายละเอียดไม่สำคัญ มันใช้งานได้โอเคและเราก็ทำการปรับปรุงต่อไป พวกเรา (ทีมเล็ก) ชอบมันมาก ถ้าเราทำลายบางสิ่งบางอย่างเราจะสังเกตเห็นอีกหนึ่งวันต่อมาและไม่ใช่ 2 เดือนต่อมาเมื่อ sqa ดู นอกจากนี้ผู้จัดการของเรา (dev + sqa) ชอบความคิด แต่คนอื่น ๆ ในทีมเพียงแค่เพิกเฉยผลการทดสอบ ในใจของพวกเขาหากการทดสอบล้มเหลวหลังเช็คอินมันเป็นปัญหาของการทดสอบไม่ใช่การเปลี่ยนรหัสและเป็นเพียงโครงการของเล่นของเรา เรามีการหารือหลายครั้งหากการทดสอบที่ล้มเหลวเป็นข้อผิดพลาดจริง เวลาส่วนใหญ่มันเป็น …

3
หนึ่งควรจัดการค่าคงที่ในหลายภาษาได้อย่างไร?
ฉันมีสถานการณ์ที่ฉันสนับสนุนสิ่งที่เป็นหน้าที่ของไลบรารีเดียวกันในหลายภาษา มักจะมีค่าคงที่ที่ต้องใช้ร่วมกันระหว่างเหล่านี้ (ตัวอย่างเช่นคีย์ชื่อเขตข้อมูล json หรือรหัสข้อผิดพลาด) วิธีที่ฉันทำอยู่ในขณะนี้คือการให้รหัสกำหนดค่าคงที่ในแต่ละภาษา ปัญหาเกิดขึ้นในการบำรุงรักษา หากฉันเพิ่มรหัสข้อผิดพลาดใหม่ฉันต้องอัปเดตในทุกไลบรารีด้วยตนเอง ในขณะนี้ใช้ได้สำหรับบางมันกลายเป็นน่าเบื่อถ้าฉันพูด 5 sdks เพื่อปรับปรุง มันคงจะดีถ้ามีแหล่งความจริงแหล่งเดียวสำหรับสิ่งเหล่านี้เช่นกัน ฉันคิดเกี่ยวกับการจัดเรียงของการตั้งค่าเหมือนบางไฟล์ แต่แล้วก็จะต้องมีการรวมอยู่ในทุกแพคเกจการใช้งานซึ่งจะเพิ่มความซับซ้อนในการสร้างกระบวนการ / การเปิดตัวของเรา มีวิธีที่ดีกว่าในการจัดการค่าคงที่ซึ่งใช้ร่วมกันระหว่างหลายภาษาหรือไม่
13 design  packages 

4
เกี่ยวกับวันที่ของฐานข้อมูลประเภท crusade: ถูกต้อง? คุ้มค่า? มีใครรู้สึกบ้างไหม?
ฉันใช้เวลามากในการตอบคำถาม SQL ผ่านทาง SO ฉันเจอคำถามของตระกูลนี้บ่อยครั้ง: SELECT * FROM person WHERE birthdate BETWEEN '01/01/2017' AND '01/03/2017' SELECT * FROM person WHERE birthdate BETWEEN '2017-01-01' AND '2017-03-01' SELECT * FROM person WHERE birthdate BETWEEN 'some string' AND 'other string' เช่นอาศัยการแปลงโดยนัยจากสตริงถึงวันที่ (ไม่ดี) ของพารามิเตอร์ที่กำหนดหรืออาศัยฐานข้อมูลที่แปลงค่า x ล้านแถวของฐานข้อมูลเป็นสตริงและทำการเปรียบเทียบสตริง (แย่กว่า) ฉันแสดงความคิดเห็นเป็นครั้งคราวโดยเฉพาะอย่างยิ่งถ้าเป็นผู้ใช้ตัวแทนสูงที่เขียนคำตอบสมาร์ท แต่คนที่ฉันรู้สึกว่าควรจะมีความเลอะเทอะน้อยลง / พิมพ์ด้วยชนิดข้อมูลของพวกเขาน้อยลง ความคิดเห็นมักจะใช้แบบฟอร์มที่มันอาจจะดีกว่าถ้าพวกเขาแปลงสตริงเป็นวันที่อย่างชัดเจนโดยใช้ to_date (Oracle), …

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

2
เทคนิคการเขียนโปรแกรมนี้เรียกว่าอะไร?
ฉันเจอเทคนิคการเขียนโปรแกรมนี้ในขณะที่ทำการเขียนโปรแกรมจับคู่ในการสัมภาษณ์และไม่พบชื่อของมันใน google แนวคิดคือคุณเขียนนิพจน์ที่ใช้ตัวแปรก่อนแล้วจึงเขียนโค้ดที่คำนวณตัวแปรในภายหลัง วิธีใช้โค้ดตัวอย่างที่นี่: private bool ValidPolicyNumber(string policyNumber) { var hasExpectedPrefix = policyNumber.Substring(0,5) == "POLIC"; var followedBy7Digits = Regex.IsMatch(policyNumber.Substring(6,7), "^[0-9]{7}$"); var hasLengthOf12 = policyNumber.Length == 12; return hasExpectedPrefix && followedBy7Digits && hasLengthOf12; } เมื่อเขียนฟังก์ชั่นนี้โดยใช้เทคนิคที่ฉันพูดถึงคุณต้องเขียนบรรทัดสุดท้ายก่อนreturn hasExpectedPrefix && followedBy7Digits && hasLengthOf12;แล้วจึงเขียน 3 บรรทัดที่อยู่ข้างหน้า เทคนิคที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้คือ "การคิดอย่างปรารถนา" และมาจาก SICP แต่เกี่ยวข้องกับการเรียกฟังก์ชั่นที่คุณจะนำไปใช้ในภายหลังแทนที่จะใช้ตัวแปรที่คุณจะเริ่มต้นในภายหลัง

1
การใช้วิธีการเริ่มต้นของ Java
สำหรับทศวรรษที่ผ่านมาจะได้รับกรณีที่อินเตอร์เฟซได้เพียง เท่านั้น (เท่านั้น) สำหรับการระบุลายเซ็นวิธี เราได้รับการบอกว่านี่เป็น "วิธีการทำสิ่งที่ถูกต้อง" จากนั้น Java 8 ออกมาและพูดว่า: เอ่อเอ่อตอนนี้คุณสามารถกำหนดวิธีการเริ่มต้น ต้องวิ่งลาก่อน ฉันอยากรู้ว่าสิ่งนี้ถูกย่อยโดยนักพัฒนา Java ที่มีประสบการณ์และผู้ที่เริ่มเมื่อเร็ว ๆ นี้ (ไม่กี่ปีที่ผ่านมา) พัฒนามัน ฉันยังสงสัยเกี่ยวกับความเหมาะสมของ Java Orthodoxy และการฝึกฝนอย่างไร ฉันกำลังสร้างรหัสทดลองและในขณะที่ฉันกำลังทำการปรับเปลี่ยนใหม่ฉันลงเอยด้วยอินเทอร์เฟซที่ขยายส่วนต่อประสานมาตรฐาน (Iterable) และเพิ่มวิธีการเริ่มต้นสองวิธี และฉันจะซื่อสัตย์ฉันรู้สึกดีกับมัน ฉันรู้ว่านี่เป็นแบบปลายเปิดเล็ก ๆ น้อย ๆ แต่ตอนนี้มีเวลาสำหรับ Java 8 ที่จะใช้ในโครงการจริงมี orthodoxy รอบการใช้วิธีการเริ่มต้นหรือยัง สิ่งที่ฉันเห็นเป็นส่วนใหญ่เมื่อพูดถึงคือวิธีการเพิ่มวิธีการใหม่ในอินเทอร์เฟซโดยไม่ทำลายผู้บริโภค แต่สิ่งที่เกี่ยวกับการใช้สิ่งนี้ตั้งแต่เริ่มต้นเหมือนตัวอย่างที่ฉันให้ไว้ข้างต้น มีใครประสบปัญหาใด ๆ กับการให้การใช้งานในส่วนต่อประสานของพวกเขา?

8
“ ชอบการแต่งเพลงมากกว่ามรดก” - เป็นเหตุผลเดียวที่จะป้องกันการเปลี่ยนแปลงลายเซ็นได้หรือไม่?
หน้านี้สนับสนุนการแต่งเพลงมากกว่าการสืบทอดด้วยอาร์กิวเมนต์ต่อไปนี้ (ใช้ถ้อยคำใหม่ในคำพูดของฉัน): การเปลี่ยนแปลงในลายเซ็นของวิธีการของซูเปอร์คลาส (ซึ่งไม่ได้ถูกแทนที่ในคลาสย่อย) ทำให้เกิดการเปลี่ยนแปลงเพิ่มเติมในหลาย ๆ สถานที่เมื่อเราใช้การสืบทอด อย่างไรก็ตามเมื่อเราใช้ Composition การเปลี่ยนแปลงเพิ่มเติมที่จำเป็นนั้นมีอยู่ในที่เดียวนั่นคือคลาสย่อย นั่นเป็นเหตุผลเดียวที่จะสนับสนุนการแต่งเพลงมากกว่าการสืบทอด? เพราะถ้าเป็นกรณีนี้ปัญหานี้สามารถบรรเทาได้ง่ายโดยบังคับใช้รูปแบบการเข้ารหัสที่สนับสนุนการเอาชนะวิธีการทั้งหมดของ superclass แม้ว่า subclass จะไม่เปลี่ยนการใช้งาน (นั่นคือการใส่ dummy แทนที่ใน subclass) ฉันทำอะไรบางอย่างหายไปหรือเปล่า

6
ทำความสะอาดวิธีการทำแผนที่ OOP วัตถุไปยังผู้นำเสนอ
ฉันกำลังสร้างเกมกระดาน (เช่นหมากรุก) ใน Java ซึ่งแต่ละชิ้นเป็นชนิดของตัวเอง (เช่นPawn, Rookฯลฯ ) สำหรับส่วน GUI ของแอปพลิเคชันฉันต้องการรูปภาพสำหรับแต่ละส่วนเหล่านี้ ตั้งแต่ทำไปคิดเหมือน rook.image(); ละเมิดการแยก UI และตรรกะทางธุรกิจฉันจะสร้างผู้นำเสนอที่แตกต่างกันสำหรับแต่ละชิ้นแล้วแมปประเภทชิ้นส่วนกับผู้นำเสนอที่สอดคล้องกันเช่น private HashMap<Class<Piece>, PiecePresenter> presenters = ... public Image getImage(Piece piece) { return presenters.get(piece.getClass()).image(); } จนถึงตอนนี้ดีมาก อย่างไรก็ตามฉันรู้สึกว่าปรมาจารย์ OOP ที่ชาญฉลาดจะขมวดคิ้วเมื่อเรียกgetClass()วิธีการและแนะนำให้ใช้ผู้เยี่ยมชมเช่นนี้: class Rook extends Piece { @Override public <T> T accept(PieceVisitor<T> visitor) { return visitor.visitRook(this); } } …

4
ฉันจะเขียนแบบทดสอบเพื่อหาวิธีบริสุทธิ์ที่ไม่ส่งคืนสิ่งใดได้อย่างไร
ฉันมีวิชาเรียนมากมายที่จัดการกับการตรวจสอบความถูกต้องของค่า ตัวอย่างเช่นRangeValidatorคลาสจะตรวจสอบว่าค่าอยู่ในช่วงที่ระบุหรือไม่ คลาสตัวตรวจสอบความถูกต้องมีสองวิธี: is_valid(value)ซึ่งส่งคืนTrueหรือFalseขึ้นอยู่กับค่าและensure_valid(value)ตรวจสอบค่าที่ระบุและไม่ทำอะไรเลยถ้าค่านั้นถูกต้องหรือส่งข้อยกเว้นเฉพาะถ้าค่าไม่ตรงกับกฎที่กำหนดไว้ล่วงหน้า ขณะนี้มีการทดสอบสองหน่วยที่เกี่ยวข้องกับวิธีนี้: สิ่งที่ผ่านค่าที่ไม่ถูกต้องและทำให้แน่ใจว่ามีข้อผิดพลาดเกิดขึ้น def test_outside_range(self): with self.assertRaises(demo.ValidationException): demo.RangeValidator(0, 100).ensure_valid(-5) สิ่งที่ผ่านค่าที่ถูกต้อง def test_in_range(self): demo.RangeValidator(0, 100).ensure_valid(25) แม้ว่าการทดสอบครั้งที่สองจะทำงาน - ล้มเหลวหากมีการโยนข้อยกเว้นและประสบความสำเร็จหากensure_validไม่ได้โยนอะไรเลย - ความจริงที่ว่าไม่มีสิ่งใดassertอยู่ข้างในดูแปลก คนที่อ่านรหัสดังกล่าวจะถามตัวเองทันทีว่าทำไมมีการทดสอบซึ่งดูเหมือนว่าไม่ได้ทำอะไรเลย นี่เป็นแนวปฏิบัติในปัจจุบันเมื่อทดสอบวิธีที่ไม่ส่งคืนค่าและไม่มีผลข้างเคียงหรือไม่ หรือฉันควรจะเขียนการทดสอบในวิธีที่ต่างออกไป? หรือเพียงแค่ใส่ความคิดเห็นอธิบายสิ่งที่ฉันทำ

8
ทีมแย่งชิงไม่ปฏิบัติตามหลักการ YAGNI
ในการประชุม SCRUM ทีมผลิตภัณฑ์กำลังถกเถียงกันเกี่ยวกับคุณลักษณะบน API ที่แอพมือถือจะถูกใช้งาน เรามีการจำลองที่แสดงให้เห็นว่าหน้าจอควรมีลักษณะอย่างไรและองค์ประกอบสำคัญที่ควรมี ("รูปแบบ") จากสิ่งนี้และการสนทนาที่ฉันมีกับเจ้าของผลิตภัณฑ์ฉันสร้างต้นแบบสำหรับการตอบกลับ API (HAL + JSON) มันง่ายมาก JSON ที่สอดคล้องกับ HAL ซึ่งไม่ได้ทำอะไรมากไปกว่าการเป็นตัวแทนของสิ่งที่อยู่ในการจำลอง ฉันไม่ได้รับอิทธิพลจากความคิดในอนาคตที่นักธุรกิจเล็งเห็นเนื่องจากพวกเขามีแนวโน้มที่จะเปลี่ยนความคิดของพวกเขาบ่อยครั้งและฉันตัดสินใจที่จะใช้วิธีการที่เรียบง่าย ข้อเสนอของฉันถูกปฏิเสธโดยทีมงานและฉันได้รับคะแนนมากกว่า 7 ต่อ 1 ทีมตัดสินใจที่จะใช้โครงสร้าง json เชิงนามธรรมที่ซับซ้อนและไม่ใช่ความหมายซึ่งช่วยให้มีความยืดหยุ่นมากขึ้นในการจัดเรียงเค้าโครง ข้อเสียของวิธีการนี้คือเราได้ชุดวัตถุที่เหมือนกันซึ่งอาจมีคุณสมบัติเป็นโมฆะและว่างเปล่าโดยการออกแบบ พวกเขายังคิดว่ามันจะเป็นการดีที่จะทำการทดสอบ A / B แต่มันก็ขึ้นอยู่กับการคาดการณ์ของพวกเขาเท่านั้นเนื่องจากเราไม่มีข้อกำหนดดังกล่าว เวลาส่วนใหญ่ที่เราถกเถียงกันเกี่ยวกับสิ่งที่ไม่ได้เป็นส่วนหนึ่งของการวิ่งหรือไม่ได้กล่าวถึงในการจำลอง ปัญหาที่อธิบายไว้คือ "จะเกิดอะไรขึ้นถ้าการตลาดในอนาคตจะ ... ", "จะเกิดอะไรขึ้นถ้าธุรกิจอาจต้องการให้เรา ... " ฉันและเจ้าของผลิตภัณฑ์เป็นโปรแกรมเมอร์ที่มีประสบการณ์และเราเคยเห็นปัญหาแบบนี้มาแล้วในอดีต เราพยายามที่จะปฏิบัติตามหลักการYAGNIและKISS ส่วนที่เหลือของทีมมีประสบการณ์น้อยลงและถึงแม้ว่าพวกเขารู้หลักการเหล่านี้พวกเขาดูเหมือนจะไม่เข้าใจพวกเขา เราเห็นด้วยกับวิธีแก้ปัญหาของพวกเขาเนื่องจากทีมโดยรวมมีความสำคัญมากกว่าสำหรับเราและเราไม่ต้องการต่อสู้กับบางสิ่งที่ไม่สำคัญ แต่ฉันกลัวว่าสิ่งนั้นจะกลายเป็นแบบอย่างสำหรับการโต้วาทีและการอภิปรายที่ซับซ้อนมากขึ้น? วิธีจัดการกับพฤติกรรมเช่นนี้? มีอะไรบ้างที่ฉันในฐานะหัวหน้าทีมสามารถทำได้ดีกว่า เป็นมูลค่าการกล่าวขวัญว่าผลิตภัณฑ์นี้เป็น MVP ขั้นต้น

2
มีระบบการสร้างใด ๆ ที่รวมเวลางานที่คาดหวังไว้ในกำหนดการหรือไม่
นี่เป็นภาพประกอบคำถามของฉัน: สมมติว่างานสร้างที่ประกอบด้วยงานอิสระ 4 งานที่ชื่อว่า AD D ใช้เวลานานกว่า AC เป็นผลรวม ระบบบิลด์ที่ไม่สามารถรวมเวลางานที่สัมพันธ์กันอาจกำหนดเวลางานดังนี้: --------------------------------------- CPU1: A | C | --------------------------------------- CPU2: B | D | --------------------------------------- ในทางตรงกันข้ามหากตัวกำหนดตารางเวลาทราบความแตกต่างของเวลางานก็อาจเกิดขึ้นกับกำหนดการที่สั้นกว่านี้มาก: --------------------------------------- CPU1: A | B | C | --------------------------------------- CPU2: D | --------------------------------------- คำถามของฉัน: มีระบบการสร้างใด ๆ ที่รวมเวลางานที่คาดหวังไว้ในกำหนดการหรือไม่ งานวิจัยเชิงวิชาการในการสร้างระบบประเภทนี้มีอยู่จริง? ระบบการสร้างเหล่านี้อยู่ที่ไหน (ถ้ามี) ใช้เวลาจากข้อมูล? การวิเคราะห์พฤติกรรมกำหนดเวลาที่รวบรวมในระหว่างการสร้างก่อนหน้า? หากระบบการสร้างดังกล่าวไม่มีอยู่ทำไม? มี gotcha ที่จะทำให้พวกเขาคุ้มค่าน้อยกว่าพวกเขาปรากฏตัวครั้งแรก?

1
ความแตกต่างระหว่าง MVP และสถาปัตยกรรมแบบใหม่คืออะไร
คำถามคืออธิบายตนเองเพียงเพื่อเพิ่มความคิดของฉัน: เท่าที่ฉันได้อ่านเลเยอร์การนำเสนอใน Clean arch มีความรับผิดชอบเช่นเดียวกับใน MV ใน MVP วิธีหนึ่งตัดสินใจเลือกรูปแบบหนึ่งแทนแบบอื่น
13 architecture  mvp 

4
ชั้นเรียนขนาดใหญ่ที่มีความรับผิดชอบเดียว
ฉันมีCharacterคลาสline 2,500 ที่: ติดตามสถานะภายในของตัวละครในเกม โหลดและยืนยันสถานะนั้น จัดการคำสั่งที่เข้ามา ~ 30 (โดยปกติ = ส่งต่อคำสั่งไปยังGameแต่คำสั่งแบบอ่านอย่างเดียวบางคำสั่งจะตอบกลับทันที) รับสายประมาณ 80 สายจากGameการกระทำที่ต้องทำและการกระทำที่เกี่ยวข้องของผู้อื่น ดูเหมือนว่าฉันCharacterมีความรับผิดชอบเดียว: การจัดการสถานะของตัวละคร, การไกล่เกลี่ยระหว่างคำสั่งที่เข้ามาและเกม มีความรับผิดชอบอื่น ๆ อีกสองสามอย่างที่ถูกทำลายไปแล้ว: Characterมีสิ่งOutgoingที่เรียกร้องให้สร้างการอัพเดตขาออกสำหรับแอปพลิเคชันไคลเอนต์ CharacterมีTimerแทร็กใดที่อนุญาตให้ทำอะไรต่อไป คำสั่งที่เข้ามาจะถูกตรวจสอบกับสิ่งนี้ ดังนั้นคำถามของฉันคือเป็นที่ยอมรับหรือไม่ที่จะมีชั้นเรียนขนาดใหญ่ภายใต้ SRP และหลักการที่คล้ายกัน? มีวิธีปฏิบัติที่ดีที่สุดในการทำให้ยุ่งยากน้อยลงหรือไม่ (เช่นอาจแบ่งวิธีเป็นไฟล์แยกกัน) หรือฉันขาดอะไรบางอย่างไปและมีวิธีที่ดีมากที่จะแยกมันออกมา? ฉันรู้ว่านี่เป็นอัตนัยและต้องการความคิดเห็นจากผู้อื่น นี่คือตัวอย่าง: class Character(object): def __init__(self): self.game = None self.health = 1000 self.successful_attacks = 0 self.points = 0 self.timer = Timer() …

5
“ ส่วนต่อประสานคงที่” เป็นแนวปฏิบัติที่ดีหรือไม่?
ฉันเพิ่งสังเกตเห็นว่ามีตัวเลือกให้มีวิธีการคงที่ในส่วนต่อประสาน เช่นเดียวกับฟิลด์คงที่ของอินเตอร์เฟสมีพฤติกรรมที่น่าสนใจ: สิ่งเหล่านี้ไม่ได้รับการสืบทอด ฉันไม่แน่ใจว่ามีประโยชน์ใด ๆ ในส่วนต่อประสานที่เกิดขึ้นจริง อย่างไรก็ตามมันทำให้โปรแกรมเมอร์สามารถสร้างส่วนต่อประสานที่เป็นเพียงซองจดหมายสำหรับสิ่งของแบบคงที่เช่นคลาสยูทิลิตี้ ตัวอย่างง่ายๆเป็นเพียงซองจดหมายสำหรับค่าคงที่ทั่วโลก เมื่อเทียบกับชั้นเรียนคุณสามารถสังเกตเห็นว่าแผ่นที่ขาดหายไปpublic static finalนั้นง่ายกว่าที่คิด (ทำให้มันน้อยลง) public interface Constants { String LOG_MESSAGE_FAILURE = "I took an arrow to the knee."; int DEFAULT_TIMEOUT_MS = 30; } คุณสามารถสร้างบางสิ่งที่ซับซ้อนกว่านี้ได้เช่นคีย์หลอกหลอก enum ของ config public interface ConfigKeys { static createValues(ConfigKey<?>... values) { return Collections.unmodifiableSet(new HashSet(Arrays.asList(values))); } static ConfigKey<T> key(Class<T> …
13 java  java8 

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