Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.
Common duplication problems, and corresponding solutions are:
Complex classes like Folios 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 Folios, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
31 | class Folios |
||
32 | { |
||
33 | |||
34 | private $xml; ///< Objeto XML que representa el CAF |
||
35 | |||
36 | /** |
||
37 | * Constructor de la clase |
||
38 | * @param xml Datos XML del código de autorización de folios (CAF) |
||
39 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
40 | * @version 2016-11-21 |
||
41 | */ |
||
42 | public function __construct($xml) |
||
54 | |||
55 | /** |
||
56 | * Método que verifica el código de autorización de folios |
||
57 | * @return =true si está ok el XML cargado |
||
58 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
59 | * @version 2015-10-30 |
||
60 | */ |
||
61 | public function check() |
||
103 | |||
104 | /** |
||
105 | * Método que entrega el nodo CAF |
||
106 | * @return DomElement |
||
107 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
108 | * @version 2015-10-30 |
||
109 | */ |
||
110 | public function getCaf() |
||
118 | |||
119 | /** |
||
120 | * Método que entrega el RUT de a quién se está autorizando el CAF |
||
121 | * @return Rut del emisor del CAF |
||
122 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
123 | * @version 2015-10-30 |
||
124 | */ |
||
125 | public function getEmisor() |
||
133 | |||
134 | /** |
||
135 | * Método que entrega el primer folio autorizado en el CAF |
||
136 | * @return Número del primer folio |
||
137 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
138 | * @version 2015-10-30 |
||
139 | */ |
||
140 | public function getDesde() |
||
148 | |||
149 | /** |
||
150 | * Método que entrega el últimmo folio autorizado en el CAF |
||
151 | * @return Número del último folio |
||
152 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
153 | * @version 2015-10-30 |
||
154 | */ |
||
155 | public function getHasta() |
||
163 | |||
164 | /** |
||
165 | * Método que entrega la firma del SII sobre el nodo DA |
||
166 | * @return Firma en base64 |
||
167 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
168 | * @version 2015-10-30 |
||
169 | */ |
||
170 | View Code Duplication | private function getFirma() |
|
178 | |||
179 | /** |
||
180 | * Método que entrega el IDK (serial number) de la clave pública del SII |
||
181 | * utilizada para firmar el CAF |
||
182 | * @return Serial number |
||
183 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
184 | * @version 2015-10-30 |
||
185 | */ |
||
186 | View Code Duplication | private function getIDK() |
|
194 | |||
195 | /** |
||
196 | * Método que entrega la clave privada proporcionada por el SII para el CAF |
||
197 | * @return Clave privada en base64 |
||
198 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
199 | * @version 2015-10-30 |
||
200 | */ |
||
201 | public function getPrivateKey() |
||
209 | |||
210 | /** |
||
211 | * Método que entrega la clave pública proporcionada por el SII para el CAF |
||
212 | * @return Clave pública en base64 |
||
213 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
214 | * @version 2015-10-30 |
||
215 | */ |
||
216 | public function getPublicKey() |
||
224 | |||
225 | /** |
||
226 | * Método que entrega el tipo de DTE para el cual se emitió el CAF |
||
227 | * @return Código de tipo de DTE |
||
228 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
229 | * @version 2015-10-30 |
||
230 | */ |
||
231 | public function getTipo() |
||
239 | |||
240 | /** |
||
241 | * Método que entrega la fecha de autorización con la que se emitió el CAF |
||
242 | * @return Fecha de autorización del CAF |
||
243 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
244 | * @version 2017-07-19 |
||
245 | */ |
||
246 | public function getFechaAutorizacion() |
||
254 | |||
255 | /** |
||
256 | * Método que indica si el CAF es de certificación o no |
||
257 | * @return =true si los folios son del ambiente de certificación, =null si no se pudo determinar |
||
258 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
259 | * @version 2015-10-30 |
||
260 | */ |
||
261 | public function getCertificacion() |
||
266 | |||
267 | /** |
||
268 | * Método que indica si el CAF está o no vigente |
||
269 | * @return =true si el CAF está vigente, =false si no está vigente |
||
270 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
271 | * @version 2018-03-20 |
||
272 | */ |
||
273 | public function vigente() |
||
283 | |||
284 | /** |
||
285 | * Método que entrega el XML completo del archivo CAF |
||
286 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
287 | * @version 2016-08-24 |
||
288 | */ |
||
289 | public function saveXML() |
||
293 | |||
294 | } |
||
295 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.