# Disseny de programari

El disseny de programari és el procés en el que un agent crea les especificacions d'un artefacte de programari amb la intenció de complir uns objectius, mitjançant un conjunt de components primitius i sotmès a certes restriccions. El disseny de programari es podria referir a "totes aquelles activitats que intervenen en la conceptualització, elaboració, implementació, posada en marxa i en definitiva modificar sistemes complexos", o bé "l'activitat de seguir l'especificació de requeriments a través d'un procés estilitzat d'enginyeria de programari".
Normalment el disseny de programari implica la solució de problemes i la planificació de programari. Això inclou el disseny de components i algorismes tant de baix com d'alt nivell, i el d'arquitectura.

## Descripció general

El disseny de programari és el procés de trobar solucions a un conjunt de problemes. Una de les parts més importants del disseny de programari és l'anàlisi de requisits de programari, que és una part essencial del procés de desenvolupament de programari, ja que llista els requeriments que haurà de complir el programari.
Si el programari és semi-automatitzat o dirigit a l'usuari, el disseny pot implicar la creació d'un guió il·lustrat per ajudar a determinar les especificacions des del punt de vista de l'usuari. En canvi, si el programari és completament automatitzat (no hi ha cap usuari ni interfície d'usuari), el disseny pot ser tan simple com un diagrama de flux o un text que descrigui una seqüència d'esdeveniments ja previstos.
Hi ha molts mètodes semi-estàndards (UML, per exemple) per tal de dur a terme el disseny de programari però, en qualsevol cas, quasi sempre es generarà una documentació del pla general per tal de tenir clares les bases del disseny. A més, el disseny pot ser específic per a una determinada plataforma o bé per a totes les plataformes, depenent de les especificacions i de la disponibilitat de la tecnologia utilitzada per dur a terme el disseny.

## Principis del disseny de programari

El procés de disseny és una seqüència de passos que permeten descriure tots els aspectes del programari a crear al dissenyador del projecte. Cal saber que el procés de disseny no és com seguir un llibre de cuina: la creativitat, l'experiència, la consciència de crear un bon programari i un compromís global de qualitat són factors crítics d'èxit per a un disseny competent. El procés comença per representar la totalitat del projecte i, a poc a poc, anar refinant cada detall. De la mateixa manera, el model de disseny que es crea pel programari ofereix una varietat de diferents punts de vista dels programes d'ordinador. Els principis bàsics del disseny permeten al programador navegar pel procés. Es suggereix un conjunt de principis per al disseny de programari, que s'han adaptat i ampliat en la següent llista:
* El procés de disseny no ha de patir "visió de túnel". Un bon dissenyador ha de considerar enfocaments alternatius, cada un basat en els requisits del problema, els recursos disponibles per fer la feina.
* El disseny ha de ser conforme amb el model d'anàlisi. Com que un sol element del model de disseny sovint traça a múltiples requisits, cal comptar amb un mitjà per al seguiment de com els requisits han estat satisfets cat pel model de disseny.
* El disseny no ha de reinventar la roda. Els sistemes es construeixen utilitzant un conjunt de patrons de disseny, molts dels quals probablement s'han trobat abans. Aquests patrons sempre han de triar-se com una alternativa a la reinvenció.
* El temps és curt i els recursos són limitats! El temps de disseny ha de ser invertit en la representació de noves idees i la integració d'aquests patrons que ja existeixen.
* El disseny ha de "minimitzar la distància intel·lectual" entre el programari i el problema que hi ha al món real. És a dir, l'estructura del disseny de programari ha (quan sigui possible) d'imitar l'estructura del domini del problema.
* El disseny ha de mostrar la uniformitat i la integració. Un disseny és uniforme si es considera que una persona desenvolupa tota la tasca. S'han de definir regles d'estil i format per a un equip de disseny abans que comenci a treballar. Un disseny s'integra si es va amb compte en les interfícies.
* El disseny ha de ser estructurat per adaptar-se als canvis. Els conceptes de disseny discutits en la propera secció permeten un disseny per assolir aquest principi.
* El disseny ha de ser estructurat perquè degradi amb suavitat, fins i tot quan es troben dades aberrants, esdeveniments o condicions de funcionament. Un programari ben dissenyat mai hauria de fallar: ha de ser dissenyat per donar cabuda a circumstàncies inusuals, i si s'ha d'acabar el processament, ho fa d'una manera elegant.
* El disseny no és la codificació, la codificació no és el disseny. El nivell d'abstracció del model de disseny és més alt que el codi font.
* El disseny ha de ser avaluat per la qualitat. Hi ha una varietat de conceptes i mesures de disseny estan disponibles per ajudar el dissenyador en l'avaluació de la qualitat.
* El disseny ha de ser revisat per minimitzar els errors conceptuals (semàntics). A vegades hi ha una tendència a centrar-se en les minúcies quan el disseny es revisa, no veure el bosc pels arbres. Un equip de disseny ha de garantir que els principals elements conceptuals del disseny (omissions, ambigüitat, inconsistència) s'han abordat abans de preocupar-se per la sintaxi del model de disseny.

