Tips para codificar de manera correcta

Creado por   el 2017-01-29 08:08:30



Con toda seguridad muchos todos nosotros hemos visto en algún foro o grupo de Facebook, a más de un usuario pidiendo ayuda sobre algún error en su código, esto no tiene nada de raro, pero cuando vemos el código :nolocreo: pasamos de largo porque ni siquiera se toman la molestia de purgar el código para aislar el problema sino que copian y pegan todo el código que muchas veces contiene un revoltijo de PHP, MySQL, HTML, Etc; también es común toparse con una captura de pantalla que apenas es legible y en texto plano sin resaltado de sintaxis.

Como si esto fuera poco no documentan el código, tampoco respetan ningún tipo de convención de nombres y no utilizan una notación adecuada.

Pero para ser justos hay que recordar que inicialmente todos cometimos este tipo de errores, por esta razón este artículo tiene la pretensión de ser una guía rápida que oriente a los programadores que aún se encuentran en su etapa de formación, para que no sigan pasando estos errores por alto.

1 - Documentar adecuadamente

Una buena práctica, es ir documentando el código a media que este se va generando, aunque en la práctica esto pocas veces se hace porque generalmente el tiempo es acotado y documentar toma algo de tiempo, pero en la medida de lo posible es aconsejable tomarse un tiempo para hacerlo, no nos olvidemos que la memoria es frágil.

"Ley de Alzheimer de la programación: si lees un código que escribiste hace más de dos semanas es como si lo vieras por primera vez"
-- Via Dan Hurvitz

Existen muchas herramientas que nos ayudan a realizar este proceso como por ejemplo phpDocumentor http://www.phpdoc.org/ que es una herramienta que hace posible la generación de la documentación directamente desde el código fuente de PHP.

La gran ventaja de documentar el código es que este será más fácil de entender y mantener.
"El buen código es su mejor documentación"
-- Steve McConnell


2- Respetar convenciones de codificación

Es importante reconocer que cada lenguaje utiliza sus propias convenciones aunque la diferencia entre uno y otros no son muy relevantes.
Algunas de las convenciones utilizadas en PHP son:

Variables -> $small_caps
Variables de objetos -> $Object
Contantes -> ALL_CAPS_AND_UNDERSCORES
Clases -> UpperCamelCase
Metodos -> lowerCamelCase
Namespace / Package -> small_caps

- Las llaves {} van abajo solo en las clases y métodos, para ningún caso más.

- Los atributos y métodos privados deben llevar delante “_” (estándar Zend), por ejemplo: $_nombre, _hacerAlgo()

- Los atributos deben iniciar siempre en minúsculas, igual que los métodos

Para las funciones el estándar aceptado es lowerCamelCase aunque personalmente prefiero utilizar la nomenclatura nativa de PHP.

- function comprobar_algo()

La idea no es convertirse en un radical fundamentalista de la codificación, lo importante es tener siempre presente que el propósito de todo esto es la legibilidad y facilidad de uso.

Se recomienda seguir los estándares de codificación de PSR-2 http://www.php-fig.org/psr/

3- Identacion y estilos de código

En los lenguajes de programación de computadoras, la indentación es un tipo de notación secundaria utilizado para mejorar la legibilidad del código fuente por parte de los programadores, teniendo en cuenta que los compiladores o intérpretes raramente consideran los espacios en blanco entre las sentencias de un programa.

https://es.wikipedia.org/wiki/Indentaci%C3%B3n

Código sin identar
code: php
for ($i = 0; $i < 10; $i++) {
for ($j = 0; $j < 10; $j++) {
echo "i=$i, j=$j<br />";
}
}

Código identado
code: php
for ($i = 0; $i < 10; $i++) {
for ($j = 0; $j < 10; $j++) {
echo "i=$i, j=$j<br />";
}
}

Además de la legibilidad del código la identacion resulta muy útil para visualizar los niveles de anidamiento.

