Engenharia de Software - 2 Flashcards

Princípio de Projetos e Padrões de Projetos

1
Q

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.

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

No contexto de princípios de projetos, quais as maiores vantagens de se ocultar informações?

A
  • 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)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Quais as principais vantagens e desvantagens de se usar getters e setters?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

O que significa dizer que uma classe é coesa? Qual princípio de projetos está diretamente relacionado ao conceito?

A

Significa dizer que a classe implementa uma única funcionalidade/serviço. Isso está diretamente relacionado ao princípio da separação de interesses.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

No contexto de princípios de projetos, o que significa acoplamento? O que significa dizer que A está acoplado a B?

A

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).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Dê exemplos de acoplamento positivo (aceitável) e negativo (ruim). O que se recomenda acerca de acoplamento e coesão?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

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.

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

No contexto de princípios de projetos, o que significa a sigla SOLID? Qual princípio está associado a cada elemento da sigla?

A
  • 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
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Explique, de forma resumida, o Princípio da Segregação de Interfaces.

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Explique, de forma resumida, o Princípio de Inversão de Dependências.

A

Ele recomenda que classes devem preferir depender de implementações abstratas (interfaces) do que implementações concretas (classes).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Explique, de forma resumida, o Princípio Aberto/Fechado.

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Explique, de forma resumida, o Princípio de Substituição de Liskov.

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Explique, de forma resumida, o Princípio de Demeter.

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Como se calcula a falta de coesão (LCOM — Lack of Cohesion Between Methods) de uma classe ?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Como se calcula o acoplamento (CBO - Coupling Between Objects) de uma classe?

A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Como se calcula a Complexidade Ciclomática (CC) de uma função ? Qual é um limite superior razoável para uma função?

A

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.

17
Q

O que são Padrões de Projetos no contexto de Engenharia de Software?

A

Padrões de projeto descrevem objetos e classes que se relacionam para resolver um problema de projeto genérico em um contexto particular.

18
Q

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();
  ...
}
A

Fábrica

19
Q

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();
  ...
}
A

Fábrica Abstrata

20
Q

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);
  }
}
A

Singleton

21
Q

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;
    }
  }
  ...
}
A

Proxy

22
Q

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();
  }
}
}
A

Adaptador

23
Q

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();
  }
}
A

Fachada

24
Q

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;
  }

}
A

Decorator

25
Q

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);
  }
}
A

Strategy

26
Q

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);
  }
}
A

Observer

27
Q

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;
  }
}
A

Template Method

28
Q

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);
}
A

Iterator

29
Q

Qual(is) princípio(s) está(ão) relacionado(s) ao padrão Fábrica?

A

Princípio Aberto/Fechado e Princípio da Inversão de Dependências.

30
Q

Quando se deve usar o padrão Singleton?

A

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).

31
Q

Qual(is) princípio(s) está(ão) relacionado(s) ao padrão Proxy?

A

Princípio da Responsabilidade Única e Prefira Interfaces a Classes.

32
Q

Quando se deve usar o padrão Adaptador?

A

Quando temos que converter a interface de uma classe para outra interface para uso dos clientes ou do time de desenvolvimento.

33
Q

Quando se deve usar o padrão Fachada?

A

Quando se deseja esconder detalhes da implementação de um sistema e no processo oferecer uma interface mais simples a seus usuários.

34
Q

Qual(is) princípio(s) está(ão) relacionado(s) ao padrão Decorador?

A

Prefira Composição a Herança.

35
Q

Qual(is) princípio(s) está(ão) relacionado(s) ao padrão Strategy?

A

Princípio Aberto/Fechado.

36
Q

Quando se deve usar o padrão Observer?

A

Quando não se deseja acoplar a classe de modelo à classe de interface visto que a segunda é muito mais susceptível a modificações.