คำถามติดแท็ก design

คำถามเกี่ยวกับการแก้ปัญหาและการวางแผนแก้ปัญหาผ่านการออกแบบซอฟต์แวร์

10
สถาปัตยกรรมที่ดี (เรียบร้อย) คืออะไรในการเขียนโปรแกรมเว็บไซต์อย่างง่ายเช่นสมุดติดต่อ
เมื่อฉันสร้างเว็บไซต์อย่างง่ายเช่นสมุดติดต่อที่ฉันสามารถเพิ่มลบและอัปเดตผู้ติดต่อได้ฉันจะสร้างindex.phpไฟล์ที่ผู้ใช้ถ้าเขาไม่ได้ลงชื่อเข้าใช้จะต้องป้อนรหัสผ่านและถ้าเขาป้อนรหัสผ่านที่ถูกต้อง กำหนดเซสชันและสามารถทำสิ่งต่าง ๆ กับผู้ติดต่อ ฉันมีสองไฟล์: ตัวแรก ( contacts.php) คือรหัส HTML ที่จะแสดง เหนือรหัส HTML ฉันรวมไฟล์ที่สองและสร้างคลาส ที่สอง ( contacts_class.php) มีวิธีการทั้งหมดสำหรับการเพิ่มการลบและการปรับปรุง ฉันคิดว่าไม่เป็นไร แต่เมื่อพูดถึงการนำโครงการใหญ่มาใช้ฉันควรทำอย่างไร? ฉันต้องสร้างโฟลเดอร์สำหรับทุก ๆ หน้าและวางไฟล์ไว้ในนั้น (เช่นด้านบน HTML และคลาส) และฉันต้องทำอย่างไร อะไรคือสถาปัตยกรรมที่ดีและเรียบร้อยสำหรับการสร้างโครงการขนาดใหญ่ที่โปรแกรมเมอร์คนอื่น ๆ ทุกคนจะเข้าใจอย่างสมบูรณ์แบบ?

