INFORMATICA - PROGRAMMAZIONE RAD

LINGUAGGI DI PROGRAMMAZIONE DI TIPO RAD (Rapid Application Development)

La programmazione ad oggetti

Negli ultimi anni si è affermato un nuovo modo di programmare, a cui viene attribuito il nome di programmazione orientata agli oggetti, dove anzichè pensare ad un problema come ad un insieme di procedure atte a risolverlo, si pensa ad esso come ad un insieme di oggetti semplici. Sulla programmazione ad oggetti ricadono numerose aspettative, in quanto, viene detto, consente di scrivere codice riutilizzabile, consente un più rapido sviluppo delle applicazioni e permette di manutenere il codice più agevolmente. D'altra parte tutte queste caratteristiche hanno un prezzo piuttosto pesante che è la difficoltà di imparare questo nuovo modo di programmare.
Proprio per superare questa grossa difficoltà gli strumenti di sviluppo offrono un insieme sempre più vasto di librerie di oggetti testati e funzionali che i programmatori possono riutilizzare.

Alan Kay, che può essere considerato il padre del primo linguaggio orientato agli oggetti, SmallTalk, ha sintetizzato le caratteristiche fondamentali di SmallTalk in 5 punti:
n ogni cosa è un oggetto;
n un programma è un insieme di oggetti dove ognuno dice all'altro cosa fare mandando dei messaggi;
n ogni oggetto è costituito da altri oggetti;
n ogni oggetto ha un tipo;
n tutti gli oggetti di un particolare tipo possono ricevere gli stessi messaggi.

Le classi

Quello che nella programmazione procedurale veniva definito come Tipo, nella programmazione ad oggetti viene definito Classe e si differenzia dal Tipo per il fatto che esso contiene anche le funzioni di interfaccia dell'oggetto, cioè i messaggi che esso è in grado di riconoscere.
Vediamo un esempio pratico. Definiamo la classe SEMAFORO, sarà costituita da 3 oggetti "lampada", ciascuno avente la proprietà "colore" diversa, e su ciascun oggetto lampada le funzioni possibili saranno "accendi" e "spegni"; l'oggetto semaforo avrà invece le funzioni "Verde" (che accenderà la lampada verde, e spegnerà la lampada rossa) "Rosso" (che spegnerà la lampada verde e quella arancione e accenderà quella Rossa) "Arancione" (che accenderà la lampada Arancione).

Questo esempio ci consente di introdurre un altro concetto, quello delle implementazioni nascoste; il programmatore che usa l'oggetto Semaforo conosce solo le funzioni che chi ha definito l'oggetto semaforo ha reso pubbliche, le funzioni definite per uso interno sono nascoste al programmatore; ciò significa che in qualsiasi momento il creatore della classe Semaforo può, cambiare la loro implementazione senza che questo abbia ripercussioni su tutti quelli che usano quella classe; inoltre questo impedisce al programmatore di manipolare dei dati, vitali per il buon funzionamento dell'oggetto, in una maniera non prevista da chi ha definito la classe. Per realizzare questi concetti Java usa tre parole chiave: Public, Private e Protected.
Public significa che la definizione è accessibile a tutti; private significa che nessuno può accedere a quella funzione o dato tranne il creatore della classe, dall'interno di funzioni appartenenti a quella classe; Protected ha lo stesso significato di Private, tranne che le classi derivate hanno accesso ai membri protetti.

Composizione

Il modo più semplice per riusare un oggetto è quello di inserire quell'oggetto come membro di una nuova classe. Di solito gli oggetti membri sono privati, così voi potete cambiarli senza che questo abbia ripercussioni sugli altri. Il concetto di creare nuove classi mettendo insieme oggetti di varie classi si chiama Composizione.

Ereditarietà

A volte è necessario definire una classe che ha un comportamento simile ad una già definita. Per fare questo è possibile fare un clone della classe già definita ed aggiungere le funzioni che realizzano le funzionalità che occorrono. Questo rappresenta un modo un po' primitivo di usare l'ereditarietà; può essere usato, ma varrebbe la pena verificare se non sarebbe meglio aggiungere queste funzioni alla classe generale. L'uso invece più interessante dell'ereditarietà è quello in cui, pur mantenendo costante l'interfaccia, viene modificato il comportamento di una funzione; per fare questo si utilizza la possibilità di ridefinire (Override) un metodo.

Il Polimorfismo

