Nguyên tắc trách nhiệm duy nhất có thể được áp dụng cho mã mới không?


20

Nguyên tắc được định nghĩa là các mô-đun có một lý do để thay đổi . Câu hỏi của tôi là, chắc chắn những lý do để thay đổi không được biết cho đến khi mã thực sự bắt đầu thay đổi ?? Khá nhiều đoạn mã có nhiều lý do tại sao nó thể thay đổi nhưng chắc chắn cố gắng lường trước tất cả những điều này và thiết kế mã của bạn với ý nghĩ này sẽ kết thúc với mã rất kém. Có phải là một ý tưởng tốt hơn khi chỉ thực sự bắt đầu áp dụng SRP khi các yêu cầu thay đổi mã bắt đầu xuất hiện không? Cụ thể hơn, khi một đoạn mã đã thay đổi nhiều lần vì nhiều lý do, do đó chứng minh rằng nó có nhiều hơn một lý do để thay đổi. Nghe có vẻ rất chống Agile khi cố gắng đoán lý do để thay đổi.

Một ví dụ sẽ là một đoạn mã in tài liệu. Một yêu cầu xuất hiện để thay đổi nó để in thành PDF và sau đó yêu cầu thứ hai được thực hiện để thay đổi nó để áp dụng một số định dạng khác nhau cho tài liệu. Tại thời điểm này, bạn có bằng chứng về nhiều lý do duy nhất để thay đổi (và vi phạm SRP) và nên thực hiện tái cấu trúc phù hợp.


6
@Frank - nó thực sự thường được định nghĩa như thế - xem ví dụ en.wikipedia.org/wiki/Single_responsibility_principl
Joris Timmermans

1
Cách bạn diễn đạt nó không phải là cách tôi hiểu định nghĩa về SRP.
Pieter B

2
Mỗi dòng mã có (ít nhất) hai lý do để được thay đổi: Nó góp phần gây ra lỗi hoặc nó can thiệp vào một yêu cầu mới.
Bart van Ingen Schenau

1
@BartvanIngenSchenau: LOL ;-) Nếu bạn thấy nó theo cách này, SRP không thể được áp dụng ở bất cứ đâu.
Doc Brown

1
@DocBrown: Bạn có thể nếu bạn không kết hợp SRP với việc thay đổi mã nguồn. Ví dụ: nếu bạn diễn giải SRP là có thể cung cấp một tài khoản đầy đủ về những gì một lớp / hàm thực hiện trong một câu mà không sử dụng từ đó (và không có từ ngữ chồn để vượt qua giới hạn đó).
Bart van Ingen Schenau

Câu trả lời:


27

Tất nhiên, nguyên tắc YAGNI sẽ cho bạn biết áp dụng SRP không trước khi bạn thực sự cần nó. Nhưng câu hỏi bạn nên tự hỏi mình là: tôi có cần áp dụng SRP trước và chỉ khi tôi phải thực sự thay đổi mã của mình?

Theo kinh nghiệm của tôi, việc áp dụng SRP mang lại cho bạn một lợi ích sớm hơn nhiều: khi bạn phải tìm ra nơicách áp dụng một thay đổi cụ thể trong mã của bạn. Đối với nhiệm vụ này, bạn phải đọc và hiểu các chức năng và các lớp hiện có của bạn. Điều này trở nên dễ dàng hơn rất nhiều khi tất cả các chức năng và các lớp của bạn có trách nhiệm cụ thể. Vì vậy, IMHO bạn nên áp dụng SRP bất cứ khi nào nó giúp mã của bạn dễ đọc hơn, bất cứ khi nào nó làm cho các chức năng của bạn nhỏ hơn và tự mô tả hơn. Vì vậy, câu trả lời là , nên áp dụng SRP ngay cả đối với mã mới.

Ví dụ: khi mã in của bạn đọc tài liệu, định dạng tài liệu in kết quả cho một thiết bị cụ thể, đây là 3 trách nhiệm tách biệt rõ ràng. Vì vậy, thực hiện ít nhất 3 chức năng trong số họ, đặt tên theo họ. Ví dụ:

 void RunPrintWorkflow()
 {
     var document = ReadDocument();
     var formattedDocument = FormatDocument(document);
     PrintDocumentToScreen(formattedDocument);
 }

