Плохая проблема проектирования ОУ - мне нужны некоторые общие функции в Java, но я не знаю, как их реализовать - PullRequest
2 голосов
/ 24 сентября 2008

Я занимаюсь разработкой небольшого редактора классов UML на Java, главным образом личного проекта, он может оказаться в SourceForge, если я найду время для создания проекта на нем.

Проект довольно продвинутый: я могу создавать классы, перемещать их, создавать интерфейсы, создавать ссылки и т. Д.

Я работаю над диалоговым окном для настройки свойств класса / интерфейса и создания новых классов / интерфейсов.

Например, у меня есть класс, который расширяет JDialog. Это главное «окно» для редактирования классов и интерфейсов (ну, есть класс для каждого). Он содержит JTabbedPane, который, в свою очередь, содержит JPanels.

Это JPanel на самом деле пользовательские. Я создал абстрактный класс, который расширяет JPanel. Этот класс использует компоненты (определенные его подклассами) и добавляет их значения в JTable (также содержится в JPanel).

Например, если я хочу отредактировать атрибуты класса, JPanel будет содержать JTextField для ввода имени атрибута, а также другой для ввода его типа. Также имеется набор кнопок для обработки данных, введенных в эти поля. Когда я нажимаю «Сохранить», данные, которые я ввел в JTextFields, добавляются в JTable (как Enterprise Architect). Конкретный класс, который расширяет абстрактный класс, отвечает за определение управления и решение, что делать с данными, когда строка добавляется или удаляется из JTable. Однако управление JTable - это ответственность абстрактного класса.

Вот моя проблема: в ОО у класса есть методы, а у интерфейса тоже есть методы. Я сказал себе: я мог бы использовать тот же конкретный пользовательский JPanel (AttributesPanel (который расширяет абстрактный класс JPanel, который я создал)) для хранения методов для класса или интерфейса.

Однако класс должен хранить копию (в качестве атрибута) класса или интерфейса, над которым я работаю. Таким образом, когда метод добавлен в него, я могу вызвать editedClass.addMethod () (или editedInterface.addMethod ()). Проблема в том, что я не могу сказать, работаю ли я над Классом или Интерфейсом.

Решение, которое я нашел, ужасно: сохранить атрибут editedClass и атрибут editedInterface в классе AttributesPanel. В зависимости от того, редактирую ли я класс или интерфейс, один из этих атрибутов будет нулевым, а для других - нет.

Это ужасно, если вы спросите меня. Фактически, я слышу, как мои учителя по разработке программного обеспечения в моей голове кричат ​​в агонии, когда они горят (ну, собственно, замирают) в девятом круге Ада.

Быстрый способ решить эту проблему - создать интерфейс с именем «ObjectWithMethods», который будут реализованы в моих классах Class и Interface. Таким образом, мне нужно будет только поместить параметр ObjectWithMethods в мой класс AttributesPanel.

Но значит ли это, что я должен создать класс с именем "ObjectWithAttributes" или "ObjectWithBlahBlah"? Я вижу хороший потенциал "TheDailyWTF" здесь ... Кроме того, я не думаю, что я должен изменить свои доменные объекты (класс, интерфейс, примечание, отношения (для моего редактора UML)) или создать новый интерфейс только ради некоторого рассмотрения пользовательского интерфейса ....

Что вы думаете?

Мне нужно больше разъяснений (потому что я сейчас очень устала и очень плохо поправляюсь (особенно в английском - мой родной язык французский), находясь в таком состоянии ...), просто спросите, и я ' Отредактирую этот вопрос.

Приветствия

Гийом.

Ответы [ 3 ]

3 голосов
/ 24 сентября 2008

Когда я читаю ваш вопрос, мне действительно кажется, что вы описываете место для использования шаблона посетителя .

Причиной, по которой шаблон посетителя должен работать здесь, является идея, известная как двойная отправка. Ваш код пользовательского интерфейса сделает вызов и передаст ссылку на себя, затем класс или интерфейс вызовут исходный вызывающий объект. Так как класс или интерфейс - это тот, кто выполняет вызов метода, он знает свой собственный тип и как выполнять работу, специфичную для его типа.

Конечно, моего описания недостаточно, чтобы реализовать эту технику, поэтому вы захотите ознакомиться с ней. Я думаю, что это хорошо задокументировано. Например, я нашел это примерно через 2 секунды в Java, которая должна помочь вам начать: http://www.javaworld.com/javaworld/javatips/jw-javatip98.html

0 голосов
/ 01 июля 2011

У вас есть приложение. В этом приложении. Вы представляете и редактируете некоторые данные.

Эти данные представляют класс языка программирования или интерфейс языка программирования.

Когда вы создаете редактор для некоторых данных, иногда вам нужно добавить дополнительную / дополнительную информацию, например, у каждой диаграммы классов может быть свой цвет линии, и он не имеет отношения к атрибутам или методам класс.

То же самое относится к полю или свойству, которое указывает, редактируете ли вы класс или интерфейс.

Предлагаю кое-что сделать.

Отделите представленные данные от кода или логики вашей программы:

если у вас есть что-то вроде:

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

Приветствие.

0 голосов
/ 01 июля 2011

Обычно, я просто делаю самое простое и начинаю думать о выделении интерфейсов, когда начинаю видеть слишком много if( .. instanceof ..) -подобных конструкций в моем коде. С современными возможностями IDE-рефакторинга код стоит недорого.

В вашем конкретном случае я хотел бы рассмотреть возможность реализации диаграмм, представленных в спецификации UML , потому что они так любезно указали UML с использованием UML-нотации!

...