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

รูปแบบการออกแบบเป็นโซลูชันที่ใช้ซ้ำได้ทั่วไปสำหรับปัญหาที่เกิดขึ้นทั่วไปในการออกแบบซอฟต์แวร์

4
มันเป็น "รูปแบบกลิ่น" ที่จะนำตัวแบบเช่น "FullName" หรือ "FormattedPhoneNumber" ในรุ่นของคุณหรือไม่?
ฉันกำลังทำงานกับแอพ ASP.NET MVC และฉันเริ่มติดนิสัยในการวางสิ่งที่ดูเหมือนว่า getters ที่เป็นประโยชน์และสะดวกในคลาส / โมเดลเอนทิตีของฉัน ตัวอย่างเช่น: public class Member { public int Id { get; set; } public string FirstName { get; set; } public string LastName { get; set; } public string PhoneNumber { get; set; } public string FullName { get { return FirstName + …

9
รูปแบบการออกแบบ: ฉันควรเรียนรู้พวกเขา? [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน4 ปีที่แล้ว ดังนั้นมันค่อนข้างแปลกที่ถามคำถามสองข้อย้อนหลัง แต่พวกเขาไม่เกี่ยวข้องกันมากและฉันไม่ต้องการรวม แต่ฉันไม่ใช่คำถามสแปมฉันสัญญา! อย่างไรก็ตามฉันเป็นบัณฑิตวิทยาลัยเมื่อไม่นานมานี้และการศึกษาของฉันได้สัมผัสกับรูปแบบการออกแบบเท่านั้น ... เราดำเนินการเรียบง่ายเพียงไม่กี่สัมผัสกับความจริงที่ว่ามีคนที่ซับซ้อนมากขึ้นและได้รับคำสั่งให้หันไปใช้หนังสือ GoF ถ้าเรา ต้องการเรียนรู้เพิ่มเติม คำถามของฉันคือมันคุ้มค่าที่จะเรียนรู้รูปแบบในหนังสือ GoF หรือไม่? สำหรับฉันแล้วมันดูเหมือนเคาน์เตอร์ธรรมดาที่จะพยายามทำปัญหาให้พอดีกับรูปแบบคลาสสิค แต่เห็นได้ชัดว่าหนังสือและรูปแบบมีชื่อเสียงด้วยเหตุผล พวกเขาปรากฏตัวเพียงพอที่ฉันควรจะเรียนรู้พวกเขา? ขอบคุณอีกครั้ง!

1
ขั้นตอนที่ตามมาเมื่อเขียน lexer เป็นไปตามไวยากรณ์คืออะไร?
ในขณะที่อ่านคำตอบสำหรับคำถามที่ชี้แจงเกี่ยวกับแกรมมาร์, Lexers และ Parsersคำตอบดังกล่าวระบุว่า: [... ] ไวยากรณ์ BNF มีกฎทั้งหมดที่คุณต้องการสำหรับการวิเคราะห์คำและการแยกวิเคราะห์ สิ่งนี้เกิดขึ้นกับฉันค่อนข้างแปลกเพราะจนถึงตอนนี้ฉันมักจะคิดเสมอว่า lexer นั้นไม่ได้ยึดหลักไวยากรณ์เลยในขณะที่ parser มีพื้นฐานมาจากหนึ่ง ฉันมาถึงข้อสรุปนี้หลังจากอ่านโพสต์บล็อกจำนวนมากเกี่ยวกับการเขียน lexers และไม่มีใครเคยใช้1 EBNF / BNF เป็นพื้นฐานสำหรับการออกแบบ หาก lexers รวมถึง parsers อิงตามไวยากรณ์ EBNF / BNF แล้วจะมีวิธีการสร้าง lexer โดยใช้วิธีนั้นอย่างไร นั่นคือฉันจะสร้าง lexer โดยใช้ไวยากรณ์ EBNF / BNF ที่กำหนดได้อย่างไร ฉันเคยเห็นโพสต์มากมายที่เกี่ยวข้องกับการเขียนโปรแกรมแยกวิเคราะห์โดยใช้ EBNF / BNF เป็นแนวทางหรือพิมพ์เขียว แต่ฉันเจอมาไม่ถึงตอนนี้ที่แสดงเทียบเท่ากับการออกแบบเล็ก ตัวอย่างเช่นใช้ไวยากรณ์ต่อไปนี้: input = digit| string …

6
รูปแบบไฟล์กำหนดค่าที่มนุษย์อ่านง่ายที่สุดคืออะไร [ปิด]
ปิด คำถามนี้เป็นคำถามความคิดเห็นตาม ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้สามารถตอบข้อเท็จจริงและการอ้างอิงได้โดยแก้ไขโพสต์นี้ ปิดให้บริการใน5 ปีที่ผ่านมา ไฟล์การกำหนดค่าปัจจุบันเป็นดังนี้: mainwindow.title = 'test' mainwindow.position.x = 100 mainwindow.position.y = 200 mainwindow.button.label = 'apply' mainwindow.button.size.x = 100 mainwindow.button.size.y = 30 logger.datarate = 100 logger.enable = True logger.filename = './test.log' นี่คือการอ่านด้วยหลามในพจนานุกรมที่ซ้อนกัน: { 'mainwindow':{ 'button':{ 'label': {'value':'apply'}, ... }, 'logger':{ datarate: {'value': 100}, enable: {'value': True}, …

6
DDD เป็นไปตาม OOP: วิธีการใช้พื้นที่เก็บข้อมูลเชิงวัตถุ?
การใช้งานทั่วไปของแหล่งเก็บข้อมูล DDD ดูไม่ OO มากเช่นsave()วิธีการ: package com.example.domain; public class Product { /* public attributes for brevity */ public String name; public Double price; } public interface ProductRepo { void save(Product product); } ส่วนโครงสร้างพื้นฐาน: package com.example.infrastructure; // imports... public class JdbcProductRepo implements ProductRepo { private JdbcTemplate = ... public void save(Product …

1
ใช้คลาสเพื่อนเพื่อแค็ปซูลฟังก์ชั่นสมาชิกส่วนตัวใน C ++ - การปฏิบัติที่ดีหรือการละเมิด?
ดังนั้นฉันสังเกตเห็นว่าเป็นไปได้ที่จะหลีกเลี่ยงการใส่ฟังก์ชั่นส่วนตัวไว้ในส่วนหัวโดยทำสิ่งนี้: // In file pred_list.h: class PredicateList { int somePrivateField; friend class PredicateList_HelperFunctions; public: bool match(); } // In file pred_list.cpp: class PredicateList_HelperFunctions { static bool fullMatch(PredicateList& p) { return p.somePrivateField == 5; // or whatever } } bool PredicateList::match() { return PredicateList_HelperFunctions::fullMatch(*this); } ฟังก์ชั่นส่วนตัวไม่เคยประกาศในส่วนหัวและผู้บริโภคของชั้นเรียนที่นำเข้าส่วนหัวไม่จำเป็นต้องรู้ว่ามันมีอยู่ นี่เป็นสิ่งจำเป็นหากฟังก์ชันตัวช่วยเป็นเทมเพลต (ทางเลือกคือใส่รหัสเต็มในส่วนหัว) ซึ่งเป็นวิธีที่ฉัน "ค้นพบ" สิ่งนี้ …

2
จะหลีกเลี่ยงการทำซ้ำโครงสร้างข้อมูลเมื่อส่วนต่างของแอพเขียนเป็นภาษาอื่นได้อย่างไร
ตัวอย่างเช่นสมมติว่าคุณกำลังเขียนแอปในJava ของแอปสื่อสารกับเซิร์ฟเวอร์ API เขียนในหลาม เซิร์ฟเวอร์ Python สื่อสารกับฐานข้อมูลSQL นอกจากนี้คุณยังมีเว็บไซต์ของแอปเขียนในJavaScript ด้วย 4 ภาษาที่แตกต่างกันมันง่ายที่จะจบลงด้วยการทำซ้ำโครงสร้างข้อมูลเดิม 4 ครั้ง ตัวอย่างเช่นUserประเภทอาจมีลักษณะเช่นนี้ (pseudocode): type User { integer id; string name; timestamp birthday; } Userส่วนหนึ่งของโครงการทุกคนจะต้องชนิดของการแสดงบางอย่างสำหรับ ส่วนของ Java และ Python ต้องการclassการประกาศสองแบบที่ต่างกัน ฐานข้อมูลจะต้องมีUserการประกาศตาราง และเว็บไซต์ส่วนหน้าจะต้องเป็นตัวแทนUserด้วย การทำซ้ำประเภทนี้ 4 ครั้งแตกต่างกันจริงๆแบ่งห้ามทำซ้ำ-Yourselfหลักการ นอกจากนี้ยังมีปัญหาที่หากUserมีการเปลี่ยนแปลงประเภทการเปลี่ยนแปลงเหล่านี้จำเป็นต้องทำซ้ำในทุกส่วนของโครงการ ฉันรู้ว่าห้องสมุดprotobufของ Google นำเสนอวิธีการแก้ปัญหาที่คุณเขียนโครงสร้างข้อมูลโดยใช้ไวยากรณ์พิเศษจากนั้นห้องสมุดจะสร้างการประกาศโครงสร้างสำหรับคุณในภาษาการเขียนโปรแกรมหลายภาษา แต่สิ่งนี้ยังไม่ได้จัดการกับปัญหาของการต้องตรวจสอบตรรกะการตรวจสอบซ้ำสำหรับประเภทของคุณ ไม่มีใครมีคำแนะนำหรือลิงค์ไปยังหนังสือ / บล็อกโพสต์เกี่ยวกับเรื่องนี้หรือไม่?

4
คลาสควรสื่อสารกับผู้ใช้อย่างไร
สถานการณ์ เว็บแอ็พพลิเคชันกำหนดอินเทอร์เฟซผู้ใช้แบ็กเอนด์IUserBackendด้วยวิธีการ getUser (UID) CreateUser (UID) deleteUser (UID) setPassword (uid, รหัสผ่าน) ... แบ็กเอนด์ผู้ใช้ที่แตกต่างกัน (เช่น LDAP, SQL, ... ) ใช้อินเทอร์เฟซนี้ แต่ไม่ใช่แบ็กเอนด์ทุกคนสามารถทำทุกอย่างได้ ตัวอย่างเช่นเซิร์ฟเวอร์ LDAP ที่เป็นรูปธรรมไม่อนุญาตให้แอปพลิเคชันเว็บนี้ลบผู้ใช้ ดังนั้นLdapUserBackendคลาสที่ใช้จะไม่ดำเนินการIUserBackenddeleteUser(uid) คลาสที่เป็นรูปธรรมจำเป็นต้องสื่อสารกับเว็บแอ็พพลิเคชันว่าเว็บแอ็พพลิเคชันใดได้รับอนุญาตให้ทำกับผู้ใช้ของแบ็กเอนด์ วิธีแก้ปัญหาที่รู้จัก ฉันได้เห็นวิธีแก้ปัญหาที่IUserInterfaceมีimplementedActionsวิธีการที่ส่งกลับจำนวนเต็มซึ่งเป็นผลมาจากการ bitwise ORs ของการกระทำ bitwise ANDed กับการกระทำที่ร้องขอ: function implementedActions(requestedActions) { return (bool)( ACTION_GET_USER | ACTION_CREATE_USER | ACTION_DELTE_USER | ACTION_SET_PASSWORD ) & requestedActions) } ที่ไหน …

5
ค้นหาแบบที่ใกล้ที่สุดที่ดีที่สุดสำหรับวงกลม
ด้านล่างเป็นภาพตัวอย่างถ้าฉันมีจุดสีขาวตรงกลางและฉันต้องการค้นหาตำแหน่งที่ใกล้ที่สุดสำหรับวงกลมสีน้ำเงิน (ซึ่งเห็นได้ชัดว่าอยู่ในตำแหน่งที่ฉันวางไว้) ถ้าวงกลมสีแดงทั้งหมดมีอยู่แล้ว . ฉันจะหาตำแหน่งนั้นได้อย่างไร ประสิทธิภาพสำหรับฉันไม่ใช่สิ่งสำคัญสำหรับแอปพลิเคชันนี้

8
การออกแบบที่เหมาะสมสำหรับชั้นเรียนด้วยวิธีการหนึ่งที่สามารถแตกต่างกันระหว่างลูกค้า
ฉันมีชั้นเรียนที่ใช้ในการประมวลผลการชำระเงินของลูกค้า ทั้งหมดยกเว้นหนึ่งในวิธีการของคลาสนี้จะเหมือนกันสำหรับลูกค้าทุกคนยกเว้นวิธีที่คำนวณ (ตัวอย่าง) จำนวนผู้ใช้ของลูกค้าที่ค้างชำระ สิ่งนี้อาจแตกต่างกันอย่างมากจากลูกค้าไปยังลูกค้าและไม่มีวิธีง่ายๆในการจับตรรกะของการคำนวณในบางสิ่งบางอย่างเช่นไฟล์คุณสมบัติเนื่องจากอาจมีปัจจัยที่กำหนดเองจำนวนเท่าใดก็ได้ ฉันสามารถเขียนรหัสน่าเกลียดที่เปลี่ยนตาม customerID: switch(customerID) { case 101: .. do calculations for customer 101 case 102: .. do calculations for customer 102 case 103: .. do calculations for customer 103 etc } แต่สิ่งนี้ต้องการการสร้างคลาสใหม่ทุกครั้งที่เราได้ลูกค้าใหม่ อะไรคือวิธีที่ดีกว่า [แก้ไข] บทความ "ซ้ำกัน" แตกต่างอย่างสิ้นเชิง ฉันไม่ได้ถามว่าจะหลีกเลี่ยงคำสั่ง switch ได้อย่างไรฉันกำลังขอการออกแบบที่ทันสมัยที่ใช้กับกรณีนี้ได้ดีที่สุด - ซึ่งฉันสามารถแก้ไขได้ด้วยคำสั่ง switch หากฉันต้องการเขียนรหัสไดโนเสาร์ ตัวอย่างที่ให้ไว้มีทั่วไปและไม่เป็นประโยชน์เนื่องจากพวกเขาบอกว่า "เฮ้สวิตช์ทำงานได้ค่อนข้างดีในบางกรณีไม่ใช่ในบางกรณี" …

3
แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้สาธารณะการป้องกันส่วนตัวหรือไม่
มันยุติธรรมที่จะบอกว่ามันเป็นวิธีที่ดีในการเริ่มต้นทุกอย่างให้privateล่วงหน้าเมื่อเขียนโค้ดบางอย่าง? จากนั้นอัปเกรดprotectedเป็นคลาสย่อยเท่านั้นpublicหากต้องการคลาสอื่นหรือไม่

3
ทำความเข้าใจกับรูปแบบฟลักซ์
ฉันกำลังศึกษารูปแบบฟลักซ์และมีบางอย่างที่ฉันไม่สามารถเข้าใจเกี่ยวกับร้านค้าได้ พวกเขาคืออะไรกันแน่ ฉันได้อ่านบทความมากมายและดูเหมือนว่ามันเกี่ยวข้องกับโดเมน มันหมายความว่านี่เป็นส่วน "นามธรรม" ที่เกี่ยวข้องกับการโทร api หรือการโทรแบ็กเอนด์? มันไม่ชัดเจนสำหรับฉัน แก้ไข: มันเป็นสิ่งเดียวกันกับโรงงานเชิงมุมหรือไม่ กำลังดึงข้อมูลระยะไกลทำให้งานธุรกิจหรือจัดเก็บบางสถานะของแอป (ตัวอย่างเช่นผู้ใช้ปัจจุบันที่เชื่อมต่อ)?

2
ทำไม 'zip' ถึงไม่สนใจหางที่ห้อยอยู่ของคอลเลกชัน?
C # , Scala, Haskell, Lisp และPythonมีzipพฤติกรรมเหมือนกัน: หากคอลเล็กชันหนึ่งยาวกว่าหางจะถูกละเว้นอย่างเงียบ ๆ อาจเป็นข้อยกเว้นได้เช่นกัน แต่ฉันไม่เคยได้ยินภาษาใด ๆ ที่ใช้วิธีการนี้ ปริศนานี้ฉัน ไม่มีใครรู้เหตุผลว่าทำไมzipถูกออกแบบมาอย่างนั้น? ฉันเดาภาษาใหม่เพราะมันเป็นภาษาอื่นทำแบบนี้ แต่อะไรคือเหตุผลหลัก ฉันกำลังถามคำถามข้อเท็จจริงเชิงประวัติศาสตร์ที่นี่ไม่ใช่ว่ามีคนชอบหรือถ้าเป็นแนวทางที่ดีหรือไม่ดี อัปเดต : ถ้าฉันถูกถามว่าจะทำอย่างไรฉันจะพูดว่า - โยนข้อยกเว้นคล้าย ๆ กับการจัดทำดัชนีอาเรย์ (แม้ว่าภาษา "โบราณ" ทุกชนิดมีเวทมนตร์ทุกชนิดวิธีจัดการกับดัชนีขอบเขต UB ขยายอาร์เรย์ ฯลฯ )

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

3
รูปแบบการออกแบบที่ดีสำหรับการสร้างไฟล์ Excel (xlsx) เป็นรหัสคืออะไร
ดูการอัปเดตของฉันที่ด้านล่างสำหรับข้อมูลเพิ่มเติม บางครั้งฉันมีโครงการที่ฉันต้องส่งออกข้อมูลบางอย่างเป็นไฟล์ Excel (รูปแบบ xlsx) กระบวนการมักจะ: ผู้ใช้คลิกปุ่มบางปุ่มในแอปพลิเคชันของฉัน รหัสของฉันเรียกใช้แบบสอบถาม DB และประมวลผลผลลัพธ์อย่างใด รหัสของฉันสร้างไฟล์ * .xlsx โดยใช้ห้องสมุด Excel com interop หรือห้องสมุดบุคคลที่สาม (เช่น Aspose.Cells) ฉันสามารถค้นหาตัวอย่างรหัสได้อย่างง่ายดายสำหรับวิธีการออนไลน์นี้ แต่ฉันกำลังมองหาวิธีที่มีประสิทธิภาพมากขึ้นในการทำเช่นนี้ ฉันต้องการให้รหัสของฉันเป็นไปตามหลักการออกแบบเพื่อให้แน่ใจว่ารหัสของฉันสามารถบำรุงรักษาและเข้าใจได้ง่าย นี่คือความพยายามครั้งแรกของฉันในการสร้างไฟล์ xlsx ที่มีลักษณะ: var wb = new Workbook(); var ws = wb.Worksheets[0]; ws.Cells[0, 0].Value = "Header"; ws.Cells[1, 0].Value = "Row 1"; ws.Cells[2, 0].Value = "Row 2"; ws.Cells[3, …

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