Buscar

EE3 2018.1 (com gabarito)

Prévia do material em texto

Engenharia de Software e Sistemas
Terceiro Exame Escrito
Paulo Borba
Centro de Informa´tica
Universidade Federal de Pernambuco
22 de maio de 2018
Por gentileza, responder as questo˜es em ordem nume´rica e alfabe´tica.
Questa˜o 1 Considerando o padra˜o de projeto Abstract Factory, responda as seguintes perguntas: (a)
Que problemas sa˜o resolvidos por esse padra˜o? (b) Que diagrama de classes ilustra, de forma abstrata
(na˜o para um exemplo espec´ıfico), a estrutura da sua soluc¸a˜o para esses problemas? (c) Qual a principal
diferenc¸a entre o Abstract Factory e o Factory? (d) Em que situac¸o˜es seria mais adequado usar o padra˜o
Factory ao inve´s do Abstract Factory? Justifique suas respostas.
Respostas: (a) Legibilidade ou modularidade comprometidas por conta de construtor grande ou
complexo, e com comportamento varia´vel de acordo com as necessidades diferentes— normalmente es-
pecificadas atrave´s de configurac¸o˜es armazenadas em arquivos de propriedades— de clientes diferentes;
(b) Ver slide do curso; (c) O padra˜o Factory na˜o faz uso de classes abstratas para representar fa´bricas e
produtos abstratos, consistindo apenas de classes concretas que representam a fa´brica e o produto criado
pela mesma; (d) quando na˜o ha´ a necessidade de variar o comportamento de criac¸a˜o de objetos, mas ha´
a necessidade de deixar a classe mais leg´ıvel ou modular, encapsulando e abstraindo a complexidade ou
os detalhes do co´digo do construtor. 2
Questa˜o 2 Responda as seguintes perguntas: (a) O que e´ o Single Resposibility Principle? (b) Voceˆ
concorda com esse princ´ıpio? (c) Em que situac¸o˜es voceˆ acha que ele deveria ser seguido? (d) Em que
situac¸o˜es voceˆ acha que ele na˜o deveria ser seguido? (e) Que maus cheiros (bad smells) de co´digo sugerem
que esse princ´ıpio na˜o esta´ sendo seguido? (f) Que refatorac¸o˜es (refactorings) sa˜o normalmente usadas
para fazer com que esse princ´ıpio venha a ser seguido?
Respostas: (a) E´ um princ´ıpio de projeto de sistemas que recomenda que um dado mo´dulo (classe,
pacote, etc.) so´ deve ter uma u´nica responsabilidade, evitando a mistura de conceitos e co´digo com
diferentes propo´sitos no mesmo mo´dulo; (b) Sim, ja´ que ele tende a melhorar a modularidade do co´digo,
com consequeˆncias positivas para reuso e manutenc¸a˜o; (c) Quando na˜o haja necessidade de economia
significativa de performance e uso de memo´ria que estejam atreladas ao uso do princ´ıpio; (d) Quando
ha´ necessidade de economia significativa de performance e uso de memo´ria, e essa economia pode ser
obtida evitando o uso do princ´ıpio; (e) Classes grandes, ou com pouca coesa˜o entre os seus elementos;
(f) Extract class e extract method. 2
Questa˜o 3 Observando a modificac¸a˜o de co´digo ilustrada na figura abaixo, responda as seguintes per-
guntas: (a) Essa modificac¸a˜o pode ser considerada uma refatorac¸a˜o? (b) Do ponto de vista de qualidade
interna de software, quais as vantagens ou desvantagens em realizar essa modificac¸a˜o? (c) O me´todo
gravar da direita tem o mesmo comportamento do me´todo da esquerda? (d) Que refatorac¸o˜es foram ou
poderiam ser utilizadas nesse caso? Por fim, (e) escreva um teste que evidencie a sua resposta ao item
c. Justifique as suas respostas.
Respostas: (a) Sim, ja´ que mante´m o comportamento do me´todo original ao mesmo tempo que
melhora a legibilidade do co´digo; (b) A principal vantagem e´ a melhor legibilidade, ja´ que a nova versa˜o
do co´digo encapsula e abstra´ı a condic¸a˜o do if, permitindo tambe´m que o co´digo da condic¸a˜o seja reusado
em outros contextos; (c) Sim, ja´ que o co´digo do novo me´todo criado e invocado e´ equivalente ao que
existia antes, trocando cpf por aluno.cpf, que e´ o argumento passado para o me´todo; (d) Extract
method ; (e)
as = new AlunoService();
r = as.gravar(nome:"Borba",email:"phmb@cin.ufpe.br");
expect(r.nome).toBe("Borba");
expect(r.email).toBe("phmb@cin.ufpe.br");
r = as.gravar(nome:"Borba",email:"phmb@cin.ufpe.br");
expect(r).toBe(null);
2
Questa˜o 4 Responda as seguintes perguntas: (a) Quais os principais mau cheiros associados ao co´digo
a seguir? (b) Que refatorac¸o˜es voceˆ usaria para melhorar este co´digo? (c) Qual o co´digo resultante
das refatorac¸o˜es? (referencie apenas os nu´meros dos blocos, na˜o o texto associado aos mesmos) (d) Por
que voceˆ acha que o comportamento do sistema seria preservado por essas refatorac¸o˜es? (e) Como voceˆ
verificaria isso na pra´tica?
class X {
a:A; // "a" e "b" s~ao conceitualmente relacionados
b:B;
c:C; // "c" e "d" s~ao conceitualmente relacionados,
d:D; // mas n~ao te^m nenhuma relac¸~ao com "a" e "b"
A m() {
var x = 1;
// bloco 1: 10 LOC so´ usando atributos "a" e "b", nenhum return ou throw,
// e realizando uma operac¸~ao conceitual op1
// bloco 2: 9 LOC so´ usando atributos "a" e "b", com "if (...) return null;"
// na u´ltima linha, realizando uma operac¸~ao conceitual op2
// bloco 3: 3 LOC so´ usando atributos "a" e "b"
// bloco 4: 10 LOC so´ usando os atributos "a" e "b" e a varia´vel "x", com
// quinta linha "x = a.f();", nenhum return ou throw, e realizando
// uma operac¸~ao conceitual op3
return a;
}
void n() {
// bloco 5: 6 LOC so´ usando atributos "c" e "d", nenhum return ou throw,
// a terceira linha sendo "c = new C(5);" e
// realizando operac¸~ao conceitual op4
// bloco 6: 3 LOC so´ usando atributos "c" e "d"
// bloco 7: 6 LOC igual ao bloco 5,
// exceto pela terceira linha: "c = new C(7);"
}
}
Justifique suas respostas, se necessa´rio dando evideˆncia e referenciando partes do co´digo.
Respostas: (a) Baixa coesa˜o de a, b, e m com c, d, e n, ale´m de me´todos grandes, e duplicac¸a˜o de
co´digo (blocos 5 e 7); (b) Extract class e extract method ; (c)
class AB {
a:A;
b:B;
A m() {
var x = 1;
this.op1();
r:R = this.op2();
if (r==null) return null;
// bloco 3: 3 LOC so´ usando atributos "a" e "b"
x = this.op3(x);
return a;
}
void op1() {
// bloco 1: 10 LOC so´ usando atributos "a" e "b", nenhum return ou throw,
// e realizando uma operac¸~ao conceitual op1
}
R op2() {
// bloco 2: 9 LOC so´ usando atributos "a" e "b", com "if (...) return null;"
// na u´ltima linha, realizando uma operac¸~ao conceitual op2
}
number op3(x:number) {
// bloco 4: 10 LOC so´ usando os atributos "a" e "b" e a varia´vel "x", com
// quinta linha "x = a.f();", nenhum return ou throw, e realizando
// uma operac¸~ao conceitual op3
return x;
}
}
class CD {
c:C; // "c" e "d" s~ao conceitualmente relacionados,
d:D; // mas n~ao te^m nenhuma relac¸~ao com "a" e "b"
void n() {
this.op4(new C(5));
// bloco 6: 3 LOC so´ usando atributos "c" e "d"
this.op4(new C(7));
}
void op4(a:C) {
// 6 LOC so´ usando atributos "c" e "d", nenhum return ou throw,
// a terceira linha sendo "c = a;" e
// realizando operac¸~ao conceitual op4
}
}
class X {
ab:AB = new AB();
cd:CD = new CD();
A m() {
return ab.m();
}
void n() {
return cd.n();
}
}
(d) Os me´todos da nova versa˜o de X retornam os mesmos valores, e teˆm os mesmos efeitos colaterais,
dos me´todos correspondentes da versa˜o anterior. (e) Executando os mesmos testes na versa˜o original do
co´digo e na versa˜o refatorada, e verificando se os resultados gerados nas duas verso˜es sa˜o ideˆnticos. 2
Boa sorte, muita leitura, gerencie bem o seu tempo, evite a sobrecarga de atividades, e
aproveite bem a sua passagem pela universidade!

Continue navegando