Engenharia de Software - 2 Flashcards
Princípio de Projetos e Padrões de Projetos
No contexto de princípios de projetos, o que significa dizer que um sistema possui alta integridade conceitual? Dê exemplos de características de um sistema assim.
Quer dizer que as diferentes partes do sistema são coerentes e coesas entre si. Por exemplo, usam padrões de projetos semelhantes para resolver problemas semelhantes, seguem um padrão de nomeação de variáveis, transmitem/recebem informações da mesma forma, entre outras.
No contexto de princípios de projetos, quais as maiores vantagens de se ocultar informações?
- Facilita o entendimento e o desenvolvimento do sistema (programadores não precisam saber como a classe será usada, só o que deve retornar)
- É mais flexível a mudanças (é possível fazer mudanças radicais em como as informações são geradas sem impactar negativamente o restante do sistema)
Quais as principais vantagens e desvantagens de se usar getters e setters?
A principal vantagem é permitir acesso a informações privadas de forma segura sem expor sua construção interna. A principal desvantagem é que permitir acesso a informações privadas vai contra o princípio de ocultamento de informações e por isso deve ser usado com cuidado.
O que significa dizer que uma classe é coesa? Qual princípio de projetos está diretamente relacionado ao conceito?
Significa dizer que a classe implementa uma única funcionalidade/serviço. Isso está diretamente relacionado ao princípio da separação de interesses.
No contexto de princípios de projetos, o que significa acoplamento? O que significa dizer que A está acoplado a B?
Acoplamento é a medida de conexão entre duas classes A e B. A estar acoplado a B significa ou que mudanças em B implicam em mudanças em A (acoplamento evolutivo) ou que A utiliza uma instância de B (acoplamento estrutural).
Dê exemplos de acoplamento positivo (aceitável) e negativo (ruim). O que se recomenda acerca de acoplamento e coesão?
Acoplamento positivo ocorre quando A usa apenas métodos públicos de B e/ou B é uma classe estável. Acoplamento negativo ocorre quando A acessa propriedades de B que podem mudar com frequência e/ou quando ambas compartilham variáveis globais.
A recomendação é maximizar a coesão das classes e minimizar o acoplamento entre elas.
Para duas classes estarem acopladas, é necessário que ambas usem uma variável em comum ou possuam instâncias umas das outras. Essa afirmação é verdadeira ou falsa? Justifique.
Falsa. Existem também instâncias de acoplamento indireto onde A usa B que usa C. Uma mudança em C pode impactar A mesmo que as classes não compartilhem variáveis ou uma utilize a outra.
No contexto de princípios de projetos, o que significa a sigla SOLID? Qual princípio está associado a cada elemento da sigla?
- Single Responsibility Principle (Princípio da Responsabilidade Única) -> coesão
- Open/Closed Principle (Princípio Aberto/Fechado) -> Extensibilidade
- Liskov Substitution Principle (Princípio da Substituição de Liskov) -> Extensibilidade
- Interface Segregation Principle (Princípio de Segregação de Interfaces) -> Coesão
- Dependency Inversion Principle (Princípio da Inversão de Dependências) -> Acoplamento
Explique, de forma resumida, o Princípio da Segregação de Interfaces.
O princípio define que interfaces têm que ser pequenas, coesas e, mais importante ainda, específicas para cada uso de modo que cada usuário usará todos os métodos disponíveis. Se um método X será usado por um tipo de usuários e um método Y por outro, a sugestão é que a interface seja dividida em uma com apenas o método X e outra com apenas o método Y.
Explique, de forma resumida, o Princípio de Inversão de Dependências.
Ele recomenda que classes devem preferir depender de implementações abstratas (interfaces) do que implementações concretas (classes).
Explique, de forma resumida, o Princípio Aberto/Fechado.
Ele recomenda que uma classe deva estar aberta a extensões e fechada a modificações.
Em outras palavras, ao pensar em uma funcionalidade nova em uma função, um projetista deve ser o mais genérico possível ao definir seus parâmetros e execução de modo que os usuários possam obter comportamentos novos usando combinações diferentes de parâmetros ao invés de precisar modificar o método em si.
Explique, de forma resumida, o Princípio de Substituição de Liskov.
O Princípio de Substituição de Liskov recomenda que uma classe filha não pode redefinir um método de uma classe mãe de modo que viole o contrato da implementação original.
Explique, de forma resumida, o Princípio de Demeter.
O Princípio de Demeter — também chamado de Princípio do Menor Privilégio (Principle of Least Privilege) — sugere que um método deve invocar apenas os seguintes outros métodos:
- De sua própria classe
- De objetos passados como parâmetros
- De objetos criados pelo próprio método
- De atributos da classe do método
Como se calcula a falta de coesão (LCOM — Lack of Cohesion Between Methods) de uma classe ?
Para calcular o valor de LCOM de uma classe C deve-se, primeiro, computar o conjunto M(C) = { (f1, f2) | f1 e f2 são métodos de C }. Ele é formado por todos os pares não-ordenados de métodos da classe C. Seja ainda o conjunto A(f) = conjunto de atributos da classe que são acessados por um método f
O valor de LCOM de C é definido por P = | { (f1, f2) in M(C) | A(f1) e A(f2) são conjuntos disjuntos } |
Isto é, LCOM(C) é o número de pares de métodos — dentre todos os possíveis pares de métodos de C — que não usam atributos em comum, isto é, a interseção deles é vazia.
Como se calcula o acoplamento (CBO - Coupling Between Objects) de uma classe?
Dada uma classe A, CBO conta o número de classes das quais A depende.
Diz-se que A depende de uma classe B quando:
- A chama um método de B
- A acessa um atributo público de B
- A herda de B
- A declara uma variável local, um parâmetro ou um tipo de retorno do tipo B
- A captura uma exceção do tipo B
- A levanta uma exceção do tipo B
- A cria um objeto do tipo B.
Como se calcula a Complexidade Ciclomática (CC) de uma função ? Qual é um limite superior razoável para uma função?
CC = número de comandos de decisão em uma função (if, else, while, for, etc) + 1. Um limite superior razoável é aproximadamente 10.
O que são Padrões de Projetos no contexto de Engenharia de Software?
Padrões de projeto descrevem objetos e classes que se relacionam para resolver um problema de projeto genérico em um contexto particular.
O seguinte trecho de código se refere a qual padrão de projeto?
class Channel1 { public static Channel create() { return new TCPChannel(); } } void f() { Channel c = Channel1.create(); ... } void g() { Channel c = Channel1.create(); ... } void h() { Channel c = Channel1.create(); ... }
Fábrica
O seguinte trecho de código se refere a qual padrão de projeto?
abstract class Protocol1 { abstract Channel createChannel(); abstract Port createPort(); ... } void f(Protocol1 pf) { Channel c = pf.createChannel(); Port p = pf.createPort(); ... }
Fábrica Abstrata
O seguinte trecho de código se refere a qual padrão de projeto?
class Logger { private Logger() {} private static Logger instance; public static Logger getInstance() { if (instance == null) instance = new Logger(); return instance; } public void println(String msg) { // registra msg no console, mas poderia ser em arquivo System.out.println(msg); } }
Singleton
O seguinte trecho de código se refere a qual padrão de projeto?
class BookSearch1 implements BookSearchInterface { private BookSearchInterface base; BookSearch1 (BookSearchInterface base) { this.base = base; } Book getBook(String ISBN) { if("livro com ISBN no cache") return "livro do cache" else { Book book = base.getBook(ISBN); if(book != null) "adicione book no cache" return book; } } ... }
Proxy
O seguinte trecho de código se refere a qual padrão de projeto?
class ProjetorSamsung1 implements Projetor { private ProjetorSamsung projetor; ProjetorSamsung1 (ProjetorSamsung projetor) { this.projetor = projetor; } public void liga() { projetor.turnOn(); } } }
Adaptador
O seguinte trecho de código se refere a qual padrão de projeto?
class InterpretadorX { private String arq; InterpretadorX(arq) { this.arq = arq; } void eval() { Scanner s = new Scanner(arq); Parser p = new Parser(s); AST ast = p.parse(); CodeGenerator code = new CodeGenerator(ast); code.eval(); } }
Fachada
O seguinte trecho de código se refere a qual padrão de projeto?
class ZipChannel extends Channel1 { public ZipChannel(Channel c) { super(c); } public void send(String msg) { "compacta mensagem msg" super.send(msg); } public String receive() { String msg = super.receive(); "descompacta mensagem msg" return msg; } } class ZipChannel extends Channel1 { public ZipChannel(Channel c) { super(c); } public void send(String msg) { "compacta mensagem msg" super.send(msg); } public String receive() { String msg = super.receive(); "descompacta mensagem msg" return msg; } }
Decorator
O seguinte trecho de código se refere a qual padrão de projeto?
class MyList { ... // dados de uma lista ... // métodos de uma lista: add, delete, search private Sort1 s; public MyList() { s = new QuickSort1(); } public void setSort1(Sort1 s) { this.s = s; } public void sort() { s.sort(this); } }
Strategy
O seguinte trecho de código se refere a qual padrão de projeto?
class Temperatura extends Subject { private double temp; public double getTemp() { return temp; } public void setTemp(double temp) { this.temp = temp; notifyObservers(); } } class TermometroCelsius implements Observer { public void update(Subject s){ double temp = ((Temperatura) s).getTemp(); System.out.println("Temperatura Celsius: " + temp); } }
Observer
O seguinte trecho de código se refere a qual padrão de projeto?
abstract class Funcionario { double salario; ... abstract double calcDescontosPrevidencia(); abstract double calcDescontosPlanoSaude(); abstract double calcOutrosDescontos(); public double calcSalarioLiquido() { double prev = calcDescontosPrevidencia(); double saude = calcDescontosPlanoSaude(); double outros = calcOutrosDescontos(); return salario - prev - saude - outros; } }
Template Method
O seguinte trecho de código se refere a qual padrão de projeto?
List<String> list = Arrays.asList("a","b","c"); I i= list.i(); while(i.hasNext()) { String s = (String) i.next(); System.out.println(s); }
Iterator
Qual(is) princípio(s) está(ão) relacionado(s) ao padrão Fábrica?
Princípio Aberto/Fechado e Princípio da Inversão de Dependências.
Quando se deve usar o padrão Singleton?
Quando se possui um objeto que deve ser único a todo o projeto (ou seja, uma variável global que não possa ser modificada).
Qual(is) princípio(s) está(ão) relacionado(s) ao padrão Proxy?
Princípio da Responsabilidade Única e Prefira Interfaces a Classes.
Quando se deve usar o padrão Adaptador?
Quando temos que converter a interface de uma classe para outra interface para uso dos clientes ou do time de desenvolvimento.
Quando se deve usar o padrão Fachada?
Quando se deseja esconder detalhes da implementação de um sistema e no processo oferecer uma interface mais simples a seus usuários.
Qual(is) princípio(s) está(ão) relacionado(s) ao padrão Decorador?
Prefira Composição a Herança.
Qual(is) princípio(s) está(ão) relacionado(s) ao padrão Strategy?
Princípio Aberto/Fechado.
Quando se deve usar o padrão Observer?
Quando não se deseja acoplar a classe de modelo à classe de interface visto que a segunda é muito mais susceptível a modificações.