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

ช่วยในการจำสำหรับชุดของหลักการออกแบบ: ความรับผิดชอบเดี่ยว, เปิด - ปิด, การทดแทน Liskov, การแยกส่วนต่อประสาน, การผกผันของการพึ่งพา

6
ปัญหาวงกลมวงรีสามารถแก้ไขได้โดยการย้อนกลับความสัมพันธ์หรือไม่?
การCircleยืดเวลาEllipseแบ่งหลักการ Liskov Substitionเนื่องจากมันจะแก้ไข postcondition: คุณสามารถตั้งค่า X และ Y อย่างอิสระเพื่อวาดวงรี แต่ X ต้องเท่ากับ Y เสมอสำหรับวงกลม แต่นี่ไม่ใช่ปัญหาที่เกิดจากการมี Circle เป็นชนิดย่อยของ Ellipse หรือไม่? เราไม่สามารถย้อนกลับความสัมพันธ์หรือไม่ ดังนั้นวงกลม supertype - setRadiusมันมีวิธีเดียว จากนั้นขยายวงรีวงกลมโดยการเพิ่มและsetX setYการเรียกsetRadiusใช้ Ellipse จะเป็นการตั้งค่าทั้ง X และ Y หมายถึง postcondition บน setRadius ได้รับการดูแล แต่ตอนนี้คุณสามารถตั้งค่า X และ Y ได้อย่างอิสระผ่านอินเทอร์เฟซเสริม

5
มีประโยชน์กับ mini-refactor code โดยหวังว่าจะปรับปรุงคุณภาพหรือเป็นเพียง“ การเคลื่อนย้ายโค้ดไปรอบ ๆ ” โดยไม่มีประโยชน์มาก?
ตัวอย่าง ฉันเจอรหัสเสาหินที่ทำ "ทุกอย่าง" ในที่เดียว - โหลดข้อมูลจากฐานข้อมูลแสดงมาร์กอัพ HTML ทำหน้าที่เป็นเราเตอร์ / คอนโทรลเลอร์ / การกระทำ ฉันเริ่มใช้การย้ายรหัสฐานข้อมูล SRP ไปยังไฟล์ของตัวเองโดยให้การตั้งชื่อที่ดีขึ้นสำหรับสิ่งต่าง ๆ และมันก็ดูดี แต่แล้วฉันก็เริ่มสงสัยว่าทำไมฉันถึงทำแบบนี้ ทำไมต้องรีแฟคเตอร์ จุดประสงค์คืออะไร? มันไร้ประโยชน์หรือเปล่า? ประโยชน์คืออะไร โปรดทราบว่าฉันส่วนใหญ่ออกจากไฟล์เสาหินตามที่เป็นอยู่ แต่ refactored เฉพาะส่วนเล็ก ๆ ที่เกี่ยวข้องกับพื้นที่ที่ฉันต้องทำงานบางอย่าง รหัสเดิม: เพื่อเป็นตัวอย่างที่เป็นรูปธรรมฉันได้พบข้อมูลโค้ดนี้ - มันโหลดข้อมูลจำเพาะของผลิตภัณฑ์โดยใช้รหัสผลิตภัณฑ์ที่รู้จักหรือโดยรหัสรุ่นที่ผู้ใช้เลือก: if ($verid) $sql1 = "SELECT * FROM product_spec WHERE id = " . clean_input($verid); else $sql1 = "SELECT …

1
Open Close Principle (OCP) vs หลักการผกผันการพึ่งพา (DIP)
ฉันพยายามที่จะเข้าใจความแตกต่างระหว่างหลักการเปิด (OCP) และหลักการผกผันของการพึ่งพา (DIP) จากการวิจัยที่ฉันได้ทำบนอินเทอร์เน็ตจนถึงตอนนี้ฉันได้ข้อสรุปว่า 'DIP เป็นทางเลือกหนึ่งที่เราสามารถบรรลุ OCP' ฉันถูกใช่ไหม คุณสามารถยกตัวอย่างที่ไม่ทำตามกรมทรัพย์สินทางปัญญา แต่ติดตาม OCP ได้ไหม

