A coisa a ser lembrada 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. Onde fica realmente confuso é quando você tenta encaixar o código não orientado a eventos na classe. Claro, 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 sua fonte da GUI pareça inchada e confusa.
Então, o que você pode fazer sobre isso e como você pode tornar as coisas mais fáceis de refatorar? Bem, primeiro eu mudaria minha definição de refatoração de algo que faço ocasionalmente para algo que faço continuamente enquanto codifico. Por quê? Porque você quer que a refatoração permita que você modifique mais facilmente seu código, e não o contrário. Eu não estou simplesmente pedindo para você mudar a semântica aqui, mas pedindo que você faça um pouco de calistenia mental para ver seu código de maneira diferente.
As três técnicas de refatoração que eu uso mais comumente são Renomear , Extrair Método , e Extrair Classe . Se eu nunca aprendi uma única refatoração, esses três ainda me permitiriam manter meu código limpo e bem estruturado, e pelo conteúdo da sua pergunta, parece-me que você provavelmente se verá usando as mesmas três refatorações quase que constantemente. para manter seu código GUI fino e limpo.
Você pode ter a melhor separação possível entre a GUI e a lógica de negócios no mundo, e ainda assim o código da GUI pode parecer um código que a mina foi detonada no meio dela. Meu conselho é que não atrapalhe ter uma classe extra ou duas para ajudá-lo a gerenciar sua GUI adequadamente, e isso não precisa necessariamente ser suas classes Visualizar se você estiver aplicando o padrão MVC - embora freqüentemente você descubra que as turmas intermediárias são tão parecidas com a sua opinião, que muitas vezes você sente vontade de mesclá-las por conveniência. Minha opinião sobre isso é que não custa nada adicionar uma camada específica de GUI adicional para gerenciar toda a lógica visual, no entanto, você provavelmente quer avaliar os benefícios e os custos de fazer isso.
Meu conselho, portanto, é:
- Não faça nada diretamente atrás de sua GUI, exceto para invocar e definir como a GUI será conectada à Visualização (ou a uma camada intermediária).
- Não tente aplicar cada coisa relacionada à visualização em uma única classe - ou mesmo em uma única classe por janela de GUI - a menos que isso faça sentido para você. Sua alternativa é criar um monte de pequenas e fáceis de gerenciar classes para gerenciar sua lógica de GUI.
- Quando seus métodos estão começando a parecer um pouco maiores que 4-5 linhas de código, examine se isso é necessário e se é possível extrair um método ou dois para que você possa manter seus métodos enxutos, mesmo que isso significa uma classe com muitos outros métodos.
- Se suas classes estiverem começando a parecer realmente grandes, comece removendo TODAS as funcionalidades duplicadas e, em seguida, veja se você pode agrupar logicamente seus métodos, de modo que possa extrair outra ou duas classes.
- Pense em refatorar toda vez que você escrever uma linha de código. Se você conseguir que uma linha de código funcione, veja se consegue refatorá-la para evitar a duplicação da funcionalidade ou para torná-la um pouco mais enxuta sem alterar o comportamento.
- Aceite o inevitável, que você sempre sentirá que uma parte ou outra em seu sistema começará a se sentir um pouco inchada, especialmente se você negligenciar a refatoração conforme avança. Mesmo com uma base de código bem-fatorada, você ainda pode sentir como se houvesse mais que você poderia fazer. Esta é a realidade do software de escrita, que você vai encontrar-se sempre sentindo que algo mais poderia ter sido feito "melhor", então você precisa encontrar um equilíbrio entre fazer um trabalho profissional e gold-plating.
- Aceite que o limpador que você tenta manter seu código, menos inchado será o seu código.