Complex classes like XML 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 XML, and based on these observations, apply Extract Interface, too.
1 | <?php |
||
35 | class XML extends \DomDocument |
||
36 | { |
||
37 | |||
38 | /** |
||
39 | * Constructor de la clase XML |
||
40 | * @param version Versión del documento XML |
||
41 | * @param encoding Codificación del documento XML |
||
42 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
43 | * @version 2015-08-05 |
||
44 | */ |
||
45 | public function __construct($version = '1.0', $encoding = 'ISO-8859-1') |
||
50 | |||
51 | /** |
||
52 | * Método que genera nodos XML a partir de un arreglo |
||
53 | * @param data Arreglo con los datos que se usarán para generar XML |
||
54 | * @param namespace Arreglo con el espacio de nombres para el XML que se generará (URI y prefijo) |
||
55 | * @param parent DOMElement padre para los elementos, o =null para que sea la raíz |
||
56 | * @return Objeto \sasco\LibreDTE\XML |
||
57 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
58 | * @version 2017-10-22 |
||
59 | */ |
||
60 | public function generate(array $data, array $namespace = null, \DOMElement &$parent = null) |
||
112 | |||
113 | /** |
||
114 | * Método que sanitiza los valores que son asignados a los tags del XML |
||
115 | * @param txt String que que se asignará como valor al nodo XML |
||
116 | * @return String sanitizado |
||
117 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
118 | * @version 2015-09-02 |
||
119 | */ |
||
120 | private function sanitize($txt) |
||
140 | |||
141 | /** |
||
142 | * Método que carga un string XML en el Objeto |
||
143 | * @param source String con el documento XML a cargar |
||
144 | * @param options Opciones para la carga del XML |
||
145 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
146 | * @version 2016-11-21 |
||
147 | */ |
||
148 | public function loadXML($source, $options = null) |
||
162 | |||
163 | /** |
||
164 | * Método para realizar consultas XPATH al documento XML |
||
165 | * @param expression Expresión XPath a ejecutar |
||
166 | * @return DOMNodeList |
||
167 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
168 | * @version 2015-08-05 |
||
169 | */ |
||
170 | public function xpath($expression) |
||
174 | |||
175 | /** |
||
176 | * Método que entrega el código XML aplanado y con la codificación que |
||
177 | * corresponde |
||
178 | * @param xpath XPath para consulta al XML y extraer sólo una parte |
||
179 | * @return String con código XML aplanado |
||
180 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
181 | * @version 2017-01-20 |
||
182 | */ |
||
183 | public function getFlattened($xpath = null) |
||
199 | |||
200 | /** |
||
201 | * Método que codifica el string como ISO-8859-1 si es que fue pasado como |
||
202 | * UTF-8 |
||
203 | * @param string String en UTF-8 o ISO-8859-1 |
||
204 | * @return String en ISO-8859-1 |
||
205 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
206 | * @version 2016-04-03 |
||
207 | */ |
||
208 | private function utf2iso($string) |
||
212 | |||
213 | /** |
||
214 | * Método que codifica el string como UTF-8 si es que fue pasado como |
||
215 | * ISO-8859-1 |
||
216 | * @param string String en UTF-8 o ISO-8859-1 |
||
217 | * @return String en ISO-8859-1 |
||
218 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
219 | * @version 2016-04-03 |
||
220 | */ |
||
221 | private function iso2utf($string) |
||
226 | |||
227 | /** |
||
228 | * Método que convierte el XML a un arreglo |
||
229 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
230 | * @version 2016-06-11 |
||
231 | */ |
||
232 | public function toArray(\DOMElement $dom = null, array &$array = null, $arregloNodos = false) |
||
282 | |||
283 | /** |
||
284 | * Método que cuenta los nodos con el mismo nombre hijos deun DOMElement |
||
285 | * No sirve usar: $dom->getElementsByTagName($tagName)->length ya que esto |
||
286 | * entrega todos los nodos con el nombre, sean hijos, nietos, etc. |
||
287 | * @return Cantidad de nodos hijos con el mismo nombre en el DOMElement |
||
288 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
289 | * @version 2015-09-07 |
||
290 | */ |
||
291 | private function countTwins(\DOMElement $dom, $tagName) |
||
300 | |||
301 | /** |
||
302 | * Método que entrega los errores de libxml que pueden existir |
||
303 | * @return Arreglo con los errores XML que han ocurrido |
||
304 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
305 | * @version 2015-09-18 |
||
306 | */ |
||
307 | public function getErrors() |
||
314 | |||
315 | /** |
||
316 | * Método que entrega el nombre del tag raíz del XML |
||
317 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
318 | * @version 2015-12-14 |
||
319 | */ |
||
320 | public function getName() |
||
324 | |||
325 | /** |
||
326 | * Método que entrega el nombre del archivo del schema del XML |
||
327 | * @return Nombre del schema o bien =false si no se encontró |
||
328 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
329 | * @version 2015-12-14 |
||
330 | */ |
||
331 | public function getSchema() |
||
339 | |||
340 | /** |
||
341 | * Wrapper para saveXML() y corregir entities |
||
342 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
343 | * @version 2017-01-20 |
||
344 | */ |
||
345 | public function saveXML(\DOMNode $node = null, $options = null) |
||
351 | |||
352 | /** |
||
353 | * Wrapper para C14N() y corregir entities |
||
354 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
355 | * @version 2017-01-20 |
||
356 | */ |
||
357 | public function C14N($exclusive = null, $with_comments = null, array $xpath = null, array $ns_prefixes = null) |
||
363 | |||
364 | /** |
||
365 | * Método que corrige las entities ' (') y " (") ya que el SII no |
||
366 | * respeta el estándar y las requiere convertidas |
||
367 | * @author Esteban De La Fuente Rubio, DeLaF (esteban[at]sasco.cl) |
||
368 | * @version 2017-01-20 |
||
369 | */ |
||
370 | private function fixEntities($xml) |
||
389 | |||
390 | } |
||
391 |
The PSR-1: Basic Coding Standard recommends that a file should either introduce new symbols, that is classes, functions, constants or similar, or have side effects. Side effects are anything that executes logic, like for example printing output, changing ini settings or writing to a file.
The idea behind this recommendation is that merely auto-loading a class should not change the state of an application. It also promotes a cleaner style of programming and makes your code less prone to errors, because the logic is not spread out all over the place.
To learn more about the PSR-1, please see the PHP-FIG site on the PSR-1.