L'ereditarietà permette di creare una famiglia di classi, basate su un'interfaccia uniforme. Questo consente di creare delle funzioni che non si preoccupano di conoscere i dettagli delle singole classi ma parlano con la classe base; in questo modo il codice è più semplice da scrivere e da leggere; inoltre se alla famiglia viene aggiunto un nuovo componente, il codice lavorerà perfettamente anche su questo componente.
Ad esempio supponiamo che le classi Cerchio, Rettangolo, Triangolo e Linea siano derivati dalla classe Forma. Se scriviamo una funzione così:

void elaboraForma(Forma s) {
s.cancella();
// ...
s.disegna();
}
Questa funzione può essere richiamata in un altra parte del programma in questo modo:

Cerchio C = new Cerchio();
Triangolo T = new Triangolo ();
Linea L = new Linea();
elaboraForma(C);
elaboraForma(T);
elaboraForma(L);

Quando voi avete scritto la funzione elaboraForma non sapevate quali oggetti vi sarebbero stati passati, eppure, nonostante questo, quando richiamate la funziona elaboraForma passandogli come oggetto un Triangolo oppure un Cerchio, le cose che avete richiesto succedono correttamente. Questa capacità di far accadere la cosa giusta senza sapere a priori quale sarà, è detta Polimorfismo.
Il processo usato dai linguaggi OOP (Object Oriented Programming) per realizzare questo concetto è detto aggancio dinamico. Il compilatore durante l'esecuzione gestisce tutti i dettagli; il programmatore deve solo sapere che questo succede e deve conoscere come usarlo.

Ciclo di vita degli oggetti

I linguaggi come l'Object Pascal (Delphi), Java e SmallTalk richiedono che gli oggetti siano creati dinamicamente nello Heap (memoria dinamica) e pertanto forniscono degli strumenti per ripulire in maniera automatica la memoria dagli oggetti che non sono più usati. Il C++ avendo come obiettivo primario l'efficienza, lascia libero il programmatore di decidere come allocare gli oggetti, in moto statico nello stack o dinamico nello heap; pertanto è il programmatore stesso che deve farsi carico di decidere quando deallocare la memoria occupata dagli oggetti.

Contenitori e iteratori

Siccome non potete sapere a priori quanti oggetti saranno necessari per risolvere un particolare problema non potete neanche sapere quanto spazio creare per questi oggetti, a questo scopo nei linguaggi OOP si utilizza la tecnica di creare un oggetto che contiene dei puntatori ad altri oggetti, ad esempio un array; ma questo nuovo oggetto, chiamato contenitore, si espanderà o rimpicciolirà a seconda delle necessità per poter contenere tutto ciò che verrà creato.
Le librerie dei linguaggi OOP forniscono diversi tipi di contenitori: vettori, liste, stack, code e si può scegliere quella che meglio soddisfa le proprie necessità. Tutti i contenitori hanno in comune il modo di aggiungere o togliere elementi, così per aggiungere un elemento ci sarà una funzione di nome "push" o "add" e per togliere ci sarà una funzione "pop" o "get". Un'altra classe che vi consente di accedere in vari modi agli elementi di un contenitore indipendentemente dal tipo di contenitore è l'iteratore.

La gerarchia degli oggetti

In Java tutti gli oggetti sono derivati da una classe base chiamata Object. Così tutti hanno un'interfaccia in comune e, in ultima analisi, si può affermare che ogni cosa che si definisce è un Object. Java fornisce anche un Contenitore di Object dove voi potete mettere e prendere tutti gli oggetti che usate.

Multithreading

Uno dei concetti fondamentali della programmazione è la possibilità di gestire più di un compito contemporaneamente. All'inizio questo era realizzato scrivendo in linguaggio macchina delle funzioni di gestione degli interrupts, ma queste sono piuttosto difficili da scrivere e assolutamente non portabili su sistemi diversi. Talvolta gli interrupts sono l'unica soluzione quando si devono gestire processi in cui il tempo di risposta è fondamentale, ma ci sono altri casi in cui è possibile dividere i compiti che devono essere gestiti da un programma in tanti moduli che girano ciascuno per suo conto; questi moduli sono chiamati Threads. Uno degli utilizzi più comuni del multithreading è l'interfaccia utente. Se ogni elemento dell'interfaccia è gestito da un thread si avranno dei tempi di risposta ai movimenti dell'utente generalmente migliori.
Nel caso in cui il sistema operativo supporti la gestione di più processori, ogni singolo thread può essere assegnato ad un processore diverso. Una complicazione nell'uso dei threads è dovuto alla gestione delle risorse condivise. Quando un thread deve usare una risorsa condivisa deve impedire l'accesso ad altri processi (lock) e rilasciarla quando ha finito di usarla. Il multithreading è built-in in Java e ciò rende la sua gestione particolarmente semplice.

