2016-11-22 2 views
5

Nach meiner Lektüre des Artikels Programmers Are People Too von Ken Arnold, habe ich versucht, die Idee der progressiven Offenlegung in einer minimalen C++ API zu implementieren, um zu verstehen, wie es in einem größeren Maßstab durchgeführt werden könnte.Progressive Disclosure in C++ API

Progressive Offenlegung bezieht sich auf die Idee, eine API in Kategorien zu "teilen", die dem Benutzer einer API nur auf Anfrage offengelegt werden. Beispielsweise kann eine API in zwei Kategorien unterteilt werden: eine Basiskategorie, die für häufig benötigte und einfach zu verwendende Methoden verfügbar ist (für den Benutzer standardmäßig zugänglich) und eine erweiterte Kategorie für Dienste auf Expertenebene.

Ich habe nur ein Beispiel im Web einer solchen Implementierung gefunden: die db4o Bibliothek (in Java), aber ich verstehe ihre Strategie nicht wirklich. Wenn wir uns beispielsweise ObjectServer ansehen, wird es wie seine erweiterte Klasse ExtObjectServer als Schnittstelle deklariert. Dann wird eine implementierende ObjectServerImpl Klasse definiert, die von diesen beiden Schnittstellen erbt und alle Methoden von beiden Schnittstellen implementiert sind.

Code Dies ermöglicht es angeblich, wie:

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? 

    // ... 
}); 

Mein Wissen von Java ist nicht so gut, aber es scheint, mein Missverständnis, wie diese Arbeit ist auf einer höheren Ebene.

Danke für Ihre Hilfe!

+0

Wenn ich den Artikel richtig verstehe, ist Progressive Disclosure eine Dokumentationstechnik, keine Programmiermethodik. Sie organisieren die Dokumentation in separaten Abschnitten für die allgemeinen Sachen und die fortgeschrittenen Sachen. – Barmar

+1

Dies macht wahrscheinlich die Frage geeigneter für Programmierer.SE oder Softwareengineering.SE. – Barmar

+0

@Barmar So wie ich es gelesen habe, ist es mehr als nur Dokumentation: Sie delegieren die "fortgeschrittenen" Funktionen in eine separate Schnittstelle. – Angew

Antwort

2

Java und C++ sind beide statisch typisiert. Was Sie also mit einem Objekt tun können, hängt nicht so sehr von seinem eigentlichen dynamischen Typ ab, sondern von dem Typ, über den Sie darauf zugreifen.

In dem Beispiel, das Sie gezeigt haben, werden Sie feststellen, dass die Variable server vom Typ ObjectServer ist. Dies bedeutet, dass Sie beim Durchlaufen von server nur auf ObjectServer Methoden zugreifen können. Selbst wenn das Objekt zufällig einen Typ hat, der andere Methoden hat (was in Ihrem Fall der Fall ist und dessen ObjectServerImpl Typ), haben Sie keine Möglichkeit, direkt auf andere Methoden als ObjectServer zuzugreifen.

Um auf andere Methoden zuzugreifen, müssen Sie das Objekt über einen anderen Typ erreichen. Dies könnte mit einem Cast oder mit einem expliziten Accessor wie dem ext() geschehen. a.ext() gibt a zurück, aber als anderer Typ (ExtObjectServer), der Ihnen Zugriff auf verschiedene Methoden von a gibt.

Ihre Frage fragt auch, wie ist server.ext() auf Expertenmethoden beschränkt, wenn ExtObjectServer erweitert ObjectServer. Die Antwort ist: es ist nicht, aber das ist richtig. Es sollte nicht so begrenzt werden. Das Ziel ist nicht, die Expertenfunktionen nur bereitzustellen. Wenn dies der Fall wäre, müsste der Client-Code, der sowohl normale als auch Expertenfunktionen verwenden muss, zwei Referenzen auf das Objekt nehmen, die nur unterschiedlich typisiert sind. Daraus ergibt sich kein Vorteil.

Das Ziel der progressiven Offenlegung ist es, das Expertenwissen zu verbergen, bis es explizit angefordert wird. Wenn Sie danach gefragt haben, haben Sie bereits die grundlegenden Dinge gesehen, warum also verstecken Sie es vor Ihnen?