<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Facilitant la web &#187; Bones pràctiques</title>
	<atom:link href="http://blog.facilitant.net/category/desenvolupament/bones-practiques/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.facilitant.net</link>
	<description>Recursos, consells i reflexions sobre el món de la web</description>
	<lastBuildDate>Tue, 02 Mar 2010 11:10:57 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Validacions de formularis: a client o a servidor?</title>
		<link>http://blog.facilitant.net/2010/02/11/validacions-de-formularis-a-client-o-a-servidor/</link>
		<comments>http://blog.facilitant.net/2010/02/11/validacions-de-formularis-a-client-o-a-servidor/#comments</comments>
		<pubDate>Thu, 11 Feb 2010 11:10:11 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Bones pràctiques]]></category>
		<category><![CDATA[Desenvolupament]]></category>
		<category><![CDATA[accessibilitat]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[usabilitat]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=211</guid>
		<description><![CDATA[Els que ens dediquem a sistemes client-servidor, més específicament, a sistemes basats en web,  sovint ens trobem amb la necessitat de construir formularis que executin accions a partir d&#8217;una entrada. És ben normal, que un client o un funcional proclami:


Vull que el número d&#8217;identificació sigui obligatori!
El correu electrònic ha d&#8217;estar en el format correcte!


O altres [...]]]></description>
			<content:encoded><![CDATA[<p>Els que ens dediquem a sistemes client-servidor, més específicament, a sistemes basats en web,  sovint ens trobem amb la necessitat de construir formularis que executin accions a partir d&#8217;una entrada. És ben normal, que un client o un funcional proclami:</p>
<blockquote>
<ul>
<li>Vull que el número d&#8217;identificació sigui obligatori!</li>
<li>El correu electrònic ha d&#8217;estar en el format correcte!</li>
</ul>
</blockquote>
<p>O altres típics requeriments que requereixin de fer una validació del formulari.</p>
<p>Davant d&#8217;aquest escenari, el primer que ens ve al cap és fer les validacions amb JavaScript a la capa client. Bé, no està malament. Fer les validacions a la capa de client, és ràpid en temps de computació, senzill (normalment) i proporciona una resposta ràpida a l&#8217;usuari, fet pel qual assegurem una bona experiència d&#8217;usuari mentre introduïm dades. Una de les primeres normes de la usabilitat a formularis és: com més aviat sàpiga l&#8217;usuari que s&#8217;ha equivocat, més aviat podrà reaccionar-hi (compte amb la interpretació d&#8217;aquesta frase <dfn title="De collita pròpia">made-by-me</dfn>!). Però mai hem d&#8217;acabar aquí!</p>
<p>Fer les validacions <strong>només</strong> a la capa client és una decisió completament errònia. On de debò s&#8217;han de fer aquestes comprovacions és a la capa servidor. Allà és on s&#8217;ha de mirar si cert camp existeix, si el format de tal camp és el correcte, de si la relació entre dos camps és correcta, etc. És a la capa servidor on tot aquest algorisme s&#8217;ha d&#8217;executar per prevenir qualsevol error que pugui tenir l&#8217;aplicació. És allà on s&#8217;executa la lògica de l&#8217;aplicació i on les validacions, com part d&#8217;aquesta lògica que són, s&#8217;han d&#8217;executar. Si només ho féssim a client, què passaria si no tinguéssim disponible el JavaScript? Quin seria el comportament de l&#8217;aplicació? Possiblement, acabéssim en un estat d&#8217;inconsistència no desitjat per ningú.</p>
<p>Sovint quan es planteja aquest argument (validacions dobles a capa client i servidor), molts <em>arquitectes </em>d&#8217;aplicacions (remarco la paraula perquè és el títol que es posen ells, no el que els hi posaria jo) posen el crit al cel i diuen la del porc argumentant que s&#8217;està fent una tasca dues vegades i que el rendiment de l&#8217;aplicació en general es veu ressentit. Si alguna vegada us trobeu davant d&#8217;això, només heu de dir:</p>
<blockquote><p>D&#8217;acord, llavors, les validacions que es facin només a la capa de servidor!</p></blockquote>
<p>Veureu com els hi canvia la cara <img src='http://blog.facilitant.net/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Cal tenir ben presents quines són les implicacions de deixar un processament de dades a una capa tan fràgil com pot ser un navegador, i la nostra tasca és argumentar i deixar ben clar el per què a client no és lloc per fer aquest tipus de processament.</p>
<p>Tingueu aquest consell sempre ben present perquè segur que al llarg de la vostra vida professional us caldrà utilitzar-lo més d&#8217;un cop.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2010/02/11/validacions-de-formularis-a-client-o-a-servidor/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Separar la forma del contingut (nom de les classes)</title>
		<link>http://blog.facilitant.net/2009/06/29/separar-la-forma-del-contingut-nom-de-les-classes/</link>
		<comments>http://blog.facilitant.net/2009/06/29/separar-la-forma-del-contingut-nom-de-les-classes/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 09:01:03 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Bones pràctiques]]></category>
		<category><![CDATA[Desenvolupament]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=136</guid>
		<description><![CDATA[Es ben sabut per tots els que ens dediquem a la programació d&#8217;interfícies web (també anomenats maquetadors o programadors front end) que cal tenir ben present que sempre s&#8217;ha de separar el document (HTML) de la seva presentació en un medi concret (CSS) i dels components amb comportament que pugui tenir (JavaScript). Així, és fàcil [...]]]></description>
			<content:encoded><![CDATA[<p>Es ben sabut per tots els que ens dediquem a la programació d&#8217;interfícies web (també anomenats maquetadors o programadors <span lang="en" xml:lang="en">front end</span>) que cal tenir ben present que sempre s&#8217;ha de separar el document (<acronym title="Hypertext Markup Language" xml:lang="en">HTML</acronym>) de la seva presentació en un medi concret (<acronym title="Cascading Style Sheets" xml:lang="en">CSS</acronym>) i dels components amb comportament que pugui tenir (JavaScript). Així, és fàcil veure que el següent fragment d&#8217;un document és completament incorrecte pel que fa a aquests cànons:</p>
<pre><code class="html">
&lt;div style="margin: 5px;"&gt;
    &lt;em&gt;Aquest contingut el vull en lletra cursiva&lt;/em&gt;
    &lt;small&gt;&lt;a onclick="window.location='/lipsum'" href="http://www.example.com"&gt;Lorem ipsum dolor&lt;/a&gt;&lt;/small&gt;
&lt;/div&gt;
</code></pre>
<p>Normalment la majoria de programadors som ben conscients de la incorrecció del fragment anterior, però sovint ens trobem incorreccions d&#8217;aquest tipus completament encobertes, i sempre seguint el mateix patró: el mal ús dels noms de classe dels elements.</p>
<p>Usaré exemples de la xarxa per a il·lustrar el que vull dir. Si anem a la portada de la pàgina d&#8217;una institució molt important del país podem trobar coses així (canvio els texts per centrar l&#8217;atenció):</p>
<pre><code class="html">
&lt;ul id="ul_home"&gt;
	&lt;li&gt;&lt;a class="vermell_nobullet_2" href="http://www.example.com"&gt;Ipse quat erimo&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a class="vermell_nobullet_2" href="http://www.example.com/dog"&gt;Sailer due rit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</code></pre>
<pre><code class="html">
&lt;div class="marge_superior"&gt;
    &lt;h2&gt;&lt;span id="actualitat" class="titol_seccio"&gt;Lorem ipsum&lt;/span&gt;&lt;/h2&gt;
&lt;/div&gt;
&lt;div id="altres_serveis" class="border_top"&gt;
    &lt;div class="border_bottom"&gt;
        &lt;a class="text_gris" href="http://www.example.com/bird"&gt;Dolor et sumum&lt;/a&gt;
    &lt;/div&gt;
&lt;/div&gt;
</code></pre>
<p>El valor de l&#8217;atribut <code class="html">@class</code> d&#8217;alguns dels elements ja ens dóna informació de com s&#8217;estilitzaran al veure-ho associat al seu full d&#8217;estils.</p>
<p>Però sovint no es veu tan fàcilment la incorrecció a l&#8217;assignació dels noms de les classes. Per exemple, és ben normal trobar-nos sempre al fragment de descripció de  l&#8217;organització d&#8217;un document, classes del tipus:</p>
<pre><code class="html">
&lt;body class="3-columnes"&gt;
    &lt;div class="columna-esquerra"&gt;
        Lorem ipsum
    &lt;/div&gt;
    &lt;div class="columna-central"&gt;
        Dolor set
    &lt;/div&gt;
    &lt;div class="columna-dreta"&gt;
        Icse et luopir
    &lt;/div&gt;
&lt;/body&gt;
</code></pre>
<p>Hi veieu res d&#8217;estrany? Per saber si les classes són reveladores de la forma final, només cal que us feu la següent pregunta: podríeu saber quina és la forma final de la pàgina només llegint l&#8217;<acronym title="Hypertext Markup Language" xml:lang="en">HTML</acronym>? Si la resposta és sí, les classes són errònies. Si és no, doncs la cosa ja està millor.</p>
<p>Per exemple, una forma correcte de fer la divisió del document podria ser:</p>
<pre><code class="html">
&lt;body class="layout-complet"&gt;
    &lt;div class="contingut-primari"&gt;
        Lorem ipsum
    &lt;/div&gt;
    &lt;div class="contingut-secundari"&gt;
        Dolor set
    &lt;/div&gt;
    &lt;div class="contingut-terciari"&gt;
        Icse et luopir
    &lt;/div&gt;
&lt;/body&gt;
</code></pre>
<p>Oi que ara ja no us espereu com serà el document final?</p>
<p>Per tant, cal anar amb compte a l&#8217;hora d&#8217;assignar els noms a les classes. Sempre cal tenir ben present de separar la forma o presentació del contingut i anar una mica amb peus de plom a l&#8217;hora de cercar els valors. Així aconseguirem que els nostres documents siguin 100% independents de la forma en que es visualitzen.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2009/06/29/separar-la-forma-del-contingut-nom-de-les-classes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amagar sense ocultar amb CSS</title>
		<link>http://blog.facilitant.net/2009/05/12/amagar-sense-ocultar-amb-css/</link>
		<comments>http://blog.facilitant.net/2009/05/12/amagar-sense-ocultar-amb-css/#comments</comments>
		<pubDate>Tue, 12 May 2009 18:48:39 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Bones pràctiques]]></category>
		<category><![CDATA[accessibilitat]]></category>
		<category><![CDATA[css]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=126</guid>
		<description><![CDATA[Sovint ens interessa amagar contingut de la nostra pàgina a l&#8217;ull humà com pot ser el cas dels menús per a saltar a continguts de la pàgina, en l&#8217;ús de tècniques de reemplaçament de contingut per imatges o per ocultar capçaleres o elements estructurals de la pàgina. És veritat que ens interessa amagar-ho de l&#8217;ull [...]]]></description>
			<content:encoded><![CDATA[<p>Sovint ens interessa amagar contingut de la nostra pàgina a l&#8217;ull humà com pot ser el cas dels menús per a saltar a continguts de la pàgina, en l&#8217;ús de tècniques de reemplaçament de contingut per imatges o per ocultar capçaleres o elements estructurals de la pàgina. És veritat que ens interessa amagar-ho de l&#8217;ull humà, però el que no volem de cap de les maneres, és amagar-ho dels lectors de pantalla.</p>
<h3>El típic error</h3>
<p>Si donem una volta per la xarxa, el que sovint trobem escrit i recomanat, és l&#8217;ús de la propietat <code class="css">display: none</code> per a ocultar elements. Amb això satisfem la nostra voluntat de que l&#8217;ull humà no percebi el contingut, però el problema és que sovint, els lectors de pantalla tampoc n&#8217;interpreten res.</p>
<p>Podríem dir que <code class="css">display: none</code> significa que l&#8217;element no existeix: ni es mostra, ni s&#8217;imprimeix, ni es llegeix el seu contingut.</p>
<h3>La solució</h3>
<p>Una tècnica alternativa que es pot considerar és la de posicionar l&#8217;element que volem amagar de forma absoluta fora del <span lang="en" xml:lang="en">viewport</span>. Així, l&#8217;element existeix però no es percep per l&#8217;ull humà. El <acronym title="Cascading Style Sheet" lang="en" xml:lang="en">CSS</acronym> que podem usar és:</p>
<pre><code class="css">.access {
    left: -9999px;
    position: absolute;
}</code></pre>
<p>Amb això aconseguim el mateix efecte visual però sense ignorar a una part dels usuaris.</p>
<p>Tot això no és pas invenció meva, sinó que és una adaptació d&#8217;<a hreflang="en" href="http://www.456bereastreet.com/archive/200905/hiding_with_css_problems_and_solutions/">un article</a> que vaig llegir fa uns dies.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2009/05/12/amagar-sense-ocultar-amb-css/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Arguments a favor i en contra de l&#8217;ús d&#8217;iframes</title>
		<link>http://blog.facilitant.net/2009/03/31/arguments-a-favor-i-en-contra-de-lus-diframes/</link>
		<comments>http://blog.facilitant.net/2009/03/31/arguments-a-favor-i-en-contra-de-lus-diframes/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 16:27:33 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Bones pràctiques]]></category>
		<category><![CDATA[Reflexions]]></category>
		<category><![CDATA[accessibilitat]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[iframe]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=113</guid>
		<description><![CDATA[Per temes de feina avui he hagut de fer un llistat d&#8217;arguments a favor i en contra de l&#8217;ús d&#8217;iframe en un desenvolupament web i m&#8217;he decidit a fer-la pública perquè tothom que vulgui pugui opinar-ne.
A favor

Integració d&#8217;aplicacions. Permet integrar aplicacions externes a dins de la nostra pàgina.
Disminució de peticions a servidor. Si tenim una [...]]]></description>
			<content:encoded><![CDATA[<p>Per temes de feina avui he hagut de fer un llistat d&#8217;arguments a favor i en contra de l&#8217;ús d&#8217;<code class="html">iframe</code> en un desenvolupament web i m&#8217;he decidit a fer-la pública perquè tothom que vulgui pugui opinar-ne.</p>
<h3>A favor</h3>
<ul>
<li><strong>Integració d&#8217;aplicacions.</strong> Permet integrar aplicacions externes a dins de la nostra pàgina.</li>
<li><strong>Disminució de peticions a servidor</strong>. Si tenim una part de la nostra pàgina que és costosa de construir (dins d&#8217;un entorn de pagines dinàmiques), podem posar-la dins d&#8217;un <code class="html">/iframe</code> fent que no s&#8217;hagi de refrescar cada cop que canviem de pàgina (seguint una mica el model del ja deprecat element <code class="html">/frame</code>).</li>
</ul>
<h3>En contra</h3>
<ul>
<li><strong>Forat negre.</strong> Al poder-hi posar tot el que vulguem, un <code class="html">/iframe</code> pot arribar a ser un problema de seguretat si no som nosaltres els creadors del seu contingut.</li>
<li><strong>Accessibilitat.</strong> Existeixen navegadors que no suporten l&#8217;ús de l&#8217;element <code class="html">iframe</code>.</li>
<li><strong>Lectors de pantalla. </strong>Hi ha navegadors que per defecte donen el focus al <code class="html">iframe</code> en el moment de carregar la pàgina. Això és un problema per a la correcta lectura del document pels lectors de pantalla.</li>
<li><strong>Cercadors. </strong>Les aranyes dels cercadors no saben navegar correctament per les pàgines que usen marcs. Per tant, pot ser que el nostre lloc no sigui correctament indexat.</li>
<li><strong>Estructura del contingut.</strong> L&#8217;ús de l&#8217;element <code class="html">iframe</code> trenca l&#8217;estructura lògica del contingut de la pàgina.</li>
<li><strong>Gran confusió al interactuar amb el navegador.</strong> Diverses interaccions de l&#8217;usuari amb el navegador es veuen greument modificades per l&#8217;ús de l&#8217;element <code class="html">iframe</code> en una pàgina:
<ul>
<li><strong>URL.</strong> La URL que es veu al navegador no és sovint la que correspon a la d&#8217;una pàgina creada amb marcs: si anem navegant dins del marc, la URL del navegador no canvia, però en canvi, la de la pàgina que estem veient sí que &#8220;ha canviat&#8221;.</li>
<li><strong>Adreces d&#8217;interès.</strong> Lligat amb el punt anterior, si volem desar l&#8217;adreça de la plana, la que desarem serà la que es veu al navegador. Al tornar-hi veurem  que no és pas la mateixa plana que havíem desat (haurem perdut la navegació dins del marc). Tot i que hi ha navegadors que ens donen la possibilitat d&#8217;esbrinar l&#8217;adreça d&#8217;un marc, pot ser que l&#8217;usuari sigui no especialitzat i per tant, no sàpiga de l&#8217;existència d&#8217;aquesta possibilitat. Igualment, un usuari de la plana no ha de saber com està feta la pàgina, i per tant, saber com ha de fer-s&#8217;ho per desar l&#8217;enllaç  &#8220;correcte&#8221; a la plana en qüestió.</li>
<li><strong>Resultats d&#8217;una cerca.</strong> Si accedim a una pàgina feta amb marcs des d&#8217;un resultat d&#8217;un cercador extern, pot dur-nos a una adreça  &#8220;incorrecte&#8221;: podem anara a l&#8217;adreça d&#8217;un marc, on veurem el contingut d&#8217;aquest però sense el contingut del seu &#8220;pare&#8221;.</li>
</ul>
</li>
<li><strong>Alçada fixa.</strong> Un <code class="html">iframe</code> té alçada fixa, i per tant, pot ser que ens aparegui una barra de desplaçament lateral en cas que el contingut ocupi més espai del reservat per l&#8217;atribut <code class="html">@height</code> del marc.</li>
</ul>
<h3>Alternatives</h3>
<p>En cas que usem marcs només per temes estètics no tenim excusa per abandonar-los, ja que el seu aspecte es pot replicar 100% amb <acronym title="Cascading Style Sheets" xml:lang="en">CSS</acronym>.</p>
<p>Si usem marcs per tal de poder deixar una part de la nostra pàgina fixa mentre fem <span lang="en" xml:lang="en">scroll</span> de la pàgina, podem usar la propietat <code class="css">position: fixed</code> de <acronym title="Cascading Style Sheets" xml:lang="en">CSS</acronym> tal i com s&#8217;explica en aquest <a hreflang="en" href="http://www.w3.org/Style/Examples/007/menus.html">article</a>.</p>
<p>En canvi, si el que volem és que cert contingut de la pàgina tingui una barra lateral per poder navegar dins seu, podem usar la propietat <code class="css">overflow</code> tal i com s&#8217;explica en aquest altre <a hreflang="en" href="http://www.quirksmode.org/css/overflow.html">article</a>.</p>
<h3>Conclusions</h3>
<p>A data d&#8217;avui, i a no ser que sigui algun motiu de rendiment o d&#8217;integració, l&#8217;ús de marcs no està justificat en un inici, ja que provoca més desavantatges que no pas avantatges. Sovint la necessitat d&#8217;aquest element recau més per un tema gràfic que no pas per un tema funcional, cosa que com ja hem vist, es pot resoldre amb l&#8217;ús de fulls d&#8217;estils.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2009/03/31/arguments-a-favor-i-en-contra-de-lus-diframes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Àmbit d&#8217;una variable a javascript</title>
		<link>http://blog.facilitant.net/2009/01/13/ambit-duna-variables-a-javascript/</link>
		<comments>http://blog.facilitant.net/2009/01/13/ambit-duna-variables-a-javascript/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 16:12:25 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Bones pràctiques]]></category>
		<category><![CDATA[Desenvolupament]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=74</guid>
		<description><![CDATA[L&#8217;àmbit d&#8217;una variable es pot definir com l&#8217;àrea del programa en que aquesta és visible i accessible.
Com a la majoria de llenguatges de programació, en javascript pots declarar una variable com a global, definida en tot l&#8217;àmbit del codi javascript, o com a local, definida només dins de l&#8217;àmbit de la funció que la defineix.
var [...]]]></description>
			<content:encoded><![CDATA[<p>L&#8217;àmbit d&#8217;una variable es pot definir com l&#8217;àrea del programa en que aquesta és visible i accessible.</p>
<p>Com a la majoria de llenguatges de programació, en javascript pots declarar una variable com a global, definida en tot l&#8217;àmbit del codi javascript, o com a local, definida només dins de l&#8217;àmbit de la funció que la defineix.</p>
<pre><code class="javascript">var a = 0;        // variable global
function foo() {
  var b = 1;      // variable local
}
</code></pre>
<p>Cal tenir sempre en compte que una variable local sempre té precedència davant d&#8217;una variable global, és a dir, si una paràmetre d&#8217;una funció o una variable declarada dins del seu àmbit té el mateix nom que una variable global, aquesta darrera queda <em>oculta</em> per la nova declaració.</p>
<pre><code class="javascript">var ambit = 'global';    // Declarem una variable global
function foo() {
  var ambit = 'local';   // Declarem una variable local
  document.write(ambit); // Usem la variable local
}
foo();                   // Imprimeix 'local'
</code></pre>
<p>Fins aquí tot força senzill, no? Però si us fixeu, encara no he dit res sobre la paraula reservada <code class="javascript">var</code>.</p>
<p>Javascript ens deixa usar variables sense haver-les de definir amb la paraula <code class="javascript">var</code>, però què passa si no ho fem? Doncs bé, si l&#8217;interpretador troba que s&#8217;està assignant un valor en una variable que no està declarada, la declara com a global i llavors li assigna el valor. Llavors cal tenir en compte que sempre que vulguem declarar una variable local, hem d&#8217;usar <code class="javascript">var</code>.</p>
<pre><code class="javascript">ambit = 'global';              // Declarem una variable global (sense var)
function foo() {
  ambit = 'local';             // Ostres! Hem canviat el valor de la variable global!
  document.write(ambit);       // Usa la variable global
  nou_ambit = 'local';         // Declarem una nova variable global
  document.write(nou_ambit);   // Usa la nova variable global
}
foo();                         // Imprimeix 'locallocal'
document.write(ambit);         // Imprimeix 'local' (el valor s'ha canviat dins la funció)
document.write(nou_ambit);     // Imprimeix 'local' (la variable s'ha creat a la funció però amb àmbit global)</code></pre>
<p>En general, una funció no sap quines variables estan definides en l&#8217;àmbit global i quines no. Així, si una funció usa una variable global en comptes d&#8217;una local sense saber-ho, pot estar modificant un valor que pot afectar a d&#8217;altres parts del programa. Per sort, la solució a tota aquesta problemàtica és ben senzilla: declareu sempre totes les variables amb <code class="javascript">var</code>.</p>
<p>Però si seguim estirant del fil, podem trobar altres coses curioses relacionades amb l&#8217;àmbit de variables.</p>
<p>A diferència d&#8217;altres llenguatges de programació, javascript no defineix l&#8217;àmbit d&#8217;una variable a nivell de bloc (només existeixen àmbits a nivell global o local!). Així, totes les variables declarades dins d&#8217;una funció, sigui on sigui, estan definides a nivell de tota la funció. Si mirem el següent codi podrem entendre-ho:</p>
<pre><code class="javascript">function foo(a) {
  var i = 0;                       // i està definida a tota la funció
  if (a == 5) {
    var j = 23;                    // j està definida a tota la funció, no només en aquest bloc
    for(var k = 0; k &lt; 20; k++) {  // k està definida a tota la funció, no només en aquest bucle
      document.write(k);
    }
    document.write(k);             // k està definida, i té valor 20
  }
  document.write(j);               // j està definida però pot ser que no estigui inicialitzada
}</code></pre>
<p>Cal tenir en compte que el fet que una variable declarada dins d&#8217;una funció està definida per tota la funció pot donar-nos alguna que altra sorpresa. Per exemple:</p>
<pre><code class="javascript">var ambit = 'global';
function foo() {
  alert(ambit);          // Mostra 'undefined', no pas 'global'
  var ambit = 'local';   // Variable inicialitzada aquí, però definida en tot l'àmbit de la funció
  alert(ambit);          // Mostra 'local'
}
foo();
</code></pre>
<p>Pot semblar-nos que el primer cop que es crida a la funció <code class="javascript">alert()</code> hauria de mostrar-nos &#8220;global&#8221; ja que la declaració de la variable local encara no s&#8217;ha executat. Però si tenim en compte les regles d&#8217;àmbit que he anat explicant, la variable local està definida en tot l&#8217;àmbit de la funció, ocultant la variable global que du el mateix nom. Però igualment, encara que la variable local està definida, aquesta no està inicialitzada fins que no s&#8217;executa la sentència <code class="javascript">var</code>. Així, la funció <code class="javascript">foo()</code> anterior és equivalent a la següent:</p>
<pre><code class="javascript">var ambit = 'global';
function foo() {
  var ambit;             // La variable local es defineix a l'inici de la funció
  alert(ambit);          // En aquest punt existeix, però té valor 'undefined'
  var ambit = 'local';   // En aquest punt la inicialitzem i li donem un valor
  alert(ambit);          // Aquí ja té valor!
}
</code></pre>
<p>Amb aquest exemple il·lustra perfectament el perquè és una bona pràctica el declarar totes les variables a l&#8217;inici de cada funció.</p>
<div class="nota">Tots els exemples que s&#8217;usen en aquesta entrada estan basats en els que es poden trobar al del llibre <cite>Javascript: The Definitive Guide</cite></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2009/01/13/ambit-duna-variables-a-javascript/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Organització i convenis en un projecte de maquetació</title>
		<link>http://blog.facilitant.net/2008/12/28/organitzacio-i-convenis-en-un-projecte-de-maquetacio/</link>
		<comments>http://blog.facilitant.net/2008/12/28/organitzacio-i-convenis-en-un-projecte-de-maquetacio/#comments</comments>
		<pubDate>Sun, 28 Dec 2008 16:55:33 +0000</pubDate>
		<dc:creator>Ramon Vilar Gavaldà</dc:creator>
				<category><![CDATA[Bones pràctiques]]></category>
		<category><![CDATA[Desenvolupament]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[xhtml]]></category>

		<guid isPermaLink="false">http://blog.facilitant.net/?p=39</guid>
		<description><![CDATA[Des de fa un temps, que sempre que m&#8217;he d&#8217;enfrontar amb un nou projecte de maquetació segueixo un conjunt de normes que ens varem marcar entre els companys de feina. Ens trobàvem que sempre que havíem de fer un manteniment d&#8217;una maqueta d&#8217;algú altra, l&#8217;organització del projecte era diferent, i clar, això feia que davant [...]]]></description>
			<content:encoded><![CDATA[<p>Des de fa un temps, que sempre que m&#8217;he d&#8217;enfrontar amb un nou projecte de maquetació segueixo un conjunt de normes que ens varem marcar entre els companys de feina. Ens trobàvem que sempre que havíem de fer un manteniment d&#8217;una maqueta d&#8217;algú altra, l&#8217;organització del projecte era diferent, i clar, això feia que davant d&#8217;un canvi mínim, perdéssim força temps interpretant on era cada cosa i com ho feia.</p>
<p>Doncs bé, aniré exposant l&#8217;organització i els convenis que jo segueixo, classificat en apartats per una fàcil comprensió.</p>
<h3>Normes generals de tractament d&#8217;arxius</h3>
<ul>
<li>El nom dels arxius, tant de text com d&#8217;imatges, estarà sempre en minúscules i, en cas d&#8217;estar format per més d&#8217;una paraula, s&#8217;usarà el guió com a separador.</li>
<li>Tots els fitxers de text estaran codificats en <code>UTF-8</code>.</li>
<li>Els tabuladors tindran una mida de dos espais.</li>
</ul>
<h3>Estructura de directoris</h3>
<p>Si partim de l&#8217;arrel del nostre projecte, es poden trobar els següents directoris:</p>
<ul>
<li><code>assets</code>: Dins d&#8217;aquest directori trobarem tots els elements que formen part de la maqueta i que complementen a l&#8217;<acronym title="Hypertext Markup Language" xml:lang="en">HTML</acronym>. Cal tenir en compte que en aquest nivell, no s&#8217;hi trobarà cap arxiu, sinó només directoris on s&#8217;organitzaran els tipus de recursos (fulls d&#8217;estils, imatges, etc.).
<ul>
<li><code>css</code>: En aquest directori trobarem tots els full d&#8217;estils del projecte.</li>
<li><code>img</code>: En aquest directori trobarem totes les imatges que sigui necessàries per a visualitzar correctament la maqueta. aquestes imatges poden ser, per exemple, icones, botons, imatges de fons, etc., però mai imatges d&#8217;exemple (imatges d&#8217;una notícia, d&#8217;un contingut, <abbr title="etcètera">etc.</abbr>). Les imatges estaran sempre en format <acronym title="Portable Network Graphics" xml:lang="en">PNG</acronym>.</li>
<li><code>js</code>: En aquest directori trobarem tots els arxius javascript que formen part de l&#8217;aplicació; tant el codi generat com qualsevol de les biblioteques que s&#8217;usi (jQuery, protoype, etc.).</li>
</ul>
</li>
<li><code>images</code>: Dins d&#8217;aquest directori trobarem les imatges de contingut que s&#8217;usen per a posar exemples a la maqueta però que no formen part d&#8217;aquesta.</li>
</ul>
<p>No s&#8217;ha dit, però els fitxers <acronym title="Hypertext Markup Language" xml:lang="en">HTML</acronym> estaran sempre a l&#8217;arrel del projecte. Com es veu, l&#8217;estructura està pensada perquè sigui fàcil integrar, ja que només cal agafar la carpeta <code>assets</code> amb tot el que conté per tal de tenir tot el que es necessita per a una correcta visualització. Tant els arxius <acronym title="Hypertext Markup Language" xml:lang="en">HTML</acronym> com la carpeta <code>images</code>, es poden descartar una vegada la integració estigui feta.</p>
<h3>Normes a l&#8217;<acronym title="Hypertext Markup Language" xml:lang="en">HTML</acronym></h3>
<ul>
<li>El <code>DOCTYPE</code> serà <code>XHTML1.0 Strict</code>, sempre i quan la natura de l&#8217;aplicació no en demani un de diferent.
<pre><code class="html">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;</code></pre>
</li>
<li>El nom de les classes i dels identificadors dels elements seran sempre en català i s&#8217;escriuran en minúscules i, en cas d&#8217;estar format per més d&#8217;una paraula, s&#8217;usarà el guió com a separador.
<pre><code class="html">&lt;div id="columna-metadades" class="bloc"&gt;
    ...
&lt;/div&gt;</code></pre>
</li>
</ul>
<h3>Normes al <acronym title="Cascading Style Sheets" xml:lang="en">CSS</acronym></h3>
<ul>
<li>Sempre i quan la mida del projecte ho permeti, tots els estils s&#8217;escriuran en un sol fitxer que anomenarem sempre <code>styles.css</code>. En cas que necessitem d&#8217;un fitxer d&#8217;estils especial per a Internet Explorer, aquest s&#8217;anomenarà, <code>styles-ie6.css</code> (per la versió 6 del navegador), <code>styles-ie7.css</code> (per la versió 7 del navegador) o <code>styles-ie.css</code> (en cas que no calgui diferenciar de versió de navegador); i es vincularà dins de l&#8217;HTML amb comentaris condicionals.</li>
<li>L&#8217;arxiu sempre començarà amb la directiva <code class="css">@charset</code>.</li>
<li>Just després de la directiva de codificació, s&#8217;introdueix una taula de continguts per tal d&#8217;organitzar l&#8217;arxiu d&#8217;estils. Les capçaleres que facin referència a la taula dins del full d&#8217;estils, seguiran el següent patró:
<ul>
<li>Aniran entre comentaris de <acronym title="Cascading Style Sheets" xml:lang="en">CSS</acronym> (<code class="css">/**/</code>).</li>
<li>A la primera línia, després d&#8217;iniciar el comentari i abans del títol, hi haurà tants guions com nivell dins de la taula de continguts es trobi; és a dir, si és un títol de primer nivell tindrà només un guió, si és de segon nivell, tindrà dos guions, i així anant fent.</li>
<li>Es fa un retorn de carro, i es posen 78 guions i es tanca el comentari (tot per fer una divisió de 80 caràcters).</li>
</ul>
</li>
<li>L&#8217;estil d&#8217;obertura i tancament de claus serà la que varen proposar Kerninghan-Ritchie al seu tractat sobre el llenguatge de programació C; la primera clau va just després del predicat (separant amb un espai) i la clau de tancament va just després d&#8217;un retorn de carro.</li>
<li>Els estils s&#8217;escriuen en bloc i sempre precedits per un tabulador. Dintre de cada bloc, les directives s&#8217;ordenen en ordre alfabètic ascendent.</li>
<li>Un exemple de full d&#8217;estil podria ser:
<pre><code class="css">@charset "utf-8";
/*
  TdC:
    - Elements genèrics
    - Capçalera
      - Regió capçalera
    - Estructura del contingut
      - Sense columnes
      - Una columna + contingut
      - Dues columnes + contingut
    - Peu
*/

/*- Elements genèrics
-----------------------------------------------------------------------------*/
body {
  color: #333;
  font-size: 62.5%;
  margin: 0 auto;
}

/*- Capçalera
-----------------------------------------------------------------------------*/
...

/*-- Regió capçalera
-----------------------------------------------------------------------------*/
...</code></pre>
</li>
</ul>
<h3>Normes al javascript</h3>
<ul>
<li>Sempre i quan la mida del projecte ho permeti, el javascript anirà tot dins d&#8217;un sol fitxer amb nom <code>script.js</code>. En cas de necessitar-ne més, el criteri de nomenclatura haurà de ser racional.</li>
<li>El nom de les classes i dels identificadors dels elements que s&#8217;usin només per al javascript, seguiran les mateixes normes d&#8217;escriptura, però amb la diferència que seran en anglès per poder diferenciar-les de les que són pròpiament d&#8217;estructura.</li>
<li>Tant les variables com les funcions s&#8217;ecriuran en <a hreflang="en" href="http://ca.wikipedia.org/wiki/CamelCase">CamelCase</a>. En el meu cas, tant el nom de les variables com els de les funcions els escriurem en angès.</li>
<li>No s&#8217;integraran biblioteques al projecte sempre i quan el seu ús no estigui justificat, és a dir, per a fer manipulacions mínimes del <acronym title="Document Object Model" xml:lang="en">DOM</acronym> no cal carregar jQuery. Passa el mateix amb l&#8217;ús d&#8217;extensions de les biblioteques: només s&#8217;usaran si es justifiquen molt els seus beneficis.</li>
<li>Tot el codi estarà documentat seguint <a hreflang="en" href="http://jsdoc.sourceforge.net/">JSDoc</a>. Un bon programador sap que la documentació és útil, però l&#8217;abús d&#8217;aquesta ocasiona problemes.</li>
</ul>
<p>Cal tenir present que aquest conjunt de normes són les que uso jo; no són ni un estàndard ni la millor manera de fer-ho, sinó una forma de fer-ho.</p>
<p>Si algú té cap conveni o norma que creieu que pot ser interessant, deixeu-ho en un comentari i així podem anar complementant-ho tot plegat.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.facilitant.net/2008/12/28/organitzacio-i-convenis-en-un-projecte-de-maquetacio/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
