2017-01-04 2 views
0

Ich habe einen Java TCP-Dienst, der Vererbung in der unten beschriebenen Weise verwendet. Der Java-Dienst verwendet Json als Eingabe, verarbeitet sie und gibt dann einen Json zurück. Die Verarbeitung ist auf Klassen wie B und C verteilt. A erstellt ihre Objekte und erledigt ihre Arbeit. Anstatt inputJson an B und C zu übergeben, habe ich die Container-Klasse gespeichert, so dass sie leicht von untergeordneten Klassen von Container verwendet werden kann.
Ich bin sicher, es gibt einen besseren Weg, um es neu zu gestalten. Bitte führen. (Anmerkung: In real, Es gibt mehr Klassen wie B, C und Behälter enthält mehr Eigenschaften, die von DOB1 verwendet werden() und DOC1() usw.)Java: Vererbung und grundlegende Design-Optimierung

//Pseudo 
Class Main(){ 

    public static void main(String[] args) 
    { 
     return new A().a1(inputJson); 
    } 

} 

Class Container{ 
    JsonNode input; 
    JsonNode output; 
} 

Class A extends Container{ 

    private JsonNode a1(inputJson) 
    { 
     input = inputJson; 

     B bObject = new B(); 
     bObject.doB1(); 

     C cObject = new C(); 
     cObject.doC1(); 

     return output; 
    } 

} 

Class B extends Container{ 
    public void doB1() 
    { 
     //prepares and updates part of output using input 
    } 
} 

Class C extends Container{ 
    public void doC1() 
    { 
     //prepares and updates part of output using input 
    } 
} 
+0

haben die Verarbeitungsmethoden in A, B, C usw. den gleichen Namen, Rückkehrtyp und Parameter? –

+0

Verschiedene Namen, verschiedene Rückkehrtypen .. kein Polymorphismus. –

+2

Ihr Code funktioniert nicht so, wie Sie es denken - die Erweiterung wird JSON nicht von A nach B und C kopieren, Sie müssen es trotzdem weitergeben. Ich schlage vor, Sie versuchen, mit grundlegenden Konzepten herumzuspielen und dann an Optimierung zu denken. – fdreger

Antwort

1

Vielleicht ist das, was Sie, es suchen eliminiert die einzelne Container-Superklasse, die Sie benötigen. Verwendung könnte so einfach sein wie C.process(B.Process(A.create()));
Natürlich müssten Sie sicherstellen, dass jede Klasse eine JsonNode zurückgeben, aber diese Funktionalität scheint schon da zu sein, Ihren Container zu sehen.

interface Processor { 
    public JsonNode process(JsonNode input); 
} 

Class A { 
    public JsonNode create() {...} 
} 

Class B implements Processor { 
    public JsonNode process(JsonNode input) { 
     // logics 
     return output; 
    } 
} 

Class C implements Processor { 
    public JsonNode process(JsonNode input) { 
     // logics 
     return output; 
    } 
} 
+0

Danke .. Sieht besser aus, aber ich versuche immer noch die Eingabe an Prozessfunktionen übergeben von B, C, um die Parameterliste zu reduzieren, die ich ihnen übergeben muss. Deshalb habe ich eine Container-Klasse erstellt, um die Eingabe und andere häufig verwendete Objekte zu speichern. Und ich erben B, C Container, so dass sie eine Eingabe sowie diese häufig verwendeten Objekte erhalten können. Noch mehr Vorschläge? Danke –

+0

Passing Argumente ist der Weg zu gehen. Wenn Sie nicht viel mehr als 6 haben, würde ich vorschlagen, eine 'Bearbeitbare' Klasse zu erstellen, die Sie dann als Parameter verwenden können. –

+0

Ja. Aber ich dachte (Übergabe der verarbeitbaren Klasse als Parameter Vs erben verarbeitbare Klasse). Es gibt viele interne Aufrufe in B und C und wenn ich passierendes Objekt auswähle, müsste ich es fast jede Funktion übergeben. Also habe ich die Vererbung gewählt. Die verarbeitbare Klasse Ihres Falles ist wie die Containerklasse meines Falles .. und die Kinder B, C benutzen ihre Eigenschaften sehr bequem über Vererbung. Ich weiß, dass es Nachteile bei diesem Ansatz gibt (wie meine Funktionen sind nicht allgemein) und deshalb suche ich nach einem besseren Design. –