-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsolid.ts
96 lines (80 loc) · 2.64 KB
/
solid.ts
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
/**
* Exemplo prático de SOLID
*
* Contextualização: obter desconto de um pedido
* de acordo com o modo de pagamento
*/
/**
* Respeita o princípio SRP, pois a classe
* só tem a finalidade de retornar o desconto.
*
* Respeita o princípio OCP, já que não é necessário
* modificar as classes existentes caso surga um método
* novo de pagamento, basta apenas criar uma nova classe.
*
* Respeita o princípio LSP, porque é possível utilizar no
* método execute qualquer classe com a implementação da
* interface PaymentMethod que ele vai continuar funcionando
* corretamente.
*
* Respeita o princípio DIP, porque a classe CalculateOrderDiscount
* está recebendo a dependência como parâmetro, ele recebe uma classe
* com a função a ser executada, nenhum import ou criação de classe foi
* realizado dentro da classe CalculateOrderDiscount.
*
* Em relação ao princípio ISP, caso a aplicação expanda para receber
* os dados de um cartão de crédito/débito, poderia ser criada uma
* interface Card com esses atributos e as classes Credit e Debit
* implementaria mais essa interface Card, dessa forma respeitando
* o princípio ISP.
*/
interface PaymentMethod {
getDiscountAmout: (amount: number) => number;
}
class Billet implements PaymentMethod {
getDiscountAmout(amount: number): number {
return amount * 0.1;
}
}
class Credit implements PaymentMethod {
private installments: number;
constructor(installments: number) {
this.installments = installments
}
getDiscountAmout(amount: number): number {
if (this.installments == 1) {
return amount * 0.1;
}
if (this.installments <= 6) {
return amount * 0.02;
}
return 0;
}
}
class Debit implements PaymentMethod {
getDiscountAmout(amount: number): number {
return amount * 0.05;
}
}
class CalculateOrderDiscount {
private paymentMethod: PaymentMethod;
// DIP - Recebe a dependência
constructor(paymentMethod: PaymentMethod) {
this.paymentMethod = paymentMethod;
}
public execute(amount: number) {
return this.paymentMethod.getDiscountAmout(amount);
}
}
const calculateOrderDiscount = new CalculateOrderDiscount(new Credit(6));
calculateOrderDiscount.execute(2000);
// Nova classe respeitando OCP
class Pix implements PaymentMethod {
getDiscountAmout(amount: number): number {
return amount * 0.15;
}
}
// LSP - troca da dependência Credit para Pix
const calculateOrderDiscount_2 = new CalculateOrderDiscount(new Pix);
// Método ainda funciona corretamente
calculateOrderDiscount_2.execute(2000);