9
คุณจะจัดระเบียบซอฟต์แวร์ที่ปรับแต่งได้อย่างไร
ฉันกำลังทำงานในโครงการซอฟต์แวร์ขนาดใหญ่ซึ่งได้รับการปรับแต่งอย่างดีสำหรับลูกค้าที่หลากหลายทั่วโลก ซึ่งหมายความว่าเราอาจมีรหัส 80% ซึ่งเป็นเรื่องปกติระหว่างลูกค้าหลายราย แต่ยังมีรหัสจำนวนมากที่ต้องเปลี่ยนจากลูกค้ารายหนึ่งเป็นลูกค้ารายอื่น ในอดีตที่ผ่านมาเราทำการพัฒนาของเราในที่เก็บแยกต่างหาก (SVN) และเมื่อโครงการใหม่เริ่มต้น (เรามีน้อย แต่ลูกค้าขนาดใหญ่) สร้างพื้นที่เก็บข้อมูลอื่นตามโครงการที่ผ่านมามีพื้นฐานรหัสที่ดีที่สุดสำหรับความต้องการของเรา สิ่งนี้ได้ผลในอดีต แต่เราพบปัญหาหลายประการ: ข้อบกพร่องที่ได้รับการแก้ไขในที่เก็บหนึ่งจะไม่ได้รับการแก้ไขในที่เก็บอื่น ๆ นี่อาจเป็นปัญหาขององค์กร แต่ฉันพบว่ามันยากที่จะแก้ไขและแก้ไขข้อบกพร่องในที่เก็บ 5 แห่งที่แตกต่างกันโดยคำนึงว่าทีมที่ดูแลพื้นที่เก็บข้อมูลนี้อาจอยู่ในอีกส่วนหนึ่งของโลกและเราไม่มีสภาพแวดล้อมการทดสอบ ไม่ทราบกำหนดการหรือข้อกำหนดที่ต้องมี ("ข้อบกพร่อง" ในประเทศหนึ่งอาจเป็น "คุณสมบัติ" ในอีกประเทศหนึ่ง) คุณสมบัติและการปรับปรุงที่ทำไว้สำหรับโครงการหนึ่งซึ่งอาจเป็นประโยชน์สำหรับโครงการอื่นหายไปหรือหากใช้ในโครงการอื่นมักทำให้เกิดอาการปวดหัวขนาดใหญ่รวมจากรหัสฐานหนึ่งไปยังอีกโครงการหนึ่ง (เนื่องจากทั้งสองสาขาอาจได้รับการพัฒนาอย่างอิสระเป็นเวลาหนึ่งปี ) Refactorings และการปรับปรุงรหัสที่ทำในสาขาการพัฒนาหนึ่งอาจสูญหายหรือก่อให้เกิดอันตรายมากกว่าดีถ้าคุณต้องรวมการเปลี่ยนแปลงทั้งหมดเหล่านี้ระหว่างสาขา ขณะนี้เรากำลังพูดถึงวิธีการแก้ปัญหาเหล่านี้และในขณะนี้ได้มีแนวคิดต่อไปนี้เกี่ยวกับวิธีการแก้ไขปัญหาดังกล่าว: ทำการพัฒนาในสาขาที่แยกกันแต่จัดระเบียบได้ดีขึ้นด้วยการมีที่เก็บส่วนกลางที่มีการแก้ไขข้อบกพร่องทั่วไปและรวมโครงการทั้งหมดเข้าด้วยกันการเปลี่ยนแปลงจากที่เก็บส่วนกลางนี้เป็นของตัวเองเป็นประจำ (เช่นทุกวัน) เรื่องนี้ต้องมีวินัยอย่างมากและมีความพยายามอย่างมากในการผสานระหว่างสาขา ดังนั้นฉันไม่มั่นใจว่ามันจะทำงานได้และเราสามารถรักษาวินัยนี้โดยเฉพาะอย่างยิ่งเมื่อเวลากดดัน ละทิ้งการพัฒนาแยกสาขาและมีที่เก็บรหัสกลางที่รหัสของเราทั้งหมดอยู่และทำการปรับแต่งของเราโดยมีโมดูลที่เสียบได้และตัวเลือกการกำหนดค่า เรากำลังใช้คอนเทนเนอร์การพึ่งพาการพึ่งพาเพื่อแก้ไขการพึ่งพาในรหัสของเราและเรากำลังติดตามรูปแบบ MVVM ในรหัสส่วนใหญ่ของเราเพื่อแยกตรรกะทางธุรกิจออกจาก UI ของเราอย่างหมดจด วิธีที่สองดูเหมือนจะสง่างามกว่า แต่เรามีปัญหาที่ยังไม่คลี่คลายในแนวทางนี้ ตัวอย่างเช่นวิธีจัดการกับการเปลี่ยนแปลง / การเพิ่มเติมในแบบจำลอง / ฐานข้อมูลของคุณ เราใช้. NET กับ …

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

