2012-05-23 45 views
12

Tôi đang làm việc trên ứng dụng iPhone/iPad/Android giao tiếp với API JSON.Các phương pháp hay nhất để tương thích ngược API

Phiên bản đầu tiên của phiên bản ứng dụng đã hoàn tất và hiện tại các giai đoạn phát triển bổ sung đang diễn ra. Trong các giai đoạn bổ sung, ứng dụng cần tích hợp với phiên bản API mới và cho phép người dùng truy cập vào các tính năng bổ sung như màn hình mới hoặc hành vi đã sửa đổi trong màn hình hiện có. Tuy nhiên, ứng dụng cần phải quay lại với các phiên bản API trước.

Thực tiễn tốt nhất để giải quyết yêu cầu đó là gì? tôi có thể của có thể làm kiểm tra khắp các mã:

if (APIVersion == 1) { 

} else if (APIVersion == 2) { 

} else if (APIVersion == ....) { 

}... 

Nhưng tôi lo ngại về khả năng mở rộng của phương pháp này. Phương pháp nhà máy đến với tâm trí nhưng tôi không chắc chắn như thế nào đến nay điều này sẽ có được tôi.

Cảm ơn, Đánh dấu

Trả lời

20

phát hành một phiên bản API mới là một rất hiếm điều. Thông thường, bạn có thể đạt được khả năng tương thích ngược chỉ bằng cách thêm các tham số tùy chọn mới hoặc các phương thức mới. Ví dụ, nếu bạn đã phương thức có tên search, nhưng bây giờ bạn không hài lòng với cách nó hoạt động, bạn có thể đối phó với nó trong nhiều cách khác nhau:

  • Nếu thay đổi là đơn giản, bạn có thể thêm một tham số mới mode mà mặc định là mode1 (vì vậy nó tương thích ngược). Nếu người dùng cung cấp mode2 bạn phát hiện nó với điều kiện thích hợp if như bạn đã tự đề xuất. (Ngoài ra, thông thường bạn có thể nghĩ ra tên tốt hơn "chế độ".)

  • Nếu thay đổi lớn, bạn có thể thêm dịch vụ search2 mới sử dụng giao diện mới. Sau đó, bạn đánh dấu phương thức search là không được chấp nhận (nhưng vẫn hoạt động và tương thích ngược). Thông thường, khi bạn làm điều này, bạn có thể refactor mã của mình theo cách như vậy, hầu như tất cả logic nằm trong phương thức search2 và phương thức cũ của bạn search gọi search2 nội bộ với thông số được sửa đổi (và định dạng lại kết quả phù hợp) . Nếu bạn làm điều này đúng cách, bạn sẽ không bao giờ cần phải thay đổi phương thức search nữa. Khi bạn thay đổi bảng của mình, v.v. - bạn sẽ chỉ cần sửa đổi search2.

Điểm của tôi là tránh phát hành N+1 phiên bản đầu tiên của API.Bản phát hành lớn như vậy ngụ ý những thay đổi lớn trong số ALL các phương pháp của bạn, không chỉ một phương pháp. Nhiều API chính không bao giờ phát hành phiên bản 2 của API của họ, họ vẫn sử dụng phiên bản 1, chỉ cần sửa đổi một chút phần của nó, như trong ví dụ trên.

Nếu bạn là hoàn toàn chắc chắn về việc phát hành phiên bản N+1 -st của bạn API, tạo điểm mục mới cho ALL các phương pháp của bạn. Nếu bạn có một thư mục có tên services, hãy tạo một thư mục mới có tên services-v2. Tái cấu trúc mã services của bạn để mã sử dụng tối đa services-v2. Nếu bạn nghĩ rằng nó quá mức cần thiết, thì tôi nghĩ bạn không cần N+1 phiên bản đầu tiên của API của bạn.

BTW, đừng nhầm lẫn các API tập trung (như Google Maps) với các API được phân phối (như Android). Android phát hành phiên bản API mới mọi lúc, bởi vì có hàng tỷ máy chủ Android (mỗi thiết bị Android là một) và tất cả chúng không thể đơn giản được nâng cấp từ xa bởi Google. Phiên bản tiếp theo của Android vẫn tương thích ngược với phiên bản trước, số này chỉ tăng lên để cho biết các tính năng mới. Ví dụ: Bạn vẫn có thể chạy các ứng dụng được tạo cho Android 3.0 trên Android 7.0 (người dùng có thể nhận thêm một số cảnh báo, nhưng ứng dụng sẽ chạy). Các nhà phát triển ứng dụng Android sử dụng những con số này để mô tả "yêu cầu tối thiểu" cho ứng dụng của họ. Trong khi đó, các API tập trung thường tăng số phiên bản của chúng để biểu thị sự thay đổi không tương thích ngược lớn.

+0

Cảm ơn. Tôi đã đi với gợi ý điểm đầu tiên. Những thay đổi này khá nhỏ nên tôi đã thực hiện kiểm tra tình trạng phiên bản API và mở rộng các phương thức với các tham số tùy chọn khác nhau hoặc tạo các phương thức mới cho mỗi phiên bản API trong một số trường hợp. Bản phát hành API nằm ngoài tầm kiểm soát của tôi vì đó là API ứng dụng khách. – Mark

+0

Đây là một câu trả lời rất hay, tôi đã hy vọng tôi nhận được một số liên kết và con trỏ là tốt mặc dù. – Alex

2

Tôi đoán bạn đã có một tách mối quan tâm. Ý tôi là, việc lấy dữ liệu cho ứng dụng của bạn chỉ được thực hiện thông qua Mô hình (ví dụ).

Vì vậy, bạn chỉ phải thay đổi mô hình.

Điều tôi đề xuất là chỉ có một điểm vào: tệp "bộ định tuyến". Tệp này kiểm tra phiên bản API cần thiết và tải tệp chính xác. Bằng cách này, bạn sẽ nhận được các tệp khác nhau cho mỗi API. Tệp "bộ định tuyến" sẽ không quá lớn và mỗi phiên bản API mới sẽ có tệp riêng của nó, vì vậy bạn không trộn lẫn mọi thứ.

Ví dụ, trong file "router":

function dispatch() { 
    switch (APIVersion) { 
    case 1: 
     use('file.1.ext'); 
     break; 
    case 2: 
     use('file.2.ext'); 
     break; 
    case 3: 
     use('file.3.ext'); 
     break; 
    } 
} 
Các vấn đề liên quan