C #: Como projetar inteligentemente uma GUI para um aplicativo de desktop com encapsulamento em mente

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

Pergunta

Estou desenvolvendo uma aplicação desktop com um MainForm que cresceu bastante grande. Existem muitos controles em vários recipientes em diferentes níveis (SplitContainers, TabPages, painéis).

Agora eu quero refazer esta classe, separando todo o código controlador responsável pela ligação de dados e de compensação dos controles ou realizando interações do usuário em classes controlador separado.

[EDIT]

Objectivo

O objectivo desta aplicação é para rastrear ordens (chamado Job) e as suas posições (chamado Jobitem). Cada trabalho está relacionada a um cliente, cada Jobitem a um artigo (Jobitems conter informações que é específico para o processo de seu artigo de fabricação, portanto, é envolver o artigo). Job, Jobitem, o Cliente eo artigo têm propriedades dinâmicas (chave basicalyl / emparelhamentos valor) que são geridos por uma classe PropertyManager.

Arquitetura

A minha aplicação é dividida em 2 projectos principais: O núcleo contém o modelo de dados em 3 classes LinqToSQL DataContext:

  • ArticleManagement
  • JobManagement
  • PropertyManagement

Para cada classe DataContext há uma classe XyzManager que fornece o objeto LinqToSQL em uma coleção para a GUI, encapsulando a fonte de dados LinqToSQL. Ele também lida com criação, exclusão e modificação de seus tipos DataContext correspondentes.

Então, eu tenho um projeto GUI, naturalmente contendo um formulário principal e algumas formas adicionais para coisas como opções etc. A partir de agora, o meu projeto GUI contém uma referência para cada classe XyzManager e recebe e define os dados por meio do Gerenciador aulas de como as interações do usuário ditar, que contém toda a lógica de controle.

Eu coloquei a maior parte da lógica independente para isso em um fora de classe Utility estática da classe principal forma, mas isso é um a menos do que a abordagem ideal, eu acho.

[/ EDIT]

Esta é minha primeira maior Aplicação Desktop e eu estou tendo um momento difícil encapsular o GUI. A partir de agora, todo o código do controlador responsável pelo tratamento de interações do usuário reside dentro da classe MainForm.

Eu sei sobre o padrão MVC, mas eu não tenho certeza de como aplicá-la em um C # WinForm com meu projeto atual.

Meu código personalizado sozinho é mais de 2400 linhas de código de comprimento, sem contar no código gerado automática do formulário, com uma tendência crescente. Quero refazer isso, mas estou perdido a respeito de como eu poderia resolver isso de uma forma mais elegante.

Foi útil?

Solução

Para aplicações de pequena escala você deve dar uma olhada Model-View-Presenter (MVP), há uma boa apresentação da (na minha opinião) melhor maneira de fazer MVP: http://martinfowler.com/eaaDev/SupervisingPresenter.html

Outras dicas

Normalmente tento compor uma GUI complexo usando UserControls menores. Mas alguns pontos são muito importantes:

  • Cada um destes UserControls deve ser independente (especialmente a partir do Formulário)
  • UserControls que têm o purpuse para mostrar ou alterar certos dados devem depender somente de dados. Você deve tentar implementar os controles de uma maneira que eles podem ser ligado a uma fonte de dados que serve todos os dados das necessidades de controle.
  • Quando você precisa mão sobre informações para o contêiner pai (outra UserControl ou o formulário) eventos de uso para que o recipiente pode se inscrever.
  • Quando você usa (ao contexto) menus, verifique se eles são obrigados a certos itens. Você deve criar os menus próximo aos itens e não dentro dos UserControls. Então, quando você mostrar o mesmo item na GUI em diferentes pontos de vista (controles) mais de uma vez, cada item deve ter o mesmo contextmenu.
  • Tente aplicar um padrão de comando para ações de botões / menus.

As suas soluções Parece que você não podia separar os diferentes responsiblities até agora. Apenas dividir o código em diferentes controles, sem fronteiras e responsabilidades claras, não é suficiente.

Você usa JobController apenas para uma forma? Se sim, então talvez tudo que você precisa, é dividir por trás de código em vários arquivos usando palavra-chave parcial?

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