Questão de Programação — Programação orientada a aspectos — Quadrix 2023
- Código
- qg027831
- Banca
- Quadrix
- Órgão
- CRM-MG
- Ano
- 2023
- Nível
- Superior
- Cargo
- CRM - MG - Analista de Sistemas
- Apointcut.
- Badvice.
- Cintroduction.
- Djoinpoint.
- Earound.
GabaritoD — joinpoint.
Gabarito: letra D. Na programação orientada a aspectos (AOP), o termo que representa pontos bem definidos na execução de um programa é o joinpoint — é o momento exato (chamada de método, execução, atribuição, etc.) em que um aspecto pode ser aplicado. Os demais termos (pointcut, advice, introduction, around) são conceitos relacionados, mas com funções distintas, como veremos a seguir.
A programação orientada a aspectos é um paradigma que visa separar preocupações transversais (cross-cutting concerns) do código principal, como logging, segurança e transações. Para isso, ela introduz uma série de conceitos próprios que precisam ser bem compreendidos para não cair em armadilhas de prova.
O joinpoint é o ponto de execução do programa onde um aspecto pode ser inserido. Pense nele como um "gancho" na execução: cada vez que o programa passa por aquele ponto, o aspecto pode ser acionado. Exemplos típicos de joinpoints são: a chamada de um método, a execução de um método, a atribuição a um campo, a construção de um objeto, entre outros.
O pointcut é um conjunto de joinpoints. Ele define quais joinpoints serão interceptados pelo aspecto. É uma expressão que seleciona os pontos de execução relevantes. Por exemplo, um pointcut pode selecionar "todas as chamadas ao método calcular() da classe Conta".
O advice é o código que será executado quando um joinpoint selecionado pelo pointcut for atingido. Ele é a ação que o aspecto realiza. Existem vários tipos de advice, como before (antes do joinpoint), after (depois), around (ao redor, podendo controlar a execução do joinpoint).
A introduction (ou inter-type declaration) é um mecanismo que permite adicionar novos membros (atributos ou métodos) a uma classe existente, sem modificar o código-fonte original. É uma forma de estender o comportamento das classes.
A pegadinha desta questão é justamente a confusão entre joinpoint e pointcut. O joinpoint é o ponto específico na execução; o pointcut é a seleção de joinpoints. A banca explora essa distinção sutil, que é fundamental na AOP.
Para fixar, veja a relação entre os conceitos:
Conceito | O que é | Analogia |
|---|---|---|
Joinpoint | Ponto específico na execução do programa | Um endereço específico na cidade |
Pointcut | Conjunto de joinpoints selecionados | Um bairro (conjunto de endereços) |
Advice | Código executado no joinpoint | A ação realizada ao chegar no endereço |
Introduction | Adição de membros a uma classe | Construir uma nova casa em um terreno |
Guarde essa distinção: o joinpoint é o onde (ponto exato), o pointcut é o quais (seleção), o advice é o o quê (ação) e a introduction é o estender (adicionar). É exatamente nessa fronteira que as alternativas se dividem.
Pointcut é o conjunto de joinpoints selecionados por uma expressão, não o ponto em si. A banca troca o conceito de "ponto bem definido" (joinpoint) pela "seleção de pontos" (pointcut).
Advice é o código que será executado no joinpoint, ou seja, a ação do aspecto. Não é o ponto de execução em si, mas o comportamento que se aplica a ele.
Introduction é o mecanismo de adicionar novos membros (métodos/atributos) a classes existentes. Não tem relação com pontos de execução do programa.
Joinpoint é, por definição, um ponto bem definido na execução do programa onde um aspecto pode ser aplicado. É o termo exato que o enunciado descreve.
Around é um tipo específico de advice que envolve o joinpoint, permitindo controlar se ele será executado ou não. Não é o ponto de execução, mas uma forma de advice.
A banca adora trocar joinpoint por pointcut. Lembre-se: joinpoint é o ponto específico (o "onde" exato); pointcut é a seleção de joinpoints (o "quais"). Se a questão pedir "ponto bem definido na execução", a resposta é sempre joinpoint. Com treino, você enxerga essa troca de longe 💪
Gabarito: letra D
Link permanente: /questoes/qg027831