Bad problema de projeto OO - Eu preciso de alguma funcionalidade geral em Java, mas não sei como implementá-lo

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

  •  02-07-2019
  •  | 
  •  

Pergunta

Estou desenvolvendo um pequeno editor UML Classe em Java, principalmente um projeto pessoal, ele pode acabar no SourceForge se eu encontrar o tempo para criar um projeto nele.

O projeto é bastante avançado:. Eu posso criar classes, movê-los, criar interfaces de, criar links, etc

O que eu estou trabalhando é a caixa de diálogo para definir as propriedades de classe / interface e criando novas classes / interfaces.

Por exemplo, eu tenho uma classe que estende JDialog. Esta é a principal "janela" para a edição de classes e interfaces (bem, há uma classe para cada). Ele contém uma JTabbedPane que por sua vez contêm JPanels.

Este JPanel são realmente os personalizados. Eu criei uma classe abstrata que estende JPanel. Isto usa classe componentes (definidos por suas subclasses) e adicionar os seus valores a uma JTable (também contida no JPanel).

Por exemplo, se eu quiser editar uma classe de atributos, o JPanel conterá um JTextField para inserir o nome do atributo, bem como um outro para entrar em seu tipo. Há também um conjunto de botão para o processamento dos dados inseridos nestes campos. Quando eu clique em "Salvar", os dados I inseridos nos JTextFields são adicionados para o JTable (à la Enterprise Architect). A classe concretada que estende a um resumo são responsáveis ??por definir o controle e decidir o que fazer para com os dados quando uma linha é adicionada ou excluída da JTable. A gestão JTable é, no entanto, a responsabilidade da classe abstrata.

Aqui está o meu problema: em OO, a classe tem métodos, e uma interface possui métodos também. Disse a mim mesmo: eu poderia usar o mesmo costume concreto JPanel (AttributesPanel (que estende a classe JPanel abstrata eu criei)) para armazenar os métodos para uma classe ou de interface e

.

No entanto, a classe precisa manter uma cópia (como um atributo) da classe ou interface que estou trabalhando. Dessa forma, quando um método é adicionado a ele, eu posso chamar editedClass.addMethod () (ou editedInterface.addMethod ()). O problema é que eu não tenho nenhuma maneira de dizer se eu trabalho em uma classe ou e Interface.

A solução que encontrei é feio: manter um atributo editedClass e um editedInterface atributo na classe AttributesPanel. Segundo a saber se eu estou editando uma classe ou interface, um desses atributos será nula, enquanto a outra vontade não.

É muito feio se você me perguntar. Na verdade, eu posso ouvir meus professores de engenharia de software na minha cabeça gritando em agonia enquanto a queima (bem, na verdade, congelamento) no nono círculo do Inferno.

A forma mais rápida de corrigir este problema de projeto seria criar uma interface chamada "ObjectWithMethods", que minhas aulas de classe e interface irá implementar. Dessa forma, eu só tenho que colocar um ObjectWithMethods parâmetro na minha classe AttributesPanel.

Mas isso significa que eu deveria criar uma classe chamada "ObjectWithAttributes", ou "ObjectWithBlahBlah"? Eu vejo um bom potencial "TheDailyWTF" aqui ... Além disso, eu não acho que eu deveria modificar meus objetos de domínio (Classe, Interface, uma nota, relacionamento (para o meu editor UML)) ou criar uma nova interface apenas por uma questão de alguma consideração UI ....

O que você acha?

Eu você precisar de mais esclarecimentos (porque eu estou certo muito cansado agora e eu tendem a direita muito mal (especialmente em Inglês - minha língua materna é o francês), enquanto neste estado de espírito ...), basta perguntar e eu' editar ll esta questão.

Cheers,

Guillaume.

Outras dicas

Normalmente, eu apenas fazer a coisa mais simples, e começar a pensar em factoring fora de interfaces, quando eu começar a ver muitos if( .. instanceof ..)-like construções no meu código. Não me custa muito com capacidades de refatoração de código moderno IDE.

No seu caso específico, eu consideraria diagramas fornecidos na UML especificação implementar, porque eles foram tão amável para especificar UML usando UML-notação!

Você tem um aplicativo. Nesse aplicativo. o representar e editar alguns dados.

Esses dados representa uma classe linguagem de programação ou de uma interface de linguagem de programação.

Quando você faz um editor para alguns dados, às vezes você tem que adicionar informações adicionais / complementares, por exemplo, cada gráfico classe pode ter uma cor de linha diferente, e não tem a ver com os atributos ou os métodos de seu classe.

O mesmo vale para o campo ou propriedade que indica wheter que você está editando uma classe ou uma interface.

Eu sugestão fazer algumas coisas.

Separar os dados representados a partir do código ou a lógica do seu programa:

Se você tem algo como:

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

Alterar a esta:

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

Felicidades.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top