Un código bien formateado es muy importante y ayuda a la comprensión del mismo, la mayoría de los editores de texto como Sublimetext o Notepad++ permiten formatear el código de manera automática, ahora si esas un IDE como Netbeans esto se logra fácilmente con la combinación de teclas shift + alt + f, incluso es posible establecer reglas de formato.


Además existen algunos estilos de codificación reconocidos a nivel global pero la adopción de uno u otro dependerá exclusivamente de cada programador.

K&R style
code: php
<?php
function saludar() {
for ($i = 1; $i < 12; $i++) {
echo "hola mundo!<br />";
}
}

Allman style
code: php
<?php
function saludar()
{
for ($i = 1; $i < 12; $i++)
{
echo "hola mundo!<br />";
}
}

Whitesmiths style
code: php
<?php
function saludar()
{
for ($i = 1; $i < 12; $i++)
{
echo "hola mundo!<br />";
}
}

GNU style
code: php
<?php
function saludar()
{
for ($i = 1; $i < 12; $i++)
{
echo "hola mundo!<br />";
}
}

Puedes ver mas informacion sobre este tema en la Wikipedia
https://en.wikipedia.org/wiki/Indent_style

Personalmente me gusta utilizar el estilo Allman aunque utilice más líneas de código.

4 - Evitar el código espagueti

De acuerdo a mi entender este es uno de los puntos más importantes debido a la gran cantidad de programadores que haciendo mal uso del lenguaje terminan generando código espagueti, el cual básicamente se caracteriza por tener una estructura compleja e incomprensible.
Sumado a lo anterior existen una serie de malas prácticas como el excesivo uso de la función require(), no utilizar los namespace, mezclar código HTML, MySQL y PHP.

El código spaguetti parece retorcido y enmarañado como el bol epónimo de spaghetti; seguir el trayecto de una sola hebra a lo largo de la totalidad es extremadamente difícil.
https://es.wikipedia.org/wiki/C%C3%B3digo_espagueti

Como sabemos PHP es un lenguaje de programación poco restrictivo, por lo que es posible comenzar a desarrollar sin tener los conocimientos propios de un desarrollador experimentado que maneja conceptos más avanzados como la programación orientada a objetos, arquitectura de capas, patrones de diseño, modelo de negocios, etc.

Solo me queda recomendarles el libro Código Limpio de Robert C. Martin.

Saludos!

Debugar PHP con Xdebug y Netbeans

Creado por   el 2015-04-12 14:11:19



Sabemos que PHP es un lenguaje interpretado que se ejecuta del lado del servidor, por lo tanto de manera predeterminada no contamos con una consola que nos ayude en la tarea de depuración para corregir los errores que se puedan producir, es aquí donde entra Xdebug.

Xdebug es una herramienta que nos permite depurar el código sobre el que estamos trabajando, puedes buscar más información en su página oficial http://xdebug.org/docs/

Para activar las funciones xdebug, hay que modificar unos parámetros del archivo php.ini
C:\xampp\php

La configuracion debe quedar de esta manera.


Reiniciamos el servicio apache, comprobamos que todo ha quedado bien a través de un phpinfo()



En este momento PHP tiene activado el módulo Xdebug ahora vamos a configurar el IDE Netbeans para debugar el código sobre el que estemos trabajando.
En la pestaña Tools->Options->PHP



Como implementar Xdebug en nuestros proyectos PHP usando el IDE Netbeans?
Lo primero que debemos hacer es crear un nuevo proyecto, para este tutorial lo llamaremos debug




code: php
<?php

$d = 20;
$r = $d/2;
$h = 50;
$pi = pi();

$vol = $pi * pow($r, 2) * $h;

echo "EL volumen de un cilindro de diametro $d y alto $h, es $vol";
?>



Como podemos ver en la línea 10 tenemos un breakpoint y el flujo del script se detiene en esa línea sin interpretarla.
Y en todas las líneas anteriores el IDE nos ofrece información del valor actual de las variables, etc.

La clase Vista, usando MVC en PHP

Creado por   el 2014-06-05 22:35:10



