2016-11-22 14 views
5

Sau khi đọc bài viết của tôi, tôi đã cố gắng thực hiện ý tưởng tiết lộ tiến bộ trong một API C++ tối thiểu, để hiểu cách nó có thể được thực hiện ở quy mô lớn hơn.Tiết lộ lũy tiến trong C++ API

Tiết lộ liên tục đề cập đến ý tưởng "tách" một API thành các danh mục sẽ chỉ được tiết lộ cho người dùng API khi có yêu cầu. Ví dụ, một API có thể được chia thành hai loại: một loại cơ sở là gì (người dùng có thể truy cập theo mặc định) cho các phương thức thường cần thiết và dễ sử dụng và danh mục mở rộng cho các dịch vụ cấp chuyên gia.

Tôi đã tìm thấy chỉ một ví dụ trên web của triển khai như vậy: thư viện db4o (bằng Java), nhưng tôi thực sự không hiểu chiến lược của chúng. Ví dụ, nếu chúng ta nhìn vào ObjectServer, nó được khai báo như một giao diện, giống như lớp mở rộng của nó ExtObjectServer. Sau đó, một lớp thực hiện ObjectServerImpl, kế thừa từ cả hai giao diện này được định nghĩa và tất cả các phương thức từ cả hai giao diện đều được thực hiện ở đó.

này được cho là phép mã như:

public void test() throws IOException { 
    final String user = "hohohi"; 
    final String password = "hohoho"; 
    ObjectServer server = clientServerFixture().server(); 
    server.grantAccess(user, password); 

    ObjectContainer con = openClient(user, password); 
    Assert.isNotNull(con); 
    con.close(); 

    server.ext().revokeAccess(user); // How does this limit the scope to 
            // expert level methods only since it 
            // inherits from ObjectServer? 

    // ... 
}); 

kiến ​​thức của tôi về Java mà không phải là tốt, nhưng có vẻ như sự hiểu lầm của tôi về cách làm việc này là ở mức độ cao hơn.

Cảm ơn sự giúp đỡ của bạn!

+0

Nếu tôi hiểu bài viết một cách chính xác, Tiết lộ lũy tiến là một kỹ thuật tài liệu, không phải là phương pháp lập trình. Bạn sắp xếp tài liệu thành các phần riêng biệt cho các nội dung phổ biến và nội dung nâng cao. – Barmar

+1

Điều này có thể làm cho câu hỏi phù hợp hơn cho programmers.SE hoặc softwareengineering.SE. – Barmar

+0

@Barmar Cách tôi đọc nó, nó không chỉ là tài liệu: bạn thực sự ủy quyền các hàm "nâng cao" thành một giao diện riêng biệt. – Angew

Trả lời

2

Java và C++ đều được nhập tĩnh, vì vậy những gì bạn có thể làm với một đối tượng phụ thuộc không nhiều vào loại động thực tế của nó, nhưng trên loại mà bạn đang truy cập vào nó.

Trong ví dụ bạn đã hiển thị, bạn sẽ nhận thấy biến số server thuộc loại ObjectServer. Điều này có nghĩa là khi trải qua server, bạn chỉ có thể truy cập ObjectServer phương pháp. Ngay cả khi đối tượng xảy ra thuộc loại có phương pháp khác (trường hợp trong trường hợp của bạn và loại ObjectServerImpl), bạn không có cách nào để truy cập trực tiếp vào các phương thức khác ngoài các phương thức khác ObjectServer.

Để truy cập các phương pháp khác, bạn cần giữ đối tượng thông qua các loại khác nhau. Điều này có thể được thực hiện với một diễn viên, hoặc với một người truy cập rõ ràng như ext() của bạn. a.ext() trả về a, nhưng là một loại khác (ExtObjectServer), cho phép bạn truy cập vào các phương thức khác nhau của a.

Câu hỏi của bạn cũng hỏi cách server.ext() giới hạn ở các phương pháp chuyên gia khi ExtObjectServer kéo dài ObjectServer. Câu trả lời là: nó không phải, nhưng đó là chính xác. Nó không nên bị giới hạn như thế này. Mục tiêu là không cung cấp chỉ các chức năng của chuyên gia. Nếu đúng như vậy, thì mã máy khách cần sử dụng cả hai chức năng bình thường và chuyên gia sẽ cần có hai tham chiếu đến đối tượng, chỉ cần nhập một cách khác nhau. Không có lợi thế để đạt được từ này.

Mục tiêu của việc tiết lộ tiến bộ là ẩn nội dung chuyên môn cho đến khi được yêu cầu rõ ràng. Một khi bạn yêu cầu nó, bạn đã nhìn thấy những thứ cơ bản, vậy tại sao ẩn nó khỏi bạn?

Các vấn đề liên quan