Bây giờ, khi bạn nhận được một yêu cầu mới để thay đổi định dạng tài liệu hoặc một yêu cầu khác để in thành PDF, bạn sẽ biết chính xác chức năng hoặc vị trí nào trong mã mà bạn phải áp dụng thay đổi, và thậm chí quan trọng hơn, trong trường hợp không.

Vì vậy, bất cứ khi nào bạn đến một chức năng bạn không hiểu vì chức năng này "quá nhiều" và bạn không chắc chắn nên áp dụng thay đổi ở đâu và sau đó , sau đó xem xét để cấu trúc lại chức năng thành các chức năng nhỏ hơn, riêng biệt. Đừng đợi cho đến khi bạn phải thay đổi một cái gì đó. Mã thường đọc gấp 10 lần so với thay đổi và các hàm nhỏ hơn dễ đọc hơn nhiều. Theo kinh nghiệm của tôi, khi một chức năng có độ phức tạp nhất định, bạn luôn có thể chia chức năng thành các trách nhiệm khác nhau, không phụ thuộc vào việc biết những thay đổi nào sẽ đến trong tương lai. Bob Martin thường tiến thêm một bước, xem liên kết tôi đã đưa ra trong các bình luận của tôi dưới đây.

EDIT: theo nhận xét của bạn: Trách nhiệm chính của chức năng bên ngoài trong ví dụ trên không phải là in ra một thiết bị cụ thể hoặc định dạng tài liệu - đó là tích hợp quy trình in . Do đó, ở mức độ trừu tượng của chức năng bên ngoài, một yêu cầu mới như "không nên định dạng tài liệu nữa" hoặc "tài liệu nên được gửi thay vì in" chỉ là "lý do tương tự" - cụ thể là "quy trình in đã thay đổi". Nếu chúng ta nói về những điều như vậy, điều quan trọng là phải tuân thủ đúng mức độ trừu tượng .


Tôi thường luôn phát triển với TDD vì vậy trong ví dụ của tôi, tôi không thể giữ tất cả logic đó trong một mô-đun vì không thể kiểm tra. Đây chỉ là sản phẩm phụ của TDD chứ không phải vì tôi cố tình áp dụng SRP. Ví dụ của tôi có khá rõ ràng, trách nhiệm riêng biệt nên có thể không phải là một ví dụ tốt. Tôi nghĩ những gì tôi đang hỏi là, bạn có thể viết bất kỳ đoạn mã mới nào và nói một cách dứt khoát, vâng, điều này không vi phạm SRP? Không phải "lý do để thay đổi" về cơ bản được xác định bởi doanh nghiệp?
Xem Không Weevil

3
@thecapsomsinkid: có, bạn có thể (ít nhất là bằng cách tái cấu trúc ngay lập tức). Nhưng bạn sẽ nhận được các hàm rất, rất nhỏ - và không phải mọi lập trình viên đều thích điều đó. Xem ví dụ này: sites.google.com.vn/site/unclebobconsultingllc/ Kẻ
Doc Brown

Nếu bạn đang áp dụng SRP bằng cách dự đoán các lý do để thay đổi, trong ví dụ của bạn, tôi vẫn có thể lập luận rằng nó có nhiều hơn một thay đổi lý do duy nhất. Doanh nghiệp có thể quyết định họ không còn muốn định dạng tài liệu và sau đó quyết định họ muốn gửi email thay vì in. EDIT: Chỉ cần đọc liên kết và trong khi tôi không đặc biệt thích kết quả cuối cùng, 'Trích xuất cho đến khi bạn không thể trích xuất thêm nữa' có ý nghĩa hơn nhiều và ít mơ hồ hơn 'chỉ một lý do để thay đổi'. Mặc dù không thực dụng lắm.
Xem Không Weevil

