Bad OO Design-Problem - ich brauche einige allgemeine Funktionalität in Java aber nicht wissen, wie es zu implementieren

StackOverflow https://stackoverflow.com/questions/125463

  •  02-07-2019
  •  | 
  •  

Frage

Ich bin einen kleinen UML-Klasseneditor in Java developping, in erster Linie ein persönliches Projekt, es könnte bis auf Source beenden, wenn ich die Zeit finden, ein Projekt auf, es zu schaffen.

Das Projekt ist relativ weit fortgeschritten. Ich Klassen erstellen können, bewegen sie sich um, Schnittstellen erstellen, erstellen Links, etc.

Was ich arbeite ist das Dialogfeld Klasse / Interface-Eigenschaften für die Einstellung und die Schaffung neuer Klassen / Interfaces.

Zum Beispiel habe ich eine Klasse, die JDialog erstreckt. Dies ist das wichtigste „Fenster“ für die Bearbeitung von Klassen und Schnittstellen (na ja, es gibt eine Klasse für jeden). Es enthält eine JTabbedPane wiederum die JPanels enthalten.

Diese JPanel sind eigentlich benutzerdefiniert diejenigen. Ich habe eine abstrakte Klasse, die JPanel erweitert. Diese Klasse verwendet Komponenten (definiert durch ihre Unterklassen) und deren Werte summieren sich zu einem JTable (auch im JPanel enthalten ist).

Zum Beispiel, wenn ich eine Klasse bearbeiten möchten Attribute, wird die JPanel ein JTextField enthalten zur Eingabe des Namens des Attributs sowie eine weitere für ihren Typ eingeben. Es gibt auch eine Reihe von Schaltfläche für die in diesen Feldern eingegebenen Daten verarbeitet werden. Wenn ich auf „Speichern“ werden die Daten, die ich in den JTextFields trat in die JTable hinzugefügt (à la Enterprise Architect). Die betonierte Klasse, die die abstrakten eines erstreckt ist verantwortlich für die Steuerung definieren und entscheiden, was zu tun mit den Daten, wenn eine Zeile hinzugefügt oder aus der JTable gelöscht. Das JTable Management ist jedoch die Verantwortung der abstrakten Klasse.

Hier ist mein Problem: in OO, eine Klasse Methoden hat, und eine Schnittstelle hat auch Methoden. Ich sagte mir: Ich könnte die gleiche konkrete individuelle verwenden JPanel (AttributesPanel (die die abstrakte JPanel-Klasse erweitert ich erstellt)), die Methoden für eine Klasse zu speichern oder und Schnittstelle

.

Allerdings muss die Klasse eine Kopie (als Attribut) halten der Klasse oder Schnittstelle arbeite ich an. Auf diese Weise, wenn ein Verfahren, um es hinzugefügt wird, kann ich editedClass.addMethod () aufrufen (oder editedInterface.addMethod ()). Das Problem ist, dass ich keine Möglichkeit zu sagen, ob ich auf eine Klasse oder Schnittstelle und arbeiten.

Die Lösung fand ich hässlich: hält ein Attribut editedClass und ein Attribut editedInterface in der AttributesPanel Klasse. Je nachdem, ob ich eine Klasse oder Schnittstelle bin der Bearbeitung eines dieser Attribute wird, während auf andere null sein wird nicht.

Es ist ziemlich hässlich, wenn Sie mich fragen. In der Tat kann ich meine Software-Engineering-Lehrer in meinem Kopf schrie in Agonie höre beim Brennen (na ja, eigentlich, Einfrieren) in dem neunten Kreis der Hölle.

Der schnelle Weg, um dieses Design-Problem zu beheben wäre eine Schnittstelle zu schaffen „ObjectWithMethods“ genannt, was meine Klasse und Interface-Klassen implementieren. Auf diese Weise werde ich nur einen ObjectWithMethods Parameter in meiner AttributesPanel Klasse setzen muß.

