Desenvolupament de programari

Tota aplicació informàtica, ja sigui utilitzada en un suport convencional (com un ordinador de sobretaula o un ordinador portàtil) o sigui utilitzada en un suport de nova generació (per exemple, dispositius mòbils com ara un telèfon mòbil de darrera generació o una tauleta tàctil PC), ha seguit un procediment planificat i desenvolupat detall per detall per a la seva creació. Aquest anirà des de la concepció de la idea o de la funcionalitat que haurà de satisfer aquesta aplicació fins a la generació d’un o diversos fitxers que permetin la seva execució exitosa.

Per convertir aquesta concepció d’una idea abstracta en un producte acabat que sigui eficaç i eficient hi haurà molts més passos, moltes tasques a fer. Aquestes tasques caldrà que estiguin ben planificades i que segueixin un guió que pot tenir en compte aspectes com:

  • Analitzar les necessitats que tenen les persones que faran servir aquest programari, escoltar com el voldran, atendre a les seves indicacions…
  • Dissenyar una solució que tingui en compte totes les necessitats abans analitzades: què haurà de fer el programari, quines interfícies gràfiques tindrà i com seran aquestes, quines dades s’hauran d’emmagatzemar i com es farà…
  • Desenvolupar el programari que implementi tot allò analitzat i dissenyat anteriorment, fent-lo d’una forma al més modular possible per facilitar el posterior manteniment o manipulació per part d’altres programadors.
  • Dur a terme les proves pertinents, tant de forma individualitzada per a cada mòdul com de forma complerta, per tal de validar que el codi desenvolupat és correcte i que fa el que ha de fer segons l’establert en els requeriments.
  • Implantar el programari en l’entorn on els usuaris finals el faran servir.

Aquest apartat se centrarà en el tercer punt, el desenvolupament de programari.

Concepte de programa informàtic

Un primer pas per poder començar a analitzar com cal fer un programa informàtic és tenir clar què és un programa i què significa aquest concepte. En contrast amb altres termes usats en informàtica, és possible referir-se a un “programa” en el llenguatge col·loquial sense haver d’estar parlant necessàriament d’ordinadors. Es podria estar referint al programa d’un cicle de conferències o de cinema. Però, tot i que no es tracta d’un context informàtic, aquest ús ja aporta una idea general del seu significat.

Un programa infomàtic és un conjunt d’esdeveniments ordenats de manera que se succeeixen de forma seqüencial en el temps, un darrere l’altre.

Un altre ús habitual, ara sí vinculat al context de les màquines i els autòmats, podria ser referir-se al programa d’una rentadora o d’un robot de cuina. En aquest cas, però, el que se succeeix són un conjunt, no tant d’esdeveniments, sinó d’ordres que l’electrodomèstic segueix ordenadament. Un cop seleccionat el programa que volem, l’electrodomèstic fa totes les tasques corresponents de manera autònoma.

Per exemple, el programa d’un robot de cuina per fer una crema de pastanaga seria:

  1. Espera que introduïu les pastanagues ben netejades, una patata i espècies al gust.
  2. Gira durant 1 minut, avançant progressivament fins a la velocitat 5.
  3. Espera que introduïu llet i sal.
  4. Gira durant 30 segons a velocitat 7.
  5. Gira durant 10 minuts a velocitat 3 mentre cou a una temperatura de 90 graus.
  6. S’atura. La crema de pastanaga està llesta!

Aquest conjunt d’ordres no és arbitrari, sinó que serveix per dur a terme una tasca de certa complexitat que no es pot fer d’un sol cop. S’ha de fer pas per pas. Totes les ordres estan vinculades entre si per arribar a assolir aquest objectiu i, sobretot, és molt important la disposició en què es duen a terme.

Entrant ja, ara sí, en el món dels ordinadors, la manera com s’estructuren les tasques que han de ser executades és similar als programes d’electrodomèstics anteriorment citats. En aquest cas, però, en lloc de transformar ingredients (o rentar roba bruta, si es tractés d’una rentadora), el que l’ordinador transforma és informació o dades.

Un programa informàtic no és més que un seguit d’ordres que es porten a terme seqüencialment, aplicades sobre un conjunt de dades.

Quines dades processa un programa informàtic? Bé, això dependrà del tipus de programa:

  • Un editor processa les dades d’un document de text.
  • Un full de càlcul processa dades numèriques ubicades en un fitxer.
  • Un videojoc processa les dades que fan referència a la forma i ubicació d’enemics i jugadors, les interfícies gràfiques on es trobarà el jugador, els punts aconseguits…
  • Un navegador web processa les ordres de l’usuari i les dades que rep des d’un servidor ubicat a internet.
  • Un reproductor de vídeo processa els fotogrames emmagatzemats en un arxiu i l’àudio relacionat.

Per tant, la tasca d’un programador informàtic és escollir quines ordres constituiran un programa d’ordinador, en quin ordre s’han de dur a terme i sobre quines dades cal aplicar-les perquè el programa porti a terme la tasca que ha de resoldre.

La dificultat de tot plegat serà més o menys gran depenent de la complexitat mateixa d’allò que cal que el programa faci. No és el mateix establir què ha de fer l’ordinador per resoldre una multiplicació de tres nombres que per processar textos o visualitzar pàgines a Internet.

Executar un programa

Per “executar un programa” s’entén fer que l’ordinador segueixi totes les seves ordres, des de la primera fins a la darrera.

D’altra banda, un cop fet el programa, cada cop que s’executi, l’ordinador complirà totes les ordres del programa.

De fet, un ordinador és incapaç de fer absolutament res per si mateix, sempre cal dir-li què ha de fer. I això se li diu mitjançant l’execució de programes. Tot i que des del punt de vista de l’usuari pot semblar que quan es posa en marxa un ordinador aquest funciona sense executar cap programa concret, cal tenir en compte que el seu sistema operatiu és un programa que està sempre en execució.

Codi font, codi objecte i codi excutable: màquines virtuals