1
@thecapsomsinkid: xem chỉnh sửa của tôi. Trách nhiệm chính của chức năng bên ngoài là không in ra một thiết bị cụ thể hoặc định dạng tài liệu - đó là tích hợp quy trình in. Và khi quy trình công việc này thay đổi, đó là lý do duy nhất tại sao chức năng sẽ thay đổi
Doc Brown

Nhận xét của bạn về việc bám đúng mức độ trừu tượng dường như là điều tôi còn thiếu. Một ví dụ, tôi có một lớp mà tôi sẽ mô tả là 'Tạo cấu trúc dữ liệu từ một mảng JSON'. Âm thanh như một trách nhiệm duy nhất với tôi. Vòng lặp thông qua các đối tượng trong một mảng JSON và ánh xạ chúng thành POJO. Nếu tôi tuân theo cùng mức độ trừu tượng như mô tả của tôi, thật khó để tranh luận rằng nó có nhiều hơn một lý do để thay đổi, tức là 'Cách JSON ánh xạ tới đối tượng'. Là ít trừu tượng tôi có thể tranh luận nó có nhiều hơn một lý do ví dụ như làm thế nào tôi bản đồ trường ngày thay đổi, làm thế nào các giá trị số được ánh xạ tới ngày, vv
SeeNoWeevil

7

Tôi nghĩ bạn đang hiểu nhầm SRP.

Lý do duy nhất để thay đổi KHÔNG phải là về việc thay đổi mã mà là về mã của bạn làm gì.


3

Tôi nghĩ định nghĩa của SRP là "có một lý do để thay đổi" là sai lệch cho chính xác lý do này. Lấy chính xác theo mệnh giá: Nguyên tắc Trách nhiệm duy nhất nói rằng một lớp hoặc hàm phải có chính xác một trách nhiệm. Chỉ có một lý do để thay đổi là tác dụng phụ của việc chỉ làm một việc để bắt đầu. Không có lý do gì bạn ít nhất có thể nỗ lực hướng tới một trách nhiệm trong mã của mình mà không biết gì về cách nó có thể thay đổi trong tương lai.

Một trong những manh mối tốt nhất cho loại điều này là khi bạn chọn tên lớp hoặc tên hàm. Nếu không rõ ràng ngay lập tức lớp nên được đặt tên là gì, hoặc tên đặc biệt dài / phức tạp hoặc tên sử dụng các thuật ngữ chung chung như "người quản lý" hoặc "tiện ích", thì có lẽ nó vi phạm SRP. Tương tự, khi ghi lại API, nó sẽ trở nên rõ ràng nhanh chóng nếu bạn vi phạm SRP dựa trên chức năng bạn mô tả.

Tất nhiên, có những sắc thái đối với SRP mà bạn không thể biết cho đến sau này trong dự án - thứ dường như là một trách nhiệm duy nhất hóa ra là hai hoặc ba. Đây là những trường hợp bạn sẽ phải cấu trúc lại để thực hiện SRP. Nhưng điều đó không có nghĩa là SRP nên được bỏ qua cho đến khi bạn nhận được yêu cầu thay đổi; đánh bại mục đích của SRP!

Để nói trực tiếp với ví dụ của bạn, hãy xem xét tài liệu về phương pháp in của bạn. Nếu bạn muốn nói "phương pháp này định dạng dữ liệu cho in ấn và gửi nó tới máy in," đó là những gì giúp bạn: đó không phải là trách nhiệm duy nhất, đó là hai trách nhiệm: định dạng và gửi đến máy in. Nếu bạn nhận ra điều này và chia chúng thành hai chức năng / lớp, thì khi các yêu cầu thay đổi của bạn xuất hiện, bạn chỉ có một lý do để mỗi phần thay đổi.


3

Một ví dụ sẽ là một đoạn mã in tài liệu. Một yêu cầu xuất hiện để thay đổi nó để in thành PDF và sau đó yêu cầu thứ hai được thực hiện để thay đổi nó để áp dụng một số định dạng khác nhau cho tài liệu. Tại thời điểm này, bạn có bằng chứng về nhiều lý do duy nhất để thay đổi (và vi phạm SRP) và nên thực hiện tái cấu trúc phù hợp.

