OOP chỉ là một mô hình trong số nhiều khả năng. Nó không phải là một mục tiêu trong chính nó, nó là một phương tiện để kết thúc. Bạn không cần phải lập trình hướng đối tượng, không phải nếu các mô hình khác phù hợp hơn với bạn.
Và vô số người thông minh trước khi bạn nhận xét rằng kiểm tra đơn vị có xu hướng dễ dàng hơn nhiều trong ngôn ngữ hướng đối tượng hơn là hướng đối tượng, đơn giản vì đơn vị tự nhiên cho thử nghiệm là một hàm. Nó không phải là một lớp (mà có thể có các phương thức riêng và tất cả các loại trạng thái lạ), nhưng là một hàm.
Khả năng kiểm tra mặt khác, không có giá trị nào. Nếu mã của bạn không thể kiểm tra, bạn không thể kiểm tra nó (rõ ràng), và nếu bạn không thể kiểm tra nó, làm thế nào bạn có thể nói rằng nó hoạt động? Vì vậy, nếu bạn phải chọn một cực hay khác, tôi chắc chắn sẽ chọn testability.
Nhưng một câu hỏi rõ ràng là, bạn có thực sự cần phải kiểm tra mọi phương pháp riêng tư không?Đây không phải là một phần của hợp đồng công khai của một lớp học, và có thể không có ý nghĩa trong sự cô lập. Các phương pháp công cộng rất quan trọng để kiểm tra vì chúng có mục đích cụ thể, chúng phải thực hiện hợp đồng rất cụ thể này, và để đối tượng ở trạng thái nhất quán và vân vân. Chúng vốn có thể thử nghiệm được, theo cách mà một phương pháp riêng có thể không. (Ai quan tâm một phương thức riêng tư nào? Nó không phải là một phần của hợp đồng lớp)
Có lẽ một giải pháp tốt hơn là chỉ cần refactor một số công cụ riêng tư vào các lớp riêng biệt. Có lẽ nhu cầu thử nghiệm các phương pháp riêng tư không lớn như bạn nghĩ.
Trên một lưu ý khác, các khuôn khổ giả mạo khác cũng cho phép bạn thử công cụ riêng tư.
Chỉnh sửa: Sau khi suy nghĩ thêm một chút nữa, tôi muốn nhấn mạnh rằng chỉ việc đặt thành viên riêng tư là một ý tưởng tồi tệ. Lý do chúng tôi có các thành viên tư nhân ở nơi đầu tiên là: Bất biến lớp phải được duy trì mọi lúc. Nó không thể cho mã bên ngoài để đưa lớp của bạn vào trạng thái không hợp lệ. Đó không chỉ là OOP, đó cũng là cảm giác thông thường. Các phương thức riêng chỉ đơn giản là cho phép bạn chi tiết hơn trong nội bộ lớp, bao gồm một số nhiệm vụ trên nhiều phương thức và như vậy, nhưng chúng thường là không bảo toàn bất biến lớp. Họ làm một nửa công việc, và sau đó dựa vào một số phương pháp riêng tư khác được gọi sau đó để làm một nửa còn lại. Và điều đó an toàn vì chúng thường không thể truy cập được. Chỉ có các phương thức lớp khác có thể gọi chúng, miễn là chúng bảo toàn được bất biến, tất cả đều tốt. Vì vậy, trong khi có, bạn thực hiện các phương pháp riêng tư có thể kiểm tra bằng cách chuyển chúng thành công cộng, bạn cũng giới thiệu một nguồn lỗi có thể không phải bị bắt dễ dàng bằng các thử nghiệm đơn vị. Bạn có thể sử dụng lớp "sai". Một lớp được thiết kế tốt luôn duy trì bất biến của nó, bất kể nó được mã bên ngoài sử dụng như thế nào. Khi bạn làm mọi thứ công khai, điều đó không còn khả thi nữa. Mã bên ngoài có thể gọi các hàm trợ giúp nội bộ có thể không được sử dụng trong ngữ cảnh đó và sẽ đưa lớp đó vào trạng thái không hợp lệ.
Và kiểm tra đơn vị không thể thực sự đảm bảo rằng điều này không xảy ra. Vì vậy, tôi muốn nói rằng bạn có nguy cơ giới thiệu một nguồn lỗi lớn hơn nhiều so với bạn có thể đã mong đợi. Tất nhiên, với định nghĩa trên của các thành viên tư nhân (những người không bảo tồn bất biến lớp), có thể chuyển một cách an toàn nhiều phương thức khác thành công, bởi vì chúng làm bảo toàn bất biến, và vì vậy không cần phải ẩn chúng khỏi mã bên ngoài. Vì vậy, điều đó có thể làm giảm bớt vấn đề của bạn, bằng cách cung cấp cho bạn ít hơn các phương pháp riêng tư, nhưng không cho phép mã bên ngoài phá vỡ lớp học của bạn, như có thể nếu mọi thứ là công khai.
Hai đoạn đầu tiên trong câu trả lời của bạn dường như mâu thuẫn với nội dung sau ... – Tim
Yeah , Tôi đã viết riêng phần thứ hai sau khi xem xét lại một chút. Tôi không nghĩ có bất kỳ mâu thuẫn nào. Phần đầu tiên thực sự là một sự lựa chọn giữa các thái cực (testability * hoặc * OOP?), Phần sau chỉ ra các vấn đề hoàn toàn không quan tâm đến thực hành OOP. Thỏa hiệp là chìa khóa. :) – jalf