SóProvas


ID
142264
Banca
CESGRANRIO
Órgão
BNDES
Ano
2009
Provas
Disciplina
Engenharia de Software
Assuntos

No âmbito da Refatoração de software, analise as afirmativas a seguir.

I - Introduce Parameter Object é uma técnica de refatoração que pode ser aplicada em métodos muito longos.
II - Código duplicado é candidato para aplicação das técnicas Extract Method e Substitute Algorithm.
III - Extract Class é uma técnica de refatoração que pode ser aplicada em classes muito grandes.

Está(ão) correta(s) a(s) afirmativa(s)

Alternativas
Comentários
  •  Alguém poderia me explicar essa questão?

    O Parameter Object, pelo que pesquisei, agrega todos os parâmetros de um método em uma classe.

    Na afirmativa I, caberia a técnica Extract Method, que cria um novo método extraindo um bloco de código.

     

  •  I - Introduce Parameter Object, em seu uso, cria-se uma classe imutável que represente o grupo de parâmetros de um ou mais métodos. O que valida a questão é que algumas vezes no corpo do método há estrutras/comportamento usados exclusivamente para manipular os parâmetros. Esses comportamentos podem ser movidos para o objeto de parâmetros.
    Fonte: Introduce Parameter Object

    II - 

  • Esta questao está MUITO errada. Como ng entrou com recurso?!?!

    Introduce Parameter Object é uma tecnica usada quando metodos possuem LISTAS DE PARAMETROS muito longos. E nao métodos longos.
  • Concordo com Marcelo. Quando o item I fala métodos longos, dá a entender métodos com corpo longo, e não a assinatura do método. Eu entraria com recurso
  • O primeiro item da questão não está errado.

    Na explicação sobre os refactorings que podem ser usados em métodos muito longos (pag 77, Refactoring, Fowler) ele explica que:

    Quando é utilizado o Extract Method, em métodos muito longos, pode ocorrer desse novo método possuir muitos parâmetros e variáveis temporárias como parâmetros fazendo com que a chamada do método extraído fique tão confusa quanto originalmente. Nesses casos ele sugere o uso de Replace Temp With Query, Introduce Parameter Object e Preserve Whole Object.

    Um bom lugar para consulta rápida dos padrões é: http://refactoring.com/catalog/
    Existe uma descrição e um exemplo de utilização do padrão.
  • @Eduardo,

    Voce escreveu:
    "pode ocorrer desse novo método possuir muitos parâmetros e variáveis temporárias como parâmetros fazendo com que a chamada do método extraído fique tão confusa quanto originalmente. Nesses casos ele sugere o uso de Replace Temp With Query, Introduce Parameter Object e Preserve Whole Object."

    Nesta passagem está dizendo que ao criar o novo metodo (Extract Method), o mesmo possa necessitar de muitos parâmetros ou variaveis temporarias como parametros. Entendo que isso quer dizer q, a quantidade de parametros a serem passados para este novo metodo fique muito grande e confusa, sendo necessario o uso do Introduce Parameter Object. Nao tem a ver com uso do Introduce Parameter Object  para metodos longos, mas sim com o fato de que o novo metodo do Extract Method fique com a lista de parametros enorme.

    @Marcelino

    Introduce Parameter Object diz:
    Often the bodies of the methods have common manipulations of the parameter values. By moving this behavior into the new object, you can remove a lot of duplicated code.

    Ou seja, esses parametros sao manipulados por operações dentro desses metodos que, ao utilizar o Introduce Parameter Object, acaba que, por consequencia, voce elimina algumas linhas daquele código. Isso nao quer dizer q o metodo era longo.


    @All

    O link do fowler[1] disserta sobre metodos longos dizendo:

    " Long lists of parameters can be slimmed down with Introduce Parameter Object and Preserve Whole Object."

    [1]http://sourcemaking.com/refactoring/long-method
  • Reanalisando o livro sobre padrões de refatoração do Fowler, percebi o seguinte:
    Na contra capa, há uma tabela com os cheiros e as refatorações aplicáveis.
    Método longo, p. 71 {Extrair método, Substituir variável temporária por consulta, Substituir método por objeto método, Decompor condicional}

    No entanto, na parte que trata sobre os cheiros temos o seguinte:
    Métodos longos:
    Em 99% do tempo acplica-se o Extrair Método.
    Você muitas vezes pode usar Substituir variável temporária por consulta para eliminar as variáveis temporárias. Listas longas de parâmetros pode ser diminuídas com Introduzir objeto parâmetro e Preservar o objeto inteiro.
    Se você tentou isso e ainda tem variáveis temporárias e parâmetros demais, é hora de usar a artilharia pesada: Substituir método por objeto método.
    ...
    Condições e laçõs também sinalizam extrações. Use Decompor Condicional para lidar com expressões condicionais.

    Então o examinador percebeu a seguinte possibilidade de derrubar meio mundo (eu incluso nessa):
    Se o cara estudar só essa tabelinha da contra-capa ao invés de ir lá dentro do livro, vai levar um ferro daqueles. (enquanto ria diabolicamente)

    E pronto, está feita uma questão a lá cesgranrio.
  • Eu sabia que a II e a III estavam corretas, como não havia na resposta apenas II e III tive que considerar a I verdadeira tb, apesar de achar que a I está errado..
    já que para mim  Parameter Object é para quando existe muitos parametros e não um metodo longo
  • Técnicas de Refactoring:

     

    - Extract Method:Transformar um fragmento de código que pode ser agrupado em um método com um nome que explica o objetivo desse fragmento.

    - Substitute Algorithm: Substitua o conteúdo de um método com um algoritmo que faça a mesma coisa mas seja melhor.

    - Introduce Parameter Object: Substituir parâmetros de um método por um objeto