7
การเขียนโปรแกรมเชิงฟังก์ชันละเลยประโยชน์ที่ได้รับจาก“ ตามเกณฑ์ที่จะใช้ในการย่อยสลายระบบเป็นโมดูล” (การซ่อนข้อมูล) หรือไม่?
มีบทความคลาสสิกชื่อตามเกณฑ์ที่จะใช้ในการย่อยสลายระบบเป็นโมดูลที่ฉันเพิ่งอ่านเป็นครั้งแรก มันสมเหตุสมผลดีสำหรับฉันและอาจเป็นหนึ่งในบทความที่ OOP อ้างอิง ข้อสรุปของมัน: เราพยายามสาธิตโดยตัวอย่างเหล่านี้ว่ามันไม่ถูกต้องเสมอไปที่จะเริ่มการสลายตัวของระบบเป็นโมดูลบนพื้นฐานของแผนผังลำดับงาน ... แต่ละโมดูลได้รับการออกแบบมาเพื่อซ่อนการตัดสินใจจากสิ่งอื่น ในความเห็นที่ไม่มีการศึกษาและไม่มีประสบการณ์ของฉันการเขียนโปรแกรมฟังก์ชั่นใช้คำแนะนำตรงข้ามแน่นอนของบทความนี้ ความเข้าใจของฉันคือการเขียนโปรแกรมการทำงานทำให้การไหลของข้อมูลเป็นสำนวน ข้อมูลถูกส่งผ่านจากฟังก์ชั่นหนึ่งไปยังอีกฟังก์ชั่นแต่ละฟังก์ชั่นจะรับรู้ข้อมูลอย่างใกล้ชิดและ"เปลี่ยน"ไปพร้อมกัน และฉันคิดว่าฉันเคยเห็น Rich Hickey คุยกันในที่ที่เขาพูดถึงว่าการซ่อนข้อมูลนั้นเกินจริงหรือไม่จำเป็นหรืออะไร แต่ฉันจำไม่ได้แน่นอน ก่อนอื่นฉันต้องการทราบว่าการประเมินของฉันถูกต้องหรือไม่ กระบวนทัศน์ของ FP และบทความนี้ขัดแย้งกับปรัชญาหรือไม่? สมมติว่าพวกเขาไม่เห็นด้วย FP จะ "ชดเชย" อย่างไรหากไม่มีการซ่อนข้อมูล บางทีพวกเขาอาจเสียสละการซ่อนข้อมูล แต่ได้รับ X, Y และ Z ฉันต้องการทราบเหตุผลว่าทำไม X, Y และ Z จึงถือว่าเป็นประโยชน์มากกว่าการซ่อนข้อมูล หรือสมมติว่าพวกเขาไม่เห็นด้วย FP อาจรู้สึกว่าการซ่อนข้อมูลไม่ดี ถ้าเป็นเช่นนั้นทำไมจึงคิดว่าการซ่อนข้อมูลไม่ดี สมมติว่าพวกเขาเห็นด้วยฉันต้องการทราบว่าการนำ FPs ไปปฏิบัติใช้ของการซ่อนข้อมูลคืออะไร เห็นได้ชัดใน OOP คุณสามารถมีprivateฟิลด์ที่ไม่มีใครนอกชั้นเรียนสามารถเข้าถึงได้ ไม่มีสิ่งใดที่เปรียบเทียบกับฉันใน FP ฉันรู้สึกว่ามีคำถามอื่น …

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

9
แยกคลาสออกจากส่วนติดต่อผู้ใช้
อะไรคือแนวปฏิบัติที่ดีที่สุดในการเขียนคลาสที่อาจต้องรู้เกี่ยวกับส่วนต่อประสานผู้ใช้ ชั้นเรียนจะรู้วิธีวาดตัวเองไม่ได้หรือไม่เพราะมันขึ้นอยู่กับว่าอินเทอร์เฟซผู้ใช้คืออะไร (คอนโซล, GUI, ฯลฯ ) ในหนังสือเขียนโปรแกรมหลายเล่มฉันเจอตัวอย่าง "รูปร่าง" ที่แสดงการสืบทอด รูปร่างคลาสพื้นฐานมีเมธอด draw () ที่แต่ละรูปร่างเช่นวงกลมและการแทนที่สแควร์ สิ่งนี้ทำให้เกิด polymorphism แต่วิธีการดึง () ไม่ใช่วิธีที่ขึ้นอยู่กับว่าส่วนต่อประสานผู้ใช้คืออะไร หากเราเขียนคลาสนี้เพื่อพูดแบบฟอร์มชนะเราจะไม่สามารถใช้งานซ้ำได้สำหรับแอปคอนโซลหรือเว็บแอป ถูกต้องหรือไม่ สาเหตุของคำถามคือฉันพบว่าตัวเองติดอยู่เสมอและวางตัวกับวิธีการวางชั้นเรียนทั่วไปเพื่อให้พวกเขามีประโยชน์มากที่สุด นี่เป็นการทำงานกับฉันและฉันสงสัยว่าถ้าฉัน "พยายามหนักเกินไป"
27 design 