Primero que todo devemos tener claro que es MVC.
El modelo–vista–controlador (MVC) es un patrón de arquitectura de software que separa los datos y la lógica de negocio de una aplicación de la interfaz de usuario y el módulo encargado de gestionar los eventos y las comunicaciones. Para ello MVC propone la construcción de tres componentes distintos que son el modelo, la vista y el controlador, es decir, por un lado define componentes para la representación de la información, y por otro lado para la interacción del usuario1 2 . Este patrón de arquitectura de software se basa en las ideas de reutilización de código y la separación de conceptos, características que buscan facilitar la tarea de desarrollo de aplicaciones y su posterior mantenimiento3 4 .

La clase Vista que no es otra cosa que un contenedor de las vistas o codigo HTML agrupandolas en secciones que se corresponden a las designadas en el layout hasta que sea propicio volcarlas en el cliente.

view.php
code: php
<?php
/**
* Esta obra está licenciada bajo la Licencia Creative
* Commons Atribución-CompartirIgual 4.0 Internacional.
* @license http://creativecommons.org/licenses/by-sa/4.0/deed.es_CL
* @author Richard Collao Olivares <http://www.richardcollao.cl>
*/

abstract class View
{
# Ruta donde se encuantras las vistas.
private static $_path_view;

# Este array contiene las distintas vistas agrupadas segun la seccion dentro del layout.
private static $_container;

# Nombre del layout, que por defecto es default
private static $_layout;

# Extencion usada para los archivos que contienen las vistas ejemplo .phtml o .php;
private static $_ext = '.php';


/**
* Inicializa la clase y establece la ruta donde se encuentran alojadas las vistas.
* $path_view, ruta donde se encuentran las vistas.
* $layout, establece el layout que mostrara la pagina por defecto su valor es default.
*/
public static function initialize($path_view, $layout = 'default')
{
self::$_container = array();
self::$_path_view = $path_view;
self::$_layout = $layout;
}

/**
* Captura las vistas, y las devuelve como un string.
* $file contiene el nombre del archivo o vista y $data los parametros que se le pasan a la vista.
*/
private static function _capture($file, $data)
{
ob_start();
require (self::$_path_view . $file . self::$_ext);
$view = ob_get_contents();
ob_end_clean();
return $view;
}

/**
* Si el archivo se recibe con la extencion que es opcional, esta se remueve.
*/
private static function _removeExtention($file)
{
if(substr($file, - strlen(self::$_ext)) == self::$_ext)
$file = substr($file, 0, strlen($file) - strlen(self::$_ext));
return $file;
}

/**
* Guarda la vista en un array contenerdor cuyo indice sera el nombre del archivo o $alias si es definido,
* ejemplo View::keep('head_1.phtml', $data, $alias = 'head')
*/
public static function keep($file, $data = array(), $alias = NULL)
{
# Si el archivo vista es enviado con la extencion esta sera removida;
$file = self::_removeExtention($file);

# Captura la vista.
$view = self::_capture($file, $data);

# Si no hay un alias toma el nombre del archivo.
empty($alias) ? $key = $file : $key = $alias;

# Guarda la vista en el contenedor.
self::$_container[$key][] = $view . PHP_EOL;
}

/**
* Devuelve el contenido de la vista como una cadena.
* ejemplo $footer = View::extract('footer.php', $data)
*/
public static function extract($file, $data)
{
$file = self::_removeExtention($file);
return self::_capture($file, $data);
}

/**
* Almacena una vista desde un string en un contenedor(el contenedor es compartido con el metodo keep)
* tambien se puede guardar una vista obtenida por extract() por lo que es posible hacer cambios sobre la marcha.
* ejemplo: View::insert(str_replace('&', '&', $footer), $alias)
*/
public static function insert($string, $alias, $important = FALSE)
{
if(empty(self::$_container[$alias]))
self::$_container[$alias] = array();

if ($important === FALSE)
self::$_container[$alias][] = $string;
else
array_unshift (self::$_container[$alias], $string);
}

/**
* Recupera el contenido de una vista que se ha almacenado previamente por los metodos keep o insert
* Al igual que el metodo extract devuelve un string.
* ejemplo echo View::show('head');
*/
public static function show($view)
{
if(key_exists($view, self::$_container))
return implode('', self::$_container[$view]);
}

/**
* Cambia el layout por defecto.
*/
public static function setLayout($layout)
{
$layout = self::_removeExtention($layout);
self::$_layout = $layout;
}

/**
* Muestra la pagina mediante el layout establecido, el cual volcara las vistas de forma organizada.
* Importante:la extencion del layout siempre debe ser .php ya que este invocara el metodo show de esta clase.
*/
public static function callLayout()
{
require (self::$_path_view . 'layouts' . DIRECTORY_SEPARATOR . self::$_layout . '.php');
}
}

