Pergunta

Em uma ferramenta como o Photoshop, há uma seleção de ferramentas em que você pode clicar (por exemplo, caneta, pincel etc.). Depois de clicar em uma ferramenta, você pode usar essa ferramenta para pintar, apagar etc, dependendo de qual ferramenta é selecionada.

Estou me perguntando como isso seria melhor implementado em um design OO. Eu só conseguia pensar em ter um Guimanager que sempre sabe qual ferramenta é selecionada, então quando a tela (área de desenho) detecta um clique do mouse ou arrasto do mouse, pergunta a Guimanager qual ferramenta é selecionada e aplica o comportamento dessa ferramenta.

Alguém descreve uma possível solução nos detalhes do nível da classe (ou em qualquer detalhe, se você não tiver tempo).

Foi útil?

Solução

Dê uma olhada no Padrão de estado que tem exatamente o seu exemplo.

No entanto, na verdade não é uma pergunta da GUI, mas mais para uma abordagem orientada a objetos para como modelar esse problema. A GUI realmente não joga nisso.

Outras dicas

Não tenho certeza se os princípios do OO realmente jogam nisso, exceto no sentido de que todos os elementos gráficos provavelmente são derivados de classes base comuns em sua GUI de escolha.

A quantidade de complexidade em um aplicativo que precisa de uma hierarquia de menus de tela à la Photoshop presumivelmente diminuiria a diferença entre a composição versus herança vs estilo funcional e o que quer que você tenha.

Embora você esteja motivado a escrever o programa duas vezes usando estilos diferentes, pode ser interessante ver os resultados. A classificação de vários estilos de programação é uma pergunta em aberto sem respostas reais neste momento, embora pensemos que os estilos de OO são importantes de uma maneira que ainda não quantificamos completamente.

Uma ideia para isso seria ter uma classe de ferramentas. Apenas esboçando isso em C ++-como pseudocode:

class Tool
{
public:
    // Keep a pointer to the "document", i.e. some representation of the
    // image you are editing
    Tool(Document *pDoc);

    // Process mouse events -- this need to be overridden to execute
    // the appropriate behaviour depending on the concrete type of tool
    virtual void OnMouseEvent(const MouseEvent &e) = 0;

    // and so on
};

Em seguida, você herda desta classe de ferramentas abstrata para fornecer as ferramentas de concreto que seu aplicativo precisa. Quando uma determinada ferramenta é selecionada, você instancia um objeto de ferramenta correspondente e lembre -se de algum lugar. A janela encaminha os eventos do mouse para o objeto de ferramenta ativo atualmente, que faz a coisa apropriada para a ferramenta que foi selecionada.

Esta é uma implementação do padrão de estado que Johannes se refere.

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