私は 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の考慮事項....
どう思いますか?
もっと説明が必要です(私は今とても疲れていて、この心の状態では(特に英語で-私の母国語はフランス語です)かなりひどく正しい傾向があるため...)、聞いてください。これを編集します質問。
乾杯、
ギヨーム。