Per crear un programa el que es farà serà crear un arxiu i escriure a un fitxer el seguit d’instruccions que es vol que l’ordinador executi. Aquestes instruccions hauran de seguir unes pautes determinades en funció del llenguatge de programació escollit. A més, haurien de seguir un ordre determinat que donarà sentit al programa escrit. Per començar n’hi haurà prou amb un editor de text simple.

Editors de text simples

Un editor de text simple és aquell que permet escriure-hi només text sense format. En són exemples el Bloc de Notes (Windows), el Gedit o l’Emacs (Unix).

Un cop s’ha acabat d’escriure el programa, el conjunt de fitxers de text resultants, on es troben les instruccions, es diu que contenen el codi font. Aquest codi font pot ser des d’un nivell molt alt, molt a prop del llenguatge humà, fins a un de nivell més baix, més proper al codi de les màquines, com ara el codi assemblador.

La tendència actual és fer ús de llenguatges d’alt nivell, és a dir, propers al llenguatge humà. Però això fa aparèixer un problema, i és que els fitxers de codi font no contenen el llenguatge màquina que entendrà l’ordinador. Per tant, resulten incomprensibles per al processador. Per poder generar codi màquina cal fer un procés de traducció des dels mnemotècnics que conté cada fitxer a les seqüències binàries que entén el processador.

En l’apartat “Tipus de llenguatges de programació” es descriuen les característiques dels llenguatges màquina, assemblador, d’alt nivell i de propòsit específic.

El procés anomenat compilació és la traducció del codi font dels fitxers del programa en fitxers en format binari que contenen les instruccions en un format que el processador pot entendre. El contingut d’aquests fitxers s’anomena codi objecte. El programa que fa aquest procés s’anomena compilador.

El codi objecte de les instruccions té aquest aspecte: 10101001000001101100110 10100101011100001110111

El codi objecte és el codi font traduït (pel compilador) a codi màquina, però aquest codi encara no pot ser executat per l’ordinador.

El codi executable és la traducció completa a codi màquina, duta a terme per l’enllaçador (en anglès, linker). El codi executable és interpretat directament per l’ordinador.

L’ enllaçador és l’encarregat d’inserir al codi objecte les funcions de les biblioteques que són necessàries per al programa i de dur a terme el procés de muntatge generant un arxiu executable.

Una biblioteca (library en anglès) és un col·lecció de codi predefinit que facilita la tasca del programador a l’hora de codificar un programa.

A la figura es mostra un resum ordenat de tots els conceptes definits. El codi font desenvolupat pels programadors es convertirà en codi objecte amb l’ajuda del compilador. Aquest ajudarà a localitzar els errors de sintaxi o de compilació que es trobin al codi font. Amb l’enllaçador, que recollirà el codi objecte i les biblioteques, es generarà el codi executable.

Figura Procés de transformació d’un codi font a un codi executable

Màquina virtual

El concepte de màquina virtual sorgeix amb l’objectiu de facilitar el desenvolupament de compiladors que generen codi per a diferents processadors.

La compilació consta de dues fases:

  • La primera parteix del codi font a un llenguatge intermedi obtenint un programa equivalent amb un menor nivell d’abstracció que l’original i que no pot ser directament executat.
  • La segona fase tradueix el llenguatge intermedi a un llenguatge comprensible per la màquina.

Arribat aquest punt es podria plantejar la pregunta: per què dividir la compilació en dues fases? L’objectiu és que el codi de la primera fase, el codi intermedi, sigui comú per a qualsevol processador, i que el codi generat en la segona fase sigui l’específic per a cada processador. De fet, la traducció del llenguatge intermedi al llenguatge màquina no se sol fer mitjançant compilació sinó mitjançant un intèrpret, tal com es mostra en la figura.

Figura Màquina virtual

La màquina virtual Java

La màquina virtual Java (JVM) és l’entorn en què s’executen els programes Java. És un programa natiu, és a dir, executable en una plataforma específica, que és capaç d’interpretar i executar instruccions expressades en un codi de bytes o (el bytecode de Java) que és generat pel compilador del llenguatge Java.

La màquina virtual Java és una peça fonamental de la tecnologia Java. Se situa en un nivell superior al maquinari sobre el qual es vol executar l’aplicació i actua com un pont entre el codi de bytes a executar i el sistema. Així, quan un programador escriu una aplicació Java, ho fa pensant en la JVM encarregada d’executar l’aplicació i no hi ha cap motiu per pensar en les característiques de la plataforma física sobre la qual s’ha d’executar l’aplicació. La JVM serà l’encarregada, en executar l’aplicació, de convertir el codi de bytes a codi natiu de la plataforma física.

Codi de bytes

El codi de bytes no és un llenguatge d’alt nivell, sinó un veritable codi màquina de baix nivell, viable fins i tot com a llenguatge d’entrada per a un microprocessador físic.

El gran avantatge de la JVM és que possibilita la portabilitat de l’aplicació a diferents plataformes i, així, un programa Java escrit en un sistema operatiu Windows es pot executar en altres sistemes operatius (Linux, Solaris i Apple OS X) amb l’únic requeriment de disposar de la JVM per al sistema corresponent.

El concepte de màquina virtual Java s’usa en dos àmbits: d’una banda, per fer referència al conjunt d’especificacions que ha de complir qualsevol implementació de la JVM; d’altra banda, per fer referència a les diverses implementacions de la màquina virtual Java existents i de les quals cal utilitzar-ne alguna per executar les aplicacions Java.

L’empresa Sun Microsystems és la propietària de la marca registrada Java, i aquesta s’utilitza per certificar les implementacions de la JVM que s’ajusten i són totalment compatibles amb les especificacions de la JVM, en el prefaci de les quals es diu: “Esperem que aquesta especificació documenti suficientment la màquina virtual de Java per fer possibles implementacions des de zero. Sun proporciona tests que verifiquen que les implementacions de la màquina virtual Java operen correctament.”

Als materials web es pot trobar una explicació, pas a pas, de com descarregar i instal·lar la màquina virtual Java.

Tipus de llenguatges de programació

Establert el concepte de programa informàtic i els conceptes de codi font, codi objecte i codi executable (així com el de màquina virtual), cal ara establir les diferències entre els diversos tipus de codi font existents, a través dels quals s’arriba a obtenir un programa informàtic.

