Complex classes like Total 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 Total, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
36 | class Total implements Node |
||
|
|||
37 | { |
||
38 | |||
39 | /** |
||
40 | * Valor Total dos produtos e serviços |
||
41 | */ |
||
42 | private $produtos; |
||
43 | /** |
||
44 | * Valor do Desconto |
||
45 | */ |
||
46 | private $desconto; |
||
47 | /** |
||
48 | * informar o valor do Seguro, o Seguro deve ser rateado entre os itens de |
||
49 | * produto |
||
50 | */ |
||
51 | private $seguro; |
||
52 | /** |
||
53 | * informar o valor do Frete, o Frete deve ser rateado entre os itens de |
||
54 | * produto. |
||
55 | */ |
||
56 | private $frete; |
||
57 | /** |
||
58 | * informar o valor de outras despesas acessórias do item de produto ou |
||
59 | * serviço |
||
60 | */ |
||
61 | private $despesas; |
||
62 | /** |
||
63 | * Valor estimado total de impostos federais, estaduais e municipais |
||
64 | */ |
||
65 | private $tributos; |
||
66 | /** |
||
67 | * Informações complementares de interesse do Contribuinte |
||
68 | */ |
||
69 | private $complemento; |
||
70 | |||
71 | /** |
||
72 | * Constroi uma instância de Total vazia |
||
73 | * @param array $total Array contendo dados do Total |
||
74 | */ |
||
75 | 29 | public function __construct($total = array()) |
|
79 | |||
80 | /** |
||
81 | * Valor Total dos produtos e serviços |
||
82 | * @param boolean $normalize informa se o produtos deve estar no formato do XML |
||
83 | * @return mixed produtos do Total |
||
84 | */ |
||
85 | 30 | public function getProdutos($normalize = false) |
|
92 | |||
93 | /** |
||
94 | * Altera o valor do Produtos para o informado no parâmetro |
||
95 | * @param mixed $produtos novo valor para Produtos |
||
96 | * @return Total A própria instância da classe |
||
97 | */ |
||
98 | 33 | public function setProdutos($produtos) |
|
99 | { |
||
100 | 33 | if (trim($produtos) != '') { |
|
101 | 30 | $produtos = floatval($produtos); |
|
102 | 30 | } |
|
103 | 33 | $this->produtos = $produtos; |
|
104 | 33 | return $this; |
|
105 | } |
||
106 | |||
107 | /** |
||
108 | * Valor do Desconto |
||
109 | * @param boolean $normalize informa se o desconto deve estar no formato do XML |
||
110 | * @return mixed desconto do Total |
||
111 | */ |
||
112 | 30 | public function getDesconto($normalize = false) |
|
119 | |||
120 | /** |
||
121 | * Altera o valor do Desconto para o informado no parâmetro |
||
122 | * @param mixed $desconto novo valor para Desconto |
||
123 | * @return Total A própria instância da classe |
||
124 | */ |
||
125 | 33 | public function setDesconto($desconto) |
|
126 | { |
||
127 | 33 | if (trim($desconto) != '') { |
|
128 | 30 | $desconto = floatval($desconto); |
|
129 | 30 | } |
|
130 | 33 | $this->desconto = $desconto; |
|
131 | 33 | return $this; |
|
132 | } |
||
133 | |||
134 | /** |
||
135 | * informar o valor do Seguro, o Seguro deve ser rateado entre os itens de |
||
136 | * produto |
||
137 | * @param boolean $normalize informa se o seguro deve estar no formato do XML |
||
138 | * @return mixed seguro do Total |
||
139 | */ |
||
140 | 29 | public function getSeguro($normalize = false) |
|
147 | |||
148 | /** |
||
149 | * Altera o valor do Seguro para o informado no parâmetro |
||
150 | * @param mixed $seguro novo valor para Seguro |
||
151 | * @return Total A própria instância da classe |
||
152 | */ |
||
153 | 33 | public function setSeguro($seguro) |
|
154 | { |
||
155 | 33 | if (trim($seguro) != '') { |
|
156 | 30 | $seguro = floatval($seguro); |
|
157 | 30 | } |
|
158 | 33 | $this->seguro = $seguro; |
|
159 | 33 | return $this; |
|
160 | } |
||
161 | |||
162 | /** |
||
163 | * informar o valor do Frete, o Frete deve ser rateado entre os itens de |
||
164 | * produto. |
||
165 | * @param boolean $normalize informa se o frete deve estar no formato do XML |
||
166 | * @return mixed frete do Total |
||
167 | */ |
||
168 | 29 | public function getFrete($normalize = false) |
|
175 | |||
176 | /** |
||
177 | * Altera o valor do Frete para o informado no parâmetro |
||
178 | * @param mixed $frete novo valor para Frete |
||
179 | * @return Total A própria instância da classe |
||
180 | */ |
||
181 | 33 | public function setFrete($frete) |
|
182 | { |
||
183 | 33 | if (trim($frete) != '') { |
|
184 | 30 | $frete = floatval($frete); |
|
185 | 30 | } |
|
186 | 33 | $this->frete = $frete; |
|
187 | 33 | return $this; |
|
188 | } |
||
189 | |||
190 | /** |
||
191 | * informar o valor de outras despesas acessórias do item de produto ou |
||
192 | * serviço |
||
193 | * @param boolean $normalize informa se a despesas deve estar no formato do XML |
||
194 | * @return mixed despesas do Total |
||
195 | */ |
||
196 | 29 | public function getDespesas($normalize = false) |
|
203 | |||
204 | /** |
||
205 | * Altera o valor da Despesas para o informado no parâmetro |
||
206 | * @param mixed $despesas novo valor para Despesas |
||
207 | * @return Total A própria instância da classe |
||
208 | */ |
||
209 | 33 | public function setDespesas($despesas) |
|
210 | { |
||
211 | 33 | if (trim($despesas) != '') { |
|
212 | 30 | $despesas = floatval($despesas); |
|
213 | 30 | } |
|
214 | 33 | $this->despesas = $despesas; |
|
215 | 33 | return $this; |
|
216 | } |
||
217 | |||
218 | /** |
||
219 | * Valor estimado total de impostos federais, estaduais e municipais |
||
220 | * @param boolean $normalize informa se o tributos deve estar no formato do XML |
||
221 | * @return mixed tributos do Total |
||
222 | */ |
||
223 | 4 | public function getTributos($normalize = false) |
|
230 | |||
231 | /** |
||
232 | * Altera o valor do Tributos para o informado no parâmetro |
||
233 | * @param mixed $tributos novo valor para Tributos |
||
234 | * @return Total A própria instância da classe |
||
235 | */ |
||
236 | 33 | public function setTributos($tributos) |
|
237 | { |
||
238 | 33 | if (trim($tributos) != '') { |
|
239 | 30 | $tributos = floatval($tributos); |
|
240 | 30 | } |
|
241 | 33 | $this->tributos = $tributos; |
|
242 | 33 | return $this; |
|
243 | } |
||
244 | |||
245 | /** |
||
246 | * Informações complementares de interesse do Contribuinte |
||
247 | * @param boolean $normalize informa se o complemento deve estar no formato do XML |
||
248 | * @return mixed complemento do Total |
||
249 | */ |
||
250 | 4 | public function getComplemento($normalize = false) |
|
257 | |||
258 | /** |
||
259 | * Altera o valor do Complemento para o informado no parâmetro |
||
260 | * @param mixed $complemento novo valor para Complemento |
||
261 | * @return Total A própria instância da classe |
||
262 | */ |
||
263 | 33 | public function setComplemento($complemento) |
|
268 | |||
269 | /** |
||
270 | * Converte a instância da classe para um array de campos com valores |
||
271 | * @return array Array contendo todos os campos e valores da instância |
||
272 | */ |
||
273 | 4 | public function toArray($recursive = false) |
|
285 | |||
286 | /** |
||
287 | * Atribui os valores do array para a instância atual |
||
288 | * @param mixed $total Array ou instância de Total, para copiar os valores |
||
289 | * @return Total A própria instância da classe |
||
290 | */ |
||
291 | 33 | public function fromArray($total = array()) |
|
335 | |||
336 | /** |
||
337 | * Cria um nó XML do total de acordo com o leiaute da NFe |
||
338 | * @param string $name Nome do nó que será criado |
||
339 | * @return DOMElement Nó que contém todos os campos da classe |
||
340 | */ |
||
341 | public function getNode($name = null) |
||
366 | |||
367 | /** |
||
368 | * Carrega as informações do nó e preenche a instância da classe |
||
369 | * @param DOMElement $element Nó do xml com todos as tags dos campos |
||
370 | * @param string $name Nome do nó que será carregado |
||
371 | * @return DOMElement Instância do nó que foi carregado |
||
372 | */ |
||
373 | 27 | public function loadNode($element, $name = null) |
|
398 | } |
||
399 |
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.