Lập trình nguyên tắc RẮN


43

Theo thời gian, tôi có thể hiểu được hai phần của RẮN - là Sọ và Đá Ov .

Tôi đã học được Nguyên tắc đóng mở với sự giúp đỡ của Kế hoạch và mô hình chiến lược.

Tiết Siết - Tôi đã học nguyên tắc Trách nhiệm đơn trong khi học ORM (logic kiên trì được lấy từ các đối tượng miền).

Theo cách tương tự, các khu vực / nhiệm vụ tốt nhất để tìm hiểu các phần khác của RẮN (the L L,, I I và và D D) là gì?

Người giới thiệu

  1. msdn - Nguy cơ vi phạm các nguyên tắc RẮN trong C #
  2. channel9 - Áp dụng các nguyên tắc RẮN trong .NET / C #
  3. Nguyên tắc OOPS (Nguyên tắc RẮN)

25
hãy lưu ý rằng tất cả những ý tưởng này là những ý tưởng tốt, và cùng nhau chúng rất tốt. nhưng nếu bạn áp dụng chúng một cách giáo điều, chúng sẽ gây ra thất bại nhiều hơn là thành công.

3
OR-Mappers tốt cho việc phân tách các mối quan tâm, không phải là nguyên tắc trách nhiệm duy nhất. Xem bài đăng này lập trình viên.stackexchange.com / questions / 155628 / Khăn để thảo luận về sự khác biệt.
Doc Brown

Ví dụ về thế giới thực blog.gauffin.org/2012/05/ Khăn
LCJ

1
@JarrodRoberson Yep, đó là lý do tại sao chúng được gọi cẩn thận là hướng dẫn . Cũng đừng quên phần còn lại của các nguyên tắc: adamjamesnaylor.com/2012/11/12/ (tổng cộng 11)
Adam Naylor

2
Liên kết của @AdamNaylor hiện là 404ing, liên kết của nó đã được chuyển đến adamjamesnaylor.com/post/ Kẻ
mattumotu

Câu trả lời:


54

Tôi đã ở trong đôi giày của bạn vài tháng trước cho đến khi tôi tìm thấy một bài viết rất hữu ích.

Mỗi nguyên tắc được giải thích độc đáo với các tình huống trong thế giới thực mà mỗi nhà phát triển phần mềm có thể gặp phải trong các dự án của họ. Tôi đang rút ngắn ở đây và chỉ vào tài liệu tham khảo - Phát triển phần mềm RẮN, từng bước một .

Như đã nêu trong các bình luận, có một cách đọc pdf rất tốt khác - Phát triển phần mềm RẮN của Pablo .

Ngoài ra, có một số cuốn sách hay mô tả các nguyên tắc RẮN chi tiết hơn - Sách hay về Phát triển phần mềm RẮN .

Chỉnh sửa và nhận xét một bản tóm tắt ngắn cho mỗi nguyên tắc:

  • Thanh Siên - Nguyên tắc trách nhiệm duy nhất được thúc đẩy bởi nhu cầu của doanh nghiệp để cho phép thay đổi. Một lý do duy nhất để thay đổi, giúp bạn hiểu các khái niệm riêng biệt nào nên được nhóm lại với nhau bằng cách xem xét khái niệm kinh doanh và bối cảnh, thay vì chỉ một mình khái niệm kỹ thuật. In another words, tôi đã học được rằng mỗi lớp nên có một trách nhiệm duy nhất. Trách nhiệm là chỉ hoàn thành nhiệm vụ được giao

  • Tôi đã học được Nguyên tắc đóng mở và bắt đầu "thích sáng tác hơn kế thừa" và như vậy, thích các lớp không có phương thức ảo và có thể được niêm phong, nhưng phụ thuộc vào trừu tượng cho phần mở rộng của chúng.

  • Tôi đã học được Nguyên lý thay thế Liskov với sự trợ giúp của mẫu Kho lưu trữ để quản lý truy cập dữ liệu.

  • Tôi đã học về Nguyên tắc phân chia giao diện bằng cách học rằng khách hàng không nên bị buộc phải thực hiện các giao diện họ không sử dụng (như trong Nhà cung cấp thành viên trong ASP.NET 2.0). Vì vậy, giao diện không nên có nhiều trách nhiệm
  • Tôi đã học về Nguyên tắc đảo ngược phụ thuộc và bắt đầu viết mã dễ thay đổi . Dễ dàng thay đổi hơn có nghĩa là tổng chi phí sở hữu thấp hơn và khả năng bảo trì cao hơn.

Như một tài nguyên hữu ích từ CodePlex đã được đề cập trong các bình luận, ví dụ tham chiếu được đưa vào RẮN

nhập mô tả hình ảnh ở đây


3
Tôi thấy bộ sưu tập các bài viết sau đây rất hữu ích: Lostechies.com/wp-content/uploads/2011/03/ mẹo
Scroog1