5
การบรรทุกเกินพิกัดเป็นตัวอย่างของหลักการเปิด / ปิดหรือไม่
Wikipedia พูดว่า "เอนทิตีของซอฟต์แวร์ (คลาส, โมดูล, ฟังก์ชั่น, ฯลฯ ) ควรเปิดเพื่อขยาย แต่ปิดเพื่อแก้ไข" ฟังก์ชั่นคำดึงดูดสายตาของฉันและตอนนี้ฉันสงสัยว่าเราสามารถสันนิษฐานได้ว่าการสร้างเกินพิกัดสำหรับวิธีการสามารถถือได้ว่าเป็นตัวอย่างของหลักการเปิด / ปิดหรือไม่? ให้ฉันอธิบายตัวอย่าง พิจารณาว่าคุณมีวิธีการในชั้นบริการซึ่งใช้ในสถานที่เกือบ 1,000 แห่ง วิธีการได้รับ userId และกำหนดว่าผู้ใช้เป็นผู้ดูแลหรือไม่: bool IsAdmin(userId) ตอนนี้ให้พิจารณาว่ามีบางสิ่งที่จำเป็นในการพิจารณาว่าผู้ใช้เป็นผู้ดูแลระบบหรือไม่โดยยึดตามชื่อผู้ใช้ไม่ใช่ชื่อผู้ใช้ หากเราเปลี่ยนลายเซ็นของวิธีการที่กล่าวถึงข้างต้นแสดงว่าเรามีรหัสที่ไม่สมบูรณ์ใน 1000 แห่ง (ฟังก์ชั่นควรปิดเพื่อแก้ไข) ดังนั้นเราสามารถสร้างโอเวอร์โหลดเพื่อรับชื่อผู้ใช้ค้นหา userId ตามชื่อผู้ใช้และวิธีการดั้งเดิม: public bool IsAdmin(string username) { int userId = UserManager.GetUser(username).Id; return IsAdmin(userId); } ด้วยวิธีนี้เราได้ขยายฟังก์ชั่นของเราผ่านการสร้างโอเวอร์โหลด (ฟังก์ชั่นควรจะเปิดเพื่อขยาย) มันเป็นตัวอย่างหลักการเปิด / ปิดหรือไม่?

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 …

9
ของแข็งกับวิธีคงที่
นี่คือปัญหาที่ฉันพบบ่อย: ให้มีโครงการร้านค้าบนเว็บที่มีระดับสินค้า ฉันต้องการเพิ่มคุณสมบัติที่อนุญาตให้ผู้ใช้โพสต์คำวิจารณ์ไปยังผลิตภัณฑ์ ดังนั้นฉันมีคลาสรีวิวซึ่งอ้างอิงผลิตภัณฑ์ ตอนนี้ฉันต้องการวิธีการที่แสดงความเห็นทั้งหมดในผลิตภัณฑ์ มีความเป็นไปได้สองอย่าง: (A) public class Product { ... public Collection<Review> getReviews() {...} } (B) public class Review { ... static public Collection<Review> forProduct( Product product ) {...} } จากการดูรหัสฉันเลือก (A): มันไม่คงที่และไม่ต้องการพารามิเตอร์ อย่างไรก็ตามฉันรู้สึกว่า (A) ละเมิดหลักการความรับผิดชอบเดี่ยว (SRP) และหลักการเปิด (OCP) ในขณะที่ (B) ไม่: (SRP) เมื่อฉันต้องการเปลี่ยนวิธีการรวบรวมความเห็นสำหรับผลิตภัณฑ์ฉันต้องเปลี่ยนระดับสินค้า แต่ควรมีเหตุผลเพียงประการเดียวว่าทำไมต้องเปลี่ยนระดับผลิตภัณฑ์ และนั่นไม่ใช่ความคิดเห็นอย่างแน่นอน หากฉันบรรจุคุณลักษณะทุกอย่างที่มีบางอย่างเกี่ยวกับผลิตภัณฑ์ไว้ใน Product …