Tôi đã rất nhiều lần tự bắn vào chân mình bằng cách dành quá nhiều thời gian để điều chỉnh mã để điều chỉnh những thay đổi đó. Thay vì chỉ in PDF ngu ngốc chết tiệt.

Tái cấu trúc để giảm mã

Mẫu sử dụng duy nhất có thể tạo mã phình. Trong đó các gói bị ô nhiễm với các lớp cụ thể nhỏ tạo ra một đống mã rác không có ý nghĩa riêng lẻ. Bạn phải mở hàng tá tệp nguồn chỉ để hiểu làm thế nào nó đến phần in. Trên hết, có thể có hàng trăm nếu không phải là hàng ngàn dòng mã được đặt ra chỉ để thực thi 10 dòng mã thực hiện in ấn.

Tạo một Bullseye

Mẫu sử dụng duy nhất nhằm giảm mã nguồn và cải thiện việc sử dụng lại mã. Nó có nghĩa là để tạo ra chuyên môn hóa và thực hiện cụ thể. Một loại bullseyetrong mã nguồn cho bạn go to specific tasks. Khi có một vấn đề với việc in ấn, bạn biết chính xác nơi cần khắc phục.

Sử dụng một lần không có nghĩa là bẻ gãy mơ hồ

Có, bạn có mã đã in một tài liệu. Có, bây giờ bạn phải thay đổi mã để in PDF. Có, bây giờ bạn phải thay đổi định dạng của tài liệu.

Bạn có chắc chắn usageđã thay đổi đáng kể?

Nếu tái cấu trúc làm cho các phần của mã nguồn trở nên quá khái quát. Đến mức mà mục đích ban đầu printing stuffkhông còn rõ ràng nữa, thì bạn đã tạo ra sự bẻ khóa mơ hồ trong mã nguồn.

Anh chàng mới sẽ có thể tìm ra điều này một cách nhanh chóng?

Luôn duy trì mã nguồn của bạn trong tổ chức dễ hiểu nhất.

Đừng là người làm đồng hồ

Đã rất nhiều lần tôi thấy các nhà phát triển đeo một thị kính và tập trung vào các chi tiết nhỏ đến mức không ai có thể đặt các mảnh lại với nhau nếu nó bị vỡ ra.

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


2

Một lý do cho sự thay đổi cuối cùng là sự thay đổi về đặc điểm kỹ thuật hoặc thông tin về môi trường nơi ứng dụng chạy. Vì vậy, một nguyên tắc trách nhiệm duy nhất là yêu cầu bạn viết từng thành phần (lớp, chức năng, mô-đun, dịch vụ ...) để nó cần xem xét càng ít thông số kỹ thuật và môi trường thực thi càng tốt.

Vì bạn biết đặc tả và môi trường khi bạn viết thành phần, bạn có thể áp dụng nguyên tắc.

Nếu bạn xem xét ví dụ về mã in một tài liệu. Bạn nên xem xét liệu bạn có thể xác định mẫu bố cục mà không xem xét tài liệu sẽ kết thúc bằng PDF. Bạn có thể, vì vậy SRP đang nói với bạn rằng bạn nên.

Tất nhiên YAGNI đang nói với bạn rằng bạn không nên. Bạn cần tìm sự cân bằng giữa các nguyên tắc thiết kế.


2

Flup đang đi đúng hướng. "Nguyên tắc trách nhiệm duy nhất" ban đầu được áp dụng cho các thủ tục. Ví dụ, Dennis Ritchie sẽ nói rằng một hàm nên làm một việc và làm tốt. Sau đó, trong C ++, Bjarne Stroustrup sẽ nói rằng một lớp nên làm một việc và làm tốt.

Lưu ý rằng, ngoại trừ quy tắc ngón tay cái, hai chính thức này có rất ít hoặc không có gì để làm với nhau. Chúng chỉ phục vụ cho những gì thuận tiện để diễn đạt bằng ngôn ngữ lập trình. Vâng, đó là một cái gì đó. Nhưng đó là một câu chuyện hoàn toàn khác so với những gì flup đang lái xe.

