Pergunta

Eu tenho desnatado a documentação on-line, ler a entrada de wiki, as mensagens e os blogs, mas ainda estou confuso.

  • O que é, em poucas palavras, Programação Orientada a Aspectos ?
  • É simplesmente melhor, em seguida, Programação Orientada a Objetos? Devo desaprender OOP?
  • Se não, como faço para saber quando usar um ou o outro? Quais são as principais diferenças entre os dois?
  • Can I refact um para o outro?

Eu sempre fui um homem OO e eu quero saber se eu preciso para cometer traição.

A sério, eu estou começando um novo projeto em breve e quero fazer as escolhas certas no início.

Foi útil?

Solução

O que é, em poucas palavras, a Aspect Oriented Programming?

Em poucas palavras, AOP é a capacidade de injetar ações no fluxo típico de outro programa, discretamente. Ele permite que você instantiations captura de classe, chamadas de método, atribuições, etc.

É simplesmente melhor então Programação Orientada a Objetos? Devo desaprender OOP?

Não, e não. Ele trabalha em conjunto com qualquer ambiente de programação que suporta. (Veja acima).

Se não, como faço para saber quando usar um ou o outro? Quais são as principais diferenças entre os dois?

Você usa AOP, geralmente, quando você deseja implementar algum tipo de acções em centenas de aulas, sem manipular as próprias classes. Exemplos típicos são a segurança (autorização do direito de chamar o determinado método / classe) ou de registro. Na minha experiência, porém, eu não usá-lo para isso. (Eu não usá-lo em tudo, honestamente).

Como acima, a principal diferença não existe realmente, como eles não são comparáveis. Mas, digamos que você deseja implementar o registo "normalmente", basta chamar o logger em pontos apropriados:

log.write("hello");

Mas com AOP, você pode criar um 'aspecto' que atribui a cada chamada de método, e log 'Método b chamado'. O ponto é que em AOP você se aproxima é mais 'shotgun': você anexar a tudo, ou apenas um pequeno subconjunto. adicionar manualmente o registo é geralmente melhor.

Can I refact um para o outro?

Não é realmente relevante, consulte outras respostas. Novamente com segurança, você poderia trocar para um modelo AOP de um modelo de OOP típico this.IsAllowed () para algo como if (callingMethod.HasAttribute (foo)) {permitido = true; }

A esperança essas respostas são úteis. Deixe-me saber se você me quer para expandir ainda mais.

Outras dicas

Não, AOP complementa OOP, ao invés de suplantando-lo. AOP e OOP fornecer diferentes tipos de "cola" para ajudar a combinar comportamentos. OOP, é claro, permite combinar comportamento através de herança e composição, etc. AOP por outro lado, permite que você adicione o comportamento de endereço preocupações transversais interceptando cortes ponto onde o novo código runs antes ou após os métodos escolhidos das classes escolhido.

Alguns exemplos comuns de preocupações transversais são: segurança, registro e controle de transação. Um princípio fundamental de um bom design é coerência, idealmente, um pedaço de código deve fazer apenas uma coisa. Por isso, turva a água para adicionar código de segurança para classes de acesso de dados, por exemplo. resolve AOP que determinado problema, permitindo adicionar o comportamento em um "aspecto" e, em seguida, aplicar esse aspecto para todas as classes que devem ter controles de segurança.

AOP é diferente do OOP, abordagens completamente diferentes para o desenvolvimento.

Basicamente, se você tem o registo, as preocupações de autenticação, código de verificação de desempenho, estes serão os mesmos, grosso modo, em várias partes do programa, em diferentes classes. Assim, você pode escrever seu aplicativo como você imagina que, em Java, então quando você precisa adicionar esses outros tipos de códigos (transversais preocupações), então você acabou de injetá-las no programa, para que possam ser compilado, mas quando você olhar para o código-fonte, você acabou de ver a lógica de negócios que você precisa lá.

Quanto ao momento de usar AOP ou OOP, eu sugiro que você escrever o programa, fazê-lo funcionar, então quando você tê-lo em funcionamento, olhada de remover código que na verdade não tem a ver com a função, mas serve alguns outra finalidade. Por exemplo, se você precisa verificar se os parâmetros de entrada estão corretos antes de usá-los, em seguida, usar um aspecto para isso. Se você tem manipulação de eventos semelhantes, como todas as exceções lançadas nas gravações da camada de acesso de dados para um arquivo de log, em seguida, criar um aspecto para isso.

Como você remover estes interesses transversais seu código vai ficar menor.

Como você obtém mais experiência que você vai ver mais usos para AOP, mas inicialmente eu sugeriria escrevê-lo, em seguida, refatorar usando AOP.

Use Eclipse, se estiver usando Java, para AOP, como o plugin AJDT será muito útil para ver onde você está adicionando aspectos.

Programação Orientada a Aspectos é um chavão catchy para a inserção de ações (chamados de "conselho") em métodos ou funções em pontos-chave, como chamadas e retornos, entre outros. Eu tenho um grande problema com AOP, porque viola todas as barreiras de abstração incorporadas ao idioma. Não há nenhuma maneira para um módulo de dizer "isto é o que um aspecto pode mexer com e é isso que um aspecto não pode mexer." Como resultado, o risco de violar invariantes internos, e você destruir o princípio de raciocínio modular (você pode compreender um módulo sem ter que entender nada, mas as interfaces dos outros módulos que importações).

Alguns anos atrás Raymie Stata escreveu uma tese de doutorado brilhante sobre como linguagens orientadas a objeto pode controlar subclasses e impedi-lo de violar invariantes chave. O trabalho correspondente para AOP ainda não foi escrito.

Enquanto como com qualquer outra ideia que os ganhos da moeda, AOP tem desfrutado de alguns sucessos espetaculares (por exemplo, a adaptação de registro para um aplicativo não projetado com registro em mente), em toda a gostaria de exortá-lo a Limitar o seu uso de AOP para casos muito simples . Ou ainda melhor, apenas dizer não a programação orientada a aspectos.

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