Complex classes like Pagamento often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Pagamento, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
33 | class Pagamento implements Node |
||
|
|||
34 | { |
||
35 | /** |
||
36 | * Indicador da forma de pagamento: 0 – pagamento à vista; 1 – pagamento à |
||
37 | * prazo. |
||
38 | */ |
||
39 | const INDICADOR_AVISTA = 'avista'; |
||
40 | const INDICADOR_APRAZO = 'aprazo'; |
||
41 | |||
42 | /** |
||
43 | * Forma de Pagamento:01-Dinheiro;02-Cheque;03-Cartão de Crédito;04-Cartão |
||
44 | * de Débito;05-Crédito Loja;10-Vale Alimentação;11-Vale Refeição;12-Vale |
||
45 | * Presente;13-Vale Combustível;99 - Outros |
||
46 | */ |
||
47 | const FORMA_DINHEIRO = 'dinheiro'; |
||
48 | const FORMA_CHEQUE = 'cheque'; |
||
49 | const FORMA_CREDITO = 'credito'; |
||
50 | const FORMA_DEBITO = 'debito'; |
||
51 | const FORMA_CREDIARIO = 'crediario'; |
||
52 | const FORMA_ALIMENTACAO = 'alimentacao'; |
||
53 | const FORMA_REFEICAO = 'refeicao'; |
||
54 | const FORMA_PRESENTE = 'presente'; |
||
55 | const FORMA_COMBUSTIVEL = 'combustivel'; |
||
56 | const FORMA_OUTROS = 'outros'; |
||
57 | |||
58 | /** |
||
59 | * Bandeira da operadora de cartão de crédito/débito:01–Visa; |
||
60 | * 02–Mastercard; 03–American Express; 04–Sorocred; 99–Outros |
||
61 | */ |
||
62 | const BANDEIRA_VISA = 'visa'; |
||
63 | const BANDEIRA_MASTERCARD = 'mastercard'; |
||
64 | const BANDEIRA_AMEX = 'amex'; |
||
65 | const BANDEIRA_SOROCRED = 'sorocred'; |
||
66 | const BANDEIRA_OUTROS = 'outros'; |
||
67 | |||
68 | /** |
||
69 | * Indicador da forma de pagamento: 0 – pagamento à vista; 1 – pagamento à |
||
70 | * prazo. |
||
71 | */ |
||
72 | private $indicador; |
||
73 | private $forma; |
||
74 | private $valor; |
||
75 | private $integrado; |
||
76 | private $credenciadora; |
||
77 | private $autorizacao; |
||
78 | private $bandeira; |
||
79 | |||
80 | 41 | public function __construct($pagamento = []) |
|
84 | |||
85 | /** |
||
86 | * Indicador da forma de pagamento: 0 – pagamento à vista; 1 – pagamento à |
||
87 | * prazo. |
||
88 | * @param boolean $normalize informa se o indicador deve estar no formato do XML |
||
89 | * @return mixed indicador da Nota |
||
90 | */ |
||
91 | 39 | public function getIndicador($normalize = false) |
|
92 | { |
||
93 | 39 | if (!$normalize) { |
|
94 | 39 | return $this->indicador; |
|
95 | } |
||
96 | 1 | switch ($this->indicador) { |
|
97 | 1 | case self::INDICADOR_AVISTA: |
|
98 | 1 | return '0'; |
|
99 | 1 | case self::INDICADOR_APRAZO: |
|
100 | 1 | return '1'; |
|
101 | } |
||
102 | 1 | return $this->indicador; |
|
103 | } |
||
104 | |||
105 | /** |
||
106 | * Altera o valor do Indicador para o informado no parâmetro |
||
107 | * @param mixed $indicador novo valor para Indicador |
||
108 | * @return Nota A própria instância da classe |
||
109 | */ |
||
110 | 41 | public function setIndicador($indicador) |
|
111 | { |
||
112 | switch ($indicador) { |
||
113 | 41 | case '0': |
|
114 | 1 | $indicador = self::INDICADOR_AVISTA; |
|
115 | 1 | break; |
|
116 | 41 | case '1': |
|
117 | 1 | $indicador = self::INDICADOR_APRAZO; |
|
118 | 1 | break; |
|
119 | } |
||
120 | 41 | $this->indicador = $indicador; |
|
121 | 41 | return $this; |
|
122 | } |
||
123 | |||
124 | /** |
||
125 | * Forma de Pagamento:01-Dinheiro;02-Cheque;03-Cartão de Crédito;04-Cartão |
||
126 | * de Débito;05-Crédito Loja;10-Vale Alimentação;11-Vale Refeição;12-Vale |
||
127 | * Presente;13-Vale Combustível;99 - Outros |
||
128 | */ |
||
129 | 38 | public function getForma($normalize = false) |
|
158 | |||
159 | 41 | public function setForma($forma) |
|
196 | |||
197 | /** |
||
198 | * Valor do Pagamento |
||
199 | */ |
||
200 | 39 | public function getValor($normalize = false) |
|
207 | |||
208 | 41 | public function setValor($valor) |
|
214 | |||
215 | /** |
||
216 | * Tipo de Integração do processo de pagamento com o sistema de automação |
||
217 | * da empresa/1=Pagamento integrado com o sistema de automação da empresa |
||
218 | * Ex. equipamento TEF , Comercio Eletronico 2=Pagamento não integrado com |
||
219 | * o sistema de automação da empresa Ex: equipamento POS |
||
220 | */ |
||
221 | 37 | public function getIntegrado($normalize = false) |
|
228 | |||
229 | /** |
||
230 | * Tipo de Integração do processo de pagamento com o sistema de automação |
||
231 | * da empresa/1=Pagamento integrado com o sistema de automação da empresa |
||
232 | * Ex. equipamento TEF , Comercio Eletronico 2=Pagamento não integrado com |
||
233 | * o sistema de automação da empresa Ex: equipamento POS |
||
234 | */ |
||
235 | 35 | public function isIntegrado() |
|
239 | |||
240 | 41 | public function setIntegrado($integrado) |
|
248 | |||
249 | /** |
||
250 | * CNPJ da credenciadora de cartão de crédito/débito |
||
251 | */ |
||
252 | 37 | public function getCredenciadora($normalize = false) |
|
259 | |||
260 | 41 | public function setCredenciadora($credenciadora) |
|
265 | |||
266 | /** |
||
267 | * Número de autorização da operação cartão de crédito/débito |
||
268 | */ |
||
269 | 11 | public function getAutorizacao($normalize = false) |
|
276 | |||
277 | 41 | public function setAutorizacao($autorizacao) |
|
282 | |||
283 | /** |
||
284 | * Bandeira da operadora de cartão de crédito/débito:01–Visa; |
||
285 | * 02–Mastercard; 03–American Express; 04–Sorocred; 99–Outros |
||
286 | */ |
||
287 | 37 | public function getBandeira($normalize = false) |
|
306 | |||
307 | 41 | public function setBandeira($bandeira) |
|
329 | |||
330 | /** |
||
331 | * Informa se o pagamento é em cartão |
||
332 | */ |
||
333 | 37 | public function isCartao() |
|
337 | |||
338 | 10 | public function toArray($recursive = false) |
|
350 | |||
351 | 41 | public function fromArray($pagamento = []) |
|
395 | |||
396 | 39 | public function getNode($name = null) |
|
427 | |||
428 | 31 | public function loadNode($element, $name = null) |
|
486 | } |
||
487 |
The class complexity is the sum of the complexity of all methods. A very high value is usually an indication that your class does not follow the single reponsibility principle and does more than one job.
Some resources for further reading:
You can also find more detailed suggestions for refactoring in the “Code” section of your repository.