Migliorare il codice Javascript: indentazione, spazi, tabulazione, a capo e formattazioni

Scritto il 29 Maggio 2008
Nella categoria Guide, Javascript | 1 commento
Tag: , , , , ,

Solitamente scrivo io il codice che devo poi mantenere, ma capita di prendere altri programmi oppure semplicemente di voler curiosare; o anche di aver scritto un po’ di righe velocemente, senza prestare troppa attenzione e poi volerle espandere. In tutti questi casi il codice scritto deve essere ben indentato e formattato.

Codice

Immagine di dermiller

Per indentazione si intende l’uso degli spazi bianchi o della tabulazione, per allineare il codice in base al flusso e alle strutture del linguaggio come blocchi o istruzioni di controllo. Per parlare chiaro, questo è codice indentato.

if (condizione == true)
    esegui();
else
    exit;

Questo è indentato con gli spazi (nel numero di 4), questo metodo di scrittura rende più semplice la lettura del codice, perché seguire il flusso logico del codice è più semplice, diventa chiaro che esegui dipende dalla condizione precedente.

if (condizione == true)
esegui();
else
exit;

Questo codice sopra è chiaramente molto meno semplice da leggere, è necessario sforzarsi molto di più per capire come funziona.

Indentazione

Alcuni editor hanno già in loro la funzionalità per “rendere bello” il nostro codice, strumenti chiamati solitamente auto-indenter, ma io non mi sono mai trovato bene, poi ognuno usa il suo e difficilmente cambierà per una funzione simile, almeno io non lo farei. Per questo vi consiglio questo tool: Online beautifuller. Ha proprio questa funzione, tutto con un unico click, inoltre utilizza il io stesso stile di indentazione, a volte chiamato K&R, dal nome dei famosi Kernighan e Ritchie, inventori del C. La scelta tra spazi e tabulazione è lasciata all’utente.

Formattazione

Un altro strumento utile, da utilizzare successivamente è Online syntax highlighting. Questo formatta in codice, lo colora in particolare, in modo da evidenziare le parole chiave, quasi tutti gli editor lo fanno già da loro, se il tuo non lo fa, ti consiglio di cambiarlo :P

Codice evidenziato

La sua utilità principale è per chi intende pubblicare codice online, perché fornisce l’HTML da inserire nelle pagine. Ricordarsi sempre di selezionare Javascript a sinistra, altrimenti non funzionerà benissimo!

Minimizzare e compattare

Ultime note su come disfare il lavoro fatto, molte volte si rivela utile anche questo, ma solo in fase finale. Il codice Javascript non viene compilato, ma gira così come lo scriviamo, quindi sicuramente leggibile, ma non compatto, mentre le pagine web devono essere il più leggere possibili. Sono stati creati quindi questi strumenti che minimizzano e compattano il codice, fino al minimo indispensabile e anche oltre volendo (restringendo anche i nomi delle variabili per esempio).

JS Minifier: forse uno dei migliori, permette la scelta anche di quanto comprimere.

BrainJar: uno dei primi e ancora buoni, servizi simili.

Packer: semplice semplice, ma efficace.

PHP Packer: script in PHP, da usare anche in locale.

Lettere scombinate

Scritto il 3 Gennaio 2008
Nella categoria Javascript, Produzioni Proprie | Scrivi un commento
Tag: , ,

Nota: se non capisci niente o non vuoi fare fatica, alla fine trovi la traduzione

Gira ormai da tntissaimo tmepo la mial srctita tttua cmoe qeusto artoiclo cioè con le lterete di ogni polraa mhiicsate, eucslse la pmria e l’umlita. Ebenbe, gaizre alla REgexp per iavddiirune le poalre apenpa vsita e alla fonunize per msrhicaie un array, ho deciso di inrmlepamete un “misciothare” di prlaoe.


Traduzione:Gira ormai da tantissimo tempo la mail scritta tutta come questo articolo cioè con le lettere di ogni parola mischiate, escluse la prima e l’ultima. Ebbene, grazie alla RegExp per individuare le parole appena vista e alla funzione per mischiare un array, ho deciso di implementare un “mischiatore” di parole.

Parole (\w+) nelle regular expression

Scritto il 28 Dicembre 2007
Nella categoria Guide, Javascript | Scrivi un commento
Tag: , , ,

Funzione molto comoda nelle Regular Expression sono le i caratteri speciali, come \d per le cifre o \s per tutti i vari spazi. Utilissimo sarebbe il carattere \w, che identificherebbe le lettere (e quindi le parole), ma la specifica impone che trovi solo i caratteri latini base (da “A” a “Z” e da “a” a “z“) più i numeri, rendendo quindi inutile il mezzo per tutti gli alfabeti con caratteri accentati o in generale estesi. Per esempio la parola “perché” non contiene tutte \w in quanto la “é” non appartiene al range [A-Za-z0-9].

Fate qui sotto una prova, nell’output verrà estratta la prima “parola” cioè il primo blocco \w+