4
การคิดเกี่ยวกับรูปแบบการออกแบบและการปฏิบัติของ OOP เปลี่ยนไปอย่างไรในภาษาที่มีการเปลี่ยนแปลงและมีการพิมพ์น้อย
มีคำถามที่เป็นประโยชน์อยู่แล้วในบรรทัดเหล่านี้ (" รูปแบบการออกแบบที่ไม่ใช่ OOP? ") แต่ฉันอยากรู้มากขึ้นเกี่ยวกับมุมมองการเปลี่ยนผ่านสำหรับใครบางคนที่เพิ่งเริ่มต้นด้วยภาษาแบบไดนามิกและพิมพ์อ่อนแอ นั่นคือ: สมมติว่าฉันได้รับการเขียนโปรแกรมใน C ++, C # หรือ Java เป็นเวลาหลายปีและดูดซึมจำนวนมากของภูมิปัญญาตามสายของรูปแบบการออกแบบ GoF ฟาวเลอร์ของรูปแบบของ Enterprise Application สถาปัตยกรรม , หลักการมูลฝอยฯลฯ ตอนนี้ฉัน' การเล่นน้ำใน Ruby, Python, JavaScript และอื่น ๆ และสงสัยว่าความรู้ของฉันใช้อย่างไร สันนิษฐานว่าฉันสามารถทำการแปลโดยตรงในหลายกรณี แต่เกือบจะแน่นอนว่าจะไม่ได้รับประโยชน์เต็มที่จากการตั้งค่าใหม่ของฉัน การพิมพ์แบบเป็ดเพียงอย่างเดียวทำให้ความคิดแบบอินเทอร์เฟซบนหัวของฉันเยอะ อะไรที่ยังคงเหมือนเดิม? การเปลี่ยนแปลงอะไร มีหลักการชี้แนะเช่น SOLID หรือรูปแบบที่เป็นที่ยอมรับ (อาจเป็นเรื่องใหม่ทั้งหมด) ที่มือใหม่ควรรู้หรือไม่?

3
หลักการแยกอินเตอร์เฟสใช้กับวิธีที่เป็นรูปธรรมหรือไม่?
เนื่องจากหลักการแยกอินเทอร์เฟซแนะนำว่าลูกค้าไม่ควรถูกบังคับให้ขึ้นอยู่กับวิธีการที่ไม่ได้ใช้ดังนั้นลูกค้าไม่ควรใช้วิธีการที่ว่างเปล่าสำหรับวิธีการอินเทอร์เฟซมิฉะนั้นวิธีการอินเทอร์เฟซนี้ แต่วิธีการที่เป็นรูปธรรม? ฉันควรแยกวิธีการที่ลูกค้าไม่ทุกคนจะใช้หรือไม่ พิจารณาคลาสต่อไปนี้: public class Car{ .... public boolean isQualityPass(){ ... } public int getTax(){ ... } public int getCost(){ ... } } public class CarShop{ ... public int getCarPrice(int carId){ Car car=carList[carId]; int price=car.getTax() + car.getCost()... (some formula); return price; } } ที่โค้ดด้านบน CarShop ไม่ได้ใช้วิธี isQualityPass () ใน …

