Posts tagged ‘MVC’

Cos’è Ruby on Rails?

Ruby on Rails, spesso chiamato RoR o semplicemente Rails, è un framework open source per applicazioni web scritto in Ruby la cui architettura è fortemente ispirata al paradigma Model-View-Controller (MVC). I suoi obiettivi sono la semplicità e la possibilità di sviluppare applicazioni di concreto interesse con meno codice rispetto ad altri framework. Il tutto con necessità di configurazione minimale.

Rails è principalmente distribuito attraverso RubyGems, che è il formato dei pacchetti e il canale di distribuzione ufficiale per librerie ed applicazioni Ruby.

Filosofia

I principi guida di Ruby on Rails comprendono "Don't Repeat Yourself" e "Convention Over Configuration".

"Don't Repeat Yourself" significa che le definizioni devono essere poste una volta soltanto. Poiché Ruby On Rails è un framework "full-stack", i componenti sono integrati in modo tale che i collegamenti fra di essi non devono essere impostati manualmente. Ad esempio in Active Record, le definizioni delle classi non devono specificare i nomi delle colonne; Ruby può estrarli direttamente dal database, dunque riportarli anche nel programma sarebbe ridondante.

"Convention Over Configuration" significa che il programmatore ha bisogno di metter mano alla configurazione soltanto per ciò che differisce dalle convenzioni. Ad esempio, se un modello è costituito dalla classe Post, la corrispondente tabella nel database deve chiamarsi posts, o altrimenti deve essere specificata manualmente (set_table_name "blogposts", nel caso in cui blogposts sia il nome della tabella).

 

Fonte: http://it.wikipedia.org/wiki/Ruby_On_Rails

Cos’è un design pattern?

Nell'ingegneria del software, un design pattern (schema di progettazione) può essere definito "una soluzione progettuale generale a un problema ricorrente". Esso non è una libreria o un componente di software riusabile, quanto piuttosto una descrizione o un modello da applicare per risolvere un problema che può presentarsi in diverse situazioni durante la progettazione e lo sviluppo del software.

I design pattern orientati agli oggetti tipicamente mostrano relazioni ed interazioni tra classi o oggetti, senza specificare le classi applicative finali coinvolte. Tali pattern risiedono quindi nel dominio dei moduli e delle interconnessioni. Ad un livello più alto sono invece i Pattern architetturali che hanno un ambito ben più ampio, descrivendo un pattern complessivo adottato dall'intero sistema.

La differenza tra un algoritmo e un design pattern è che il primo risolve problemi computazionali, mentre il secondo è legato agli aspetti progettuali del software.

Storia

Il termine fu inizialmente introdotto in architettura in un celebre saggio di Christopher Alexander; in seguito, proprio l'opera di Alexander ispirò la nascita di un settore dell'ingegneria del software dedicato all'applicazione del concetto di design pattern alle architetture software, soprattutto object-oriented. Oggi, l'espressione design pattern viene usata principalmente con riferimento a questo particolare contesto.

Il tema dei pattern viene oggi considerato una delle linee principali di sviluppo dell'ingegneria del software object-oriented. Esso trova applicazioni in tutta una serie di contesti di grande interesse per l'industria del software, dallo sviluppo di software basato su componenti, ai sistemi aperti, ai framework e così via. La maggior parte dei linguaggi di programmazionemoderni, e di tecnologie correlate, sono stati progettati (o modificati) tenendo conto anche dell'obiettivo di essere coerenti con questo approccio emergente allo sviluppo del software.

La nascita del "movimento" dei pattern in informatica si deve al celebre libro Design Patterns: Elementi per il riuso di software ad oggetti di Erich GammaRichard HelmRalph Johnson eJohn Vlissides (1995). Grazie al successo di quest'opera, i suoi quattro autori divennero nomi talmente citati che la comunità scientifica iniziò, per brevità, a identificarli collettivamente con un nomignolo: la "banda dei quattro" (Gang of Four o Gof).

Struttura di un pattern

Un design pattern è costituito da:

  • il nome, costituito da una o due parole che siano il più possibile rappresentative del pattern stesso;
  • il problema, ovvero la descrizione della situazione alla quale si può applicare il pattern. Può comprendere la descrizione di classi o di problemi di progettazione specifici, come anche una lista di condizioni perché sia necessario l'utilizzo del pattern;
  • la soluzione, che descrive gli elementi costitutivi del progetto con le relazioni e relative implicazioni, senza però addentrarsi in una specifica implementazione. Il concetto è di presentare un problema astratto e la relativa configurazione di elementi adatta a risolverlo;
  • le conseguenze, i risultati e i vincoli che derivano dall'applicazione del pattern. Sono fondamentali in quanto possono essere l'ago della bilancia nella scelta dei pattern: le conseguenze comprendono considerazioni di tempo e di spazio, possono descrivere implicazioni del pattern con alcuni linguaggi di programmazione e l'impatto con il resto del progetto.

L'uso di pattern nella descrizione di altri pattern dà origine ai cosiddetti linguaggi di pattern.

Classificazione dei design pattern

