Có, RẮN là một cách rất tốt để thiết kế mã có thể dễ dàng kiểm tra. Là một đoạn mồi ngắn:
S - Nguyên tắc trách nhiệm duy nhất: Một đối tượng nên thực hiện chính xác một việc và phải là đối tượng duy nhất trong cơ sở mã thực hiện một việc đó. Chẳng hạn, lấy một lớp miền, nói Hóa đơn. Lớp Hóa đơn phải thể hiện cấu trúc dữ liệu và quy tắc kinh doanh của hóa đơn như được sử dụng trong hệ thống. Nó phải là lớp duy nhất đại diện cho một hóa đơn trong cơ sở mã. Điều này có thể được chia nhỏ hơn nữa để nói rằng một phương thức nên có một mục đích và phải là phương thức duy nhất trong cơ sở mã đáp ứng nhu cầu này.
Theo nguyên tắc này, bạn tăng khả năng kiểm tra thiết kế của mình bằng cách giảm số lượng kiểm tra bạn phải viết để kiểm tra cùng chức năng trên các đối tượng khác nhau và bạn cũng thường kết thúc bằng các phần chức năng nhỏ hơn để dễ kiểm tra hơn.
O - Nguyên tắc mở / đóng: Một lớp nên được mở để mở rộng, nhưng đóng để thay đổi . Khi một đối tượng tồn tại và hoạt động chính xác, lý tưởng là không cần phải quay lại đối tượng đó để thực hiện các thay đổi có thêm chức năng mới. Thay vào đó, đối tượng nên được mở rộng, bằng cách lấy nó hoặc bằng cách cắm các triển khai phụ thuộc mới hoặc khác nhau vào nó, để cung cấp chức năng mới đó. Điều này tránh hồi quy; bạn có thể giới thiệu chức năng mới khi nào và ở đâu cần thiết, mà không thay đổi hành vi của đối tượng vì nó đã được sử dụng ở nơi khác.
Bằng cách tuân thủ nguyên tắc này, bạn thường tăng khả năng chịu đựng các "giả" của mã và bạn cũng tránh phải viết lại các bài kiểm tra để dự đoán hành vi mới; tất cả các thử nghiệm hiện có cho một đối tượng vẫn sẽ hoạt động trên triển khai chưa được mở rộng, trong khi các thử nghiệm mới cho chức năng mới sử dụng triển khai mở rộng cũng sẽ hoạt động.
Nguyên tắc thay thế L - Liskov: Một lớp A, phụ thuộc vào lớp B, có thể sử dụng bất kỳ X: B nào mà không biết sự khác biệt. Điều này về cơ bản có nghĩa là bất cứ điều gì bạn sử dụng như một phụ thuộc nên có hành vi tương tự như nhìn thấy bởi lớp phụ thuộc. Ví dụ ngắn gọn, giả sử bạn có giao diện IWriter hiển thị Write (chuỗi), được ConsoleWriter triển khai. Bây giờ bạn phải ghi vào một tệp thay thế, vì vậy bạn tạo FileWriter. Khi làm như vậy, bạn phải đảm bảo rằng FileWriter có thể được sử dụng giống như cách ConsoleWriter đã làm (nghĩa là cách duy nhất mà người phụ thuộc có thể tương tác với nó bằng cách gọi Write (chuỗi)), và vì vậy thông tin bổ sung mà FileWriter có thể cần phải làm điều đó công việc (như đường dẫn và tệp để ghi vào) phải được cung cấp từ một nơi khác ngoài người phụ thuộc.
Điều này là rất lớn để viết mã có thể kiểm tra được, bởi vì một thiết kế phù hợp với LSP có thể có một đối tượng "bị chế giễu" thay thế cho vật thật tại bất kỳ thời điểm nào mà không thay đổi hành vi dự kiến, cho phép kiểm tra các đoạn mã nhỏ một cách tự tin hệ thống sau đó sẽ làm việc với các đối tượng thực được cắm vào.
I - Nguyên tắc phân chia giao diện: Một giao diện nên có ít phương thức khả thi để cung cấp chức năng của vai trò được xác định bởi giao diện . Nói một cách đơn giản, nhiều giao diện nhỏ hơn tốt hơn ít giao diện lớn hơn. Điều này là do một giao diện lớn có nhiều lý do để thay đổi và gây ra nhiều thay đổi hơn ở nơi khác trong cơ sở mã có thể không cần thiết.
Việc tuân thủ ISP cải thiện khả năng kiểm tra bằng cách giảm độ phức tạp của các hệ thống được kiểm tra và sự phụ thuộc của các SUT đó. Nếu đối tượng bạn đang kiểm tra phụ thuộc vào giao diện IDoThreeThings hiển thị DoOne (), DoTwo () và DoThree (), bạn phải giả định một đối tượng thực hiện cả ba phương thức ngay cả khi đối tượng chỉ sử dụng phương thức DoTwo. Nhưng, nếu đối tượng chỉ phụ thuộc vào IDoTwo (chỉ hiển thị DoTwo), bạn có thể dễ dàng giả định một đối tượng có một phương thức đó.
D - Nguyên tắc đảo ngược phụ thuộc: Cụ thể và trừu tượng không bao giờ nên phụ thuộc vào các cụ thể khác, mà phụ thuộc vào trừu tượng . Nguyên tắc này trực tiếp thực thi nguyên lý của khớp nối lỏng lẻo. Một đối tượng không bao giờ phải biết IS là gì; thay vào đó nó nên quan tâm những gì một đối tượng LÀM. Vì vậy, việc sử dụng các giao diện và / hoặc các lớp cơ sở trừu tượng luôn được ưu tiên hơn so với việc sử dụng các triển khai cụ thể khi xác định các thuộc tính và tham số của một đối tượng hoặc phương thức. Điều đó cho phép bạn trao đổi một triển khai này cho một triển khai khác mà không phải thay đổi cách sử dụng (nếu bạn cũng tuân theo LSP, song hành với DIP).
Một lần nữa, điều này rất lớn cho khả năng kiểm tra, vì nó cho phép bạn, một lần nữa, đưa một thực thi giả của một phụ thuộc thay vì triển khai "sản xuất" vào đối tượng của bạn đang được thử nghiệm, trong khi vẫn kiểm tra đối tượng ở dạng chính xác mà nó sẽ có trong khi trong sản xuất. Đây là chìa khóa để kiểm tra đơn vị "trong sự cô lập".