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

2 pensamientos en “Conceptos básicos de programación independientes del lenguaje

  1. Imagen de RenzoRenzo el dijo:

    Veo que escribiste esto en el 2013, estuve buscando un formulario que adjunte archivos y el tuyo me sirvio y me sirve muchisimo. Le has agarrado gusto a la Programación por lo que veo y leo.

    Mis felicitaciones no son pocas !

    Saludos y que tengas muchos triunfos !

  2. Imagen de 3rn3st0 el dijo:

    Ameno e ilustrativo tu artículo. Te sugeriría tres puntos más…

    1. Documenta, documenta, documenta, documenta. Los caracteres especiales para comentarios se hicieron para usarlos. Si luego de algunas semanas y/o meses regresas a un código para modificarlo, te podrías encontrar conque pierdes valioso tiempo recordando que hacía la línea X o la función Y. Agregar comentarios inteligentes para guiarte a ti mismo o para que otros puedan usar tu código es siempre una buena práctica.
    2. Separa todo en pequeños bloques de código, no crees funciones “AiO”, terminan por convertirse en agujeros negros muy difíciles de depurar. Siempre es mejor el código modular que pueda reutilizarse y mezclarse entre si, que funciones y/o módulos gigantescos que podrían convertirse, con el tiempo, en elefantes blancos.
    3. Destrúyelo todo… al terminar. Muchos lenguajes hacen garbage collection, pero eso no significa que lo hagan bien. Muchas veces nuestras variables terminan por ensuciar la memoria de la PC, por ejemplo o podríamos terminar con un equipo donde los direccionamientos de memoria se conviertan en un enredo peor que el de Babel. Destruye los objetos, las variables y cualquier elemento que pueda ocupar memoria cuando finalices un módulo o cuando salgas de la aplicación. Tus usuarios y la RAM de sus equipos te lo agradecerán.
    4. Bueno, ha sido un placer leerte, saludos desde Venezuela

      NOTA: AiO = All in One

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Puedes usar las siguientes etiquetas y atributos HTML:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre data-language=""> <ul> <ol> <li>
Para poner código usa <pre data-language="[lenguaje]"><code>[código]</code></pre>, y no olvides escapar el HTMl.