Như Anders nói , một phần về hiệu suất và một phần về việc khóa các thiết kế kém suy nghĩ để giảm phạm vi rắc rối gây ra sau đó bởi những người mù quáng kế thừa những thứ không được thiết kế để kế thừa.
Hiệu năng có vẻ rõ ràng - trong khi hầu hết các phương pháp sẽ không được chú ý trên phần cứng hiện đại, một bộ thu ảo có thể gây ra một điểm nhấn đáng chú ý, ngay cả trên phần cứng hiện đại phụ thuộc nhiều hơn vào các hướng dẫn dễ dự đoán trong đường ống CPU.
Bây giờ lý do để làm cho mọi thứ ảo theo mặc định dường như chỉ được điều khiển bởi một điều duy nhất: các khung kiểm tra đơn vị. Dường như với tôi rằng đây là một lý do kém, nơi chúng tôi đang thay đổi mã để phù hợp với khung hơn là thiết kế nó đúng cách.
Có lẽ vấn đề là với các khung được sử dụng ở đây, họ nên cải thiện để cho phép thay thế các hàm trong thời gian chạy bằng các miếng chêm được tiêm thay vì xây dựng mã thực hiện điều này (với tất cả các hack để có được các phương thức riêng tư cũng như các phương thức không ảo, không đề cập đến chức năng tĩnh và bên thứ 3)
Vì vậy, các phương thức lý do không phải là ảo theo mặc định là như Anders đã nói, và bất kỳ mong muốn biến chúng thành ảo để phù hợp với một số công cụ kiểm tra đơn vị là đặt giỏ hàng trước ngựa, thiết kế phù hợp sẽ vượt qua các ràng buộc nhân tạo.
Bây giờ bạn có thể giảm thiểu tất cả những điều này bằng cách sử dụng các giao diện hoặc bằng cách làm lại toàn bộ cơ sở mã của bạn để sử dụng các thành phần (hoặc microservice) giao tiếp qua tin nhắn thay vì các cuộc gọi phương thức có dây trực tiếp. Nếu bạn phóng to bề mặt của một đơn vị để kiểm tra thành một thành phần và thành phần đó hoàn toàn khép kín, bạn không thực sự cần phải bắt vít với đơn vị đó để kiểm tra đơn vị đó.