## Conceptes de disseny

Els conceptes de disseny proporcionen al dissenyador una base des de la qual es poden aplicar mètodes més sofisticats. El conjunt de conceptes fonamentals de disseny ha evolucionat. Aquests són els següents:
* Abstracció - L'abstracció és el procés o resultat de la generalització al reduir el contingut d'informació d'un concepte o un fenomen observable, per tal de retenir només la informació que és rellevant per a un propòsit particular.
* Refinament - És el procés d'elaboració. Una jerarquia és desenvolupada per la descomposició de la funció d'una manera gradual fins a arribar a les instruccions del llenguatge de programació. A cada pas, una o diverses instruccions d'un programa es descomponen en instruccions més detallades. L'abstracció i el refinament són conceptes complementaris
* Modularitat - L'arquitectura es divideix en components anomenats mòduls.
* Arquitectura de programari - Es refereix a l'estructura general del programari i les formes en què aquesta estructura proporciona integritat conceptual per a un sistema. Una bona arquitectura produirà un bon retorn de la inversió respecte al resultat desitjat del projecte, per exemple, en termes de rendiment, la qualitat, l'horari i el cost.
* Jerarquia de control - es refereix a una estructura de programa que gestiona l'organització i jerarquien entre els components del programa.
* Particions estructurals - L'estructura del programa es pot dividir tant horitzontal com verticalment. Les particions horitzontals defineixen branques separades de jerarquia modular per a cada funció principal del programa. Les particions verticals suggereixen que el control i el treball han de ser distribuïts de dalt a baix en l'estructura del programa.
* Estructura de Dades - Es tracta d'una representació de la relació lògica entre els elements individuals de dades.
* Procediment - Es centra en el processament de cada mòdul de forma individual.
* Informació "oculta" - Els mòduls han de ser especificats i dissenyats perquè la informació continguda dins d'un mòdul sigui inaccessible pels altres que no tenguin necessitat d'aquesta informació.
En el seu model d'objectes, Grady Booch esmenta l'abstracció, encapsulació, modularització, i la Jerarquia com a principis fonamentals de disseny. El PHAME acrònim (Principis de la Jerarquia, Abstracció, modularització i encapsulació) s'utilitza de vegades per referir-se a aquests quatre principis fonamentals.

## Consideracions del disseny

Hi ha molts aspectes a considerar en el disseny d'un troç de programari. La importància de cada un ha de reflectir els objectius del programari que tracta d'assolir. Alguns d'aquests aspectes són:
* Compatibilitat - el programari és capaç d'operar amb altres productes que estan dissenyats per a la interoperabilitat amb un altre. Per exemple, un troç de programari pot ser compatible amb una versió anterior d'aquest.
* Extensibilitat - es poden afegir noves capacitats al programari sense majors canvis en l'arquitectura subjacent.
* Tolerància de fallada - el programari és resistent i capaç de recuperar-se de falles en els components.
* Mantenibilitat - es considera una mesura de la facilitat de correcció d'errors o modificacions funcionals que es pot aconseguir. Una alta capacitat de manteniment pot ser el producte de la modularitat i extensibilitat.
* Modularitat - el programari resultant comprèn components independents que condueixen a un millor manteniment. Els components podrien ser després implementats i provats individualment abans de ser integrats per formar un sistema desitjat. Això permet la divisió del treball en un projecte de desenvolupament de programari.
* Fiabilitat - El programari és capaç de realitzar una funció requerida sota les condicions establertes per un període especificat.
* Reutilització - parts o tot el programari es poden utilitzar en altres projectes.
* Robustesa - El programari és capaç d'operar sota estrès o tolerar l'entrada impredictible o no vàlida. Per exemple, pot ser dissenyat amb una capacitat de resistència en condicions de poca memòria.
* Seguretat - El programari és capaç de suportar actes hostils i influències.
* Usabilitat - La interfície d'usuari ha de ser senzilla per tal de facilitar als destinataris el seu ús. Els valors per defecte per als paràmetres han de ser elegits de manera que siguin una bona opció per a la majoria dels usuaris.
* Rendiment - El programari realitza les seves tasques dins d'un temps d'ús acceptable. El programari no consumeix massa memòria.
* Portabilitat - La facilitat d'ús del mateix programari en diferents ambients.
* Escalabilitat - El programari s'adapta bé a l'augment de les dades o el nombre d'usuaris.

