O que deve ser lembrado sobre o código da GUI é que ele é orientado a eventos, e o código orientado a eventos sempre terá a aparência de uma massa de manipuladores de eventos organizados aleatoriamente. O que fica realmente confuso é quando você tenta inserir código não orientado a eventos na classe. Claro, ele tem a aparência de fornecer suporte para os manipuladores de eventos e você pode manter seus manipuladores de eventos agradáveis e pequenos, mas todo esse código de suporte extra flutuando faz com que a fonte da GUI pareça inchada e confusa.
Então, o que você pode fazer sobre isso e como facilitar a refatoração das coisas? Bem, eu mudaria primeiro minha definição de refatoração de algo que faço ocasionalmente para algo que faço continuamente enquanto codifico. Por quê? Porque você deseja que a refatoração permita modificar mais facilmente seu código, e não o contrário. Não estou simplesmente pedindo para você alterar a semântica aqui, mas pedindo para fazer um pouco de ginástica mental para ver seu código de maneira diferente.
As três técnicas de refatoração que considero mais comuns são Renomear , Extrair Método e Extrair Classe . Se eu nunca aprendi uma única refatoração, essas três ainda me permitiriam manter meu código limpo e bem estruturado, e pelo conteúdo de sua pergunta, parece-me que você provavelmente se encontrará usando as mesmas três refatorações quase constantemente para manter seu código GUI fino e limpo.
Você pode ter a melhor separação possível da GUI e da lógica de negócios do mundo, e ainda assim o código da GUI pode parecer um código que a minha foi detonada no meio dela. Meu conselho é que não custa ter uma classe extra ou duas para ajudá-lo a gerenciar sua GUI corretamente, e isso não necessariamente precisa ser a sua classe View se você estiver aplicando o padrão MVC - embora frequentemente você encontre as classes intermediárias são tão parecidas com a sua visão que você geralmente sente vontade de mesclá-las por conveniência. Minha opinião é que não é realmente necessário adicionar uma camada específica específica da GUI para gerenciar toda a lógica visual; no entanto, você provavelmente deseja avaliar os benefícios e custos de fazê-lo.
Portanto, meu conselho é:
- Não faça nada diretamente atrás da sua GUI, exceto para chamar e definir como a GUI será conectada à Visualização (ou a uma camada intermediária).
- Não tente usar todas as coisas relacionadas à exibição em uma única classe - ou mesmo uma única classe por janela da GUI - a menos que faça sentido fazer isso. Sua alternativa é criar muitas classes pequenas e fáceis de gerenciar para gerenciar sua lógica da GUI.
- Quando seus métodos começarem a parecer um pouco maiores que 4-5 linhas de código, examine se isso é necessário e se é possível extrair um ou dois métodos para que você possa manter seus métodos enxutos, mesmo que isso signifique uma classe com muito mais métodos.
- Se suas classes estão começando a parecer realmente grandes, comece removendo TODAS as funcionalidades duplicadas e verifique se você pode agrupar logicamente seus métodos para extrair outra ou duas classes.
- Pense em refatorar toda vez que escrever uma linha de código. Se você conseguir que uma linha de código funcione, verifique se é possível refatorá-la para evitar duplicar a funcionalidade ou torná-la um pouco mais enxuta sem alterar o comportamento.
- Aceite o inevitável: você sempre sentirá que uma parte ou outra do seu sistema começará a ficar um pouco inchada, especialmente se você negligenciar a refatoração à medida que avança. Mesmo com uma base de código bem fatorada, você ainda pode sentir que há mais que poderia fazer. Essa é a realidade do software de escrita, que você sempre sentirá que algo mais poderia ter sido feito "melhor"; portanto, é necessário encontrar um equilíbrio entre realizar um trabalho profissional e investir em ouro.
- Aceite que, quanto mais limpo você tentar manter seu código, menos inchado ele parecerá.