<?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>Agile Technology</title>
	<atom:link href="http://www.agilogy.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.agilogy.com</link>
	<description>Ingenieria de Software</description>
	<lastBuildDate>Wed, 05 Aug 2009 17:38:35 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>ca</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Exceptions best practices</title>
		<link>http://www.agilogy.com/exceptions-best-practices/</link>
		<comments>http://www.agilogy.com/exceptions-best-practices/#comments</comments>
		<pubDate>Wed, 05 Aug 2009 17:34:38 +0000</pubDate>
		<dc:creator>jordi.pradel</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[disseny]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.agilogy.com/?p=250</guid>
		<description><![CDATA[Ho sentim, aquesta entrada només està disponible en English.
]]></description>
			<content:encoded><![CDATA[<p>Ho sentim, aquesta entrada només està disponible en <a href="http://www.agilogy.com/en/feed/">English</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agilogy.com/exceptions-best-practices/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lean Software Development: Evitar malgastament</title>
		<link>http://www.agilogy.com/eliminate-waste/</link>
		<comments>http://www.agilogy.com/eliminate-waste/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 16:38:07 +0000</pubDate>
		<dc:creator>jose.raya</dc:creator>
				<category><![CDATA[lean]]></category>

		<guid isPermaLink="false">http://www.agilogy.com/?p=237</guid>
		<description><![CDATA[Ho sentim, aquesta entrada només està disponible en Español.
]]></description>
			<content:encoded><![CDATA[<p>Ho sentim, aquesta entrada només està disponible en <a href="http://www.agilogy.com/es/feed/">Español</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agilogy.com/eliminate-waste/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Lean Software Development</title>
		<link>http://www.agilogy.com/lean-software-development/</link>
		<comments>http://www.agilogy.com/lean-software-development/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 08:27:12 +0000</pubDate>
		<dc:creator>jose.raya</dc:creator>
				<category><![CDATA[lean]]></category>

		<guid isPermaLink="false">http://www.agilogy.com/?p=167</guid>
		<description><![CDATA[Ho sentim, aquesta entrada només està disponible en Español.
]]></description>
			<content:encoded><![CDATA[<p>Ho sentim, aquesta entrada només està disponible en <a href="http://www.agilogy.com/es/feed/">Español</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agilogy.com/lean-software-development/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Diagrames de seqüència UML: Errors més freqüents</title>
		<link>http://www.agilogy.com/diagrames-de-sequencia-uml-errades-mes-frequents/</link>
		<comments>http://www.agilogy.com/diagrames-de-sequencia-uml-errades-mes-frequents/#comments</comments>
		<pubDate>Wed, 21 Jan 2009 09:50:57 +0000</pubDate>
		<dc:creator>jordi.pradel</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[uml]]></category>

		<guid isPermaLink="false">http://www.agilogy.com/?p=114</guid>
		<description><![CDATA[Els diagrames de seqüència UML permeten modelar la interacció entre diversos participants que intercanvien missatges per a dur a terme una certa tasca. Un dels usos més habituals d&#8217;aquests diagrames és mostrar un escenari de funcionament d&#8217;un programari orientat a objectes; en aquest cas, es mostra com un conjunt d&#8217;instàncies de programari (objectes del llenguatge [...]]]></description>
			<content:encoded><![CDATA[<p>Els diagrames de seqüència UML permeten modelar la interacció entre diversos participants que intercanvien missatges per a dur a terme una certa tasca. Un dels usos més habituals d&#8217;aquests diagrames és mostrar un escenari de funcionament d&#8217;un programari orientat a objectes; en aquest cas, es mostra com un conjunt d&#8217;instàncies de programari (objectes del llenguatge de programació triat) interactuen quan una d&#8217;elles rep una invocació d&#8217;una operació.</p>
<p><span id="more-114"></span></p>
<p>Aquest article documenta una sèrie d&#8217;errors freqüents que he detectat que es solen produir en els diagrames de seqüència dels dissenyadors novells. No es tracta tant de documentar errades de disseny com d&#8217;explicar les errades de llenguatge UML a l&#8217;hora d&#8217;expressar un disseny mitjançant un diagrama de seqüències.</p>
<h2>Documents illegibles</h2>
<p>Un diagrama de seqüències és un document que una persona ha de poder llegir en paper o en pantalla. Encara que sembli absurd, molts dissenyadors fan diagrames tant grans que, mostrats sencers en una pantalla o impresos en una pàgina de paper són impossibles de llegir. La situació és especialment greu quan ni tant sols en format digital i fent zoom es pot llegir el contingut del diagrama.</p>
<p>Exemple:</p>
<div id="attachment_156" class="wp-caption alignnone" style="width: 599px"><img class="size-full wp-image-156" title="Diagrama illegible" src="http://www.agilogy.com/wp-content/uploads/2009/01/illegiblediagram1.gif" alt="Diagrama illegible" width="589" height="399" /><p class="wp-caption-text">Diagrama illegible</p></div>
<p>Les causes d&#8217;això poden ser moltes no relacionades amb UML:</p>
<ul>
<li>Format d&#8217;imatge incorrecte: S&#8217;ha fet servir un format amb pèrdua de qualitat que ha introduït massa soroll per a que es pugui llegir el diagrama</li>
<li>Nivell de zoom massa allunyat: El nivell de zoom del diagrama no permet llegir-lo sobre paper o sobre pantalla quan es mostra tot el diagrama a la pantalla</li>
<li>&#8230;</li>
</ul>
<p>Des del punt de vista UML, però, hi ha solucions aplicables per a simplificar diagrames. Qualsevol operació es pot deixar, en un diagrama de seqüències, sense documentar. Aleshores cal, però, fer un altre diagrama de seqüències on es mostri només el disseny d&#8217;aquella operació. Vegeu l&#8217;apartat &#8220;Operacions no dissenyades&#8221; per a un exemple d&#8217;operació documentada en un diagrama a part.</p>
<h2>Errades en la representació de participants</h2>
<p>Els participants, en un diagrama de seqüències del disseny, són objectes i classes de programari. Un participant que representi una classe es pot fer servir per mostrar la invocació d&#8217;operacions amb àmbit de classe (estàtiques).</p>
<p><img class="size-full wp-image-130" title="Instàncies" src="http://www.agilogy.com/wp-content/uploads/2009/01/instances.png" alt="Instàncies" width="294" height="89" /></p>
<p>Un participant es representa amb una etiqueta:</p>
<ul>
<li>El participant representa una classe. Ex: Controller</li>
<li>El participant representa un objecte anònim. Ex: <img src='http://www.agilogy.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> erson</li>
<li>El participant representa un objecte amb nom. Ex: d:Department</li>
</ul>
<p>Un objecte anònim és un objecte al que no donem nom al diagrama de seqüència. Això fa que no poguem identificar d&#8217;on surt aquest objecte. Per tant sol ser recomenable posar nom a tots els objectes que apareixen al diagrama. Com a excepcions a aquesta norma hi ha:</p>
<ul>
<li>Objecte inicial del diagrama: Un diagrama de seqüències documenta el comportament d&#8217;un conjunt d&#8217;objectes a partir d&#8217;un objecte inicial del que documentem una operació. A aquest objecte inicial pot ser innecessari donar-li un nom.</li>
<li>Objectes singleton: De les classes singleton només n&#8217;hi ha una instància. Per tant, no cal que aquesta instància tingui nom.</li>
</ul>
<h2>Errades a les activacions</h2>
<p>L&#8217;activació és la banda que es dibuixa damunt la línia de vida d&#8217;una instància quan aquesta rep la invocació d&#8217;una operació (o, en general, qualsevol missatge). Aquesta banda representa el temps que l&#8217;objecte està actiu ja sigui perquè està fent alguna mena de càlculs o perquè està esperant una resposta d&#8217;una invocació que, al seu torn, ha fet sobre un altre objecte.</p>
<h3>Més d&#8217;un missatge cap a la mateixa activació</h3>
<p><img class="size-full wp-image-122" title="Dos missatges cap a la mateixa activació" src="http://www.agilogy.com/wp-content/uploads/2009/01/activation-1.png" alt="Dos missatges cap a la mateixa activació" width="235" height="189" /></p>
<h3>Activació espontània d&#8217;una instància</h3>
<p><img class="size-full wp-image-125" title="Activació espontània d'una instància" src="http://www.agilogy.com/wp-content/uploads/2009/01/activation-2.png" alt="Activació espontània d'una instància" width="365" height="215" /></p>
<p>En aquest exemple el missatge 2 s&#8217;origina des de la instància p:Persona sense que aquesta estigués prèviament activa. La instància, per tant, s&#8217;ha activat espontàniament. Si estem modelant un programari OO tradicional (sense objectes actius) això no pot passar mai, ja que qualsevol instància &#8211; i p:Person en particular &#8211; només pot actuar com a resposta a una invocació.</p>
<h2>No mostrar quina operació inicial es documenta</h2>
<p>Un diagrama de seqüències de disseny documenta com interactuen un conjunt d&#8217;objectes quan un d&#8217;ells (o una classe) rep la invocació d&#8217;una operació. Cal mostrar, però, quina és l&#8217;operació que s&#8217;està documentant.</p>
<p><img class="size-full wp-image-136" title="Diagrama de seqüències d'una operació desconeguda" src="http://www.agilogy.com/wp-content/uploads/2009/01/start-nok1.png" alt="Diagrama de seqüències d'una operació desconeguda" width="223" height="240" /></p>
<p>Aquest diagrama de seqüències documenta una operació de la classe Controller que fa dues invocacions sobre una instància p:Person. Però no sabem quina és l&#8217;operació de Controller que estem documentant.</p>
<p><img class="size-full wp-image-137" title="Diagrama de seqüències de Controller::getPersonData" src="http://www.agilogy.com/wp-content/uploads/2009/01/start-ok1.png" alt="Diagrama de seqüències de Controller::getPersonData" width="312" height="250" /></p>
<p>En aquest diagrama podem veure que s&#8217;està documentant l&#8217;operació Controller::getPersonData.</p>
<p>Nota: En aquest article, la majoria de figures mostren fragments de diagrames de seqüència. Per tant, no ens hem preocupat de mostrar en tots els casos quina operació s&#8217;està documentant.</p>
<h2>Errades d&#8217;instanciació d&#8217;objectes</h2>
<h3>Missatge de creació mal representat</h3>
<p><img class="size-full wp-image-127" title="Missatge de creació mal representat" src="http://www.agilogy.com/wp-content/uploads/2009/01/create-1.png" alt="Missatge de creació mal representat" width="366" height="240" /></p>
<p>El missatge 1 d&#8217;aquest exemple pretén representar la creació de la instància p:Person, però en realitat mostra la invocació d&#8217;una operació create() sobre una instància p de tipus Person que existeix prèviament. El missatge 2, en canvi, mostra la forma correcta de representar la instanciació d&#8217;una instància.</p>
<h2>Instàncies inexistents</h2>
<p>En un diagrama de seqüències del disseny, tota instància que aparegui ha d&#8217;estar clar d&#8217;on surt. Si estem dissenyant per a un llenguatge de programació orientat a objectes típic una instància només podrà invocar operacions en algun determinats escenaris escenaris.</p>
<p>Suposem que estem documentant la invocació d&#8217;una operació op1() sobre una instància a de tipus A. La instància a només podrà invocar operacions:</p>
<ul>
<li>Amb àmbit de classe (estàtica) sobre qualsevol classe visible per A</li>
<li>Amb àmbit d&#8217;instància (no estàtica) sobre una instància b:B quan:
<ul>
<li>La classe A té un atribut b de tipus B i la instància a té un objecte en aquest atribut (i no un null)</li>
<li>L&#8217;operació A::op1 té un paràmetre b de tipus B i la invocació ha rebut un argument no null en aquest paràmetre</li>
<li>La instància b de tipus B ha estat creada des de la mateixa operació op1() abans d&#8217;invocar-hi l&#8217;operació. Aquest cas no és gaire freqüent.</li>
</ul>
</li>
</ul>
<p><img class="size-full wp-image-144" title="Ús d'una instància inexistent" src="http://www.agilogy.com/wp-content/uploads/2009/01/inexistant-instance.png" alt="Ús d'una instància inexistent" width="315" height="149" /></p>
<p>En aquest exemple :Controller fa servir una instància <img src='http://www.agilogy.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> erson que no se sap d&#8217;on surt. A menys que la classe Controller tingui un atribut de tipus Person (i, en tal cas, caldria indicar com a nom de la instància <img src='http://www.agilogy.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> erson el nom de l&#8217;atribut), la instància :Controller no pot enviar missatges a <img src='http://www.agilogy.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> erson.</p>
<p><img class="size-full wp-image-145" title="Operació getName invocada sobre una instància p:Person identificada correctament" src="http://www.agilogy.com/wp-content/uploads/2009/01/inexistant-instance-ok.png" alt="Operació getName invocada sobre una instància p:Person identificada correctament" width="497" height="268" /></p>
<p>En el segon exemple s&#8217;ha corregit l&#8217;error: :Controller fa servir una instància anònima de Dictionary</p>
<p>(que probablement ha rebut per injecció de dependències) i obté, a partir de l&#8217;identificador d&#8217;una persona, una instància p:Person. És sobre aquesta instància sobre la que invoca getName().</p>
<h3>Instàncies anònimes</h3>
<p>En alguns casos particulars, no mostrem d&#8217;on surt una instància quan està molt clar a quina instància ens referim i quin és el seu origen. És el cas d&#8217;instàncies de classes Singleton per a les que no volem mostrar el funcionament del patró Singleton o el cas d&#8217;instàncies de serveis que s&#8217;han injectat a la instància que fa la crida per injecció de dependències. Per a que quedi clar aquest ús, és recomenable no donar nom a aquestes instàncies.</p>
<p>En el cas dels diagrames de seqüència de la Capa de Domini, per exemple, recomano reservar aquest tractament per als controladors de la Capa de Gestió de Dades (o per als Diccionaris si encara no s&#8217;han introduït aquests controladors).</p>
<h2>Cas general: Variables inexistents</h2>
<p>El cas de les instàncies inexistents es pot extendre a qualsevol variable utilitzada en el diagrama de seqüències:</p>
<ul>
<li>Nom d&#8217;instància</li>
<li>Variables fetes servir en arguments a la invocació d&#8217;operacions</li>
<li>Variables fetes servir en condicions de marcs OPT, LOOP i ALT</li>
</ul>
<h2>Operacions no dissenyades</h2>
<p>En un diagrama de seqüències del disseny, habitualment, ens cal mostrar tot el disseny de totes les operacions que apareixen al diagrama. Qualsevol operació que sigui invocada ha de ser dissenyada, al seu torn, com a part de mateix diagrama de seqüències o en un diagrama de seqüències a part.</p>
<p>Les úniques operacions per a les quals no apareixerà cap disseny, per tant, són aquelles que una instància atén sense delegar en cap altra instància; és a dir, aquelles que la instància resoldrà sense invocar cap operació sobre cap altra instància:</p>
<ul>
<li>Operacions consultores (getter) que només retornen el valor d&#8217;un atribut</li>
<li>Operacions modificadores d&#8217;atribut (setter) que només canvien el valor d&#8217;un atribut</li>
<li>Operacions que efectuen algun tipus de càlcul només amb valors (per oposició a objectes) que siguin atributs o arguments de la crida: Manipulació de números, strings, dates, etc.</li>
</ul>
<p><img class="size-full wp-image-150" title="Operació Company::getHighestPayedEmployee no dissenyada" src="http://www.agilogy.com/wp-content/uploads/2009/01/non-designed-operations1.png" alt="Operació Company::getHighestPayedEmployee no dissenyada" width="589" height="247" /></p>
<p>En aquest exemple, l&#8217;operació getHighestPayedEmployee, suposant que no es tracti només d&#8217;una consulta d&#8217;un atribut, necessitarà recórrer els empleats associats a la companyia i trobar quin és el que està millor pagat. Per a fer-ho, haurà d&#8217;invocar operacions sobre instàncies de classe Employee. En aquest diagrama no es mostra el disseny d&#8217;aquesta operació.</p>
<p>Això no seria un problema sempre que en un diagrama a part es mostri el disseny d&#8217;aquesta operació:</p>
<p><img class="size-full wp-image-152" title="Company::getHighestPayedEmployee" src="http://www.agilogy.com/wp-content/uploads/2009/01/company-gethighestpayedemployee.png" alt="Company::getHighestPayedEmployee" width="519" height="243" /></p>
<p>Notes:</p>
<ul>
<li>En aquest exemple s&#8217;han fet seriv comentaris al costat de l&#8217;activació per explicar aquelles parts del disseny que no impliquen la interacció amb altres objectes. Per exemple, com s&#8217;inicialitza i modifica la variable maxSalary.</li>
<li>En aquest exemple s&#8217;ha fet servir un LOOP amb condició &#8220;for each emp in employees&#8221; enlloc de mostrar l&#8217;ús a baix detall d&#8217;un iterador.</li>
<li>Fixeu-vos que emp:Employee és una instància correctament identificada, ja que correspon a l&#8217;empleat actual de la iteració (apareix explícitament a la condició del LOOP). Pel que fa a employees hem de suposar que es tracta d&#8217;un atribut de Company (o una associació navegable des de Company cap a Employee amb nom de rol employees al costat d&#8217;Employee).</li>
</ul>
<h2>Errades de disseny</h2>
<p>Finalment, moltes de les errades dels diagrames de seqüència són errades de disseny. És a dir, el diagrama de seqüències no només ha de tenir sentit i documentar correctament un disseny possible, sinó que, a més, ha d&#8217;estar correctament dissenyat.</p>
<p>Malgrat que no és la intenció d&#8217;aquest article parlar d&#8217;aquest tipus d&#8217;errors (que no són específics dels diagrames de seqüència, sinó que també es poden trobar en un disseny expressat directament en codi, per exemple), dóno aquí una llista dels que són més habituals:</p>
<ul>
<li>L&#8217;operació no compleix amb el contracte (ja sigui un contracte explícitament documentat o un contracte implícit) i, per tant, no fa el que ha de fer.</li>
<li>No s&#8217;ha aplicat correctament els patrons Expert i Creador de Larman i, per tant, la cohesió i acoblament de la solució obtinguda són dolents.</li>
<li>Els noms donats a les operacions no són indicatius de la semàntica de les mateixes. Exemple: Una operació getEdat que, en realitat, modifiqui l&#8217;atribut dataNaixement de la instància sobre la que s&#8217;invoca.</li>
<li>No s&#8217;honora el principi de No Repetició de Hunt i Thomas i, per tant, hi ha dues o més operacions que tenen total o parcialment el mateix disseny. És especialment curiós quan es fa servir una operació ja dissenyada en un altre diagrama de seqüències tal qual i, malgrat tot, es torna a mostrar tot el disseny intern de l&#8217;operació en qüestió.</li>
</ul>
<h2>Referències</h2>
<ul>
<li><strong>[LARMAN] Larman, Craig</strong> (2002) <em>Applying UML and Patterns</em>. Prentice Hall.</li>
<li><strong>[PRAGPROG] Andy Hunt, David Thomas</strong> (2000) <em>The Pragmatic Programmer &#8211; from journeyman to master</em>. Addison Wesley</li>
<li><strong>[UPC-ES2] Franch, Xavier (professor responsable)</strong> Assignatura ES2 de la secció de SI, departament LSI, UPC.</li>
<li><strong>[UOC-EPOO] Jordi Fernández Gonzalez, Jordi Pradel i Miquel i Jose Antonio Raya Martos (coordinadors Jordi Cabot i Isabel Guitart)</strong>. (2005) <em>Enginyeria del programari orientat a l’objecte</em>. Barcelona: UOC</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.agilogy.com/diagrames-de-sequencia-uml-errades-mes-frequents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Análisis UML: Errors més freqüents</title>
		<link>http://www.agilogy.com/analisi-uml-errades-mes-frequents/</link>
		<comments>http://www.agilogy.com/analisi-uml-errades-mes-frequents/#comments</comments>
		<pubDate>Wed, 26 Mar 2008 09:59:37 +0000</pubDate>
		<dc:creator>jordi.pradel</dc:creator>
				<category><![CDATA[anàlisi]]></category>
		<category><![CDATA[uml]]></category>

		<guid isPermaLink="false">http://www.agilogy.com/analisi-uml-errades-mes-frequents</guid>
		<description><![CDATA[
Aquest document conté un compendi de les errades més freqüents a l’hora d’utilitzar UML per a fer l’anàlisi d’un sistema d’informació Orientat a Objectes. S’ha considerat que la metodologia d’analisi utilitzada és la metodologia simplificada que es pot trobar a [EPOO].

Diagrama de casos d’ús
Concepte de cas d’ús
Dels apunts d’EP de la UOC: Un cas d’ús [...]]]></description>
			<content:encoded><![CDATA[<p><!--<br />
Per a aquest article cal tenir definits aquests estils:<br />
p.exemple {<br />
  background:url(/img/example.png) no-repeat;<br />
  padding-left: 25px;<br />
  min-height:25px;<br />
}<br />
p.validacio{<br />
  background:url(/img/warning.png) no-repeat;<br />
  padding-left: 25px;<br />
  min-height:25px;<br />
}<br />
p.indicador{<br />
  background:url(/img/information.png) no-repeat;<br />
  padding-left: 25px;<br />
  min-height:25px;<br />
}<br />
--></p>
<p>Aquest document conté un compendi de les errades més freqüents a l’hora d’utilitzar UML per a fer l’anàlisi d’un sistema d’informació Orientat a Objectes. S’ha considerat que la metodologia d’analisi utilitzada és la metodologia simplificada que es pot trobar a [<a href="#npp-epoo">EPOO</a>].<br />
<span id="more-82"></span></p>
<h2>Diagrama de casos d’ús</h2>
<h3>Concepte de cas d’ús</h3>
<p>Dels apunts d’EP de la UOC: Un cas d’ús documenta una interacció entre el programari i un actor o més. La interacció en qüestió ha de ser en principi una funció autònoma dins el programari.</p>
<p>L’errada més freqüent en el diagrama de casos d’ús és, en aquest concepte. Un cas d’ús no és part d’una funcionalitat ni un pas d’un algorisme.</p>
<p class="validacio">Un cas d’ús ha de ser tal que tingui sentit que un actor accedeixi al sistema, realitzi aquell cas d’ús i deixi de treballar al sistema; és a dir, per definició, ha de ser un possible cas d’ús del sistema per part de l’usuari. Si una funcionalitat no es pot aïllar d’aquesta manera, segurament no és un cas d’ús.</p>
<p class="indicador">Un bon indicador que estem confonent el concepte de cas d’ús són diagrames de casos d’ús amb un nombre excessiu de casos d’ús.</p>
<p>Excepcionalment, podem modelar casos d’ús que agrupen un conjunt de funcionalitats d’aquest tipus. Podríem, per exemple, modelar un cas d’ús “Gestió de departaments” que representés l’alta, la baixa, la modificació, la consulta i el llistat de departaments. En tal cas, però, cal no barrejar graus de granularitat: O bé parlem del cas d’ús “Gestió de departaments” o bé parlem dels casos d’ús “Alta de departament”, “Llistat de departaments”, etc. però no de totes dues coses.</p>
<h3>Relacions entre casos d’ús</h3>
<h4>include</h4>
<p>El cas d’ús A està inclòs en el cas d’ús B (B inclou A) si A és un conjunt d’interaccions entre l’usuari i el sistema que forma part del cas d’ús B. En tal cas, el cas d’ús A no és necessàriament un cas d’ús complet segons la definició donada abans: Pot ser un fragment d’un altre cas d’ús.</p>
<p>En general, no té sentit que indiquem que un cas d’ús A està inclòs dins un cas d’ús B si el cas d’ús A no és inclòs, alhora, en altres casos d’ús, ja que si només està inclòs dins un únic cas d’ús i en forma part, no cal que el modelem com a cas d’ús.</p>
<p class="validacio">Una relació d’inclusió s’indica amb una línia discontínua, amb punta de fletxa oberta que va del cas d’ús general al cas d’ús inclòs i que porta l’etiqueta &lt;&lt;include&gt;&gt;.</p>
<p class="validacio">Un cas d’ús inclòs en algun altre hauria d’estar inclòs en dos o més casos d’ús. Molt excepcionalment, i mai com a regla general, podem indicar un cas d’ús només inclòs en un altre; i, en tal cas, ha de ser degut a una gran complexitat.</p>
<h4>extends</h4>
<p>Una extensió d’un cas d’ús és un conjunt d’interaccions entre l’actor i el sistema que es pot produir en algun moment del cas d’ús, normalment en una situació fora del flux principal d’esdeveniments.</p>
<p>Un cas d’ús A extén un cas d’ús B si A és una extensió del cas d’ús B que, a més, té sentit com a cas d’ús independent.</p>
<p class="validacio">Una relació d’extensió s’indica amb una línia discontínua, amb punta de fletxa oberta que va del cas extensió al cas d’ús general (extès) i que porta l’etiqueta &lt;&lt;extend&gt;&gt;.</p>
<p class="validacio">Un cas d’ús que n’extén un altre ha de tenir sentit com a cas d’ús independent. Per tant, ha de passar les validacions pròpies d’aquests.</p>
<h4>General</h4>
<p class="indicador">Un bon indicador que estem sobre-utilitzant les relacions entre casos d’ús és la seva presència en excessiu nombre. No és habitual que la majoria de casos d’ús participin en una o més relacions, excepte escenaris de reutilització massiva de fragments de cas d’ús (per exemple, quan pràcticament tots els casos d’ús del sistema inclouen una sèrie de passos d’interacció per a que l’usuari s’autentiqui al sistema, conegut com a procés de login); en tal cas, la majoria de relacions seran d’inclusió cap al cas d’ús reutilitzat.</p>
<h3>Actors</h3>
<p>Dels apunts d’EP de la UOC: “La finalitat del programari és proporcionar informació a persones, màquines i dispositius o programaris de l’exterior, el conjunt de tots els quals anomenarem entitats exteriors; també hi ha entitats exteriors &#8211; les mateixes o d’altres &#8211; que demanen funcions al programari o bé li subministren informació per a tractar. Un actor és un conjunt de papers d’una entitat exterior en relació amb el sistema de programari considerat.”</p>
<p>Per tant, considerem actors els diferents papers (o conjunts de papers) que poden prendre les persones o sistemes externs que interactuïn amb el sistema que analitzem.</p>
<p>En un determinat cas d’ús, un actor en pot ser iniciador (el qui ha iniciat el cas d’ús activament) o pot ser-hi participant (sense haver iniciat el cas d’ús).</p>
<p class="validacio">La relació entre un actor i un cas d’ús s’indica mitjançant una línia contínua sense etiquetes ni puntes de fletxa de cap mena.</p>
<p class="validacio">Cada actor ha de participar, com a mínim en un cas d’ús.</p>
<p class="validacio">Cada cas d’ús ha de tenir, com a mínim, un actor iniciador, tot i que pot tenir altres actors (iniciadors o no). Excepció: Els casos d’ús inclosos no tenen sentit per si mateixos i, per tant, no tindran actors iniciadors (tot i que en poden tenir de participants sense ser iniciadors).</p>
<h2>Especificació textual de casos d’ús</h2>
<p>Un diagrama de casos d’ús només és una forma gràfica de mostrar un índex dels casos d’ús i actors del nostre sistema i les relacions entre ells. Però en cap cas, els requisits funcionals d’un sistema queden prou documentats amb un diagrama de casos d’ús. Cal, per a cada cas d’ús, donar-ne l’especificació textual.</p>
<p>Existeixen diversos formats per a l’especificació textual de casos d’ús; alguns són més breus i d’altres més complets. Si no es diu el contrari es considerarà que es vol una especificació completa del cas d’ús.</p>
<p class="validacio">Cal fer servir un format consensuat a l’organització on es treballi. N’hi ha un exemple al mòdul 3, apartat 1.2.1 dels materials d’EPOO de la UOC.</p>
<h4>Nom</h4>
<p class="validacio">El nom d’un cas d’ús que especifiquem textualment ha de coincidir necessàriament amb algun dels casos d’ús indicats al diagrama de casos d’ús!!</p>
<h4>Flux d’esdeveniments principal</h4>
<p>Un cas d’ús ha de tenir clarament associat un objectiu que l’actor principal del cas d’ús vol assolir, com per exemple, donar d’alta un nou empleat o llistar els empleats d’un departament. Per a cada cas d’ús, triarem un flux d’esdeveniments principal que és aquell a través del qual l’usuari obté el seu objectiu de la forma més directa o habitual.</p>
<p>En el flux d’esdeveniments principal cal indicar la sèrie de passos que formen la interacció entre el sistema i els actors implicats. Cada pas ha de ser una acció simple que fa UN actor o el sistema i ha d’anar numerat per a poder-hi fer referència més endavant.</p>
<p>En el cas que el cas d’ús n’inclogui un altre, tot el cas d’ús inclòs es considerarà un únic pas i no s’indicarà els diferents passos que el formen, ja que per això s’ha utilitzat la relació d’inclusió: Per a no haver de documentar cada cop els diversos passos que formen el cas d’ús inclòs.</p>
<p class="validacio">Ha d’estar format per una sèrie de passos numerats</p>
<p class="validacio">Cada pas hauria de ser quelcom que fa el sistema o quelcom que fa un actor</p>
<p class="indicador">El flux d’esdeveniments principal hauria de documentar un diàleg entre diverses parts i, per tant, el més normal és que tingui forma d’una sèrie de passos que alternen peticions dels actors amb respostes del sistema.</p>
<p class="validacio">Cada pas del sistema ha de deixar clar quines dades mostra el sistema com a resultat; normalment n’hi ha prou amb indicar clarament la pantalla mostrada.</p>
<p class="validacio">Cada pas d’un actor ha de deixar clar quines dades proporciona al sistema; normalment n’hi ha prou indicant clarament la pantalla on s’introdueixen i quines dades d’aquesta s’introdueixen (típicament totes)</p>
<h4>Flux d’esdeveniments alternatius</h4>
<p>El flux d’esdeveniments principal ha de ser un escenari d’ús del cas d’ús a través del qual tot funciona correctament i que es consideri l’escenari més habitual. Qualsevol flux alternatiu (errades de l’actor, opcions que no siguin la principal, etc.) s’ha de documentar en un flux d’esdeveniments alternatiu.</p>
<p>Cada flux d’esdeveniments alternatiu ha d’indicar en quin pas de l’escenari principal es produeix i sota quina condició. Aleshores ha d’incloure els passos numerats que es segueixen (amb les mateixes regles que el flux d’esdeveniments principal).</p>
<p>Moltes vegades, un flux d’esdeveniments alternatiu finalitza retornant a algun pas del flux d’esdeveniments principal.</p>
<p class="validacio">Cada flux d’esdeveniments alternatiu ha d’indicar en quin punt es produeix (un número), s’ha d’identificar dins aquest punt (típicament amb una lletra) i ha de descriure quan es produeix (una frase explicant l’alternativa triada o l’error comès).</p>
<h2>Model conceptual de dades</h2>
<p>El Model Conceptual de Dades modela les dades que el sistema gestiona classificant-les en classes, que tenen atributs i associacions entre elles. Algunes classes, a més, poden mantenir una relació d’especialització/generalització que té un tractament especial.</p>
<h3>Classes</h3>
<p>Cada classe ha de tenir un nom que sigui descriptiu del que representa i, normalment, n’han de poder existir diverses instàncies al sistema. Cada instància tindrà certs valors als atributs de la classe i certes altres instàncies associades a través de les associacions.</p>
<p class="validacio">Els noms de classe han de ser únics</p>
<p class="indicador">Una classe de la qual no en puguem imaginar més d’una instància al sistema sol ser una classe innecessària.</p>
<p class="validacio">En el cas excepcional que d’una classe només en pugui existir una instància, cal marcar la classe com a singleton fent servir l’indicador de cardinalitat de classe propi d’UML.</p>
<p class="indicador">Una classe que no tingui atributs és molt poc habitual i, gairebé sempre, indicadora d’alguna errada de modelat. Les instàncies d’una classe així només es podrien distingir les unes de les altres per les instàncies que tinguin associades.</p>
<p class="validacio">Una classe sense atributs ni associacions és un error, ja que les seves instàncies no es podrien distingir les unes de les altres i no tindrien cap informació útil.</p>
<p class="validacio">Les classes d’un model conceptual de dades no han de tenir operacions.</p>
<h3>Atributs</h3>
<p>Els atributs indiquen el tipus d’informació que coneixem de cada instància d’una classe. Cada atribut ha de tenir un nom identificatiu i autoexplicatiu i un tipus, que ha de ser un “tipus primitiu”.</p>
<p class="validacio">Un atribut no pot ser del tipus d’una classe del model conceptual de dades. En tal cas, cal substituir-lo per una associació.</p>
<p class="validacio">Un atribut no pot ser de tipus llista, col·lecció, array, etc. En tal cas cal fer servir atributs multiavaluats.</p>
<p class="indicador">Els atributs multiavaluats no són freqüents i, molts cops, indiquen que estem modelant incorrectament una associació com a atribut.</p>
<p>Si no s’indica el contrari, un atribut és obligatori. Per a indicar que un atribut és opcional (pot no prendre valor per a algunes instàncies del sistema), cal indicar-ne la cardinalitat [0..1].</p>
<p class="indicador">Un atribut no pot funcionar com una clau forana del model relacional: Un atribut no pot contenir un valor que identifiqui una altra instància d’alguna classe del model conceptual; en tal cas, cal substituir-lo per una associació.</p>
<p class="exemple">Suposem que tenim una classe Departament i una classe Empleat amb un atribut dni que n’identifica les instàncies. Per indicar que de cada departament en sabem el cap, que és un empleat, cal fer servir una associació entre les dues classes, mai un atribut dniCap a la classe Departament.</p>
<h3>Associacions</h3>
<p>Cada associació associa dues (en alguns casos més) classes.</p>
<p class="validacio">A cada extrem d’una associació cal indicar-hi la cardinalitat.</p>
<p class="indicador">Les associacions ternàries, quaternàries, etc. (N-àries on N&gt;2) són poc habituals i és possible fer models correctes sense utilitzar-les. En cas de dubte o si no se’n coneix molt bé el funcionament, és millor no fer-les servir.</p>
<p>Quan una associació indica una certa relació de tot-part, es considera que és una agregació (i es dibuixa un rombe a l’extrem del tot). Si aquesta relació és especialment forta (i segueix certes restriccions semàntiques) aleshores l’agregació és una composició (i el rombe es dibuixa ple).</p>
<p class="indicador">No és habitual que la majoria d’associacions siguin agregacions o composicions. La majoria haurien de ser associacions simples.</p>
<p class="indicador">Si no es coneix molt bé la diferència que hi ha entre una composició i una agregació, és millor no fer servir composicions.</p>
<p class="indicador">En una agregació, la cardinalitat a la part del tot sol ser 1 o 0..1.</p>
<p class="validacio">En una composició, la cardinalitat a la part del tot sempre ha de ser 1.</p>
<h3>Generalització / Especialització</h3>
<p>Quan modelem una classe A1 com una especialització d’una classe A, indiquem que tota instància d’A1 és, també de tipus A. Per tant, tot allò que sigui cert sobre les instàncies d’A, ho serà també per a les instàncies d’A1, però no a l’inrevés. En particular, tota instància de la classe A1 tindrà les mateixes associacions i atributs que les instàncies de la classe A, però tindrà associacions i atributs propis.</p>
<p class="validacio">Un atribut d’una classe (A1) no pot tenir el mateix nom que un atribut de la seva superclasse (A)</p>
<h3>Restriccions d’integritat</h3>
<p>En tot sistema hi ha certes restriccions d’integritat que s’han de complir en tot moment (no entrem en la definició formal de què vol dir en tot moment). Algunes restriccions d’integritat es poden representar amb UML, però d’altres s’han de representar com a notes del diagrama (entre { i }) o com a restriccions textuals al peu del diagrama.</p>
<p class="exemple">Si no pot haver-hi, en cap moment, dues persones amb el mateix dni, direm que aquesta és una restricció d’integritat.</p>
<p class="indicador">Un cas especial de restricció és la de clau. Quan una classe té un atribut o conjunt d’atributs que identifica les instàncies d’aquella classe (i que, per tant, no puguin prendre valors repetits), direm que aquest atribut o conjunt d’atributs formen la clau externa d’aquella classe.</p>
<p class="exemple">Seguint l’exemple anterior, direm que dni és clau externa de la classe Persona.</p>
<p class="indicador">Normalment la majoria de classes del sistema haurien de tenir una clau externa. És convenient indicar-la explícitament.</p>
<h2>Disseny extern del sistema</h2>
<p>El disseny extern del sistema consisteix a dissenyar l’aspecte que ofereix el sistema als seus usuaris. En una primera fase, es sol dissenyar només els aspectes més rellevants d’aquest disseny extern sense entrar en detalls.</p>
<p class="exemple">És important dissenyar quins tipus d’entrades i sortides permet fer el nostre disseny extern i quins fluxos de navegació entre pantalles permet, però podem deixar per a més endavant qüestions com el color de les pantalles o el tipus de lletra qui hi farem servir.</p>
<p>Per a fer un disseny extern del sistema n’analitzarem l’aspecte estàtic (fent esboços de les pantalles que formen la interfície gràfica d’usuari) i de l’aspecte dinàmic (indicant en un diagrama d’estats els fluxos navegacionals entre pantalles del sistema).</p>
<h3>Disseny extern: Aspecte dinàmic (diagrama de la interfície gràfica)</h3>
<p>Un diagrama d’estats de la interfície gràfica ha de mostrar, per a un cas d’ús (o més d’un), els diversos estats pels quals passa la interfície mostrada a l’usuari. Cada estat es correspondrà (informalment) amb una pantalla i permetrà diverses transicions cap a altres estats.</p>
<p class="validacio">Tot estat ha de tenir un nom identificatiu i autoexplicatiu</p>
<p>Cada transició és originada per un esdeveniment (normalment ocasionat per l’usuari) i pot tenir una condició (indicada entre [ i ]). L’esdeveniment d’una transició ha de tenir un nom identificatiu i autoexplicatiu i pot tenir paràmetres.</p>
<p class="validacio">Tota transició ha de tenir associat un esdeveniment.</p>
<p class="indicador">Un esdeveniment s’ha de correspondre amb un esdeveniment d’alt nivell. No cal tenir en compte, doncs, esdeveniments que no afecten l’estat del sistema com ara omplir un camp de text, minimitzar, fer servir l’scroll…</p>
<p class="exemple">Si, en un formulari d’alta d’empleat, un usuari indica un nom en un camp, un dni en un altre, una data de naixement en un tercer i, a continuació, prem el botó ok, podem considerar que altaUsuari(nom,dni,dataNaixement) és un bon nom d’esdeveniment amb els seus paràmetres. En canvi, omplirNom, omplirDni, premerOk, etc, són noms d’esdevniment a massa baix nivell d’abstracció.</p>
<p class="validacio">Des d’un mateix estat, no en poden sortir dues transicions amb el mateix esdeveniment, a menys que tinguin una condició excloent, és a dir, que les distingeixi.</p>
<p class="indicador">Si entre dos estats hem modelat una transició (incorrecta) sense esdeveniment, probablement l’estat origen de la transició no és un estat, ja que el sistema no s’hi està fins que es produeixi un esdeveniment.</p>
<p class="indicador">Un diagrama d’interfície gràfica té com a únic objectiu mostrar els estats (pantalles) pels que navega l’usuari. No cal que hi aparegui informació sobre altres tasques realitzades pel sistema, que molts cops es modelen incorrectament com a estats amb transicions sense esdeveniments.</p>
<p class="validacio">El diagrama ha de tenir un únic estat incial que és la primera pantalla que l’usuari veu (del cas d’ús o del conjunt de casos d’ús).</p>
<p class="validacio">Aquell estat (pantalla) en el qual es doni per finalitzat el cas d’ús modelat (a partir del qual ja no s’admetin transicions), ha de ser marcat com a estat final.</p>
<p class="validacio">Tot diagrama ha de tenir, com a mínim, un estat final.</p>
<p class="indicador">Normalment no és necessari fer servir altres característiques avançades dels diagrames d’estat UML. En particular, si es modela un diagrama per cas d’ús no és necessari fer servir subestats, estats històrics, estats paral·leles, etc. Si ens trobem amb lògiques complexes, val la pena fer un diagrama simple i anotar-lo per a complementar-lo amb un comentari UML o al peu del diagrama.</p>
<p class="indicador">Tota transició que, en fer-se, reculli dades introduïdes per l’usuari, ha de tenir paràmetres que representin aquelles dades. Només el fet de prémer un botó, una opció de menú o esdeveniments així de senzills corresponen a transicions sense paràmetres.</p>
<h3>Disseny extern: Aspecte estàtic (esboç de les pantalles)</h3>
<p>Per a cada possible estat de la interfície d’usuari (pantalla) el diagrama de l’aspecte dinàmic del disseny extern ens mostra les possibles transicions que es poden produir, però no els tipus d’elements d’interfície gràfica que es faran servir i com s’organitzaran. Per a cada estat, doncs, cal fer un esboç on es mostri quins elements es faran servir.</p>
<p class="validacio">Cada esboç s’ha de correspondre amb un estat del diagrama d’estats i cal identificar-lo clarament.</p>
<p class="indicador">Normalment cada pantalla tindrà un títol visible al seu disseny extern que hauria de coincidir amb el nom de l’estat del diagrama d’estats.</p>
<p class="validacio">A cada esboç de pantalla cal identificar la forma de fer cada una de les transicions del diagrama d’estats (no menys).</p>
<p class="exemple">Si el diagrama d’estats indica que hi ha una transició altaEmpleat(nom, dni, dataNaixement), l’esboç de la pantalla ha d’incloure elements que ens permetin introduir un nom, un dni, una data de naixement i, finalment, confirmar l’entrada (per exemple, amb un botó amb l’etiqueta “D’acord”).</p>
<p class="validacio">En un esboç de pantalla només han de ser possibles les transicions definides al diagrama d’estats (no més).</p>
<p class="exemple">Si, des d’un determinat estat, no hi ha cap transició cancel·lar, no hauria d’haver-hi cap botó etiquetat “Cancel·lar” (que no es correspongui a alguna altra transició vàlida des d’aquell estat).</p>
<p>Quan no sigui obvi, cal indicar en un comentari al peu de cada esboç, la correspondència entre els elements d’IGU dibuixats i els esdeveniments identificats al diagrama d’estats.</p>
<p class="exemple">Si es fa servir dos components de llistes i volem que, en arrossegar un element d’una llista a una altra es produeixi un des esdeveniments identificats al diagrama, aquest comportament no serà obvi a l’esbós de la pantalla. En tal cas, cal afegir un comentari explicant-lo.</p>
<hr />
<h3>Símbols utilitzats:</h3>
<p class="validacio">Validació: Característica que sempre cal comprovar</p>
<p class="indicador">Indicador: Característica que sol ser indicadora d’algun problema, però que no és precisa com una validació.</p>
<p class="exemple">Exemple: Exemple concret d’algun dels aspectes mencionats</p>
<h3>Referències:</h3>
<ul>
<li>[<a id="npp-epoo" href="#">EPOO</a>]: Jordi Fernández Gonzalez, Jordi Pradel i Miquel i Jose Antonio Raya Martos, Enginyeria del programari orientat a l’objecte. UOC, 2005</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.agilogy.com/analisi-uml-errades-mes-frequents/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Disseny de bases de dades: Value Object i Embedded Value</title>
		<link>http://www.agilogy.com/disseny-de-bases-de-dades-value-object-i-embedded-value/</link>
		<comments>http://www.agilogy.com/disseny-de-bases-de-dades-value-object-i-embedded-value/#comments</comments>
		<pubDate>Fri, 04 Jan 2008 13:23:27 +0000</pubDate>
		<dc:creator>jordi.pradel</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[disseny]]></category>

		<guid isPermaLink="false">http://www.agilogy.com/disseny-de-bases-de-dades-value-object-i-embedded-value</guid>
		<description><![CDATA[En aquest petit article vull comentar què hem de fer a l&#8217;hora de dissenyar una base de dades quan ens trobem un Value Object, una classe d&#8217;objectes amb semàntica de valor i no d&#8217;objecte. Fowler, a [FOW], documenta aquest patró (que revisaré) i documenta un patró per a tractar-lo en fer el disseny de la [...]]]></description>
			<content:encoded><![CDATA[<p>En aquest petit article vull comentar què hem de fer a l&#8217;hora de dissenyar una base de dades quan ens trobem un Value Object, una classe d&#8217;objectes amb semàntica de valor i no d&#8217;objecte. Fowler, a [FOW], documenta aquest patró (que revisaré) i documenta un patró per a tractar-lo en fer el disseny de la base de dades: Embedded Value.<span id="more-79"></span></p>
<h2>Value Object</h2>
<p>En un anàlisi UML hi poden aparèixer classificadors (diguem-ne classes, si es vol) que no tenen semàntica d&#8217;objectes. Fowler diu que tenen semàntica de valor per oposició a la semàntica d&#8217;objectes amb referència.</p>
<p>Els valors (objectes amb semàntica de valor, segons Fowler) es comparen pel seu contingut, però no tenen identitat. Això fa que no tingui sentit pensar en termes de quina és la llista d&#8217;instàncies d&#8217;un tipus de valor en un sistema. Els objectes, en canvi, es comparen per la seva identitat, no pel seu contingut, i ens interessa saber quines instàncies en tenim al sistema.</p>
<h3 class="Exemple">Exemple</h3>
<p>Vegem un exemple. Suposem que disposem d&#8217;un model conceptual molt senzill format per les dues classes següents:</p>
<p><img src="http://www.agilogy.com/wp-content/uploads/2008/01/person-department.png" alt="Associació * - * entre Person i Department amb atributs id i name a totes dues classes i atribut dateOfBirth de tipus Date a Person" /></p>
<p>En aquest cas, les classes Person i Department tenen semàntica de referència, ja que, efectivament, ens interessa distingir cada un de les instàncies que en tenim i distingim entre aquestes per la seva identitat.</p>
<p>Les &#8220;classes&#8221; String i Date (que podrien haver aparegut com a classificadors explícitament, en forma de caixa al diagrama) tenen semàntica de valor, ja que no ens interessa saber quines instàncies de Date o d&#8217;String hi ha al sistema i les comparem pel seu contingut (una data és igual que una altra si tenen el mateix dia, mens, any, etc).</p>
<h3>Value Objects típics</h3>
<p>Tots els tipus primitius es poden considerar objectes per valor. Des d&#8217;un punt de vista d&#8217;anàlisi m&#8217;agrada utilitzar tipus independents de llenguatges de programació, com ara, natural, enter, real, String, data, hora, etc. UML proposa una sèrie de tipus primitius que podem usar des del punt de vista d&#8217;anàlisi.</p>
<p>Altres Vaule Object són menys obvis i poden tenir, inclús, atributs:</p>
<ul>
<li>Quantitats: Un cas paradigmàtic és el resultat d&#8217;aplicar el patró Quantity de Larman [LAR], on indiquem una magnitud (com el preu d&#8217;un producte, per exemple) mitjançant valor i unitats (ex 12 €). Es dóna le cas que aquest cas particular del patró Quantity aplicat a diners és anomenat, per Fowler, patró Money.</li>
<li>Intervals de temps: Resultat d&#8217;aplicar el patró Range, també de Larman</li>
<li>Enumeracions: Com, per exemple, els mesos de l&#8217;any</li>
</ul>
<h2>Embedded Value</h2>
<p>Fowler resumeix molt bé com tractar els Value Objects a l&#8217;hora de dissenyar bases de dades amb un bon exemple. Cito textualment (en traducció lliure de de l&#8217;anglès): &#8220;Cap persona amb dos dits de seny voldria una taula de valors monetaris&#8221;. El cas de les dates és més flagrant.</p>
<p>La solució que proposa en forma de patró Embedded Value és mapejar els camps del Value Object com camps de la taula que conté una referència cap a aquest Value Object. Això implica, evidentment, no crear taules per a aquests valors.</p>
<p>Així, per exemple, si una persona té una data de naixement, a la taula persona hi posarem una columna dataNaixement de tipus Date (com a primer exemple obvi). Si la persona tingués, a més, una associació cap a un Diner (quantiat i moneda) anomenada limitCrèdit, posaríem a la taula persona, dues columnes: quantitatLimitCredit i monedaLimitCredit.</p>
<p>Per si a algú li preocupa, en el cas que sobre aquesta base de dades estiguem desenvolupant una aplicació orientada a objectes amb Domain Model i Data Mapper, els bastiments de Data Mapper actuals solucionen prou bé aquesta solució. Hibernate, per exemple, permet mantenir aquesta estructura de base de dades però utilitzant una classe Java per a representar el tipus de dades (per exemple, la classe Diner). Per a més detalls, vegeu [HIB].</p>
<h2>Referències</h2>
<ul>
<li><strong>[FOW] Fowler, M</strong> (2005).  <a href="http://books.google.es/books?id=FyWZt5DdvFkC&amp;dq=Patterns+of+Enterprise+Application+Architecture&amp;psp=1"><em>Patterns of Enterprise Application Architecture</em></a>. Boston, US: Addison-Wesley</li>
<li><strong>[LAR] Larman, C. </strong> (2002). <a href="http://books.google.es/books?id=r8i-4En_aa4C"><em>Applying Uml and Patterns: An Introduction to Object-oriented Analysis and Design</em></a>. US: Prentice-Hall</li>
<li><strong>[HIB] Bauer C., King, G. </strong> (2007). <a href="http://books.google.es/books?id=I51OAAAACAAJ"><em>Java Persistence with Hibernate</em></a>. US: Manning</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.agilogy.com/disseny-de-bases-de-dades-value-object-i-embedded-value/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Disseny de bases de dades: Claus primàries</title>
		<link>http://www.agilogy.com/disseny-de-bases-de-dades-claus-primaries/</link>
		<comments>http://www.agilogy.com/disseny-de-bases-de-dades-claus-primaries/#comments</comments>
		<pubDate>Fri, 04 Jan 2008 12:33:31 +0000</pubDate>
		<dc:creator>jordi.pradel</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[disseny]]></category>

		<guid isPermaLink="false">http://www.agilogy.com/disseny-de-bases-de-dades-claus-primaries</guid>
		<description><![CDATA[En un post anterior vaig posar un esquema sobre disseny de bases de dades a partir del model conceptual de l&#8217;anàlisi. En aquell post s&#8217;hi mencionen un patró en el que voldria aprofundir: Surrogate o Substitut.

Fowler menciona a [FOW] un patró anomenat Identify Field consistent a representar la clau primària d&#8217;un registre d&#8217;una Base de [...]]]></description>
			<content:encoded><![CDATA[<p>En un post <a href="http://www.agilogy.com/disseny-de-bases-de-dades-del-model-conceptual-al-model-logic">anterior</a> vaig posar un esquema sobre disseny de bases de dades a partir del model conceptual de l&#8217;anàlisi. En aquell post s&#8217;hi mencionen un patró en el que voldria aprofundir: Surrogate o Substitut.</p>
<p><span id="more-78"></span></p>
<p>Fowler menciona a [FOW] un patró anomenat Identify Field consistent a representar la clau primària d&#8217;un registre d&#8217;una Base de Dades en forma d&#8217;atributs (en un Domain Model). El cas és que inclou una dissertació força bona a l&#8217;hora de triar una clau primària a la base de dades. Bona part d&#8217;aquesta dissertació és independent del fet d&#8217;aplicar o no Domain Model i, en general, independent del fet de desenvolupar o no aplicacions sobre la base de dades en qüestió.</p>
<h2>Clau natural  vs artificial</h2>
<p>Una dels primers punts a discutir és si es farà servir una clau natural (és a dir, que té significat en el nostre domini, Fowler les anomena meaningful) o una clau artificial (sense significat propi, anomenades meaningless per Fowler). Si tenim una taula de persones, per exemple, una clau natural seria el DNI de la persona, mentre que una clau artificial seria un identificador numèric generat per la base de dades.</p>
<p>Per a que una clau funcioni correctament ha de ser única (evidentment) i immutable. Com comenta Fowler, les claus naturals no són immutables degut, principalment, als errors humans. Com que una clau natural té significat en el domini, és important que el seu valor sigui el que ha de ser. I per tant, en cas d&#8217;error, caldrà corregir-la.</p>
<p>Per tant, com a norma general, cal utilitzar claus artificials.</p>
<h2>Clau composta vs clau simple</h2>
<p>Una clau composta està formada per una combinació de camps que han de ser únics, mentre que una clau simple només té un camp.</p>
<p>Les claus simples són més senzilles de fer servir i manipular. En particular, des d&#8217;un punt de vista de bases de dades, és més senzill establir claus foranes cap a una clau primària si aquesta és simple. Les claus artificials són simples per la seva pròpia naturalesa, però les claus naturals poden ser tant simples com compostes.</p>
<h2>Aleshores: Quan usar un substitut?</h2>
<p>Resposta ràpida: Sempre.</p>
<h3>Excepcions a la norma: Associacions M:N, o N-àries on N&gt;2 sense classe associativa</h3>
<p>Les taules que, des d&#8217;un punt de vista d&#8217;anàlisi, no es corresponen a cap classe no mereixen, sota el meu punt de vista, un substitut de la clau primària. Aquestes taules només es consultaran per a veure les relacions entre altres taules i no tenen altra informació que aquesta relació. Per tant, cada fila d&#8217;una d&#8217;aquestes taules es correspon amb una associació entre files d&#8217;altres taules. No té sentit que cada una d&#8217;aquestes associacions tingui un identificador propi, ja que mai les recuperarem per identificador.</p>
<p>Si l&#8217;associació té una classe associativa, però, l&#8217;analista està indicant que hi ha informació addicional. En tal cas, és possible que interessi identificar aquestes instàncies i, per tant, si que recomanaria usar substitut de la clau primària.</p>
<p>En aquesta excepció, la clau primària serà composta, però continuarà sent artificial si les taules a les que refereix l&#8217;associació tenen, al seu torn, claus artificials. I per tant, continuarà sent immutable.</p>
<h2>Unicitat del substitut de la clau primària</h2>
<p>Fowler menciona també un punt a tenir en compte. Un substitut de la clau primària es pot dissenyar de tal forma que sigui:</p>
<ul>
<li>Únic a la taula: No poden haver-hi, a la mateixa taula, dues files amb el mateix identificador. Però podria ser que hi hagi en alguna altra taula una altra fila amb el mateix identificador.</li>
<li>Únic a tota la base de dades: No poden haver-hi en tota la base de dades dues files amb el mateix identificador. Però podria ser que en alguna altra base de dades existeixi alguna fila que fagi servir el mateix identificador.</li>
<li>Únic globalment: No pot haver-hi en tot el món una altra fila amb aquest identificador</li>
</ul>
<p>Resumint-ho ràpidament, els identificadors únics globalment són difícils de dissenyar i aporten aventatges relatius en la majoria de casos. Entre les claus úniques a la taula o a la base de dades, els avantatges i inconvenients sorgeixen en manipular aquestes files fora de la base de dades (per exemple, quan cal fer URLs per identificar recursos en una aplicació web o quan cal fer servir un data mapper). En aquests casos la meva experiència és que un identificador únic a la taula sol ser suficient.</p>
<p>Per a una discussió detallada de quina és la millor opció recomano llegir Fowler.</p>
<h2>Referències</h2>
<ul>
<li><strong>[FOW] Fowler, M</strong> (2005).  <a href="http://books.google.es/books?id=FyWZt5DdvFkC&amp;dq=Patterns+of+Enterprise+Application+Architecture&amp;psp=1"><em>Patterns of Enterprise Application Architecture</em></a>. Boston, US: Addison-Wesley</li>
<li><strong> [DBD] Sistach et al.</strong> (?) <em>, Disseny de Bases de Dades</em>. Barcelona: UOC</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.agilogy.com/disseny-de-bases-de-dades-claus-primaries/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quan evitar l&#8217;acoblament</title>
		<link>http://www.agilogy.com/quan-evitar-lacoblament/</link>
		<comments>http://www.agilogy.com/quan-evitar-lacoblament/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 10:58:30 +0000</pubDate>
		<dc:creator>jose.raya</dc:creator>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[disseny]]></category>

		<guid isPermaLink="false">http://www.agilogy.com/quan-evitar-lacoblament</guid>
		<description><![CDATA[&#8220;Acoblament baix&#8221; és un dels principis de disseny de software més àmpliament acceptats (de fet, no crec que poguem trobar cap referència enlloc on algú indiqui que és bó mantenir l&#8217;acoblament alt) però si apliquem aquest principi sense cap altre criteri, ens podem trobar [LAR] amb un disseny molt pobre on alguns objectes només actuin [...]]]></description>
			<content:encoded><![CDATA[<p>&#8220;Acoblament baix&#8221; és un dels principis de disseny de software més àmpliament acceptats (de fet, no crec que poguem trobar cap referència enlloc on algú indiqui que és bó mantenir l&#8217;acoblament alt) però si apliquem aquest principi sense cap altre criteri, ens podem trobar [LAR] amb un disseny molt pobre on alguns objectes només actuin com a contenidors de dades (i no tinguin cap acoblament amb altres classes) mentre que altres concentrin tots els acoblaments i totes les responsabilitats del sistema. Per tant, i citant en Larman <em>Some moderate degree of coupling between classes is normal and necessary for creating an object-oriented system in which tasks are fulfilled by a collaboration between connected objects</em>.</p>
<p><span id="more-77"></span></p>
<p>Un cop acceptem que és necessari assumir un cert grau d&#8217;acoblament al sistema, necessitem establir criteris per a decidir, entre dos acoblaments, quin és més greu per tal de mantenir un bon disseny. El propi Larman ens ofereix algunes pistes a la discussió del patró GRASP: Hem d&#8217;<strong>evitar l&#8217;acoblament cap als elements menys estables o amb més possibilitats d&#8217;evolucionar</strong>.</p>
<p>Però en Larman no és l&#8217;únic autor que ha tractat aquest tema. D&#8217;altres, com ara en Robert C. Martin, l&#8217;han tractat des del punt de vista de la gestió de dependències. El <a href="http://www.objectmentor.com/resources/articles/dip.pdf"> principi d&#8217;inversió de dependències </a> diu que:</p>
<ul>
<li>a. Els elements d&#8217;alt nivell (d&#8217;abstracció) no haurien de dependre dels de baix nivell. Tots dos haurien de dependre d&#8217;abstraccions</li>
<li>b. Les abstraccions no haurien de dependre dels detalls. Els detalls haurien de dependre de les abstraccions</li>
</ul>
<p>D&#8217;aquest principi podriem extreure un altre criteri: <strong>Evitar els acoblaments cap a elements de més baix nivell d&#8217;abstracció</strong>.</p>
<p>Finalment, una tercera variable que hem de tenir en compte és que el concepte d&#8217;acoblament depèn de quina sigui la unitat organitzativa que volguem tractar. Per exemple, podem considerar els acoblaments entre classes, entre paquets, mòduls o subsistemes. En Robert C. Martin [MAR] dedica un capítol sencer a la gestió de l&#8217;acoblament entre paquets, mentre que altres autors com en Bertrand Meyer [MEY] o en <a href="http://martinfowler.com/ieeeSoftware/coupling.pdf"> Martin Fowler </a> també tracten el tema de l&#8217;acoblament associat al concepte de mòdul o subsistema. Per tant, és molt important gestionar l&#8217;<strong>acoblament a nivell de paquets</strong>.</p>
<p>Recapitulant, doncs, ens trobem amb tres variables o criteris per decidir: La possibilitat de canvis, el nivell d&#8217;abstracció i la pertanyença a un mateix paquet. En realitat, però, si hem fet una bona organització de paquets, totes les classes d&#8217;un mateix paquet tindran un mateix nivell d&#8217;abstracció i, a més, hauran previst el mateix tipus de canvi, de manera que, si hem fet una bona organització de paquets, el criteri principal és <strong>evitar els acoblaments cap a classes d&#8217;altres paquets, especialment si el seu nivell d&#8217;abstracció és més baix que el del paquet de la classe en qüestió</strong> ja que son les que ténen més possiblitats de treballar a un nivell d&#8217;abstracció diferent o de canviar per motius que poden no haver estat previstos al disseny de la nostra classe.</p>
<p>Significa això que la resta d&#8217;acoblaments no s&#8217;han d&#8217;evitar? Mai. Això només significa que, en termes generals, hem d&#8217;<strong>evitar, de manera <em>preferent</em>, els acoblaments cap a classes que pertanyin a altres paquets</strong>. Per exemple, és una mala decissió afegir un acoblament cap a una classe d&#8217;un altre paquet per evitar un acoblament cap a una classe del mateix paquet.</p>
<p>Referències:</p>
<p>[LAR] Craig Larman, Applying Uml and Patterns, 3rd Edition<br />
[MAR] Robert C. Martin, Agile Software Development: Principles, Patterns and Practices<br />
[MEY] Bertrand Meyer, Object Oriented Software Construction</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agilogy.com/quan-evitar-lacoblament/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>UML 2.0</title>
		<link>http://www.agilogy.com/uml-20/</link>
		<comments>http://www.agilogy.com/uml-20/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 11:07:32 +0000</pubDate>
		<dc:creator>jordi.pradel</dc:creator>
				<category><![CDATA[cursos]]></category>

		<guid isPermaLink="false">http://www.agilogy.com/uml-20</guid>
		<description><![CDATA[Este curso está dirigido a personas de perfil técnico y analistas con conocimientos de análisis y diseño que quieran actualizar sus conocimientos a UML 2.0]]></description>
			<content:encoded><![CDATA[<p>Ho sentim, aquesta entrada només està disponible en <a href="http://www.agilogy.com/es/feed/">Español</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agilogy.com/uml-20/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Anàlisi de Sistemes d&#8217;Informació amb UML</title>
		<link>http://www.agilogy.com/analisis-de-sistemas-de-informacion-con-uml/</link>
		<comments>http://www.agilogy.com/analisis-de-sistemas-de-informacion-con-uml/#comments</comments>
		<pubDate>Thu, 12 Jul 2007 10:56:55 +0000</pubDate>
		<dc:creator>jordi.pradel</dc:creator>
				<category><![CDATA[cursos]]></category>

		<guid isPermaLink="false">http://www.agilogy.com/analisis-de-sistemas-de-informacion-con-uml</guid>
		<description><![CDATA[Ho sentim, aquesta entrada només està disponible en Español.
]]></description>
			<content:encoded><![CDATA[<p>Ho sentim, aquesta entrada només està disponible en <a href="http://www.agilogy.com/es/feed/">Español</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.agilogy.com/analisis-de-sistemas-de-informacion-con-uml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