Các triển khai hiện đại (tức là nhanh nhẹn và DDD) tập trung nhiều vào những gì quan trọng đối với doanh nghiệp hơn là những gì ngôn ngữ lập trình có thể diễn đạt. Phần đáng ngạc nhiên là các ngôn ngữ lập trình chưa bắt kịp. Các ngôn ngữ cũ giống như FORTRAN nắm bắt các trách nhiệm phù hợp với các mô hình khái niệm chính của thời đại: các quy trình được áp dụng cho mỗi thẻ khi nó đi qua đầu đọc thẻ, hoặc (như trong C) xử lý đi kèm với mỗi ngắt. Sau đó, đến các ngôn ngữ ADT, đã trưởng thành đến mức nắm bắt được những gì mà người DDD sau này sẽ phát minh lại là quan trọng (mặc dù Jim Neighbor đã tìm ra hầu hết những điều này, được xuất bản và sử dụng vào năm 1968): ngày nay chúng ta gọi là các lớp học . (Chúng KHÔNG phải mô-đun.)

Bước này là một sự tiến hóa ít hơn một quả lắc. Khi con lắc vung lên dữ liệu, chúng tôi đã mất mô hình ca sử dụng vốn có trong FORTRAN. Điều đó tốt khi trọng tâm chính của bạn liên quan đến dữ liệu hoặc hình dạng trên màn hình. Đây là một mô hình tuyệt vời cho các chương trình như PowerPoint hoặc ít nhất là cho các hoạt động đơn giản của nó.

Những gì đã mất là trách nhiệm hệ thống . Chúng tôi không bán các yếu tố của DDD. Và chúng tôi không phương pháp lớp tốt. Chúng tôi bán trách nhiệm hệ thống. Ở một mức độ nào đó, bạn cần thiết kế hệ thống của mình theo nguyên tắc trách nhiệm duy nhất.

Vì vậy, nếu bạn nhìn vào những người như Rebecca Wirfs-Brock, hoặc tôi, người thường nói về các phương pháp của lớp, thì bây giờ chúng ta đang nói về các trường hợp sử dụng. Đó là những gì chúng tôi bán. Đó là những hoạt động hệ thống. Một trường hợp sử dụng nên có một trách nhiệm duy nhất. Một trường hợp sử dụng hiếm khi là một đơn vị kiến ​​trúc. Nhưng mọi người đều cố gắng giả vờ như vậy. Chứng kiến ​​những người làm ví dụ.

Đây là lý do tại sao tôi rất hào hứng với kiến ​​trúc DCI của Trygve Reenskaug - đó là những gì được mô tả trong cuốn sách Kiến trúc Lean ở trên. Cuối cùng nó đưa ra một số tầm vóc thực sự cho những gì từng là sự phản đối tùy tiện và thần bí đối với "trách nhiệm duy nhất" - như người ta thấy trong hầu hết các cuộc tranh luận ở trên. Tầm vóc đó liên quan đến các mô hình tinh thần của con người: người dùng cuối trước và lập trình viên thứ hai. Nó liên quan đến mối quan tâm kinh doanh. Và, gần như tình cờ, nó gói gọn sự thay đổi khi flup thách thức chúng ta.

Nguyên tắc trách nhiệm duy nhất mà chúng ta biết đó là một con khủng long còn sót lại từ thời kỳ khởi đầu hoặc một con ngựa có sở thích mà chúng ta sử dụng thay thế cho sự hiểu biết. Bạn cần phải bỏ lại một vài con ngựa có sở thích này để làm phần mềm tuyệt vời. Và điều đó đòi hỏi phải suy nghĩ ra khỏi hộp. Giữ mọi thứ đơn giản và dễ hiểu chỉ hoạt động khi vấn đề đơn giản và dễ hiểu. Tôi không quan tâm lắm đến những giải pháp đó: chúng không phải là điển hình và đó không phải là thách thức.