12
SOLID vs. การหลีกเลี่ยงสิ่งที่เป็นนามธรรมก่อนวัยอันควร
ฉันเข้าใจว่าSOLIDควรทำอะไรให้สำเร็จและใช้มันเป็นประจำในสถานการณ์ที่ความเป็นโมดูล่านั้นสำคัญและเป้าหมายของมันก็มีประโยชน์อย่างชัดเจน อย่างไรก็ตามมีสองสิ่งที่ขัดขวางไม่ให้ฉันใช้มันอย่างสม่ำเสมอบน codebase ฉันต้องการหลีกเลี่ยงสิ่งที่เป็นนามธรรมก่อนวัยอันควร จากประสบการณ์ของฉันวาดเส้นที่เป็นนามธรรมโดยไม่มีกรณีการใช้อย่างเป็นรูปธรรม (ชนิดที่มีอยู่ในปัจจุบันหรือในอนาคตอันใกล้ ) นำไปสู่การที่พวกเขาถูกวาดในสถานที่ที่ผิด เมื่อฉันพยายามแก้ไขโค้ดดังกล่าวบรรทัดที่เป็นนามธรรมจะเข้ามาแทนที่การช่วยเหลือ ดังนั้นฉันมักจะทำผิดด้านข้างของการไม่วาดเส้นนามธรรมจนกว่าฉันจะมีความคิดที่ดีว่าพวกเขาจะมีประโยชน์ที่ไหน ฉันพบว่ามันยากที่จะปรับให้เป็นแบบโมดูลาร์เพื่อประโยชน์ของตัวเองถ้ามันทำให้โค้ดของฉันละเอียดยิ่งขึ้นเข้าใจได้ยากขึ้นและไม่กำจัดการทำซ้ำใด ๆ ฉันพบว่ารหัสโพรซีเดอร์ที่เรียบง่ายและแน่นหนาบางครั้งเข้าใจง่ายกว่าโค้ดราวีโอลี่ที่มีปัจจัยดีเพราะการไหลนั้นง่ายและเป็นเชิงเส้น นอกจากนี้ยังง่ายต่อการเขียน ในทางตรงกันข้ามความคิดนี้มักจะนำไปสู่วัตถุที่พระเจ้า ฉันมักจะปรับโครงสร้างเหล่านี้อย่างอนุรักษ์นิยมโดยเพิ่มเส้นนามธรรมที่ชัดเจนเฉพาะเมื่อฉันเห็นรูปแบบที่ชัดเจน หากมีสิ่งใดผิดปกติกับวัตถุของพระเจ้าและรหัสคู่ที่แน่นหนาถ้าคุณไม่ต้องการความเป็นโมดูล่าร์ที่ชัดเจนกว่านี้ไม่มีการทำซ้ำอย่างมีนัยสำคัญและสามารถอ่านรหัสได้? แก้ไข: เท่าที่หลักการของแต่ละบุคคลฉันตั้งใจจะเน้นว่าการทดแทน Liskov เป็น IMHO อย่างเป็นทางการของสามัญสำนึกและควรนำไปใช้ทุกที่เนื่องจาก abstractions ไม่สมเหตุสมผลถ้าไม่ใช่ นอกจากนี้ทุกชั้นเรียนควรมีความรับผิดชอบเพียงระดับเดียวในระดับที่เป็นนามธรรมแม้ว่ามันอาจจะเป็นระดับที่สูงมากโดยมีรายละเอียดการดำเนินการทั้งหมดหนาตาลงในชั้นเรียน 2,000 บรรทัดขนาดใหญ่ โดยพื้นฐานแล้วบทคัดย่อของคุณควรเข้าใจว่าคุณเลือกนามธรรมอย่างไร หลักการที่ฉันถามในกรณีที่ไม่มีความชัดเจนว่าเป็นโมดูล่าร์แบบเปิดปิดการแยกอินเทอร์เฟซและโดยเฉพาะอย่างยิ่งการพึ่งพาอาศัยกัน

