Baixe o app para aproveitar ainda mais
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!
Compartilhar