2
Khi đọc những gì bạn viết, đâu đó dọc đường tôi hoàn toàn mất cảnh giác về những gì bạn đang nói. Câu trả lời hay không coi câu hỏi là điểm khởi đầu của một vụ lùm xùm trong rừng, mà là một chủ đề xác định để liên kết tất cả các văn bản với.
Donal Fellows

1
Ah, bạn là một trong số đó, giống như một trong những người quản lý cũ của tôi. "Chúng tôi không muốn hiểu nó: chúng tôi muốn cải thiện nó!" Vấn đề chủ đề chính ở đây là một trong những nguyên tắc: đó là "P" trong "SRP." Có lẽ tôi đã trả lời trực tiếp câu hỏi nếu đó là câu hỏi đúng: không phải vậy. Bạn có thể đưa nó lên với những người từng đặt ra câu hỏi.
Đối phó

Có một câu trả lời tốt được chôn ở đây ở đâu đó. Tôi nghĩ rằng ...
RubberDuck

0

Có, Nguyên tắc Đơn trách nhiệm phải được áp dụng cho mã mới.

Nhưng! Trách nhiệm là gì?

Là "in một báo cáo là một trách nhiệm"? Câu trả lời, tôi tin là "Có thể."

Hãy thử sử dụng định nghĩa về SRP là "chỉ có một lý do duy nhất để thay đổi".

Giả sử bạn có một chức năng in báo cáo. Nếu bạn có hai thay đổi:

  1. thay đổi chức năng đó vì báo cáo của bạn cần có nền đen
  2. thay đổi chức năng đó bởi vì bạn cần in ra pdf

Sau đó, thay đổi đầu tiên là "thay đổi kiểu báo cáo", thay đổi khác là "thay đổi định dạng đầu ra báo cáo" và bây giờ bạn nên đặt chúng ở hai chức năng khác nhau vì đây là những điều khác nhau.

Nhưng nếu thay đổi thứ hai của bạn sẽ là:

2b. thay đổi chức năng đó vì báo cáo của bạn cần một phông chữ khác

Tôi muốn nói cả hai thay đổi là "thay đổi kiểu báo cáo" và chúng có thể nằm trong một chức năng.

Vì vậy, nơi mà để lại cho chúng tôi? Như thường lệ, bạn nên cố gắng giữ mọi thứ đơn giản và dễ hiểu. Nếu thay đổi màu nền có nghĩa là 20 dòng mã và thay đổi phông chữ có nghĩa là 20 dòng mã, hãy tạo lại hai chức năng. Nếu nó là một dòng mỗi, giữ nó trong một.


0

Khi bạn đang thiết kế một hệ thống mới, sẽ là khôn ngoan khi xem xét loại thay đổi bạn có thể phải thực hiện trong suốt vòng đời của nó và mức độ đắt đỏ của những kiến ​​trúc mà bạn sẽ đưa vào. Chia hệ thống của bạn thành các mô-đun là một quyết định đắt giá để nhận sai.

Một nguồn thông tin tốt là mô hình tinh thần trong đầu các chuyên gia trong lĩnh vực kinh doanh. Lấy ví dụ về tài liệu, định dạng và pdf. Các chuyên gia tên miền có thể sẽ cho bạn biết họ định dạng các chữ cái của họ bằng các mẫu tài liệu. Hoặc trên văn phòng phẩm hoặc trong Word hoặc bất cứ điều gì. Bạn có thể lấy thông tin này trước khi bắt đầu mã hóa và sử dụng nó trong thiết kế của bạn.

Một bài đọc tuyệt vời về những điều này: Lean Architecture của Coplien


0

"In" rất giống "view" trong MVC. Bất cứ ai hiểu những điều cơ bản của các đối tượng sẽ hiểu điều đó.

Đó là một trách nhiệm hệ thống . Nó được triển khai như một cơ chế - MVC - bao gồm một máy in (Chế độ xem), thứ được in (Mô-đun) và các tùy chọn và yêu cầu của máy in (từ Bộ điều khiển).