?>

Clase BBCode

Creado por   el 2014-01-31 16:35:05



He visto en algunos foros a mas de un usuario preguntando como implementar codigo BBCode en sus proyectos, por esta razon publico esta clase para que tengan un ejemplo de como implementar esta util herramienta que nos permite añdir funcionalidad a nuestros proyectos.
La clase es bastante sencilla pero tambien muy facil de implementar, ademas podran añadirle nuevas mejoras segun sus necesidades.

code: php
class BBCode {
private $_bbcodes = array(
'type1' => array(
'spoiler' => array(
'html' => '<div class="spoiler_container"><div class="spoiler_bar"><input class="i_button" type="button" value="spoiler +" onclick="toogleSpoiler(this);" /></div><div class="spoiler_content">$1</div></div>',
'pattern' => '#\[spoiler](.*?)\[\/spoiler]#is'),
'cite' => array(
'html' => '<div class="cite"><div class="bgclose">$1</div></div>',
'pattern' => '#\[cite](.*?)\[\/cite]#is'),
'shell' => array(
'html' => '<div class="shell">$1</div>',
'pattern' => '#\[shell](.*?)\[\/shell]#is'),
'box' => array(
'html' => '<div class="box">$1</div>',
'pattern' => '#\[box](.*?)\[\/box]#is'),
'text' => array(
'html' => '<div class="text">$1</div>',
'pattern' => '#\[text](.*?)\[\/text]#is'),
'bold' => array(
'html' => '<b>$1</b>',
'pattern' => '#\(.*?)\[\/b]#is'),
'italic' => array(
'html' => '<i>$1</i>',
'pattern' => '#\[i](.*?)\[\/i]#is'),
'underline' => array(
'html' => '<u>$1</u>',
'pattern' => '#\[u](.*?)\[\/u]#is'),
'strike' => array(
'html' => '<strike>$1</strike>',
'pattern' => '#\[strike](.*?)\[\/strike]#is'),
'left' => array(
'html' => '<div style="text-align:left;">$1</div>',
'pattern' => '#\[left](.*?)\[\/left]#is'),
'center' => array(
'html' => '<div style="text-align:center;">$1</div>',
'pattern' => '#\[center](.*?)\[\/center]#is'),
'right' => array(
'html' => '<div style="text-align:right;">$1</div>',
'pattern' => '#\[right](.*?)\[\/right]#is'),
'img' => array(
'html' => '<img style="max-width: 100%" src="$1" alt=""/>',
'pattern' => '#\[img](.*?[\.jpg|\.gif|\.png])\[\/img]#is'),
'url' => array(
'html' => '<a href="$1">$1</a>',
'pattern' => '#\[url](.*?)\[\/url]#is'),
'youtube' => array(
'html' => '<iframe width="640" height="360" src="//www.youtube.com/embed/$1?feature=player_detailpage" frameborder="0" allowfullscreen></iframe>',
'pattern' => '#\[youtube].*\?v=(.*?)\[\/youtube]#is'),
'vimeo' => array(
'html' => '<iframe src="http://player.vimeo.com/video/$1" width="640" height="360" frameborder="0"></iframe>',
'pattern' => '#\[vimeo](.*?)\[\/vimeo]#is')
),
'type2' => array(
'url' => array(
'html' => '<a href="$1">$2</a>',
'pattern' => '#\[url=(.*?)](.*?)\[\/url]#is'),
'size' => array(
'html' => '<font size="$1">$2</font>',
'pattern' => '#\[size=([1-6])\](.*?)\[\/size]#is'),
'color' => array(
'html' => '<font color="$1">$2</font>',
'pattern' => '#\[color=(\#[0-9a-fA-F]{3,6})\](.*?)\[\/color]#is'),
'quote' => array(
'html' => '<div class="quote">Publicado por:$1<br />$2</div>',
'pattern' => '#\[quote=([0-9]{1,6})\](.*?)\[\/quote]#is'),
'code' => array(
'html' => '<div class="code"><b>code: $1</b><pre class="container_code"><code class="$1">$2</code></pre></div>',
'pattern' => '#\[code=(sql|html|css|js|php)](.*?)\[\/code]#is')
)
);

public function toHtml($content) {
$content = htmlentities($content, ENT_QUOTES, 'UTF-8');

$content = $this->replaceBbcodesType1($content);
$content = $this->replaceBbcodesType2($content);
$content = str_replace("\r", '<br />', $content);
# Evita un salto de linea si esta despues de un div de cierre.
$content = str_replace("</div><br />", '</div>', $content);
return $content;
}

/**
* tipo 1 bbocdes simples sin parametros del tipo [b]hola mundo!

*/
public function replaceBbcodesType1($content) {
foreach ($this->_bbcodes['type1'] as $key => $bbcode) {
while (preg_match_all($bbcode['pattern'], $content, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
$full = $match[0]; # Devuelve todo el patron "hola mundo!"
$expr = $match[1]; # Devuelve la coincidencia del match "hola mundo!"

$newhtml = str_ireplace('$1', $expr, $bbcode['html']);
$content = str_ireplace($full, $newhtml, $content);
}
}
}
return $content;
}

/**
* tipo 2 bbocdes simples con parametros del tipo hola mundo!
*/
public function replaceBbcodesType2($content) {
foreach ($this->_bbcodes['type2'] as $key => $bbcode) {
while (preg_match_all($bbcode['pattern'], $content, $matches, PREG_SET_ORDER)) {
foreach ($matches as $match) {
$full = $match[0]; # Devuelve todo el patron "hola mundo!"
$param = $match[1]; # Devuelve la coincidencia del 1er match "#0000FF"
$expr = $match[2]; # Devuelve la coincidencia del 2do match "hola mundo!"
if ($key === 'code') {
$expr = trim($expr);
} // Evita que se creen lineas sin codigo al comienzo y al final.
$newhtml = str_ireplace('$1', $param, $bbcode['html']);
$newhtml = str_ireplace('$2', $expr, $newhtml);
$content = str_ireplace($full, $newhtml, $content);
}
}
}
return $content;
}
}

Ejemplo:
code: php
$bbcode = new BBCode();
$result = $bbcode->convert('[b]Hola mundo[ /b]');
echo $result;
obtendremos:
<b>Hola mundo</b>
Servidor Web más utilizado, con mayor número de instalaciones a nivel mundial, es un proyecto de código abierto y uso gratuito, multiplataforma.
Conjunto de datos de un mismo contexto y almacenados sistemáticamente para su posterior uso.
Lenguajes que hacen referencia al codigo de marcado para la elaboración de páginas web.
Potente lenguaje de programación orientado a objetos, independiente del sistema operativo.
Lenguaje interpretado orientado a objetos desarrollado por Netscape que se utiliza en millones de páginas web y aplicaciones de servidor en todo el mundo
Sistema operativo de software libre inspirado en el sistema Unix, escrito por Linus Torvalds con la ayuda de miles de programadores en Internet
El modelado 3D es el proceso de desarrollo de una representación matemática de cualquier objeto tridimensional a través de un software especializado. Al producto se le llama modelo 3D
Lenguaje de programación principalmente orientado al desarrollo web, su código es ejecutado del lado del servidor.
Todo lo que no sea trabajo, solo temas recreativos para divertirse.