Un llenguatge de programació és un llenguatge que permet establir una comunicació entre l’home i la màquina. El llenguatge de programació identificarà el codi font, que el programador desenvoluparà per indicar a la màquina, una vegada aquest codi s’hagi convertit en codi executable, quins passos ha de donar.

Al llarg dels darrers anys ha existit una evolució constant en els llenguatges de programació. S’ha establert una creixent evolució en la qual es van incorporant elements que permeten crear programes cada vegada més sòlids i eficients. Això facilita molt la tasca del programador per al desenvolupament del programari, el seu manteniment i l’adaptació. Avui en dia, existeixen, fins i tot, llenguatges de programació que permeten la creació d’aplicacions informàtiques a persones sense coneixements tècnics d’informàtica, pel fet d’existir una creació pràcticament automàtica del codi a partir d’unes preguntes.

Els diferents tipus de llenguatges són:

  • Llenguatge de primera generació o llenguatge màquina.
  • Llenguatges de segona generació o llenguatges d’assemblador.
  • Llenguatges de tercera generació o llenguatges d’alt nivell.
  • Llenguatges de quarta generació o llenguatges de propòsit específic.
  • Llenguatges de cinquena generació.

El primer tipus de llenguatge que es va desenvolupar és l’anomenat llenguatge de primera generació o llenguatge màquina. És l’únic llenguatge que entén l’ordinador directament.

La seva estructura està totalment adaptada als circuits impresos dels ordinadors o processadors electrònics i molt allunyada de la forma d’expressió i anàlisi dels problemes propis dels humans (les instruccions s’expressen en codi binari). Això fa que la programació en aquest llenguatge resulti tediosa i complicada, ja que es requereix un coneixement profund de l’arquitectura física de l’ordinador. A més, s’ha de valorar que el codi màquina fa possible que el programador utilitzi la totalitat de recursos del maquinari, amb la qual cosa es poden obtenir programes molt eficients.

10110000 01100001 
Aquesta línia conté una instrucció que mou un valor al registre del processador.

Actualment, a causa de la complexitat del desenvolupament d’aquest tipus de llenguatge, està pràcticament en desús. Només es farà servir en processadors molts concrets o per a funcionalitats molt específiques.

El segon tipus de llenguatge de programació són els llenguatges de segona generació o llenguatges d’assemblador. Es tracta del primer llenguatge de programació que utilitza codis mnemotècnics per indicar a la màquina les operacions que ha de dur a terme. Aquestes operacions, molt bàsiques, han estat dissenyades a partir de la coneixença de l’estructura interna de la pròpia màquina.

Cada instrucció en llenguatge d’assemblador correspon a una instrucció en llenguatge màquina. Aquests tipus de llenguatges depenen totalment del processador que utilitzi la màquina, per això es diu que estan orientats a les màquines.

A la figura es mostra un esquema del funcionament dels llenguatges de segona generació. A partir del codi escrit en llenguatge d’assemblador, el programa traductor (assemblador) ho converteix en codi de primera generació, que serà interpretat per la màquina.

Figura Llenguatge de segona generació

En general s’utilitza aquest tipus de llenguatges per programar controladors (drivers) o aplicacions de temps real, ja que requereix un ús molt eficient de la velocitat i de la memòria.

Característiques dels llenguatges de primera i segona generació

Com a avantatges dels llenguatges de primera i segona generació es poden establir:

  • Permeten escriure programes molt optimitzats que aprofiten al màxim el maquinari (hardware) disponible.
  • Permeten al programador especificar exactament quines instruccions vol que s’executin.

Els inconvenients són els següents:

  • Els programes escrits en llenguatges de baix nivell estan completament lligats al maquinari on s’executaran i no es poden traslladar fàcilment a altres sistemes amb un maquinari diferent.
  • Cal conèixer a fons l’arquitectura del sistema i del processador per escriure bons programes.
  • No permeten expressar de forma directa conceptes habituals a nivell d’algorisme.
  • Son difícils de codificar, documentar i mantenir.

El següent grup de llenguatges es coneix com a llenguatges de tercera generació o llenguatges d’alt nivell. Aquests llenguatges, més evolucionats, utilitzen paraules i frases relativament fàcils d’entendre i proporcionen també facilitats per expressar alteracions del flux de control d’una forma bastant senzilla i intuïtiva.

Els llenguatges de tercera generació o d’alt nivell s’utilitzen quan es vol desenvolupar aplicacions grans i complexes, on es prioritza el fet de facilitar i comprendre com fer les coses (llenguatge humà) per sobre del rendiment del programari o del seu ús de la memòria.

Els esforços encaminats a fer la tasca de programació independent de la màquina on s’executaran van donar com a resultat l’aparició dels llenguatges de programació d’alt nivell.

Els llenguatges d’alt nivell són normalment fàcils d’aprendre perquè estan formats per elements de llenguatges naturals, com ara l’anglès. A continuació es mostra un exemple d’algorisme implementat en un llenguatge d’alt nivell, concretament en Basic. Aquest algorisme calcula el factorial d’un nombre donat a la funció com a paràmetre. Es pot observar com és fàcilment comprensible amb un mínim coneixement de l’anglès.

' ------------------------------------------
' Funció Factorial
' -----------------------------------------
Public Function Factorial(num As Integer)As String
Dim i As Integer
    For i = 1 To num - 1
      num = num * i
      Factorial = num
    Next
End Function

Com a conseqüència d’aquest allunyament de la màquina i acostament a les persones, els programes escrits en llenguatges de programació de tercera generació no poden ser interpretats directament per l’ordinador, sinó que és necessari dur a terme prèviament la seva traducció a llenguatge màquina. Hi ha dos tipus de traductors: els compiladors i els intèrprets.

En Basic, el llenguatge d’alt nivell més conegut, les ordres com IF comptador = 10 THEN STOP poden utilitzar-se per demanar a l’ordinador que pari si la variable comptador és igual a deu.

Compiladors

Són programes que tradueixen el programa escrit amb un llenguatge d’alt nivell al llenguatge màquina. El compilador detectarà els possibles errors del programa font per aconseguir un programa executable depurat.