Cố gắng bản địa hóa điều này như một trách nhiệm của lớp hoặc mô-đun là điều tối kị và phản ánh suy nghĩ 30 tuổi. Chúng tôi đã học được rất nhiều kể từ đó, và nó được chứng minh trong tài liệu và mã của các lập trình viên trưởng thành.


0

Có phải là một ý tưởng tốt hơn khi chỉ thực sự bắt đầu áp dụng SRP khi các yêu cầu thay đổi mã bắt đầu xuất hiện không?

Lý tưởng nhất là bạn sẽ có ý tưởng tốt về trách nhiệm của các phần khác nhau của mã. Phân chia trách nhiệm theo bản năng đầu tiên của bạn, có thể tính đến những thư viện mà bạn đang sử dụng muốn làm gì (giao nhiệm vụ, trách nhiệm cho thư viện thường là một việc tuyệt vời, với điều kiện thư viện thực sự có thể thực hiện nhiệm vụ ). Sau đó, tinh chỉnh sự hiểu biết của bạn về các trách nhiệm theo các yêu cầu thay đổi. Bạn càng hiểu rõ hệ thống ban đầu, bạn càng cần ít thay đổi về cơ bản các nhiệm vụ trách nhiệm (mặc dù đôi khi bạn phát hiện ra rằng một trách nhiệm được phân chia tốt nhất thành trách nhiệm phụ).

Không phải là bạn nên dành một thời gian dài để lo lắng về nó. Một tính năng chính của mã là nó có thể được thay đổi sau đó, bạn không cần phải hoàn toàn đúng ngay lần đầu tiên. Chỉ cần cố gắng cải thiện theo thời gian để tìm hiểu các loại trách nhiệm hình dạng có gì để bạn có thể ít mắc lỗi hơn trong tương lai.

Một ví dụ sẽ là một đoạn mã in tài liệu. Một yêu cầu xuất hiện để thay đổi nó để in thành PDF và sau đó yêu cầu thứ hai được thực hiện để thay đổi nó để áp dụng một số định dạng khác nhau cho tài liệu. Tại thời điểm này, bạn có bằng chứng về nhiều lý do duy nhất để thay đổi (và vi phạm SRP) và nên thực hiện tái cấu trúc phù hợp.

Đây hoàn toàn là một dấu hiệu cho thấy trách nhiệm chung - In ấn mã mã - có trách nhiệm phụ và nên được chia thành từng phần. Đó không phải là vi phạm SRP mỗi lần mà là một dấu hiệu cho thấy việc phân vùng (có lẽ là định dạng các nhiệm vụ phụ của Cameron và có thể được yêu cầu. Bạn có thể mô tả các trách nhiệm đó một cách rõ ràng để bạn có thể hiểu những gì đang diễn ra trong các nhiệm vụ phụ mà không cần nhìn vào việc thực hiện chúng không? Nếu bạn có thể, họ có khả năng là chia tách hợp lý.

Nó cũng có thể rõ ràng hơn nếu chúng ta nhìn vào một ví dụ thực tế đơn giản. Hãy để chúng tôi xem xét các sort()phương pháp tiện ích trong java.util.Arrays. Nó làm gì? Nó sắp xếp một mảng, và đó là tất cả những gì nó làm. Nó không in các yếu tố ra, nó không tìm thấy thành viên phù hợp nhất về mặt đạo đức, nó không huýt sáo Dixie . Nó chỉ sắp xếp một mảng. Bạn cũng không cần phải biết. Sắp xếp là trách nhiệm duy nhất của phương pháp đó. (Trên thực tế, có nhiều phương thức sắp xếp trong Java vì những lý do kỹ thuật hơi xấu phải làm với các kiểu nguyên thủy; bạn không cần phải chú ý đến điều đó, vì tất cả chúng đều có trách nhiệm tương đương.)

Làm cho các phương thức của bạn, các lớp của bạn, các mô-đun của bạn, làm cho chúng có một rô-bốt được chỉ định rõ ràng như vậy trong cuộc sống. Nó giữ số tiền mà bạn phải hiểu ngay lập tức, và đến lượt nó là thứ cho phép bạn xử lý việc thiết kế và duy trì một hệ thống lớn.

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.