3
การค้นพบสำหรับนักพัฒนาเป็นปัญหาเมื่อใช้หลักการของ SOLID หรือไม่?
ฉันทำแอพทางธุรกิจที่นักพัฒนาคนอื่น ๆ ทั้งหมดคุ้นเคยกับการทำแอพพลิเคชั่น CRUD ขั้นพื้นฐานหรือมุ่งเน้นไปที่การสร้างอินเทอร์เฟซที่สวย / ใช้งานได้เพียงอย่างเดียว "ด้วยวิธีที่เราใช้ทำพนักงานจะมีทุกสิ่งที่คุณสามารถทำได้กับพนักงาน" และมันก็เป็นจริง "คลาส" นั้นมีโค้ดหลายพันบรรทัดและคุณสามารถทำอะไรกับพนักงานได้ หรือแย่กว่านั้นคือมีตารางข้อมูลพนักงานและผู้พัฒนาแต่ละคนคิดว่าจะทำอย่างไรในสิ่งที่พวกเขาต้องการทำในตัวจัดการเหตุการณ์ สิ่งเลวร้ายทั้งหมดเกี่ยวกับวิธีการดังกล่าวนั้นเป็นจริง แต่อย่างน้อยนักพัฒนาที่ใช้พนักงานสามารถทำได้โดยไม่ต้องไปที่เอกสารอื่น ๆ หาวิธีการลงทะเบียนพนักงานในแผนสุขภาพ สำหรับผู้จัดการและแนวคิดสำคัญอื่น ๆ ทั้งหมด หรือถ้าพวกเขาใช้พนักงานตารางข้อมูลอื่นที่จำเป็นก็สามารถทำได้ในสิ่งที่พวกเขาต้องการ ใช่มีรหัสซ้ำกันมาก ใช่มันเป็นรหัสที่เปราะบางมาก ใช่การทดสอบมันยากกว่าที่จำเป็น ใช่ฟังก์ชั่นการเปลี่ยนคือการกระตุ้นให้เกิดความกลัวและ Copy Paste นั้นเป็นเรื่องปกติเนื่องจากวิธีการ แต่อย่างน้อยพวกเขาสามารถค้นพบสิ่งที่มีอยู่โดยการสร้างชั้นหนึ่งหรือพวกเขาสามารถทำสิ่งที่พวกเขาต้องทำโดยไม่ต้องเข้าใจความแตกต่างระหว่างอินเทอร์เฟซคลาสนามธรรมคลาสรูปธรรมเป็นต้นและพวกเขาไม่ต้องค้นหาอะไรอื่นนอกจาก เมธอดที่ส่งคืนโดยระบบภายในหรือรู้ตารางที่มีข้อมูลอยู่ ฉันได้ทำ googled / binged และ yahoo! d แล้ว แต่ฉันไม่พบปัญหานี้ ดังนั้นอาจจะไม่มีปัญหาและฉันเพิ่งจะพลาดบางสิ่งบางอย่าง ฉันพยายามคิดหาวิธีแก้ปัญหาที่นักพัฒนาซอฟต์แวร์ที่ไม่ทำงานพฤติกรรม / การออกแบบที่แท้จริงสามารถค้นพบวิธีการทำอะไรได้อย่างง่ายดายโดยไม่ต้องอ้างอิงเอกสารภายนอกใด ๆ หรือสแกนชื่อคลาสในส่วนประกอบต่าง ๆ / โครงการเพื่อค้นหาสิ่งที่ดูเหมือนจะใช้งานได้ สิ่งเดียวที่ฉันสามารถทำได้คือมีสิ่งเหล่านี้เพราะไม่มีชื่อที่ดีกว่า "Table of …
10 solid  crud 