Client-server e il WEB

Alcune volte è necessario gestire delle informazioni in un unico posto, solitamente in un database, dove possono essere aggiornate in maniera univoca e da dove possono essere distribuite agli utenti. L'insieme costituito dal database, dal software per distribuire l'informazione e dal computer prende il nome di server, mentre il software che risiede sul computer remoto, che chiede le informazioni al server e le processa prende il nome di client. Il server deve preoccuparsi che le transazioni effettuate dai clients, vadano a buon fine e non siano in contraddizione tra di loro.
Il Web è un gigantesco sistema client-server, dove numerosi server e ancora più numerosi client coesistono su un singolo network. Inizialmente il client si collegava ad un server e trasferiva sul suo computer un file che con un browser poteva essere letto. In seguito si è voluto dare a questo sistema tutte le capacità di un sistema client-server, con la possibilità di fare interrogazioni al server, trasferire o modificare delle informazioni residenti nel server, introducendo così anche ulteriori problemi relativi alla sicurezza del sistema.
All'inizio i browser erano solo dei visualizzatori di informazioni; tutta l'attività di elaborazione era eseguita sul server. Questo aveva lo svantaggio di avere dei tempi di risposta piuttosto lunghi. Per risolvere questi problemi sono state sviluppate diverse soluzioni: sono state incrementate le capacità grafiche, per poter visualizzare migliori video e animazioni dentro i browser, e sono stati implementati degli schemi "plug-in" per permettere a dei programmi di girare dentro il browser. Java entra in questo schema attraverso le Java applet.
Un applet è un mini programma che girerà dentro un web-browser. Viene scaricata automaticamente assieme alla pagina web e quando è attivata, viene eseguita. Vi consente di distribuire il software client nel momento in cui questo è necesario, essendo sicuri che l'utente avrà sempre la versione più aggiornata; inoltre il programmatore dovrà creare un solo programma che girerà su tutti i browser (indipendentemente dal sistema operativo) che hanno un interprete Java built-in. In questo modo si può eseguire il maggior numero di operazioni possibile direttamente sul client ed accedere al server solo quando è necessario, ottenendo così migliori prestazioni in locale e non sovraccaricando Internet con ingenti quantità di trasferimenti inutili.
Il fatto che questi programmi si scarichino automaticamente sul computer può sembrare un veicolo di propagazione di virus; in verità l'interprete Java esamina il codice per verificare la presenza di istruzioni strane; in particolare le applets non possono scrivere o cancellare files. Questa rappresenta però una notevole limitazione, per superare la quale si sono create le cosiddette applet firmate. Esse usano un sistema di crittografia a chiave pubblica per verificare che l'applet abbia un creatore ben identificabile, a cui ci si possa rivolgere nel caso di comportamenti non desiderati. Questo meccanismo fornisce una garanzia sufficiente per un uso più efficace delle Java applets.

Alternative alle Java applets

Le Java applets rappresentano una buona soluzione per risolvere il problema del clien/server su Internet ma non sono certamente l'unica. Due alternative possibili sono JavaScript di Sun e VBScript di Microsoft, dove gli script sono inseriti direttamente nel sorgente della pagina web. Quando la pagina viene letta lo script è trasportato tramite Internet ed eseguito sulla macchina client dall'interprete che è integrato nel browser. L'interprete è responsabile della prevenzione di codice "pericoloso". Uno dei vantaggi delle Java applet è che queste sono compilate, per cui il codice sorgente non è visibile dal cliente, anche se può essere abbastanza facilmente decompilato.
Va detto infine, come considerazione generale, che se si è già utenti di Visual Basic è sicuramente più agevole scrivere programmi in VBScript piuttosto che imparare un nuovo linguaggio. Un'altra possibilità è offerta dalla piattaforma ActiveX di Microsoft, dove è possibile scrivere il codice necessario nel linguaggio che si preferisce.
Chiudi

Outlet Offerte Sconti Promozioni Risparmiare sugli Acquisti di prodotti e Servizi in Internet

Gigacenter Store-Vente privee-Show room prive-La ruota della fortuna-Outlet Pił Style-Offerte Outlet Store-Sconti Outlet Offerte-Spartoo Shoes-Private Outlet-Saldi Privati-Sold Outlet-Offerte del GiornoBuoni sconto-Saldi Sconti-Offerte Viaggio-Acquisti + Guadagni

 

eXTReMe Tracker

Shiny Stat

free counters