Aber bedeutet das, dass ich eine Klasse erstellen, sollte den Namen „ObjectWithAttributes“ oder „ObjectWithBlahBlah“? Ich sehe einige gute „TheDailyWTF“ Potenzial hier ... Außerdem, ich glaube, ich sollte meine Domain-Objekte ändern (eine Klasse, Schnittstelle, Hinweis, Beziehung (für meine UML-Editor)) oder erstellen Sie eine neue Schnittstelle, nur um einiger UI Überlegung ....

Was denken Sie?

Ich brauche dich mehr Klärungen (weil ich jetzt sehr müde bin und ich neige dazu, ziemlich schlecht (vor allem in Englisch nach rechts - meine Muttersprache ist Französisch), während in diesem Zustand des Geistes ...), fragen Sie einfach und ich ll diese Frage bearbeiten.

Cheers,

Guillaume.

War es hilfreich?

Lösung

Wenn ich Ihre Frage gelesen scheint es wirklich, wie Sie einen Ort beschreiben die Besucher verwenden .

Der Grund für die Besuchermuster hier arbeiten sollen, ist eine Idee, als Doppel-Ausgabe bekannt. UI-Code wird einen Anruf tätigen und einen Verweis auf mich selbst passiert, dann ist die Klasse oder Schnittstelle endet die ursprünglichen Anrufer anruft. Da die Klasse oder Schnittstelle derjenige ist, wodurch das Verfahren nennt es seine eigene Art kennt und wie die Arbeit spezifisch für seine Art zu tun.

Natürlich ist meine Beschreibung nicht ausreicht, diese Technik zu implementieren, so dass Sie auf, es lesen wollen werden. Ich denke, es ist gut dokumentiert. Zum Beispiel fand ich dies in ca. 2 Sekunden in Java, die sollten Sie beginnen: http://www.javaworld.com/javaworld/javatips/jw-javatip98.html

Andere Tipps

Normalerweise tue ich nur die einfachste Sache, und starten Sie denken an Schnittstellen Ausklammern, wenn ich zu viele if( .. instanceof ..)-ähnliche Konstrukte in meinem Code zu sehen beginnen. Es kostet mich nicht viel mit modernem IDE-Code-Refactoring-Funktionen.

In Ihrem speziellen Fall würde ich prüfen, selbst erstellte Grafiken bei der Umsetzung UML-Spezifikation , weil sie UML UML-Notation waren so nett geben!

Sie haben eine Anwendung. In dieser App. vertreten Ihre und bearbeiten einige Daten.

Diese Daten stellen eine Programmiersprache Klasse oder eine Programmiersprache Schnittstelle.

Wenn Sie einen Editor für einige Daten, manchmal haben Sie zusätzliche / ergänzende Informationen hinzufügen, beispielsweise jede Klasse Diagramm eine andere Linienfarbe haben kann, und muss nicht mit den Attributen oder die Methoden tun Ihrer Klasse.

Das gleiche gilt für das Feld oder eine Eigenschaft, die angibt, ob Sie ein, eine Klasse oder eine Schnittstelle bearbeiten.

Ich Vorschlag einige Dinge tun.

Trennen Sie die dargestellten Daten aus dem Code oder Logik Ihres Programms:

, wenn Sie so etwas wie:

// all code, classes, mixed up
public class JCustomPanel:  {

    protected ChartClass Charts;
    protected ArrayList<String> MyClassAttributes;
    protected ArrayList<String> MyClassMethods;

    void PanelDoSomeThing();
    void ClassDoSomeThing();
    void InterfaceDoSomeThing();

    // ...
} // class JCustomPanel

Ändern folgt aus:

// things related to a single class or interface,
// nothing to do with the chart

public class JClassRepresentation:  {

    ArrayList<String> Attributes;
    ArrayList<String> Methods;

    bool IsInterface;

    void ClassDoSomeThing();
    void InterfaceDoSomeThing();

    // ...
} // class JCustomPanel

// things related to the editor,
// contains the classes and interfaces,
// but, as separate stuff
public class JCustomPanel:  {

    ArrayList<JClassRepresentation> Classes;

    int PagesCount;

    void InterfaceDoSomeThing();

    // ...
} // class JCustomPanel

Prost.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top