## Llenguatges de modelatge

Un llenguatge de modelatge és qualsevol llenguatge artificial que es pot utilitzar per a expressar informació,coneixement o sistemes en una estructura que es defineix per un conjunt consistent de regles. Les regles s'utilitzen per a la interpretació del significat dels components en una estructura determinada. Un llenguatge de modelatge pot ser gràfic o textual. Exemples de llenguatges de modelatge gràfic per al disseny de programari són:
* Llenguatge de Descripció d'Arquitectures (ADL) és un llenguatge utilitzat per descriure i representar l'arquitectura de programari d'un sistema de programari.
* Business Process Modeling Notation (BPMN) és un exemple d'un llenguatge de modelatge de processos.
* EXPRESS i EXPRESS-G (ISO 10.303-11) és un llenguatge internacional de propòsit general de modelatge de dades estàndard.
* Extended Enterprise Modeling Language (EEML) és comunament utilitzat per a la modelització de processos de negocis a través d'una sèrie de capes.
* Diagrama de flux (Flowchart) és una representació esquemàtica d'un algoritme o un procés pas a pas.
* Conceptes Fonamentals de Modelatge (FMC) és llenguatge de modelatge de sistemes intensius en programari.
* IDEF és una família de llenguatges de modelatge, el més notable dels quals inclouen IDEF0 per a la modelització funcional, IDEF1X per a la modelització d'informació, i IDEF5 d'ontologies de modelatge.
* Programació Estructurada Jackson (JSP) és un mètode per a la programació estructurada basat en les correspondències entre l'estructura de flux de dades i l'estructura del programa.
* LePUS3 és un llenguatde visual de descripció de dissenys orientats a objectes i una especificació de llenguatge formal que és adequat principalment per a la modelització de grans programes orientats a objectes (Java, C ++, C #) i patrons de disseny.
* Llenguatge Unificat de Modelatge (UML) és un llenguatge (amb una notació gràfica i extensible) de modelatge general per a descriure l'estructura i el comportament del programari.
* Alloy (llenguatge d'especificació) és un llenguatge de propòsit general per expressar restriccions estructurals complexes i el comportament d'un sistema de programari. Proporciona un llenguatge concís basat en lògica de primer ordre relacional.
* SysML (SysML) és un nou llenguatge de propòsit general de modelatge per a l'enginyeria de sistemes.
* Service-oriented modeling framework (SOMF) és un marc de modelatge orientat a serveis.

## Patrons de disseny

Un dissenyador de programari o arquitecte poden identificar un problema de disseny que ha estat resolt per altres abans. Una plantilla o patró que descriu una solució a un problema comú es coneix com un patró de disseny. La reutilització d'aquests patrons pot accelerar el procés de desenvolupament de programari, havent estat provat i demostrat en el passat per altres individus.
La dificultat d'utilitzar el terme "disseny" en relació amb el món del programari és que, en cert sentit, el codi font d'un programa és el disseny per al programa que produeix. En la mesura que això és cert, el disseny del programari es refereix a la concepció del disseny del disseny. Edsger W. Dijkstra es va referir a aquesta superposició de nivells semàntics com la "novetat radical" de la programació d'ordinadors.

## Referències

* ↑ Ralph, P. and Wand, Y. (2009). A proposal for a formal definition of the design concept. In Lyytinen, K., Loucopoulos, P., Mylopoulos, J., and Robinson, W., editors, Design Requirements Workshop (LNBIP 14), pp. 103–136. Springer-Verlag, p. 109
* ↑ Freeman, Peter; David Hart (2004). "A Science of design for software-intensive systems". Communications of the ACM 47 (8): 19–21 [20].
* ↑ Booch, Grady; et al. (2004). Object-Oriented Analysis and Design with Applications (3rd ed.). MA, USA: Addison Wesley.
* ↑ Suryanarayana, Girish (November 2014). Refactoring for Software Design Smells. Morgan Kaufmann. p. 258.
* ↑ Carroll, ed., John (1995). Scenario-Based Design: Envisioning Work and Technology in System Development. New York: John Wiley & Sons.
* ↑ Bell, Michael (2008). "Introduction to Service-Oriented Modeling". Service-Oriented Modeling: Service Analysis, Design, and Architecture. Wiley & Sons.
* ↑ Judith Bishop. "C# 3.0 Design Patterns: Use the Power of C# 3.0 to Solve Real-World Problems". C# Books from O'Reilly Media. Retrieved 2012-05-15. If you want to speed up the development of your .NET applications, you're ready for C# design patterns -- elegant, accepted and proven ways to tackle common programming problems.
* ↑ Dijkstra, E. W. (1988). "On the cruelty of really teaching computing science".