2

私は Java で小さな UML クラス エディターを開発していますが、主に個人的なプロジェクトです。プロジェクトを作成する時間があれば、SourceForge で終了する可能性があります。

このプロジェクトは非常に高度です。クラスの作成、移動、インターフェイスの作成、リンクの作成などを行うことができます。

私が取り組んでいるのは、クラス/インターフェースのプロパティを設定し、新しいクラス/インターフェースを作成するためのダイアログ ボックスです。

たとえば、JDialog を拡張するクラスがあります。これは、クラスとインターフェイスを編集するためのメインの「ウィンドウ」です (まあ、それぞれにクラスがあります)。これには、JPanels を含む JTabbedPane が含まれます。

この JPanel は実際にはカスタムのものです。JPanel を拡張する抽象クラスを作成しました。このクラスはコンポーネント (そのサブクラスによって定義される) を使用し、それらの値を JTable (JPanel にも含まれる) に追加します。

たとえば、クラスの属性を編集する場合、JPanel には、属性の名前を入力するための JTextField と、そのタイプを入力するための別の JTextField が含まれます。これらのフィールドに入力されたデータを処理するための一連のボタンもあります。「保存」をクリックすると、JTextFields に入力したデータが JTable に追加されます (Enterprise Architect 風)。抽象クラスを拡張する具体化されたクラスは、制御を定義し、行が JTable に追加または削除されたときにデータをどう処理するかを決定します。ただし、JTable の管理は抽象クラスの責任です。

これが私の問題です。オブジェクト指向では、クラスにはメソッドがあり、インターフェースにもメソッドがあります。クラスまたはインターフェイスのメソッドを格納するために、同じ具体的なカスタム JPanel (AttributesPanel (作成した抽象 JPanel クラスを拡張する)) を使用できると自分に言い聞かせました。

ただし、クラスは、作業中のクラスまたはインターフェイスのコピーを (属性として) 保持する必要があります。そうすれば、メソッドが追加されたときに、editedClass.addMethod() (またはeditedInterface.addMethod()) を呼び出すことができます。問題は、クラスまたはインターフェイスのどちらで作業しているかを判断する方法がないことです。

私が見つけた解決策は醜いです.AttributesPanelクラスに属性editClassと属性editInterfaceを保持してください。クラスまたはインターフェイスのどちらを編集しているかに応じて、これらの属性の 1 つが null になり、他の属性は null になりません。

あなたが私に尋ねると、それはかなり醜いです。実際、地獄の第 9 サークルで燃えている (実際には凍っている) 間、私の頭の中でソフトウェア エンジニアリングの教師が苦痛に悲鳴を上げているのが聞こえます。

この設計上の問題を解決する簡単な方法は、"ObjectWithMethods" という名前のインターフェイスを作成することです。このインターフェイスは、Class および Interface クラスで実装されます。そうすれば、AttributesPanel クラスに ObjectWithMethods パラメーターを配置するだけで済みます。

しかし、それは「ObjectWithAttributes」または「ObjectWithBlahBlah」という名前のクラスを作成する必要があるということですか? ここに「TheDailyWTF」の良い可能性があると思います...その上、ドメイン オブジェクト (クラス、インターフェイス、ノート、リレーションシップ (UML エディター用)) を変更したり、新しいインターフェイスを作成したりする必要はないと思います。いくつかのUIの考慮事項....

どう思いますか?

もっと説明が必要です(私は今とても疲れていて、この心の状態では(特に英語で-私の母国語はフランス語です)かなりひどく正しい傾向があるため...)、聞いてください。これを編集します質問。

乾杯、

ギヨーム。

4

3 に答える 3

3

あなたの質問を読んでみると、ビジター パターンを使用する場所を説明しているように思えます。

ここで訪問者パターンが機能する理由は、二重ディスパッチと呼ばれる考え方です。UI コードが呼び出しを行い、それ自体への参照を渡すと、クラスまたはインターフェイスは最終的に元の呼び出し元を呼び出します。クラスまたはインターフェイスはメソッド呼び出しを行うものであるため、独自の型と、その型に固有の作業を行う方法を知っています。

もちろん、私の説明はこの手法を実装するには不十分なので、読みたいと思うでしょう。十分に文書化されていると思います。たとえば、Java で約 2 秒でこれを見つけました

于 2008-09-24T05:01:23.043 に答える
0

通常、私は最も簡単なことを行い、コードに似たような構造が多すぎると、インターフェイスをファクタリングすることを考え始めif( .. instanceof ..)ます。最新のIDEコードリファクタリング機能ではそれほど費用はかかりません。

あなたの特定のケースでは、 UML表記法を使用してUMLを指定するのがとても親切だったので、UML仕様で提供される図を実装することを検討します。

于 2011-07-01T14:07:47.027 に答える
0

アプリケーションがあります。そのアプリで。あなたが代表し、いくつかのデータを編集します。

そのデータは、プログラミング言語クラスまたはプログラミング言語インターフェースを表します。

一部のデータのエディターを作成する場合、追加/補足情報を追加する必要がある場合があります。たとえば、各クラス チャートには異なる線の色があり、クラスの属性やメソッドとは関係ありません。

同じことが、クラスまたはインターフェイスのどちらを編集しているかを示すフィールドまたはプロパティにも当てはまります。

私はいくつかのことを提案します。

表現されたデータをプログラムのコードまたはロジックから分離します。

次のようなものがある場合:

// 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

これに変更します。

// 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

乾杯。

于 2011-07-01T17:03:52.803 に答える