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.