I design pattern possono essere classificati con diversi criteri, i più comuni dei quali sono quelli che evidenziano il tipo di problema che si cerca di risolvere. Il tipo di problema può essere legato ad uno specifico dominio progettuale (telecomunicazioni, reti, software…) oppure, più comunemente, al problema progettuale in senso più ampio (nell'ingegneria del software, ad esempio, si può parlare di creazione, comportamento, navigazione di oggetti o strutture dati).

Nel loro libro la "banda dei quattro" identificò 23 tipi di design pattern, suddivisi in 3 categorie: strutturali, creazionali e comportamentali.

Pattern creazionali

I pattern creazionali nascondono i costruttori delle classi e mettono dei metodi al loro posto creando un'interfaccia. In questo modo si possono utilizzare oggetti senza sapere come sono implementati.

  • L'Abstract factory (letteralmente, "fabbrica astratta") fornisce un'interfaccia per creare famiglie di oggetti connessi o dipendenti tra loro, in modo che non ci sia necessità da parte degli utilizzatori di specificare i nomi delle classi concrete all'interno del proprio codice.
  • Il Builder ("costruttore") separa la costruzione di un oggetto complesso dalla sua rappresentazione, in modo che il processo di costruzione stesso possa creare diverse rappresentazioni.
  • Il Factory method ("metodo fabbrica") fornisce un'interfaccia per creare un oggetto, ma lascia che le sottoclassi decidano quale oggetto istanziare.
  • La Lazy initialization ("inizializzazione pigra") è la tattica di instanziare un oggetto solo nel momento in cui deve essere usato per la prima volta. È utilizzato spesso insieme al patternfactory method.
  • Il Prototype pattern ("prototipo") permette di creare nuovi oggetti clonando un oggetto iniziale, o prototipo.
  • Il Singleton ("singoletto") ha lo scopo di assicurare che di una classe possa essere creata una sola istanza.

Pattern strutturali

I pattern strutturali consentono di riutilizzare degli oggetti esistenti fornendo agli utilizzatori un'interfaccia più adatta alle loro esigenze.

  • L'Adapter ("adattatore") converte l'interfaccia di una classe in una interfaccia diversa
  • Bridge ("ponte") permette di separare l'astrazione di una classe dalla sua implementazione, per permettere loro di variare indipendentemente.
  • Il Composite ("composto"), utilizzato per dare la possibilità all'utilizzatore di manipolare gli oggetti in modo uniforme, organizza gli oggetti in una struttura ad albero.
  • Il Container ("contenitore") offre una soluzione alla rottura dell'incapsulamento per via dell'uso dell'ereditarietà.
  • Il Decorator ("decoratore") consente di aggiungere metodi a classi esistenti durante il run-time (cioè durante lo svolgimento del programma), permettendo una maggior flessibilità nell'aggiungere delle funzionalità agli oggetti.
  • Extensibility ("estendibilità")
  • Il Façade ("facciata") permette, attraverso un'interfaccia più semplice, l'accesso a sottosistemi che espongono interfacce complesse e diverse tra loro.
  • Flyweight ("peso piuma"), che permette di separare la parte variabile di una classe dalla parte che può essere riutilizzata.
  • Proxy fornisce una rappresentazione di un oggetto di accesso difficile o che richiede un tempo importante per l’accesso o creazione. Il Proxy consente di posticipare l’accesso o creazione al momento in cui sia davvero richiesto.
  • Pipes and filters ("condotti e filtri")
  • Private class data ("dati di classe privati")

Pattern comportamentali

I pattern comportamentali forniscono soluzione alle più comuni tipologie di interazione tra gli oggetti.

  • Chain of Responsibility ("catena di responsabilità") diminuisce l'accoppiamento fra l'oggetto che effettua una richiesta e quello che la soddisfa, dando a più oggetti la possibilità di soddisfarla
  • Il Command ("comando") permette di isolare la porzione di codice che effettua un'azione dal codice che ne richiede l'esecuzione.
  • Event Listener ("ascoltatore di eventi")
  • Hierarchical Visitor ("visitatore di gerarchia")
  • Interpreter ("interprete") dato un linguaggio, definisce una rappresentazione della sua grammatica insieme ad un interprete che utilizza questa rappresentazione per l'interpretazione delle espressioni in quel determinato linguaggio.
  • L'Iterator ("iteratore") risolve diversi problemi connessi all'accesso e alla navigazione attraverso gli elementi di una struttura dati, senza esporre i dettagli dell'implementazione e della struttura interna del contenitore.
  • Il Mediator ("mediatore") si interpone nelle comunicazioni tra oggetti, allo scopo di aggiornare lo stato del sistema quando uno qualunque di essi comunica un cambiamento del proprio stato.
  • Il design pattern Memento ("promemoria") è l'operazione di estrarre lo stato interno di un oggetto, senza violarne l'incapsulazione, e memorizzarlo per poterlo ripristinare in un momento successivo.
  • L'Observer ("osservatore") definisce una dipendenza uno a molti fra oggetti diversi, in maniera tale che se un oggetto cambia il suo stato, tutti gli oggetti dipendenti vengono notificati del cambiamento avvenuto e possono aggiornarsi.
  • Single-serving Visitor
  • State ("stato") permette ad un oggetto di cambiare il suo comportamento al cambiare di un suo stato interno.
  • Lo Strategy ("strategia") è utile in quelle situazioni dove è necessario modificare dinamicamente gli algoritmi utilizzati da un'applicazione.
  • Il Template method ("metodo schema") permette di definire la struttura di un algoritmo lasciando alle sottoclassi il compito di implementarne alcuni passi come preferiscono.
  • Il Visitor ("visitatore") permette di separare un algoritmo dalla struttura di oggetti composti a cui è applicato, in modo da poter aggiungere nuovi comportamenti senza dover modificare la struttura stessa.


Altri tipi di pattern

Alcuni pattern definiti nella letteratura non operano a livello di design del sistema, non possono quindi essere definiti propriamente design pattern. Alcuni esempi sono:

Pattern architetturali

I pattern architetturali operano ad un livello diverso (e più ampio) rispetto ai design pattern, ed esprimono schemi di base per impostare l'organizzazione strutturale di un sistema software. In questi schemi si descrivono sottosistemi predefiniti insieme con i ruoli che essi assumono e le relazioni reciproche.

Pattern di metodologia

Pattern di concorrenza

Nel caso di processi che eseguono contemporaneamente delle attività su dati condivisi si parla di concorrenza. Alcuni design pattern sono stati sviluppati per mantenere sincronizzato lo stato dei dati in tali situazioni:


Il testo è disponibile secondo la licenza Creative Commons Attribuzione-Condividi allo stesso modo

Cos’e’ Struts? – Un occhiata all’ottimo framework MVC

Diamo un occhiata al diffuso framework utilizzabile con JAVA ed Apache Tomcat ( e non solo ):

Apache Struts è un framework open source per lo sviluppo di applicazioni web su piattaforma J2EE.
Il progetto era inizialmente sviluppato come sotto-progetto di Apache Jakarta ma ora è divenuto un progetto a sé.

Struts estende le Java Servlet, incoraggiando gli sviluppatori all’utilizzo del pattern Model-View-Controller.

La potenza di framework come STRUTS, di librerie come Hibernate o JSF rendono vana ogni possibilità di confronto con i possibili concorrenti e consentono allo sviluppatore di utilizzare pattern di programmazione moderni e dotati di eccezionali pregi tra cui:

- Manutenibilità
- Riusabilità
- Rapidità di sviluppo
- Netta suddivisione dei layers inerenti l’applicazione ( vedi MVC )

L’utilizzo di Struts permette lo sviluppo di web application di notevoli dimensioni; inoltre agevola la suddivisione dello sviluppo del progetto fra vari sotto-team. In altre parole, i designers, e i vari gruppi di sviluppatori possono gestire in parallelo e autonomamente la loro parte del progetto. Tra le funzionalità offerte c’è la I18N, ossia l’internazionalizzazione, una potente tag library e la validazione dei form.

Struts concentra la sua attenzione nella divisione dei compiti fra le varie entità che gestisce. In prima battuta possiamo dire che data una successione di pagine che bisogna visionare, Struts vincola l’ordine in cui queste devono essere visitate.

Ad esempio, se un utente cerca di accedere ad una pagina che richiede un’autenticazione senza aver preventivamente fatto il log in, il framework lo ridirige verso il form di autenticazione.

Inoltre Struts mette a disposizione dei metodi che agevolano la validazione dei dati; si assume anche il compito di verificare se un utente ha inserito tutti i campi in un form: se tutti i campi richiesti sono validi l’azione prosegue, altrimenti avverrà un reindirizzamento alla pagina di inserimento dei dati a cui verranno aggiunti dei messaggi (configurati dallo sviluppatore) che descrivono perché l’azione non è andata a buon fine.

Per quanto riguarda il livello presentazione (la view del pattern MVC), Struts supporta diverse tecnologie, inclusi JSP, XML/XSLT, Java Server Faces (JSF), Cocoon, Swing (JFC) e Velocity.
Struts permette la gestione della internazionalizzazione (”I18N”) dei contenuti, in pratica permette la gestione centralizzata dei file contenenti le stringhe testuali da visualizzare in dipendenza alla lingua dichiarata dal browser.

Un’altra caratteristica è la gestione automatica del pool delle connessioni al database, sollevando lo sviluppatore da tale incarico; ogni volta che bisogna accedere al database, si dichiara che è necessaria una connessione e il framework restituisce un handler alla connessione.

Per quanto riguarda il livello di modellazione dei dati sono supportati i JavaBean e EJB.

Struts lega i suoi componenti in base alle direttive contenute in un file XML, il file struts-config.xml. In questo file vengono configurati i componenti e le interazioni fra gli stessi.

Anche se Struts è molto ben documentato, affidabile e diffuso, di recente vede la concorrenza di altri framework MVC più leggeri, come Spring e Tapestry e di altri come XWork e il più evoluto WebWork.
 


Al momento STRUTS è pienamente supportato da tutti i piani di Hosting JAVA offerti da Hosty.it