Bueno, mucho tiempo llevaba sin escribir aquí, y no por falta de ganas, precisamente.

Lo normal es que hable de desarrollo web, que es lo que más me gusta, pero en la universidad estamos con C a saco, y si de algo me doy cuenta, es que hay cosas que independientemente del lenguaje, son universales. Hago este post como recopilación personal de los aspectos que más importancia tienen en mi opinión como programador.

Como siempre, estoy abierto a la discusión, rectificación o adición de cosas

Organización

Un código bien organizado es más fácil de leer, usar y mantener.

Una de las cosas que me ha enseñado haber «empezado a programar de cero» (en clase no me dejaban usar ni una mísera función, por el hecho de que no lo habíamos dado), es de la importancia que tiene organizar tu código.

Tener organizado el código significa:

Que no se repita

Esto a los guiris les encanta llamarlo DRY (Don’t Repeat Yourself). Para hacer el código más mantenible lo ideal es que cada instrucción sólo se repita una vez, y así sólo habrá que cambiarla una vez, entenderla una vez… y sobre todo, programarla una vez.

Si te encuentras con esto:

int main(void) {
	// Lo ideal sería que la array en este caso fuera dinámica, pero es un ejemplo...
	int v[12];
	size_t length;
	printf("Introduce cuántos números vas a meter (máximo 12):");
	do {
		scanf("%u", &length);
		if ( length > 12 ) {
			printf("Dimensión nó válida, ha de ser menor o igual a 12, repite:");
		} else {
			break;
		}
	} while(1);
}

Te habrás fijado que el valor 12 aparece escrito a mano cuatro veces. El día que queramos permitir 14 elementos nos tocará cambiarlo las cuatro veces.

Este caso es muy simple, la repetición de valores (al igual que en CSS pasa con los colores, tamaños…), y se puede solucionar con una constante:

#define DIM 12
int main(void) {
	// Lo ideal sería que la array en este caso fuera dinámica, pero es un ejemplo...
	int vector[DIM];
	size_t length;
	printf("Introduce cuántos números vas a meter (máximo %d):", DIM);
	do {
		scanf("%u", &length);
		if ( length > DIM ) {
			printf("Dimensión nó válida, ha de ser menor o igual a %d, repite:", DIM);
		} else {
			break;
		}
	} while(1);
}

A lo que voy

Estoy oxidado con esto de escribir y me voy por las ramas…

Todos los lenguajes de programación tienen formas de no repetir instrucciones y valores: constantes, variables, funciones, clases… Como programador debes de tratar de abstraerte lo máximo posible para que tu código sea mucho más polivalente y legible.

Separa y reutiliza

Cuando me encuentro con el código fuente de úna página/aplicación y me doy de bruces con un archivo de 2000 líneas de texto, no puedo hacer otra cosa que llorar…

Por tu bien y el del resto de personas que lean tu código, lo mejor que puedes hacer es separar tu lógica de tu ejecución. Así, podrás reutilizar tu código lógico, y tu código principal, el de ejecución, será mucho más visible y legible.

Llama a tus variables con nombres descriptivos

Cuando digo variables también digo funciones/clases/constantes…

No hay nada como encontrarse un código así:

function at($array) {
	foreach($array as $i) {
		// ...
	}
}

No cuesta nada poner nombres descriptivos a las variables para así facilitar al que lo lee su comprensión:

function purchase($products) {
	foreach($products as $product) {
		// ...
	}
}

Indenta tu código

Sea cual sea la forma que escojas para indentar (tabulación, 2 espacios, 4 espacios…), úsala, y sobre todo sé consistente.

Documentación

Es muy importante saber el uso que hay que darle a un método/función, o lo que almacena una variable. Esto es incluso más importante en los lenguajes con tipos de datos dinámicos (JavaScript/PHP…).

Por lo general no debería ser necesario leer toda la función interna para saber qué tenemos que pasar:

var sendGetRequest = function(url, params, callback) {
	var xhr = new XMLHttpRequest();
	// ...
}

Deberíamos pasar un objeto a params? O tal vez valga sólo con pasar la query string via una cadena? Tal vez soporte ambas?

/**
 * Sends an ajax GET request to a url
 * @param {String} url the target url
 * @param {Object|String} params the GET parameters either in string ("a=1&b=3") or object format ({a: 1, b: 3})
 * @param {Function} callback the success callback
 * @return {XMLHttpRequest}
 */
var sendGetRequest = function(url, params, callback) {
	var xhr = new XMLHttpRequest();
	// ...
	return xhr;
}

No dejes lugar a la duda!

Soy de esos a los que no les gusta ver código en C/JavaScript/PHP/cualquierlenguajedondelasllavesseanopcionales escrito de esta manera:

if( a == 5 )
	c = 2;
	b = 2;

Es posible que el que programó eso fuera consciente de que la variable b es independiente de la condición (y se hubiera equivocado al indentar), pero también es posible que quisiera decir:

if( a == 5 ) {
	c = 2;
	b = 2;
}

A mí este tipo de confusiones no me gusta (pasa lo mismo cuando falta un break en un switch), y por eso no me gusta dejarme una sóla llave por poner.

Ésto es todo? No

Estoy seguro de que se me ha pasado alguna cosa, de ser así la pondré cuando me acuerde (con esta memoria… ). Si tenéis alguna aportación es siempre bienvenida, por mí no os cortéis