2
เมื่อติดตาม SRP ฉันจะจัดการกับการตรวจสอบและการบันทึกเอนทิตีได้อย่างไร
ฉันอ่านClean Codeและบทความออนไลน์มากมายเกี่ยวกับ SOLID เมื่อเร็ว ๆ นี้และยิ่งฉันอ่านมากเท่าไหร่ฉันก็ยิ่งรู้สึกว่าไม่รู้อะไรเลย สมมติว่าผมสร้างโปรแกรมประยุกต์บนเว็บโดยใช้ ASP.NET MVC 3. สมมติว่าผมมีUsersControllerกับCreateการกระทำเช่นนี้ public class UsersController : Controller { public ActionResult Create(CreateUserViewModel viewModel) { } } ในวิธีการกระทำนั้นฉันต้องการบันทึกผู้ใช้ไปยังฐานข้อมูลหากข้อมูลที่ป้อนนั้นถูกต้อง ตอนนี้ตามหลักการความรับผิดชอบเดี่ยววัตถุควรมีความรับผิดชอบเดียวและความรับผิดชอบนั้นควรถูกห่อหุ้มทั้งหมดโดยชั้นเรียน บริการทั้งหมดของ บริษัท ควรสอดคล้องกับความรับผิดชอบนั้น เนื่องจากการตรวจสอบความถูกต้องและการบันทึกลงในฐานข้อมูลเป็นความรับผิดชอบที่แยกกันสองอย่างฉันจึงควรสร้างคลาสแยกต่างหากเพื่อจัดการกับสิ่งเหล่านี้: public class UsersController : Controller { private ICreateUserValidator validator; private IUserService service; public UsersController(ICreateUserValidator validator, IUserService service) { this.validator = …

5
เป็นการละเมิดหลักการ Open-Closed หรือไม่ในการอัพเดทค่าคงที่ซึ่งแสดงถึงมูลค่าที่แท้จริงของโลก?
ฉันมีชั้นเรียนที่คำนวณรายได้สุทธิต่อปีของคนงาน มันมีค่าคงที่คิดเป็นร้อยละภาษี แต่วันหนึ่งอัตราภาษีมีการเปลี่ยนแปลงดังนั้นฉันต้องแก้ไขรหัส การกระทำของการแก้ไขค่าคงที่นี้บ่งบอกถึงการละเมิดหลักการ Open-Closedเนื่องจากมันเป็นหลักว่าชั้นควรจะปิดเพื่อแก้ไข?

7
หลีกเลี่ยงกฎในพ่อมดและนักรบ
ในบทความบล็อกชุดนี้ Eric Lippert อธิบายถึงปัญหาในการออกแบบเชิงวัตถุโดยใช้พ่อมดและนักรบเป็นตัวอย่างโดยที่: abstract class Weapon { } sealed class Staff : Weapon { } sealed class Sword : Weapon { } abstract class Player { public Weapon Weapon { get; set; } } sealed class Wizard : Player { } sealed class Warrior : Player { } แล้วเพิ่มกฎสองสามข้อ: …

2
การแยกส่วนอินเทอร์เฟซหลักการ: จะทำอย่างไรถ้าส่วนต่อประสานมีการทับซ้อนกันอย่างมีนัยสำคัญ?
จากการพัฒนาซอฟต์แวร์หลักการรูปแบบและการปฏิบัติ: Pearson New International Edition : บางครั้งวิธีที่เรียกใช้โดยกลุ่มลูกค้าที่แตกต่างกันจะทับซ้อนกัน หากการซ้อนทับมีขนาดเล็กดังนั้นอินเทอร์เฟซสำหรับกลุ่มควรจะแยกจากกัน ควรประกาศฟังก์ชันทั่วไปในอินเทอร์เฟซที่ทับซ้อนกันทั้งหมด คลาสเซิร์ฟเวอร์จะสืบทอดฟังก์ชันทั่วไปจากแต่ละอินเตอร์เฟสเหล่านั้น แต่จะใช้งานเพียงครั้งเดียว ลุงบ๊อบพูดถึงกรณีที่มีการเหลื่อมกันเล็กน้อย เราควรทำอย่างไรหากมีการทับซ้อนอย่างมีนัยสำคัญ บอกว่าเรามี Class UiInterface1; Class UiInterface2; Class UiInterface3; Class UiIterface : public UiInterface1, public UiInterface2, public UiInterface3{}; เราควรทำอย่างไรหากมีการทับซ้อนกันระหว่างUiInterface1และUiInterface2?

2
มีหลักการอินเตอร์เฟซ“ ถามเฉพาะสิ่งที่คุณต้องการ” หรือไม่?
ฉันได้เติบโตขึ้นโดยใช้หลักการในการออกแบบและใช้งานส่วนต่อประสานที่พูดโดยทั่วไปว่า "ถามเฉพาะสิ่งที่คุณต้องการ" ตัวอย่างเช่นหากฉันมีประเภทที่สามารถลบได้มากมายฉันจะสร้างDeletableส่วนต่อประสาน: interface Deletable { void delete(); } จากนั้นฉันสามารถเขียนคลาสสามัญ: class Deleter<T extends Deletable> { void delete(T t) { t.delete(); } } ที่อื่นในรหัสฉันมักจะถามถึงความรับผิดชอบที่เล็กที่สุดที่เป็นไปได้เพื่อตอบสนองความต้องการของรหัสลูกค้า ดังนั้นถ้าฉันจะต้องลบFileก็ยังจะขอไม่ได้ DeletableFile หลักการนี้เป็นความรู้ทั่วไปและมีชื่อยอมรับแล้วหรือไม่? มันขัดแย้งหรือไม่ มันถูกกล่าวถึงในตำราหรือไม่?

6
อะไรคือความแตกต่างระหว่าง“ การจ้าง” และ“ เกือบ” ที่ซื่อสัตย์สำหรับการสัมภาษณ์ในสถานที่สุดท้าย [ปิด]
ปิด. คำถามนี้เป็นคำถามปิดหัวข้อ ไม่ยอมรับคำตอบในขณะนี้ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Software Engineering Stack Exchange ปิดให้บริการใน6 ปีที่ผ่านมา ดังนั้นเมื่อเร็ว ๆ นี้ฉันได้สัมภาษณ์ในสถานที่กับ Google และ Amazon และได้รับจดหมายปฏิเสธอย่างสุภาพทำให้ฉันรู้ว่าฉันสนิท แต่ก็ไม่เหมาะกับทักษะที่พวกเขามองหา ฉันได้ทำรอบสุดท้ายสำหรับการสัมภาษณ์ทั้งหมดที่ฉันทำ (ยกเว้นข้อเสนอบางอย่างจากตำแหน่งที่ไม่น่าสนใจเล็ก ๆ ที่ฉันสัมภาษณ์เพื่อฝึกซ้อม) แต่จนถึงตอนนี้การมีการสัมภาษณ์ 5-8 ครั้งต่อวันทำให้ฉันมีเวลามากพอที่จะ มีข้อผิดพลาดของฉันเพิ่มขึ้นพอที่จะทำให้ฉันออกจากการทำงาน ฉันรู้ว่าฉันทำได้ดีอย่างน้อยในคำถามการเข้ารหัสและคำถามทางเทคนิคทั่วไปอื่น ๆ ดูเหมือนว่าฉันไม่ดีในการออกแบบสิ่ง OOP เช่นการ์ดเกมหรืออู่จอดรถ (ฉันไม่ได้ลงลึกไปในวัตถุเดียวและใช้เวลาทั้งหมดของฉันแทน) การที่กว้างขึ้น) และการเข้ารหัสของฉันแม้ว่าพวกเขาจะทำงานโดยรวมไม่ได้มีข้อบกพร่อง / ขอบบางกรณีที่ฉันพลาด (เช่นกรณีที่โหนดอินพุตอาจเป็นคำตอบจริง ๆ แทนที่จะต้องการให้ชัดเจน) และฉันก็ไม่มีปัญหาที่จะพูดว่า "ฉันไม่รู้" แต่บางทีฉันอาจจะเร่าร้อนนิดหน่อยและจำเป็นต้องพูดเพื่อคำถามที่ฉันคิดว่าฉันสามารถตอบได้ แต่ไม่สามารถให้คำตอบที่ชัดเจนกับ ... ดังนั้นอะไรคือสิ่งที่ผลักดันคุณให้เป็นคนดี แต่ไม่ใช่ "จ้าง" มีคำแนะนำใด ๆ …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.