Alguns exemples de codis de programació que hauran de passar per un compilador són: Pascal, C, C++, .NET, …

A la figura es pot veure, en un esquema, la funció del compilador entre els dos llenguatges.

Figura Codi compilat

El procediment que haurà de seguir un programador és el següent:

  • Crear el codi font.
  • Crear el codi executable fent ús de compiladors i enllaçadors.
  • El codi executable depèn de cada sistema operatiu. Per a cada sistema hi ha un compilador, és a dir, si es vol executar el codi amb un altre sistema operatiu s’ha de recompilar el codi font.
  • El programa resultant s’executa directament des del sistema operatiu.

A la figura es pot observar un esquema que representa la dependència del sistema operatiu a l’hora d’escollir i utilitzar compilador.

Figura Codi compilat per SO

Els intèrprets

L’intèrpret també és un programa que tradueix el codi d’alt nivell al llenguatge màquina, però, a diferència del compilador, ho fa en temps d’execució. És a dir, no es fa un procés previ de traducció de tot el programa font a codi de bytes, sinó que es va traduint i executant instrucció per instrucció.

Alguns exemples de codis de programació que hauran de passar per un intèrpret són: JavaScript, PHP, ASP…

Algunes característiques dels llenguatges interpretats són:

  • El codi interpretat no és executat directament pel sistema operatiu, sinó que fa ús d’un intèrpret.
  • Cada sistema té el seu propi intèrpret.

Compiladors davant intèrprets

L’intèrpret és notablement més lent que el compilador, ja que du a terme la traducció alhora que l’execució. A més, aquesta traducció es fa sempre que s’executa el programa, mentre que el compilador només la du a terme una vegada. L’avantatge dels intèrprets és que fan que els programes siguin més portables. Així, un programa compilat en un ordinador amb sistema operatiu Windows no funcionarà en un Macintosh, o en un ordinador amb sistema operatiu Linux, a menys que es torni a compilar el programa font en el nou sistema.

Característiques dels llenguatges de tercera, quarta i cinquena generació

Els llenguatges de tercera generació són aquells que són capaços de contenir i executar, en una sola instrucció, l’equivalent a diverses instruccions d’un llenguatge de segona generació.

Els avantatges dels llenguatges de tercera generació són:

  • El codi dels programes és molt més senzill i comprensible.
  • Són independents del maquinari (no hi fan cap referència). Per aquest motiu és possible “portar” el programa entre diferents ordinadors / arquitectures / sistemes operatius (sempre que en el sistema de destinació existeixi un compilador per a aquest llenguatge d’alt nivell).
  • És més fàcil i ràpid escriure els programes i més fàcil mantenir-los.

Els inconvenients dels llenguatges de tercera generació són:

  • La seva execució en un ordinador pot resultar més lenta que el mateix programa escrit en llenguatge de baix nivell, tot i que això depèn molt de la qualitat del compilador que faci la traducció.

Exemples de llenguatges de programació de tercera generació: C, C++, Java, Pascal…

Els llenguatges de quarta generació o llenguatges de propòsit específic. Aporten un nivell molt alt d’abstracció en la programació, permetent desenvolupar aplicacions sofisticades en un espai curt de temps, molt inferior al necessari per als llenguatges de 3a generació.

S’automatitzen certs aspectes que abans calia fer a mà. Inclouen eines orientades al desenvolupament d’aplicacions (IDE) que permeten definir i gestionar bases de dades, dur a terme informes (p.ex.: Oracle reports), consultes (p.ex.: informix 4GL), mòduls… , escrivint molt poques línies de codi o cap.

IDE són les sigles en anglès d’Integrated Development Environment, és a dir, Entorn Integrat de Desenvolupament.

Permeten la creació de prototipus d’una aplicació ràpidament. Els prototipus permeten tenir una idea de l’aspecte i del funcionament de l’aplicació abans que el codi estigui acabat. Això facilita l’obtenció d’un programa que reuneixi les necessitats i expectatives del client.

Alguns dels aspectes positius que mostren aquest tipus de llenguatges de programació són:

  • Major abstracció.
  • Menor esforç de programació.
  • Menor cost de desenvolupament del programari.
  • Basats en generació de codi a partir d’especificacions de nivell molt alt.
  • ­Es poden dur a terme aplicacions sense ser un expert en el llenguatge.
  • ­Solen tenir un conjunt d’instruccions limitat.
  • Són específics del producte que els ofereix.

Aquests llenguatges de programació de quarta generació estan orientats, bàsicament, a les aplicacions de negoci i al maneig de bases de dades.

Alguns exemples de llenguatges de quarta generació són Visual Basic, Visual Basic .NET, ABAP de SAP, FileMaker, PHP, ASP, 4D…

A la figura es pot veure l’entorn de treball i un exemple de codi font de FileMaker.

Figura FileMaker: Llenguatge de quarta generació

Els llenguatges de cinquena generació són llenguatges específics per al tractament de problemes relacionats amb la intel·ligència artificial i els sistemes experts.

En lloc d’executar només un conjunt d’ordres, l’objectiu d’aquests sistemes és “pensar” i anticipar les necessitats dels usuaris. Aquests sistemes es troben encara en desenvolupament. Es tractaria del paradigma lògic.

Alguns exemples de llenguatges de cinquena generació són Lisp o Prolog.

Paradigmes de programació

És difícil establir una classificació general dels llenguatges de programació, ja que existeix un gran nombre de llenguatges i, de vegades, diferents versions d’un mateix llenguatge. Això provocarà que en qualsevol classificació que es faci un mateix llenguatge pertanyi a més d’un dels grups establerts. Una classificació molt estesa, atenent a la forma de treballar dels programes i a la filosofia amb què van ser concebuts, és la següent:

  • Paradigma imperatiu/estructurat.
  • Paradigma d’objectes.
  • Paradigma funcional.
  • Paradigma lògic.

El paradigma imperatiu/estructurat deu el seu nom al paper dominant que exerceixen les sentències imperatives, és a dir aquelles que indiquen dur a terme una determinada operació que modifica les dades guardades en memòria.

Alguns dels llenguatges imperatius són C, Basic, Pascal, Cobol…