11
ตอบสนองความต้องการจากนักธุรกิจ?
วิธีใดที่ดูเหมือนว่าจะดีที่สุดในการเกลี้ยกล่อมข้อกำหนดจากคนที่ไม่มีเทคโนโลยี ฉันกำลังทำงานกับทีมที่พยายามหาข้อมูลจำเพาะสำหรับโครงการ ทุกครั้งที่เราพบกันและมันก็เป็นความคาดหวังสำหรับการประชุมครั้งต่อไปเราขอให้นักธุรกิจนำความต้องการของพวกเขากลับมา พวกเขามักจะตอบสนองสิ่งนี้:“ คุณคิดว่าพวกคุณสามารถสร้างต้นแบบขึ้นมาเพื่อที่เราจะได้เห็นสิ่งที่เราชอบในสัปดาห์หน้า…คุณรู้ไม่ใช่ข้อมูลหรืออะไรเลยเพราะมันเป็นต้นแบบเพียงแค่การใช้งาน” เป็นโครงการบวก 6 เดือนเพื่อให้เห็นได้ชัดว่าเป็นไปไม่ได้ (เราจะต้องพัฒนาทุกสิ่ง!) และเราไม่รู้ด้วยซ้ำว่าจะต้องทำอะไรหากไม่มีสเป็คบางอย่าง ตรงไปตรงมาฉันคิดว่าเหมือนคนส่วนใหญ่พวกเขามีความคิดบางอย่างของสิ่งที่พวกเขาต้องการพวกเขาไม่ได้คิดเกี่ยวกับมันในวิธีที่มุ่งเน้นที่จำเป็นในการรวบรวมความต้องการที่แท้จริง เป็นอีกทางเลือกหนึ่งในการบอกพวกเขา “ ให้สิ่งที่คุณต้องการหรือเราไม่สามารถ / ไม่ทำงาน” (เราต้องการให้พวกเขามีความสุขกับผลลัพธ์) มีวิธีที่ช่วยให้พวกเขาตัดสินใจในสิ่งที่พวกเขาต้องการหรือไม่? ตัวอย่างเช่นเราสามารถบอกพวกเขาได้: “ วาดบางหน้าจอ (ใน Powerpoint บนผ้าเช็ดปากหรืออะไรก็ได้) ที่แสดง UI ที่คุณต้องการด้วยข้อมูลทั้งหมดที่คุณต้องการดูและคำอธิบายเกี่ยวกับการทำงานในระยะขอบ จากนี้เราจะขัดมันขึ้นมาและสร้างแบ็กเอนด์ขึ้นอยู่กับความต้องการด้านพฤติกรรมนี้” หรือ “ ไม่ต้องกังวลว่าจะเป็นอย่างไรในตอนนี้ (หมายเลข 1 วางสาย) เพียงแค่ให้รายการของข้อมูลทั้งหมดที่คุณต้องการเกี่ยวกับแต่ละสิ่งที่โปรแกรมติดตาม ดังนั้นสำหรับ“ ลูกค้า” คุณอาจมีรายชื่อ: ชื่อที่อยู่หมายเลขโทรศัพท์คำสั่งซื้อ ฯลฯ ไม่จำเป็นต้องเป็นโครงสร้างฐานข้อมูลที่สมบูรณ์แบบ แต่เราสามารถทำอะไรบางอย่างออกมาจากสิ่งนี้และรับทราบว่าคุณกำลังมองหาอะไร” ทำอย่างใดอย่างหนึ่งในวิธีการทางเลือกเหล่านี้เพื่อให้นักธุรกิจมุ่งเน้นไปที่สิ่งที่พวกเขาต้องการทำให้รู้สึก? มีทางเลือกอื่นที่คุณเห็นในการกระทำหรือไม่

