forked from reprograma/on21-imersao-js-S10-SOLID
-
Notifications
You must be signed in to change notification settings - Fork 0
/
D.js
104 lines (75 loc) · 2.81 KB
/
D.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
/*
D — Dependency Inversion Principle (Princípio da Inversão da Dependência)
As entidades devem depender de abstrações, não de concreções. Ele afirma que o módulo de alto nível não deve depender do módulo de baixo nível, mas devem depender de abstrações.
Conceito: Dependa de abstrações e não de implementações.
Objetivo: Este princípio visa reduzir a dependência de uma classe de alto nível na classe de baixo nível, introduzindo uma interface.
Sobre esse princípio, Uncle Bob nos confere duas definições:
“Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender da abstração”;
“Abstrações não devem depender de detalhes. Detalhes devem depender de abstrações”.
Com a Inversão de Dependência, conseguimos desacoplar nossas classes de bibliotecas específicas e fazer com que outras ferramentas possam ser utilizadas no lugar desta primeira. Assim, as classes utilizarão abstrações de interfaces ao invés de outras classes ou de instâncias objetos.
Exemplos:
Os códigos abaixo estão em Typescript, é o mais próximo de JS possível, mas permite entender melhor certas coisas que em JS passariam batidas como classe abstrata e/ou interface.
Não utilizando o Princípio da Inversão de Dependência:
public class Interruptor
{
private Ventilador _ventilador;
public void Acionar()
{
if(!_ventilador.Ligado)
_ventilador.Ligar();
else
_ventilador.Desligar();
}
}
public class Ventilador
{
public bool Ligado {get; set; }
public void Ligar() { ... }
public void Desligar() { ... }
}
No exemplo, podemos perceber que além de quebrar outros princípios do SOLID, a classe concreta Interruptor depende de uma outra classe concreta (Ventilador).
O Interruptor deveria ser capaz de acionar qualquer dispositivo independente de ser um ventilador uma lâmpada ou até mesmo um carro.
Utilizando o Princípio da Inversão de Dependência:
interface IDispositivo
{
bool Ligado { get; set; }
void Acionar();
void Ligar();
void Desligar();
}
public class Ventilador : IDispositivo
{
public bool Ligado { get; set; }
public void Acionar ()
{
if (!this.Ligado)
this.Ligar();
else
this.Desligar();
}
public void Ligar() { ... }
public void Desligar() { ... }
}
public class Lampada : IDispositivo
{
public bool Ligado { get; set; }
public void Acionar ()
{
if (!this.Ligado)
this.Ligar();
else
this.Desligar();
}
public void Ligar() { ... }
public void Desligar() { ... }
}
public class Interruptor
{
private readonly IDispositivo _dispositivo;
public void AcionarDispositivo()
{
_dispositivo.Acionar();
}
}
Atividade 5
*/