2016-11-22 62 views
5

Po przeczytaniu artykułu Programmers Are People Too przez Kena Arnolda, próbowałem wdrożyć ideę progresywnego ujawniania w minimalnym API C++, aby zrozumieć, jak można to zrobić na większą skalę.Progresywne ujawnianie w C++ API

Ujawnianie progresywne odnosi się do idei "dzielenia" API na kategorie, które zostaną ujawnione użytkownikowi interfejsu API tylko na żądanie. Na przykład API można podzielić na dwie kategorie: kategorię podstawową, która jest (domyślnie dostępna dla użytkownika) dla metod, które są często potrzebne i łatwe w użyciu oraz rozszerzonej kategorii dla usług na poziomie eksperckim.

Znalazłem tylko jeden przykład w sieci takiej implementacji: biblioteka db4o (w Javie), ale tak naprawdę nie rozumiem ich strategii. Na przykład, jeśli przyjrzymy się ObjectServer, zostanie on zadeklarowany jako interfejs, podobnie jak jego rozszerzona klasa ExtObjectServer. Następnie implementowana jest implementująca klasa ObjectServerImpl dziedzicząca z obu tych interfejsów i zaimplementowane tam są wszystkie metody z obu interfejsów.

To podobno pozwala kodu, takich jak:

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? 

    // ... 
}); 

Moja znajomość Java nie jest dobre, ale wydaje się, moje niezrozumienie, jak ta praca jest na wyższym poziomie.

Dzięki za pomoc!

+0

Jeśli dobrze rozumiem artykuł, Progressive Disclosure jest techniką dokumentacji, a nie metodologią programowania. Możesz uporządkować dokumentację w oddzielne sekcje dla zwykłych rzeczy i zaawansowanych rzeczy. – Barmar

+1

To prawdopodobnie sprawia, że ​​pytanie jest bardziej odpowiednie dla programistów.SE lub softwareengineering.SE. – Barmar

+0

@Barmar Sposób, w jaki to czytam, to coś więcej niż tylko dokumentacja: delegujesz funkcje "zaawansowane" do osobnego interfejsu. – Angew

Odpowiedz

2

Java i C++ są statycznie pisane na klawiaturze, więc to, co można zrobić z obiektem, zależy nie tyle od faktycznego typu dynamicznego, ale od typu, z którego uzyskujesz dostęp.

W pokazanym przykładzie zauważysz, że zmienna server ma typ ObjectServer. Oznacza to, że przechodząc przez server, można uzyskać dostęp tylko do metod ObjectServer. Nawet jeśli obiekt jest typu, który ma inne metody (co ma miejsce w twoim przypadku i jego typ ObjectServerImpl), nie masz możliwości bezpośredniego dostępu do metod innych niż te, które są inne niż .

Aby uzyskać dostęp do innych metod, musisz zdobyć obiekt poprzez inny typ. Można to zrobić za pomocą odlewu lub z wyraźnym akcesoriem, takim jak Twój ext(). a.ext() zwraca a, ale jako inny typ (ExtObjectServer), umożliwiając dostęp do różnych metod a.

Na pytanie zadajesz też sobie pytanie, w jaki sposób server.ext() jest ograniczone do metod eksperckich, gdy ExtObjectServer rozszerza się o . Odpowiedź brzmi: nie jest, ale to prawda. To nie powinno być tak ograniczone. Celem nie jest zapewnienie funkcji eksperckich. Jeśli tak było, to kod klienta, który musi używać zarówno funkcji normalnej, jak i eksperckiej, musiałby wziąć dwa odniesienia do obiektu, po prostu inaczej wpisane. Nie można na tym zyskać żadnej korzyści.

Celem progresywnego ujawniania informacji jest ukrywanie specjalistycznych materiałów do momentu wyraźnego zażądania. Gdy poprosisz o to, już widziałeś podstawowe rzeczy, więc po co to ukrywać?