IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

A Enginyeria del Programari el terme refacció (el terme refactorització no és correcte en català) s'utilitza sovint per tal de descriure el procés de modificar el codi font d'una aplicació sense modificar el seu comportament.

De forma informal també s'anomena a aquest procés: neteja de codi.

La refacció es realitza sovint durant el desenvolupament de programari amb l'objectiu de millorar la consistència, l'organització, el disseny i la claredat del codi. Després de modificar el codi cal tornar a provar el codi per tal d'assegurar-nos que tot funcioni igual que abans de la modificació.

NOTA: Cal doncs destacar que la refacció no resol problemes o errors i que tampoc modifica el comportament o afegeix funcionalitat a una aplicació

El terme es va crear per analogia amb la factorització de números i polinomis. Per exemple, X2-1 pot ser refaccionat com a (x + 1)(x − 1) relevant una estructura interna que no era visible anteriorment (el polinomi té 2 arrels, -1 i 1). La refacció fa quelcom similar ja que facilita la comprensió de l'estructura interna del codi.

Objectius

  • Millorar la llegibilitat del codi
  • Reduir la complexitat
  • Millorar la mantenibilitat de l'aplicació
  • Millorar la extensibilitat de l'aplicació

Exemples de refactorització

Canviar el nom d'una variable o mètode/funció per expressar millor la seva utilitat

Suposeu un codi com el següent:

$i= "5%";

A priori sense més informació costa saber quin és l'objectiu de la variable i. Per exemple, si sabem que es tracta d'un tipus d'interès bancari podem millora el codi amb:

$tipus_interes= "5%";

Objectiu:

  • Millorar la llegibilitat del codi

Crear funcions o mètodes (Extract Method)

És un dels processos de refactorització més habituals. Consisteix en moure/extreure un tros de codi per tal de crear una nova funció o mètode.

Objectiu

  • Fer el codi més reusable.
  • Evitar duplicitat de codi, codi més lleuger.
  • Millorar la consistència. És més fàcil/ràpid corregir un error a una funció que no pas a múltiples trossos de codi similar o equivalents.

Modificar el model de dades

Vegeu el següent exemple, que converteix un dada persona (pot ser un objecte o un altre estructura de dades) amb dades més o menys complexes, en dos estructures de dades més senzilles.

Persona-ref.png

Objectiu

  • Fer el codi més reusable.
  • Més fàcil de llegir

Programació orientada a objectes

Encapsulate Field - Forçar l'ús de mètodes get i set

Generalize Type - Crear un tipus de dades més genèric

Es tracta de redefinir un tipus de dada per tal de fer-la més genèrica i d'aquesta manera millorar la seva reusabilitat.

Aquest tipus de refactorització és possible en llenguatges orientats a objecte que suporten polimorfisme.

Pull Up - Moure un mètode o camp a una superclasse

S'utilitza quan s'identifica que el mètode o el camp d'un objecte pot ser utilitzar per altres objectes germans (és a dir altres objectes que comparteixen pare amb l'objecte).

Push Down - Moure un mètode o camp a una subclasse

Tasks

Task Tasks. Eclipse. TODO

SQL, PHP i Heredocs

Observeu el següent codi:

<?php
print "<html><head>";
print "<title>sample</title>";
print "</head>";
print "<body><p>List of photo table:</p>";
print "<table>\n";

$connection = mysql_connect("some_host", "some_user",
                            "some_password");
$the_db = mysql_select_db("our_db", $connection);
$result = mysql_query("SELECT collection_id,collection_dir,title,description, cover_photo_id FROM collection ORDER BY collection_dir ASC;");
while ($current_line = 	mysql_fetch_assoc($result)) {
    print "<tr>\n";
    foreach ($current_line as $cur_field) {
        print "<td>$cur_field</td>\n";
    }
    print "</tr>\n";
}
print "</table>";

...etc...

?>

Aquest codi barreja en un mateix fitxer codi SQL, codi PHP i codi HTML. Un embolic... No hi ha separació entre presentació, model i controlador. A més imagineu que heu de treballar en equip:

  • Un dissenyador web expert en HTML/CSS
  • Un desenvolupador PHP
  • L'especialista en base de dades

Aquest tipus de fitxer o ajuda a desenvolupar en equip...

Els heredocs poden ajudar a fer més llegible el codi:

$sql_list_collections =<<<EOD
SELECT collection_id,collection_dir,title,description, cover_photo_id
FROM collection
ORDER BY collection_dir ASC;
EOD;

Es poden utilitzar variables dins del heredoc:

$sql_insert_photo =<<<EndSQL
INSERT INTO collection (title, major_category, subcategory,
                       location, event_date, collection_dir)
        VALUES ('{$VALS['title']}',  '{$VALS['major_cat']}',
               '{$VALS['subcat']}', '{$VALS['location']}',
               '{$VALS['date']}',   '{$VALS['unique_path']}');
EndSQL;

En aquest cas un array associatiu que conté els valors a inserir a la base de dades.

Plantilles

Eclipse

ES poden definir a:

Window → Preferences → PHP → Editor → Templates

NOTA: En el cas de PHP. Cada llenguatge té les seves plantilles. Podeu cercar templates a les preferències

Cada plantilla té un nom. Per a utilitzar-les podem escriure el nom (o part del nom) en qualsevol lloc del codi font i utilitzar autocompletion:

CTRL + SPACE 

Per exemple proveu amb

class  CTRL + SPACE 

I escolliu la plantilla class.


Llicència

Un exemple:

/*
* Poseu aquí el nom de l'aplicació - URL
* Copyright (c) ${year}, Autor
* 
* This library is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at your option)
* any later version.
* 
* This library is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
* details.
* 
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
* http://www.fsf.org/licensing/licenses/lgpl.txt
*/

Més concret...:

/*
 * webfaltes - https://sourceforge.net/projects/webfaltes/
 * Copyright (c) ${year}, Sergi Tur Badenas _Carles Anyo
 * Coautors: 
 *
 * This library is free software; you can redistribute it and/or modify it under
 * the terms of the GNU Lesser General Public License as published by the Free
 * Software Foundation; either version 2.1 of the License, or (at your option)
 * any later version.
 * 
 * This library is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
 * details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with this library; if not, write to the Free Software Foundation, Inc.,
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
 * http://www.fsf.org/licensing/licenses/lgpl.txt
 */

Amb PHPDocs i Subversion:

/**
 * Project:     Webfaltes: LAMP application to check class attendance.
 * File:        file
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * For questions, help, comments, discussion, etc., please join the
 * webfaltes mailing list:
 * [email protected]
 * https://lists.sourceforge.net/lists/listinfo/webfaltes-users
 *
 * @link https://sourceforge.net/projects/webfaltes/
 * @copyright 2009-2010 Sergi Tur Badenas, Carles Anyo
 * @author Sergi Tur <sergi dot tur at upc dot edu>
 * @author Carles Anyo
 * @package webfaltes
 * @version 0.1
 */
 /* $Id$ */

Llenguatges de programació

PHP

Refactoring amb PHPStorm

[[[PHPStorm]]

Eines web/ Continuos Integration

Recursos

Jbrains trivia

$ git clone https://github.com/jbrains/trivia.git

Recursos:


Tècniques/Patrons de refactorització

https://laracasts.com/series/whip-monstrous-code-into-shape

Recursos:

Vegeu també