3
วิธีที่จะกลายเป็นดีในการวิเคราะห์และออกแบบเชิงวัตถุ (OOAD)?
การเป็นนักวิเคราะห์และนักออกแบบที่ดีจะเป็นประโยชน์อย่างมากต่อผู้พัฒนา แต่มีอุปสรรคสำหรับเรื่องนี้อย่างแน่นอน ไม่ใช่ทุกคนที่สนใจ OOAD และไม่ใช่ทุกคนที่สนใจรู้เส้นทาง OOAD ที่ดีควรรู้ภาษา OO หลายภาษาหรือไม่ หรือเขา / เธอควรทำโครงการล้มเหลว เราจะเป็น OOAD ที่ดีได้อย่างไร?

3
มีรายการชื่อผู้ใช้ทั่วไปที่จะจองในระบบใหม่หรือไม่?
คำถามนี้ถูกโยกย้ายจาก Stack Overflow เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 8 ปีที่ผ่านมา ฉันต้องจองชื่อผู้ใช้ในเว็บไซต์ใหม่ของฉัน โดยทั่วไปแล้วแบ่งออกเป็นสามประเภท 1) ชื่อผู้ใช้ที่ไม่ควรมี (เช่น: ผู้ดูแลระบบผู้ใช้บริการความช่วยเหลือรูตและอื่น ๆ ) 2) ชื่อของบุคคลหรือ บริษัท ที่มีชื่อเสียงระดับสูงที่เราอาจต้องการจองในกรณีที่ปรากฏ 3) ชื่ออื่นที่ระบุโดยเราโดยตรง มันจะมีประโยชน์จริง ๆ ถ้ามีรายชื่อผู้ใช้สำหรับ 2 หมวดหมู่แรกที่มีอยู่และฉันสามารถใช้มันได้ ไม่มีใครรู้รายการดังกล่าวหรือไม่

8
คุณจัดการกับการออกแบบใน Scrum ได้อย่างไร
คุณจัดการกับการออกแบบใน Scrum ได้อย่างไร คุณยังมีเอกสารการออกแบบที่ดีสำหรับการทำซ้ำในการต่อสู้แต่ละครั้งหรือไม่? คุณเพิ่งออกแบบบันทึกที่มีไดอะแกรม UML หรือไม่? หรือคุณเพิ่งมีรหัสความคิดเห็นดี? การวนซ้ำแต่ละครั้งอาจเกี่ยวข้องกับการเปลี่ยนแปลงการออกแบบดังนั้นฉันแค่อยากจะรู้ว่าผู้คนจับสิ่งนี้ได้อย่างไรเพื่อให้นักพัฒนาใหม่มีงานง่าย ๆ ในการทำความเข้าใจโดเมน
26 design  scrum 

