Giả sử rằng bạn có một dự án lớn được hỗ trợ bởi cơ sở API. Dự án cũng gửi một API công khai mà người dùng cuối (ish) có thể sử dụng.
Đôi khi bạn cần thay đổi cơ sở API hỗ trợ dự án của bạn. Ví dụ: bạn cần thêm một tính năng cần thay đổi API, phương thức mới hoặc yêu cầu thay đổi một trong các đối tượng hoặc định dạng của một trong các đối tượng đó, được chuyển đến hoặc từ API.
Giả sử rằng bạn cũng đang sử dụng các đối tượng này trong API công khai của mình, các đối tượng công khai cũng sẽ thay đổi bất cứ khi nào bạn thực hiện việc này, điều không mong muốn vì khách hàng của bạn có thể dựa vào các đối tượng API giống hệt nhau để mã phân tích cú pháp của họ hoạt động. (ho khách hàng C ++ WSDL ...)
Vì vậy, một giải pháp tiềm năng là phiên bản API. Nhưng khi chúng ta nói "phiên bản" API, có vẻ như điều này cũng có nghĩa là phải phiên bản các đối tượng API cũng như cung cấp các lệnh gọi phương thức trùng lặp cho mỗi chữ ký phương thức đã thay đổi. Vì vậy, sau đó tôi sẽ có một đối tượng clr cũ đơn giản cho mỗi phiên bản api của tôi, một lần nữa dường như không mong muốn. Và ngay cả khi tôi làm điều này, tôi chắc chắn sẽ không xây dựng từng đối tượng từ đầu vì điều đó sẽ kết thúc với số lượng lớn mã trùng lặp. Thay vào đó, API có khả năng mở rộng các đối tượng riêng mà chúng tôi đang sử dụng cho API cơ sở của chúng tôi, nhưng sau đó chúng tôi gặp vấn đề tương tự vì các thuộc tính được thêm vào cũng sẽ có sẵn trong API công khai khi chúng không được phép.
Vì vậy, một số sự tỉnh táo thường được áp dụng cho tình huống này là gì? Tôi biết nhiều dịch vụ công cộng như Git cho Windows duy trì API được phiên bản, nhưng tôi gặp khó khăn khi tưởng tượng một kiến trúc hỗ trợ điều này mà không có số lượng lớn mã trùng lặp bao gồm các phương thức được nhập và các đối tượng đầu vào / phiên bản khác nhau.
Tôi biết rằng các quy trình như phiên bản ngữ nghĩa cố gắng đặt sự tỉnh táo khi xảy ra sự cố vỡ API công khai. Vấn đề là nhiều hơn có vẻ như nhiều hoặc hầu hết các thay đổi đều yêu cầu phá vỡ API công khai nếu các đối tượng không tách biệt hơn, nhưng tôi không thấy cách nào tốt để làm điều đó mà không cần sao chép mã.
I don't see a good way to do that without duplicating code
- API mới của bạn luôn có thể gọi các phương thức trong API cũ hoặc ngược lại.