Hãy ghi nhớ số liệu ổn định của Martin và ý nghĩa của "tính ổn định":
Instability = Ce / (Ca+Ce)
Hoặc là:
Instability = Outgoing / (Incoming+Outgoing)
Đó là, một gói được coi là hoàn toàn không ổn định nếu tất cả các phụ thuộc của nó là đi: nó sử dụng những thứ khác, nhưng không có gì sử dụng nó. Trong trường hợp đó, nó chỉ có ý nghĩa cho điều đó là cụ thể. Đây cũng sẽ là loại mã dễ thay đổi nhất vì không có gì khác sử dụng nó, và do đó không có gì khác có thể phá vỡ nếu mã đó được sửa đổi.
Trong khi đó, khi bạn có kịch bản ngược lại về sự "ổn định" hoàn toàn với một gói được sử dụng bởi một hoặc nhiều thứ nhưng nó không sử dụng bất cứ thứ gì, như gói trung tâm được sử dụng bởi phần mềm, đó là khi Martin nói điều này nên trừu tượng. Điều đó cũng được củng cố bởi phần DIP của SOLI (D), Nguyên tắc đảo ngược phụ thuộc, về cơ bản nói rằng các phụ thuộc phải thống nhất chảy theo hướng trừu tượng cho cả mã cấp thấp và cấp cao.
Đó là, các phụ thuộc phải thống nhất theo hướng "ổn định", và chính xác hơn, các phụ thuộc sẽ chảy vào các gói có nhiều phụ thuộc đến hơn phụ thuộc đi và hơn nữa, các phụ thuộc sẽ chảy theo trừu tượng. Điểm chính của lý do đằng sau đó là sự trừu tượng cung cấp phòng thở để thay thế một kiểu con cho một kiểu con khác, mang lại mức độ linh hoạt cho các bộ phận cụ thể thực hiện giao diện để thay đổi mà không phá vỡ các phụ thuộc đến giao diện trừu tượng đó.
Có bất kỳ nhược điểm đáng kể nào phụ thuộc vào sự trừu tượng?
Chà, tôi thực sự không đồng ý với Martin ở đây cho tên miền của tôi ít nhất, và ở đây tôi cần đưa ra một định nghĩa mới về "sự ổn định" như trong "thiếu lý do để thay đổi". Trong trường hợp đó tôi sẽ nói rằng các phụ thuộc sẽ chuyển sang ổn định, nhưng các giao diện trừu tượng không giúp ích gì nếu các giao diện trừu tượng không ổn định (theo định nghĩa của tôi về "không ổn định", như dễ bị thay đổi nhiều lần, không phải của Martin). Nếu các nhà phát triển không thể sửa lỗi trừu tượng và khách hàng liên tục thay đổi ý định theo cách khiến các nỗ lực trừu tượng mô hình hóa phần mềm không hoàn chỉnh hoặc không hiệu quả, thì chúng tôi không còn được hưởng lợi từ tính linh hoạt nâng cao của giao diện trừu tượng để bảo vệ hệ thống chống lại các thay đổi phá vỡ phụ thuộc theo tầng. . Trong trường hợp cá nhân của tôi, tôi đã tìm thấy các công cụ ECS, chẳng hạn như các công cụ được tìm thấy trong các trò chơi AAA,cụ thể nhất : hướng tới dữ liệu thô, nhưng dữ liệu đó rất ổn định (như trong "không bao giờ cần phải thay đổi"). Tôi thường thấy xác suất của một cái gì đó đòi hỏi những thay đổi trong tương lai là một số liệu hữu ích hơn so với tỷ lệ của hiệu ứng trên tổng số khớp nối trong các quyết định SE hướng dẫn.
Vì vậy, tôi sẽ thay đổi DIP một chút và chỉ nói, "các phụ thuộc sẽ chảy vào các thành phần có xác suất yêu cầu thay đổi thấp nhất", bất kể các thành phần đó là giao diện trừu tượng hay dữ liệu thô. Tất cả những gì quan trọng với tôi là xác suất mà họ có thể yêu cầu thay đổi thiết kế trực tiếp. Trừu tượng chỉ hữu ích trong bối cảnh ổn định này nếu một cái gì đó, bằng cách trừu tượng, làm giảm xác suất đó.
Đối với nhiều bối cảnh có thể là trường hợp với các kỹ sư và khách hàng tử tế, những người dự đoán được nhu cầu của phần mềm trả trước và thiết kế trừu tượng (như không thay đổi), trong khi những tóm tắt đó cung cấp cho họ tất cả các phòng thở mà họ cần để trao đổi các triển khai cụ thể. Nhưng trong một số lĩnh vực, các tóm tắt có thể không ổn định và dễ bị thiếu, trong khi dữ liệu cần thiết của động cơ có thể dễ dàng hơn nhiều để dự đoán và ổn định trước. Vì vậy, trong những trường hợp đó, nó thực sự có thể có lợi hơn từ quan điểm duy trì (dễ dàng thay đổi và mở rộng hệ thống) cho các phụ thuộc để chuyển sang dữ liệu thay vì trừu tượng hóa. Trong ECS, các bộ phận không ổn định nhất (như trong các bộ phận thường xuyên thay đổi nhất) thường là chức năng cư trú trong các hệ thống (PhysicsSystem
, ví dụ), trong khi các phần ổn định nhất (ít có khả năng thay đổi nhất) là các thành phần chỉ bao gồm dữ liệu thô ( MotionComponent
ví dụ) mà tất cả các hệ thống sử dụng.