2
ช่วงความสลับซับซ้อนของวัฏจักร [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ประเภทของความซับซ้อนตามวัฏจักรคืออะไร? ตัวอย่างเช่น: 1-5: บำรุงรักษาง่าย 6-10: ยาก 11-15: ยากมาก 20+: ใกล้จะเป็นไปไม่ได้ เป็นเวลาหลายปีแล้วที่ฉันได้ไปโดยมีข้อสันนิษฐานว่า 10 ข้อ จำกัด และสิ่งอื่น ๆ นอกเหนือจากนั้นไม่ดี ฉันกำลังวิเคราะห์วิธีแก้ปัญหาและฉันพยายามกำหนดคุณภาพของรหัส ความซับซ้อนตามวัฏจักรแน่นอนไม่ได้วัดเพียง แต่มันสามารถช่วย มีวิธีการที่มีความซับซ้อนของวงจร 200+ ฉันรู้ว่ามันแย่มาก แต่ฉันอยากรู้เกี่ยวกับช่วงล่างเช่นในตัวอย่างด้านบน ฉันพบสิ่งนี้ : ค่าอ้างอิงดังกล่าวจาก Carnegie Mellon กำหนดช่วงคร่าวๆสี่ค่าสำหรับค่าความซับซ้อนของวงจร: วิธีการระหว่าง 1 ถึง 10 ถือว่าง่ายและเข้าใจง่าย ค่าระหว่าง 10 ถึง 20 แสดงถึงรหัสที่ซับซ้อนกว่าซึ่งอาจยังเข้าใจได้ อย่างไรก็ตามการทดสอบจะยากขึ้นเนื่องจากจำนวนสาขาที่เป็นไปได้มากขึ้นที่รหัสสามารถทำได้ ค่า 20 …

5
จะอธิบายได้อย่างไรว่าทำไมตัวเลือกการออกแบบถึงดี? [ปิด]
ปิด คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้มุ่งเน้นที่ปัญหาเดียวโดยแก้ไขโพสต์นี้ ปิดให้บริการใน4 ปีที่แล้ว เมื่อฉันเป็นนักพัฒนาที่ดีขึ้นฉันพบว่าทักษะการออกแบบส่วนใหญ่มาจากสัญชาตญาณมากกว่าการวิเคราะห์เชิงกล มันเยี่ยมมาก มันช่วยให้ฉันอ่านโค้ดและรู้สึกถึงมันเร็วขึ้น มันช่วยให้ฉันแปลการออกแบบระหว่างภาษาและ abstractions ง่ายขึ้นมาก และมันทำให้ฉันทำสิ่งต่าง ๆ ได้เร็วขึ้น ข้อเสียคือฉันพบว่ามันยากที่จะอธิบายให้เพื่อนร่วมทีม (และที่แย่กว่านั้นคือการจัดการ) ทำไมการออกแบบโดยเฉพาะนั้นมีประโยชน์ โดยเฉพาะอย่างยิ่งเพื่อนร่วมทีมที่ล้าหลังในการปฏิบัติที่ดีที่สุด "การออกแบบนี้สามารถทดสอบได้มากขึ้น!" หรือ "คุณควรสนับสนุนการแต่งเพลงมากกว่ามรดก" ไปที่หัวของพวกเขาและนำไปสู่หลุมกระต่ายของฉันพยายามที่จะเบาะแสทุกคนในทศวรรษที่ผ่านมาของความก้าวหน้าด้านวิศวกรรมซอฟต์แวร์ ฉันจะดีขึ้นด้วยการฝึกฝนแน่นอน แต่ในเวลานั้นมันเกี่ยวข้องกับเวลาที่สูญเปล่าและ / หรือการออกแบบที่ไม่ดี (ซึ่งจะนำไปสู่การเสียเวลาแก้ไขในภายหลัง) ฉันจะอธิบายได้อย่างไรว่าเหตุใดการออกแบบบางอย่างจึงเหนือกว่าเมื่อผู้ชมไม่เห็นประโยชน์อย่างชัดเจน

11
เต็มไปด้วยข้อบกพร่องแบบมัลติเธรด
ในทีมใหม่ของฉันที่ฉันจัดการรหัสส่วนใหญ่ของเราคือแพลตฟอร์มซ็อกเก็ต TCP และรหัสเครือข่าย http C ++ ทั้งหมด ส่วนใหญ่มาจากผู้พัฒนารายอื่นที่ออกจากทีมไป นักพัฒนาปัจจุบันของทีมนั้นฉลาดมาก แต่ส่วนใหญ่เป็นรุ่นรองในแง่ของประสบการณ์ ปัญหาที่ใหญ่ที่สุดของเรา: ข้อบกพร่องที่เกิดขึ้นพร้อมกันแบบมัลติเธรด ไลบรารีคลาสของเราส่วนใหญ่เขียนเป็นแบบอะซิงโครนัสโดยใช้คลาสเธรดพูลบางคลาส เมธอดบนไลบรารีคลาสมักเข้าคิวเพื่อรัน taks ที่ยาวบนเธรดพูลจากเธรดหนึ่งและจากนั้นเมธอดการเรียกกลับของคลาสนั้นจะถูกเรียกใช้บนเธรดอื่น เป็นผลให้เรามีข้อบกพร่องกรณีขอบจำนวนมากที่เกี่ยวข้องกับข้อสันนิษฐานเกลียวที่ไม่ถูกต้อง ซึ่งส่งผลให้ข้อบกพร่องที่ลึกซึ้งที่มีมากกว่าส่วนที่สำคัญและล็อคเพื่อป้องกันปัญหาการเกิดพร้อมกัน สิ่งที่ทำให้ปัญหาเหล่านี้ยากขึ้นคือความพยายามแก้ไขมักไม่ถูกต้อง ข้อผิดพลาดบางประการที่ฉันสังเกตเห็นว่าทีมพยายาม (หรือภายในรหัสเดิม) รวมถึงสิ่งต่อไปนี้: ข้อผิดพลาดทั่วไป # 1 - แก้ไขปัญหาการเกิดพร้อมกันโดยเพียงแค่ใส่ล็อกรอบ ๆ ข้อมูลที่ใช้ร่วมกัน แต่ลืมเกี่ยวกับสิ่งที่เกิดขึ้นเมื่อวิธีการไม่ได้รับการเรียกในลำดับที่คาดหวัง นี่เป็นตัวอย่างง่ายๆ: void Foo::OnHttpRequestComplete(statuscode status) { m_pBar->DoSomethingImportant(status); } void Foo::Shutdown() { m_pBar->Cleanup(); delete m_pBar; m_pBar=nullptr; } ดังนั้นตอนนี้เรามีข้อผิดพลาดที่สามารถเรียกปิดได้ในขณะที่ OnHttpNetworkRequestComplete กำลังเกิดขึ้น ผู้ทดสอบพบข้อผิดพลาดจับการถ่ายโอนข้อมูลความผิดพลาดและกำหนดข้อผิดพลาดให้กับนักพัฒนา เขาก็แก้ไขข้อผิดพลาดเช่นนี้ …

4
วิธีหลีกเลี่ยง“ ผู้จัดการ” ในรหัสของฉัน
คำถามนี้ถูกโยกย้ายจาก Code Exchange Stack Stack เพราะสามารถตอบได้ใน Software Engineering Stack Exchange อพยพ 6 ปีที่แล้ว ขณะนี้ฉันกำลังออกแบบระบบ Entityของฉันใหม่สำหรับ C ++ และฉันมีผู้จัดการจำนวนมาก ในการออกแบบของฉันฉันมีชั้นเรียนเหล่านี้เพื่อผูกห้องสมุดของฉันเข้าด้วยกัน ฉันได้ยินสิ่งเลวร้ายมากมายเมื่อพูดถึงคลาส "ผู้จัดการ" บางทีฉันอาจไม่ได้ตั้งชื่อชั้นเรียนของฉันอย่างเหมาะสม อย่างไรก็ตามฉันไม่รู้ว่าจะตั้งชื่อพวกเขาอย่างไร ผู้จัดการส่วนใหญ่ในห้องสมุดของฉันประกอบด้วยชั้นเรียนเหล่านี้ (แม้ว่ามันจะแตกต่างกันเล็กน้อย): คอนเทนเนอร์ - คอนเทนเนอร์สำหรับวัตถุในตัวจัดการ คุณสมบัติ - คุณลักษณะสำหรับวัตถุในผู้จัดการ ในการออกแบบใหม่สำหรับห้องสมุดของฉันฉันมีชั้นเรียนเฉพาะเหล่านี้เพื่อผูกห้องสมุดของฉันเข้าด้วยกัน ComponentManager - จัดการส่วนประกอบใน Entity System ComponentContainer ComponentAttributes ฉาก * - อ้างอิงถึงฉาก (ดูด้านล่าง) SystemManager - จัดการระบบในระบบองค์กร SystemContainer ฉาก * …

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