Input:

Output:
(generato tramite match(/\w+/) )Per ovviare a questo problema, mi sono sfogliato tutti i codici unicode e ho estratto il blocco esatto per i caratteri, che include quindi anche le lettere accentate e strane di ogni nazione.

[\w\u00C0-\u017F\u1e00-\u1ef9]

Sarebbe il blocco corrispettivo, cioè il classico \w più il resto delle lettere (per essere preciso il blocco Latin Extended Additional, il necessario da Latin-1 Supplement e Latin Extended-A ), ma magari è più utile

[A-Za-Z\u00C0-\u017F\u1e00-\u1ef9]

Che individua solo le lettere escludendo i numeri (che non capisco perché vengano inclusi). Eccone una prova

Input:

Output:
(generato tramite match(/[A-Za-z\u00C0-\u017F\u1e00-\u1ef9]+/) )
.

La delegazione di eventi

Scritto il 16 Agosto 2007
Nella categoria Guide, Javascript | Scrivi un commento
Tag: , ,

La delegazione di eventi è una tecnica Javascript/DOM che ho trovato utile in alcune occasioni, si tratta di non controllare ogni singolo nodo di cui ci interessa un evento, e monitorarne un altro nodo più in alto nella radice DOM.

Un esempio per chiarire: abbiamo una serie di campi input testuali, vogliamo controllare il cambiamento di tutti quanti; classicamente dovremmo attaccare un EventListener ad ognuno di essi (oppure aggiungere una proprietà onChange o simile). Beh invece si può attaccare un solo EventListener ad un elemento che contiene tutti i campi (come l’elemento “form” ad esempio).

Questo è possibile perché gli eventi si trasmettono attraverso l’albero dei nodi, per maggiori informazioni a proposito (ma diventa piuttosto tecnico), si trovano sulla documentazione ufficiale DOM, sezione Eventi.

Potrebbe però diventare utile, a questo punto, scoprire qual’è l’elemento che ha generato l’evento, perché this farà riferimento al nodo a cui abbiamo aggiunto l’EventListener, non al campo testuale. Tra le proprietà dell’evento infatti c’è target oppure srcElement, dipende dal browser. Per essere sicuro che funzioni, io utilizzo il seguente codice: var element = e.target || e.srcElement;

[via HTML]

Mischiare un array: mix()

Scritto il 23 Aprile 2007
Nella categoria Javascript, Produzioni Proprie | Scrivi un commento
Tag: , , ,

Oggi altra funzione che potrebbe tornare utile: mix() che mischia un array in modo casuale; non mi addentro sul significato di casuale, dico soltanto che crea un array aggiungendo ogni volta un elemento preso a caso dall’array originale.

Array.prototype.mix = function() {
	var ret = new Array();
	while (this[0]) {
		ret.push(
			this.splice(
				parseInt(Math.random()*this.length),
				1)[0]
			)
	}
	while (ret[0]) {
		this.push(ret.shift());
	}
	return this;
}

La funzione oltre che mischiare l’array lo restituisce, quindi potete subito agire sul risultato di mix().

Chiaramente è applicabile anche al di fuori di un array, basta che l’oggetto supporti push, pop e splice; inoltre con pochissimi cambiamenti potete renderla una funzione esterna, io preferisco però la programmazione ad oggetti e quindi la implemento come membro di una classe.

Non c’è molto altro da spiegare, viene sempre utile anche se avete una cosa da mischiare, per esempio un elenco di nomi (stringhe in generale). A me è servita proprio per mischiare un elenco di file, resi in array e poi mischiati ;)

Aggiungere e togliere Classi CSS: toggleClassName

Scritto il 23 Aprile 2007
Nella categoria Javascript, Produzioni Proprie | Scrivi un commento
Tag: , , ,

Oggi ho scritto la funzione ToggleClassName perchè la userò in una nuova edizione di Travian Più Più. Serve per aggiungere e togliere una classe CSS ad un elemento, chiaramente se è già presente la toglie, altrimenti la aggiunge.

Io l’ho implementata con Element.prototype chiaramente può essere fatta anche come funzione esterna, con piccoli cambiamenti.

Element.prototype.toggleClassName = function(className) {
	if ( (' '+this.className+' ').indexOf(' '+className+' ') > -1) {
		var str = ' '+this.className+' ';
		str = str.replace(new RegExp(' '+className));
		str = str.substr(1).substr(0,str.length-2);
		this.className = str;
		return false;
	} else {
		this.className += ' '+className;
		return true;
	}
}

Il grosso problema che ho dovuto affrontare è nel separatore spazio delle classi, quindi il codice non risulta snellissimo, per quelli interessati si può raggruppare le prime 4 righe dopo il primo if in una unica, ma a me non piace tantissimo e poi diventa una riga troppo lunga per essere visualizzata qui :P

Ultima annotazione, la funzione restituisce true se aggiunge, falsese toglie.