La tècnica seguida en la programació imperativa és la programació estructurada. La idea és que qualsevol programa, per complex i gran que sigui, pot ser representat mitjançant tres tipus d’estructures de control:

  • Seqüència.
  • Selecció.
  • Iteració.

D’altra banda, també es proposa desenvolupar el programa amb la tècnica de disseny descendent (top-down). És a dir, modular el programa creant porcions més petites de programes amb tasques específiques, que se subdivideixen en altres subprogrames, cada vegada més petits. La idea és que aquests subprogrames típicament anomenats funcions o procediments han de resoldre un únic objectiu o tasca.

Imaginem que hem de fer una aplicació que registri les dades bàsiques del personal d’una escola, dades com poden ser el nom, el DNI, i que calculi el salari dels professors així com el dels administratius, on el salari dels administratius és el sou base (SOU_BASE) * 10 mentre que el salari dels professors és el sou base (SOU_BASE) + nombre d’hores impartides (numHores) * 12.

const float SOU_BASE = 1.000;

Struct Administratiu
{
    string nom;
    string DNI;
    float Salari;
}

Struct Professor
{
    string nom;
    string DNI;
    int numHores;
    float salari;
}

void AssignarSalariAdministratiu (Administratiu administratiu1)
{
    administratiu1. salari = SOU_BASE * 10;
}

void AssignarSalariProfessor (Professor professor1)
{
    professor1. salari = SOU_BASE + (numHores * 12);
}

El paradigma d’objectes, típicament conegut com a Programació Orientada a Objectes (POO, o OOP en anglès), és un paradigma de construcció de programes basat en una abstracció del món real. En un programa orientat a objectes, l’abstracció no són procediments ni funcions sinó els objectes. Aquests objectes són una representació directa d’alguna cosa del món real, com ara un llibre, una persona, una comanda, un empleat…

Alguns dels llenguatges de programació orientada a objectes són C++, Java, C#…

Un objecte és una combinació de dades (anomenades atributs) i mètodes (funcions i procediments) que ens permeten interactuar amb ell. En aquest tipus de programació, per tant, els programes són conjunts d’objectes que interactuen entre ells a través de missatges (crides a mètodes).

La programació orientada a objectes es basa en la integració de 5 conceptes: abstracció, encapsulació, modularitat, jerarquia i polimorfisme, que és necessari comprendre i seguir de manera absolutament rigorosa. No seguir-los sistemàticament, ometre’ls puntualment per pressa o altres raons fa perdre tot el valor i els beneficis que ens aporta l’orientació a objectes.

class Treballador {
   private:
      string nom;
      string DNI;
   protected:
      static const float SOU_BASE = 1.000; 
   public:
      string GetNom() {return this.nom;}
      void SetNom (string n) {this.nom = n;}
      string GetDNI() {return this.DNI;}
      void SetDNI (string dni) {this.DNI = dni;}
      virtual float salari() = 0;
}

class Administratiu: public Treballador {
   public:
      float Salari() {return SOU_BASE * 10};
}

class Professor: public Treballador {
   private:
      int numHores;
   public:
      float Salari() {return SOU_BASE + (numHores * 15);}
}

El paradigma funcional està basat en un model matemàtic. La idea és que el resultat d’un càlcul és l’entrada del següent, i així successivament fins que una composició produeixi el resultat desitjat.

Els creadors dels primers llenguatges funcionals pretenien convertir-los en llenguatges d’ús universal per al processament de dades en tot tipus d’aplicacions, però, amb el pas del temps, s’ha utilitzat principalment en àmbits d’investigació científica i aplicacions matemàtiques.

Un dels llenguatges més típics del paradigma funcional és el Lisp. Vegeu un exemple de programació del factorial amb aquest llenguatge:

> (defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
FACTORIAL
> (factorial 3)
6

El paradigma lògic té com a característica principal l’aplicació de les regles de la lògica per inferir conclusions a partir de dades.

Un programa lògic conté una base de coneixement sobre la que es duen a terme consultes. La base de coneixement està formada per fets, que representen la informació del sistema expressada com a relacions entre les dades i regles lògiques que permeten deduir conseqüències a partir de combinacions entre els fets i, en general, altres regles.

Un dels llenguatges més típics del paradigma lògic és el Prolog.

Exemple de desplegament pràctic del paradigma lògic

Determinarem si hem de prescriure al pacient estar a casa reposant al saber que es compleixen els següents fets: malestar i 39º de temperatura corporal.

Regles de la base de coneixement:

  • R1: Si febre, llavors estar a casa en repòs.
  • R2: Si malestar, llavors posar-se termòmetre.
  • R3: Si termòmetre marca una temperatura > 37º, llavors febre.
  • R4: Si diarrea, llavors dieta.

Si seguim un raonament d’encadenament cap endavant, el procediment seria:

Indicar el motor d’inferència, els fets: malestar i termòmetre marca 39.

<code>Base de fets = { malestar, termòmetre marca 39º }

El sistema identifica les regles aplicables: R2 i R3. L’algorisme s’inicia aplicant la regla R2, incorporant en la base de fets “posar-se el termòmetre”.

Base de fets = { malestar, termòmetre marca 39º, posar-se termòmetre }

Com que no s’ha solucionat el problema, continua amb la següent regla R3, afegint a la base de fets “febre”.

Base de fets = { malestar, termòmetre marca 39º, posar-se termòmetre, febre }

Com que no s’ha solucionat el problema, torna a identificar un subconjunt de regles aplicables, excepte les ja utilitzades. El sistema identifica les regles aplicables: R1, tot incorporant a la base de fets “estar a casa en repòs”.

Base de fets = { malestar, termòmetre marca 39º, posar-se termòmetre, febre, estar a casa en repòs}

Com que repòs està a la base de fets, s’ha arribat a una resposta positiva a la pregunta formulada.

El paradigma és àmpliament utilitzat en les aplicacions que tenen a veure amb la Intel·ligència Artificial, particularment en el camp de sistemes experts i processament del llenguatge humà. Un sistema expert és un programa que imita el comportament d’un expert humà. Per tant conté informació (és a dir una base de coneixements) i una eina per comprendre les preguntes i trobar la resposta correcta examinant la base de dades (un motor d’inferència).

També és útil en problemes combinatoris o que requereixin una gran quantitat o amplitud de solucions alternatives, d’acord amb la naturalesa del mecanisme de tornada enrere (backtracking).

Característiques dels llenguatges més difosos

Existeixen molts llenguatges de programació diferents, fins al punt que moltes tecnologies tenen el seu llenguatge propi. Cada un d’aquests llenguatges té un seguit de particularitats que el fan diferent de la resta.

Els llenguatges de programació més difosos són aquells que més es fan servir en cadascun dels diferents àmbits de la informàtica. En l’àmbit educatiu, per exemple, es considera un llenguatge de programació molt difós aquell que es fa servir a moltes universitats o centres educatius per a la docència de la iniciació a la programació.

Els llenguatges de programació més difosos corresponents a diferents àmbits, a diferents tecnologies o a diferents tipus de programació tenen una sèrie de característiques en comú que són les que marquen les similituds entre tots ells.

Característiques de la programació estructurada

La programació estructurada va ser desenvolupada pel neerlandès Edsger W. Dijkstra i es basa en el denominat teorema de l’estructura. Per això utilitza únicament tres estructures: seqüència, selecció i iteració, essent innecessari l’ús de la instrucció o instruccions de transferència incondicional (GOTO, EXIT FUNCTION, EXIT SUB o múltiples RETURN).

D’aquesta forma les característiques de la programació estructurada són la claredat, el teorema de l’estructura i el disseny descendent.

Claredat

Hi haurà d’haver prou informació al codi per tal que el programa pugui ser entès i verificat: comentaris, noms de variables comprensibles i procediments entenedors… Tot programa estructurat pot ser llegit des del principi a la fi sense interrupcions en la seqüència normal de lectura.

Teorema de l’estructura

Demostra que tot programa es pot escriure utilitzant únicament les tres estructures bàsiques de control:

  • Seqüència: instruccions executades successivament, una darrere l’altra. A la figura es pot observar un exemple de l’estructura bàsica de seqüència, on primer s’executarà la sentència A i, posteriorment, la B.
Figura Exemple de seqüència
  • Selecció: la instrucció condicional amb doble alternativa, de la forma “si condició, llavors SentènciaA, sinó SentènciaB”. A la figura es pot observar un esquema que exemplifica l’estructura bàsica de selecció.
Figura Exemple de selecció
  • Iteració: el bucle condicional “mentre condició, fes SentènciaA”, que executa les instruccions repetidament mentre la condició es compleixi. A la figura es pot observar un esquema que exemplifica l’estructura bàsica d’iteració.
Figura Exemple d’iteració

Disseny descendent

El disseny descendent és una tècnica que es basa en el concepte de “divideix i venceràs” per tal de resoldre un problema en l’àmbit de la programació. Es tracta de la resolució del problema al llarg de diferents nivells d’abstracció partint d’un nivell més abstracte i finalitzant en un nivell de detall.

A la figura es pot observar un exemple del disseny descendent. A partir del problema1 s’obtenen diversos subproblemes (subproblema 1.1, subproblema 1.2 i subproblema 1.3). La resolució d’aquests subproblemes serà molt més senzilla que la del problema original per tal com se n’ha reduït considerablement l’abast i la mida. De forma iterativa es pot observar com aquests subproblemes es tornen a dividir, a la vegada, en altres subproblemes.

Figura Disseny descendent

La visió moderna de la programació estructurada introdueix les característiques de programació modular i tipus abstractes de dades (TAD).

Programació modular

La realització d’un programa sense seguir una tècnica de programació modular produeix sovint un conjunt enorme de sentències l’execució de les quals és complexa de seguir, i d’entendre, amb la qual cosa es fa gairebé impossible la depuració d’errors i la introducció de millores. Fins i tot, es pot donar el cas d’haver d’abandonar el codi preexistent perquè resulta més fàcil començar de nou.

Quan es parla de programació modular, ens referim a la divisió d’un programa en parts més manejables i independents. Una regla pràctica per aconseguir aquest propòsit és establir que cada segment del programa no excedeixi, en longitud, d’un pam de codificació.

En la majoria de llenguatges, els mòduls es tradueixen a:

  • Procediments: són subprogrames que duen a terme una tasca determinada i retornen 0 o més d’un valor. S’utilitzen per estructurar un programa i millorar la seva claredat.
  • Funcions: són subprogrames que duen a terme una determinada tasca i retornen un únic resultat o valor. S’utilitzen per crear operacions noves que no ofereix el llenguatge.

Tipus abstractes de dades (TAD)

En programació, el tipus de dades d’una variable és el conjunt de valors que la variable pot assumir. Per exemple, una variable de tipus booleà pot adoptar només dos valors possibles: vertader o fals. A més, hi ha un conjunt limitat però ben definit d’operacions que tenen sentit sobre els valors d’un tipus de dades; així, operacions típiques sobre el tipus booleà són AND o OR.

Els llenguatges de programació assumeixen un nombre determinat de tipus de dades, que pot variar d’un llenguatge a un altre; així, en Pascal tenim els enters, els reals, els booleans, els caràcters… Aquests tipus de dades són anomenats tipus de dades bàsics en el context dels llenguatges de programació.

Fins fa uns anys, tota la programació es basava en aquest concepte de tipus i no eren pocs els problemes que apareixien, lligats molt especialment a la complexitat de les dades que s’havien de definir. Va aparèixer la possibilitat de poder definir tipus abstractes de dades, on el programador pot definir un nou tipus de dades i les seves possibles operacions.

Exemple d’implementació d’un tipus abstracte de dades implementat en el llenguatge C

struct TADpila
{
        int top;
        int elements[MAX_PILA];
}

void crear(struct TADpila *pila)
{
        Pila.top = -1;
}

void apilar(struct TADpila *pila, int elem)
{
        Pila.elements[pila.top++] = elem;
}

void desapilar(struct TADpila *pila)
{
        Pila.top--;
}

Característiques de la programació orientada a objectes

Un dels conceptes importants introduïts per la programació estructurada és l’abstracció de funcionalitats a través de funcions i procediments. Aquesta abstracció permet a un programador utilitzar una funció o procediment coneixent només què fa, però desconeixent el detall de com ho fa.

Aquest fet, però, té diversos inconvenients:

  • Les funcions i procediments comparteixen dades del programa, cosa que provoca que canvis en un d’ells afectin a la resta.
  • Al moment de dissenyar una aplicació és molt difícil preveure detalladament quines funcions i procediments necessitarem.
  • La reutilització del codi és difícil i acaba consistint a copiar i enganxar determinats trossos de codi, i retocar-los. Això és especialment habitual quan el codi no és modular.

L’orientació a objectes, concebut als anys setanta i vuitanta però estesa a partir dels noranta, va permetre superar aquestes limitacions.

L’orientació a objectes (en endavant, OO) és un paradigma de construcció de programes basat en una abstracció del món real.

En un programa orientat a objectes, l’abstracció no són els procediments ni les funcions, són els objectes. Aquests objectes són una representació directa d’alguna cosa del món real, com ara un llibre, una persona, una organització, una comanda, un empleat…

Un objecte és una combinació de dades (anomenades atributs) i mètodes (funcions i procediments) que ens permeten interactuar amb ell. En OO, doncs, els programes són conjunts d’objectes que interactuen entre ells a través de missatges (crides a mètodes).

Els llenguatges de POO (programació orientada a objectes) són aquells que implementen més o menys fidelment el paradigma OO. La programació orientada a objectes es basa en la integració de 5 conceptes: abstracció, encapsulació, modularitat, jerarquia i polimorfisme, que és necessari comprendre i seguir de manera absolutament rigorosa. No seguir-los sistemàticament o ometre’ls puntualment, per pressa o altres raons, fa perdre tot el valor i els beneficis que aporta l’orientació a objectes.

Abstracció

És el procés en el qual se separen les propietats més importants d’un objecte de les que no ho són. És a dir, per mitjà de l’abstracció es defineixen les característiques essencials d’un objecte del món real, els atributs i comportaments que el defineixen com a tal, per després modelar-lo en un objecte de programari. En el procés d’abstracció no ha de ser preocupant la implementació de cada mètode o atribut, només cal definir-los.

En la tecnologia orientada a objectes l’eina principal per suportar l’abstracció és la classe. Es pot definir una classe com una descripció genèrica d’un grup d’objectes que comparteixen característiques comunes, les quals són especificades en els seus atributs i comportaments.

Encapsulació

Permet als objectes triar quina informació és publicada i quina informació és amagada a la resta dels objectes. Per això els objectes solen presentar els seus mètodes com a interfícies públiques i els seus atributs com a dades privades o protegides, essent inaccessibles des d’altres objectes. Les característiques que es poden atorgar són:

  • Públic: qualsevol classe pot accedir a qualsevol atribut o mètode declarat com a públic i utilitzar-lo.
  • Protegit: qualsevol classe heretada pot accedir a qualsevol atribut o mètode declarat com a protegit a la classe mare i utilitzar-lo.
  • Privat: cap classe no pot accedir a un atribut o mètode declarat com a privat i utilitzar-lo.

Modularitat

Permet poder modificar les característiques de cada una de les classes que defineixen un objecte, de forma independent de la resta de classes en l’aplicació. En altres paraules, si una aplicació es pot dividir en mòduls separats, normalment classes, i aquests mòduls es poden compilar i modificar sense afectar els altres, aleshores aquesta aplicació ha estat implementada en un llenguatge de programació que suporta la modularitat.

Jerarquia

Permet l’ordenació de les abstraccions. Les dues jerarquies més importants d’un sistema complex són l’herència i l’agregació.

L’herència també es pot veure com una forma de compartir codi, de manera que quan s’utilitza l’herència per definir una nova classe només s’ha d’afegir allò que sigui diferent, és a dir, reaprofita els mètodes i variables, i especialitza el comportament.

Per exemple, es pot identificar una classe pare anomenada treballador i dues classes filles, és a dir dos subtipus de treballadors, administratiu i professor.

Figura Exemple d’herència

A la figura es pot observar la representació en forma de diagrama de l’exemple explicat anteriorment: les classes administratiu i professor que hereten de la classe treballador.

L’agregació és un objecte que està format de la combinació d’altres objectes o components. Així, un ordinador es compon d’una CPU, una pantalla, un teclat i un ratolí, i aquests components no tenen sentit sense l’ordinador. A la figura es pot observar un exemple d’agregació en què la classe ordinador està composta per les altres quatre classes.

Figura Exemple d’agregació

El polimorfisme

És una característica que permet donar diferents formes a un mètode, ja sigui en la definició com en la implementació.

La sobrecàrrega (overload) de mètodes consisteix a implementar diverses vegades un mateix mètode però amb paràmetres diferents, de manera que, en invocar-lo, el compilador decideix quin dels mètodes s’ha d’executar, en funció dels paràmetres de la crida.

Un exemple de mètode sobrecarregat és aquell que calcula el salari d’un treballador en una empresa. En funció de la posició que ocupa el treballador tindrà més o menys conceptes a la seva nòmina (més o menys incentius, per exemple).

El mateix mètode, que podríem anomenar CàlculSalari quedarà implementat de forma diferent en funció de si es calcula el salari d’un operari (amb menys conceptes en la seva nòmina, la qual cosa provoca que el mètode rebi menys variables) o si es calcula el salari d’un directiu.

La sobreescriptura (override) de mètodes consisteix a reimplementar un mètode heretat d’una superclasse exactament amb la mateixa definició (incloent nom de mètode, paràmetres i valor de retorn).

Un exemple de sobrecàrrega de mètodes podria ser el del mètode Area(). A partir d’una classe Figura que conté el mètode Area(), existeix una classe derivada per a alguns tipus de figures (per exemple, Rectangle o Quadrat).

La implementació del mètode Area() serà diferent a cada una de les classes derivades; aquestes poden implementar-se de forma diferent (en funció de com es calculi en cada cas l’àrea de la figura) o definir-se de forma diferent.

Fases del desenvolupament dels sistemes d'informació

Una aplicació informàtica necessitarà moltes petites accions (i no tan petites) per ser creada. S’han desenvolupat moltes metodologies que ofereixen un acompanyament al llarg d’aquest desenvolupament, proporcionant pautes, indicacions, mètodes i documents per ajudar, sobretot, els caps de projecte més inexperts.

Dintre d’aquestes metodologies hi ha Mètrica v3.0. Ha estat desenvolupada pel Ministeri d’Administracions Públiques. Es tracta d’una metodologia per a la planificació, desenvolupament i manteniment dels sistemes d’informació d’una organització. Per al desenvolupament de programari cal fixar-se en la part que fa referència al desenvolupament dels sistemes d’informació (SI), dins la metodologia Mètrica. Divideix el desenvolupament en 5 fases, que se segueixen de forma seqüencial.

També és important tenir clarament identificats els rols dels components de l’equip de projecte que participaran en el desenvolupament de l’aplicació informàtica. A Mètrica aquests perfils són:

  • Parts interessades (stakeholders)
  • Cap de Projecte
  • Consultors
  • Analistes
  • Programadors

A la figura hi podeu observar les cinc fases principals de la metodologia Mètrica v3.0.

Figura Fases de desenvolupament d’una aplicació

Estudi de viabilitat del sistema

El propòsit d’aquest procés és analitzar un conjunt concret de necessitats, amb la idea de proposar una solució a curt termini. Els criteris amb què es fa aquesta proposta no seran estratègics sinó tàctics i relacionats amb aspectes econòmics, tècnics, legals i operatius.

Els resultats de l’estudi de viabilitat del sistema constituiran la base per prendre la decisió de seguir endavant o abandonar el projecte.

Anàlisi del sistema d'informació

El propòsit d’aquest procés és aconseguir l’especificació detallada del sistema d’informació, per mitjà d’un catàleg de requisits i d’una sèrie de models que cobreixin les necessitats d’informació dels usuaris per als quals es desenvoluparà el sistema d’informació i que seran l’entrada per al procés de Disseny del sistema d’informació.

En primer lloc, es descriu el sistema d’informació, a partir de la informació obtinguda en l’estudi de viabilitat. Es delimita el seu abast, es genera un catàleg de requisits generals i es descriu el sistema mitjançant uns models inicials d’alt nivell.

Es recullen de forma detallada els requisits funcionals que el sistema d’informació ha de cobrir. A més, s’identifiquen els requisits no funcionals del sistema, és a dir, les facilitats que ha de proporcionar el sistema, i les restriccions a què estarà sotmès, quant a rendiment, freqüència de tractament, seguretat…

Normalment, per tal d’efectuar l’anàlisi se sol elaborar els models de casos d’ús i de classes, en desenvolupaments orientats a objectes, i de dades i processos en desenvolupaments estructurats. D’altra banda, s’aconsella dur a terme una definició d’interfícies d’usuari, ja que facilitarà la comunicació amb els usuaris clau.

Disseny del sistema d'informació

El propòsit del disseny és obtenir la definició de l’arquitectura del sistema i de l’entorn tecnològic que li donarà suport, juntament amb l’especificació detallada dels components del sistema d’informació. A partir d’aquesta informació, es generen totes les especificacions de construcció relatives al propi sistema, així com l’especificació tècnica del pla de proves, la definició dels requisits d’implantació i el disseny dels procediments de migració i càrrega inicial.

En el disseny es generen les especificacions necessàries per a la construcció del sistema d’informació, com per exemple:

  • Els components del sistema (mòduls o classes, segons el cas) i de les estructures de dades.
  • Els procediments de migració i els seus components associats.
  • La definició i revisió del pla de proves, i el disseny de les verificacions dels nivells de prova establerts.
  • El catàleg d’excepcions, que permet establir un conjunt de verificacions relacionades amb el propi disseny o amb l’arquitectura del sistema.
  • L’especificació dels requisits d’implantació.

Construcció del sistema d'informació

La construcció del sistema d’informació té com a objectiu final la construcció i la prova dels diferents components del sistema d’informació, a partir del seu conjunt d’especificacions lògiques i físiques, obtingut en la fase de disseny. Es desenvolupen els procediments d’operació i de seguretat, i s’elaboren els manuals d’usuari final i d’explotació, aquests últims quan sigui procedent.

Per aconseguir aquest objectiu, es recull la informació elaborada durant la fase de disseny, es prepara l’entorn de construcció, es genera el codi de cada un dels components del sistema d’informació i es van duent a terme, a mesura que es vagi finalitzant la construcció, les proves unitàries de cada un d’ells i les d’integració entre subsistemes. Si fos necessari efectuar una migració de dades, és en aquest procés on es porta a terme la construcció dels components de migració i dels procediments de migració i càrrega inicial de dades.

Implantació i acceptació del sistema

Aquest procés té com a objectiu principal el lliurament i l’acceptació del sistema en la seva totalitat, que pot comprendre diversos sistemes d’informació desenvolupats de manera independent, i un segon objectiu, que és dur a terme les activitats oportunes per al pas a producció del sistema.

Un cop revisada l’estratègia d’implantació, s’estableix el pla d’implantació i es detalla l’equip que el portarà a terme.

Per a l’inici d’aquest procés es prenen com a punt de partida els components del sistema provats de forma unitària i integrats en el procés de construcció, així com la documentació associada. El sistema s’ha de sotmetre a les proves d’implantació amb la participació de l’usuari d’operació. La responsabilitat, entre altres aspectes, és comprovar el comportament del sistema sota les condicions més extremes. El sistema també serà sotmès a les proves d’acceptació, que seran dutes a terme per l’usuari final.

En aquest procés s’elabora el pla de manteniment del sistema, de manera que el responsable del manteniment conegui el sistema abans que aquest passi a producció.

També s’estableix l’acord de nivell de servei requerit una vegada que s’iniciï la producció. L’acord de nivell de servei fa referència a serveis de gestió d’operacions, de suport a usuaris i al nivell amb què es prestaran aquests serveis.

Anar a la pàgina anterior:
Referències
Anar a la pàgina següent:
Activitats