Pergunta

Eu herdei esse legado aplicativo web Java gigantesco usando Struts 1.2.4. Eu tenho uma pergunta específica sobre Ações. A maioria das páginas têm exatamente uma ação, eo processExecute () métodos são monstros horríveis (muito longos e toneladas de instruções IF aninhadas com base em parâmetros de solicitação).

Dado que as ações são uma implementação do padrão de comando, eu estou pensando para dividir essas ações em uma ação por gesto usuário. Este será um grande refactoring embora, e eu estou querendo saber:

  1. É este o caminho certo?
  2. Existe um passo intermediário que eu poderia tomar, um padrão que lida com a bagunça dentro das ações monolíticas? Talvez um outro padrão de comando dentro da ação?
Foi útil?

Solução

A minha maneira de lidar com isso seria:

  • Não fazer 'tudo de uma vez'
  • sempre que mudar nada, deixá-lo melhor do que você o encontrou
    • substituindo condicionais com implementações de ação separados é um passo.
    • Melhor ainda: Faça suas implementações de separar as classes de ação para que você possa usá-lo quando você altera quadros
    • Mantenha a sua nova implementação de comando absolutamente , sem referências ao Struts, usar suas novas acções como wrapper em torno destas implementações.
    • Você pode precisar fornecer interfaces para seus Struts ActionForms, a fim de passá-los ao redor sem copiar todos os dados. Por outro lado - você pode querer passar em torno de outros objetos do que ActionForms que normalmente são um bando de Cordas (ver sua outra pergunta sobre Suportes 1,2 ActionForms )
  • começar a migrar peças a tecnologia mais recente e melhor. Struts 1.2 foi grande quando ele saiu, mas definitivamente não é o que você quer para apoiar na eternidade. Há algumas gerações de melhores enquadramentos agora.

Há definitivamente mais - Desculpe, eu estou correndo contra o tempo aqui ...

Outras dicas

do Struts Actions, em minha mente, não deve ter muito código-los em tudo. Eles devem apenas interagir diretamente com o pedido e resposta - tomar alguns dados de uma forma ou um parâmetro de solicitação, mão essa informação off para a camada de serviço, e, em seguida, colocar algumas coisas em um objeto de resposta ou talvez salvar alguns dados na sessão do usuário.

Eu recomendo ficar longe de fazer herança com classes de ação. Parece uma boa idéia no começo, mas eu acho que mais cedo ou mais tarde você percebe que você está sapato Horning coisas mais do que você está realmente fazendo a base de código robusto. Struts tem ações de base suficiente como é, se você está criando novos que você provavelmente tem código na camada web que não deveria estar lá.

Isso é apenas minha experiência pessoal.

Eu lidei com esse tipo de coisa antes. Uma primeira etapa consiste em inserir uma outra classe de base para a cadeia de herança entre a acção e uma das classes originais de acção monstruosas (permite chamada ClasseA). Especialmente se você não tem tempo para fazer tudo de uma vez. Então você pode começar retirando pedaços de funcionalidade em menores classes de ação paralela (ClassB, ClassC). Qualquer coisa que é comum entre a ClassA original e as novas classes reformulado pode ser puxado para dentro da nova classe base. Assim, a hierarquia agora se parece com isso:

Original Hierarchy:      New Hierarchy:

     Action                   Action
       |                        |
       |                      BaseA
  (old)ClassA                   |
                       +--------+----------+
                       |        |          |
                   ClassB (new)ClassA   ClassC
  1. Go método um de cada vez
  2. Gravar alguns casos de teste que você pode reproduzir mais tarde. Exemplo aqui (certifique-se de sucesso como muitos caminhos através do código como você pode, ou seja, todos os gestos do usuário na página que chamar esta ação)
  3. refatorar o método para reduzir a sua complexidade, criando métodos menores que fazem coisas menores.
  4. testes
  5. Execute novamente como você faz isso

Neste ponto, você tem reformulado versão do enorme método irritante grande. Agora você pode realmente começar a criar ações específicas.

Você pode usar sua classe recém-reformulado como uma classe base, e implementar cada acção específica como uma subclasse usando esses métodos pequenos refatorado.

Uma vez feito isso, você deve ter uma boa visão de lógica compartilhada entre as classes e pode puxar para cima ou push-down esses métodos, conforme necessário.

Não é divertido, mas se você vai estar trabalhando na base de código por um tempo, você vai economizar tempo e dores de cabeça.

problema difícil, mas típico de desenvolvimento de aplicativos web mais cedo.

As primeiras coisas primeiro você precisa para começar a pensar sobre o que a lógica constitui um comportamento empresarial, que a lógica constitui "fluxo" (ou seja, o que o usuário vê), e que a lógica recebe o conteúdo para que ele vê.

Você não tem que ir abaixo da rota de fábricas e interfaces e tudo isso; aplicação retroativa é muito menos útil ... mas consolidando lógica de negócios e dados lógica de recuperação para os delegados de algum tipo ... e deixando as ações struts para determinar página de fluxo com base no sucesso / fracasso do que a lógica.

De lá você só tem que tomar algumas semanas e moer-lo

Um método muito tempo nunca é bom, a menos que ele passa a ser uma única instrução switch onde os casos são muito curtos (análise de token ou algo parecido).

Você poderia pelo menos refactor a longo método em métodos menores com nomes descritivos.

Se for possível você poderia começar seu método com reconhecendo o que é que deve fazer, examinando o formulário e, em seguida, if / else seu caminho para as várias opções. Nenhum ifs aninhados no entanto, aqueles tendem a tornar o código ilegível. Apenas

enum Operation {
  ADD, DELETE;
}

...

Operation operation = determineOperation(form);
if (operation == Operation.DELETE) { 
  doDelete(form); 
} else if (operation == Operation.ADD) {
  doAdd(form);
}

Se você pode ir tão longe de ter seu bom lógica e limpo e você pode fazer o refatoração quiser.

A parte mais difícil é obter a sua lógica clara, e você pode fazer isso em etapas. Não escolha um padrão que você até estar nivelado entender exatamente qual é seu problema.

Se você está planejando para refatorar o código que você deve certificar-se testes de gravação para o código existente primeiro, assim você pode ter certeza que você não alteraram a funcionalidade do que uma vez que você começar a refatoração.

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