Tôi đọc toàn bộ bài viết đó và tôi không được bán trên các mẫu hoặc trên RẮN. Ví dụ này quá đơn giản, nhưng khi nó trở nên phức tạp thì sự phức tạp đó là giả tạo. Tôi vẫn chưa gặp phải thế giới thực RẮN mà không có lựa chọn thay thế tốt hơn.
Công việc

3
kể từ khi các bài báo bị mất đã được đề cập ở đây, cũng có solidexamples.codeplex.com này (dựa trên các bài bị mất)
bóng tối

2
Tôi là một trong những người đóng góp cho Sách điện tử Pablos. Tôi rất vui vì mọi người vẫn thấy nó hữu ích. :)
Sean Chambers

1
+1000000 nếu tôi có thể tóm tắt về nguyên tắc Đóng mở của bạn - mọi người đều hiểu sai và nghĩ rằng đó là về quyền thừa kế
AlexFoxGill

11

(I) Phân đoạn trước và (D) nghịch đảo có thể được học thông qua thử nghiệm đơn vị và chế nhạo. Nếu các lớp tạo ra các phụ thuộc của riêng chúng, bạn không thể tạo các bài kiểm tra đơn vị tốt. Nếu chúng phụ thuộc vào một giao diện quá rộng (hoặc hoàn toàn không có giao diện), thì rõ ràng những gì cần phải được chế giễu để thực hiện các bài kiểm tra đơn vị của bạn.


2
+1 điều này rất đúng. Bạn thậm chí không phải tuân thủ (imo) đôi khi quá nghiêm ngặt 'một bài kiểm tra đơn vị chỉ nên kiểm tra một quy tắc': nếu bạn không thể đưa ra một bộ kiểm tra đàng hoàng cho một lớp trong vài phút, thì nó sẽ vi phạm I và D và có lẽ phần còn lại của
alf.us

8

Nguyên tắc thay thế Liskov về cơ bản không cho phép bạn lạm dụng thừa kế thực hiện: bạn không bao giờ nên sử dụng kế thừa chỉ để tái sử dụng mã (có thành phần cho việc này)! Bằng cách tuân thủ LSP, bạn có thể khá chắc chắn rằng thực sự tồn tại một "mối quan hệ" là giữa siêu lớp của bạn và lớp con của bạn.

Những gì nó nói là các lớp con của bạn phải thực hiện tất cả các phương thức của lớp con theo cách tương tự như việc thực hiện các phương thức trong lớp con. Bạn không bao giờ nên ghi đè một phương thức với việc thực hiện NOP hoặc trả về null khi siêu kiểu ném ngoại lệ; được nêu trong Thiết kế theo các điều khoản Hợp đồng, bạn nên tôn trọng hợp đồng của phương thức từ siêu lớp khi ghi đè một phương thức. Một cách để bảo vệ chống lại việc phá vỡ nguyên tắc này là không bao giờ ghi đè một phương thức đã thực hiện; thay vào đó trích xuất một giao diện và thực hiện giao diện đó trong cả hai lớp.

Nguyên tắc phân chia giao diện , Nguyên tắc trách nhiệm đơn lẻ và Nguyên tắc Coehsion cao từ GRASP có liên quan đến nhau; họ đề cập đến thực tế rằng một thực thể chỉ chịu trách nhiệm cho một điều duy nhất để chỉ có một lý do để thay đổi để thay đổi được thực hiện rất dễ dàng.

Nó thực sự nói rằng nếu một lớp thực hiện một giao diện thì nó phải thực hiện và sử dụng tất cả các phương thức của giao diện đó. Nếu có các phương thức ar không cần thiết trong lớp cụ thể đó, thì giao diện không tốt và phải được chia thành hai giao diện, một giao diện chỉ có các phương thức cần thiết cho lớp gốc. Nó có thể được xem xét từ một POV, liên quan đến nguyên tắc trước đó bởi thực tế là nó không cho phép bạn tạo các giao diện lớn để việc triển khai chúng có thể phá vỡ LSP.

Bạn có thể thấy Nghịch đảo phụ thuộc trong Mô hình nhà máy; ở đây cả thành phần cấp cao (máy khách) và thành phần cấp thấp (cá thể được tạo) đều phụ thuộc vào sự trừu tượng hóa(giao diện). Một cách để áp dụng nó trong kiến ​​trúc phân lớp: bạn không nên xác định giao diện cho một lớp trong lớp được triển khai mà trong mô-đun được gọi. Ví dụ, API cho lớp nguồn dữ liệu không nên được viết trong lớp nguồn dữ liệu mà trong lớp logic buisness, nơi cần được gọi. Theo cách này, lớp nguồn dữ liệu kế thừa / phụ thuộc vào hành vi được xác định trong logic buisness (do đó là đảo ngược) chứ không phải ngược lại (như cách thông thường). Điều này cung cấp sự linh hoạt trong thiết kế, cho phép logic nghiệp vụ hoạt động mà không có bất kỳ thay đổi mã nào, với một nguồn dữ liệu hoàn toàn khác.


1
Giải thích tuyệt vời về Liskov. :)
John Korsnes
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.