Single Page Application con ExtJS

marzo 29th, 2012 § Lascia un commento

Java Code Katas

marzo 16th, 2012 § Lascia un commento

Abbiamo creato un progetto su GitHub per ospitare degli esercizi di
programmazione in Java.

Segui le istruzioni nel readme. Happy hacking ;)

Introduzione a Spring Roo

marzo 7th, 2012 § Lascia un commento

Cambiare la porta con cui viene avviato l’embedded tomcat del maven plugin

febbraio 15th, 2012 § Lascia un commento

Usare la variabile di sistema: -Dmaven.tomcat.port=<numero porta>
Quindi per avviare il tomcat sulla porta 8181: mvn -Dmaven.tomcat.port=8181 tomcat:run

Java Debugging con Intellij Idea

gennaio 18th, 2012 § Lascia un commento

Nexse WLAB selezionata nel programma “Innovare e progettare con successo”

dicembre 5th, 2011 § Lascia un commento

Nexse WLAB è stata selezionata nell’ambito del programma “Innovare e progettare con successo – Promuovere e cogliere opportunità di business” organizzato da HR Services di Telecom Italia e a cui parteciperanno 15-20 ingegneri delle business unit TopClients e PublicSector.

HR Services, nell’ambito dei cicli formativi rivolti a tali figure, ha individuato 4 aziende innovative e di eccellenza presso cui recarsi mezza giornata in visita, per analizzarne l’approccio all’innovazione e i casi di successo (ne seguiranno altre nel 2012):

  • Ferrovie dello Stato
  • Mediaset
  • Digital Magics
  • Nexse

La visita presso Nexse WLAB è prevista per giovedì 15 dicembre 2011 alle ore 15:00.

Tale incontro rappresenta per tutti noi un importante riconoscimento del livello di eccellenza del nostro approccio all’innovazione e progettazione di servizi ICT.

Logging Booklet

novembre 29th, 2011 § Lascia un commento

Abbiamo appena pubblicato un booklet in italiano dal titolo “Logging”, in cui si parla di aspetti generali del log applicativo fino ad arrivare ai dettagli di implementazione in ambiente Java.

Il libricino è gratuito e distribuito con licenza Creative Commons per cui la diffusione è incoraggiata e benvenuta. Buona lettura!

Update: è disponibile l’audio del talk in mp3.

I princîpi dell’Object Orientation

novembre 18th, 2011 § Lascia un commento

Lo scopo di questo articolo è quello di accennare alcuni principi indispensabili per sviluppare correttamente object oriented. Il post non vuole (e non può) essere esaustivo. Si vuole solo evidenziare l’importanza di conoscere questi argomenti per produrre software di qualità.

Perché sviluppare object oriented?
Una caratteristica fondamentale dei sistemi object oriented è quella di essere manutenibili. La manutenibilità di un sistema è una caratteristica importantissima che influisce sulla sua sopravvivenza. La vita di un sistema è caratterizzata dal cambiamento (ad esempio a causa dell’aggiunta di requisiti nuovi) e se la più piccola modifica comporta un costo molto alto, il sistema è destinato a vivere poco.

La pratica ha dimostrato come i sistemi object oriented siano più manutenibili. Questa caratteristica è dovuta a un mix di fattori, ad esempio: la semplicità nel mappare il dominio dei requisiti, quella di mostrare un’architettura chiara e la bassissima percentuale di codice duplicato.

Come sviluppare object oriented?
La prima alternativa è quella di affidarsi ai pattern, cioè a soluzioni a problemi ricorrenti distillate dall’esperienza di molti sviluppatori. Ma utilizzarli non è semplice, anche perché devono essere sempre adattati allo scenario di utilizzo. La seconda alternativa è quella di utilizzare direttamente i principi fondativi dei pattern. Se ci atterremo a questi è molto probabile che nelle nostre soluzioni riutilizzeremo un pattern, anche se inconsciamente.

Elenchiamo di seguito alcuni principi:

Open/Closed Principle (OCP): Una classe deve essere aperta alle estensioni ma chiusa alle modifiche.

L’OCP è indubbiamente il più importante dei principi. Il sistema che sto sviluppando deve essere strutturato in maniera tale che nel caso voglia aggiungere una nuova funzionalità non devo modificare il codice esistente.

Dependency Inversion Principle (DIP): Le classi che sviluppo devono dipendere da astrazioni e non da classi concrete.

La caratteristica di questo principio è quella di invertire la convenzione secondo cui uno strato software deve dipendere da uno strato più specializzato (da cui il nome). Il principio mette l’accento più che sul livello di specializzazione, sul fatto che le classi da cui dipendiamo devono essere astrazioni (interfacce o classi astratte).

Composite Reuse Principle (CRP): Bisogna favorire la composizione polimorfica degli oggetti piuttosto che l’ereditarietà.

Facciamo un semplice esempio in uno scenario di applicazione di gestione degli ordini. GestoreOrdini è la classe che ritorna un Ordine dato il nome ed il cognome, calcolando le spese di spedizione.

package it.nexse.swat.non_oo;
public class GestoreOrdini {
    public Ordine riempiOrdine(String nome, String cognome, int peso){
        int costoSpedizione = calcolaSpedizionePerItalia(peso);
        return new Ordine(nome, cognome, costoSpedizione);
    }

    private int calcolaSpedizionePerItalia(int peso){
            return 100*peso; //e se cambia il costo o l'algoritmo di calcolo?
    }
}

Nel caso in cui l’algoritmo di calcolo cambi sarò costretto a cambiare la classe (violazione dell’OCP). Modifichiamo il codice in modo da renderlo più manutenibile:

package it.nexse.swat.oo;

public class GestoreOrdini {
    private StrategiaDiCalcoloDelleSpeseDiSpedizione strategiaDiCalcoloDelleSpeseDiSpedizione;

    public GestoreOrdini(StrategiaDiCalcoloDelleSpeseDiSpedizione strategiaDiCalcoloDelleSpeseDiSpedizione) {
        this.strategiaDiCalcoloDelleSpeseDiSpedizione = strategiaDiCalcoloDelleSpeseDiSpedizione;
    }

    public Ordine riempiOrdine(String nome, String cognome, int peso){
        int costoSpedizione = strategiaDiCalcoloDelleSpeseDiSpedizione.calcolaSpedizione(peso);
        return new Ordine(nome, cognome, costoSpedizione);
    }

}

package it.nexse.swat.oo;

public interface StrategiaDiCalcoloDelleSpeseDiSpedizione {
    int calcolaSpedizione(int peso);
}

Abbiamo estratto la parte che potrebbe cambiare inglobandola all’interno di un’astrazione da cui la nostra classe dipende (adesione al DIP).

diagramma delle classi

Ora, nel caso in cui si modifichi l’algoritmo di calcolo del costo della spedizione, la nostra classe GestoreOrdini non dovrà essere modificata. Abbiamo quindi creato un punto di estensione del codice (adesione all’OCP).

Potremo quindi implementare in diverse maniere la nostra interfaccia:

package it.nexse.swat.oo;

public class StrategiaDiCalcoloDelleSpeseDiSpedizionePerEstero implements StrategiaDiCalcoloDelleSpeseDiSpedizione{
    public int calcolaSpedizione(int peso) {
        return 200*peso;
    }
}

package it.nexse.swat.oo;

public class StrategiaDiCalcoloDelleSpeseDiSpedizionePerItalia implements StrategiaDiCalcoloDelleSpeseDiSpedizione{
    public int calcolaSpedizione(int peso) {
        return 100*peso;
    }
}

La semplice adesione al DIP ed all’OCP ci ha portato inconsapevolmente al riuso di un pattern: lo strategy pattern.

È importante sottolineare come non è necessario che tutto il codice dell’applicazione aderisca ai principi, perché questi a volte possono aumentare inutilmente la complessità del sistema. Quando si sviluppa bisognerebbe tuttavia sempre tenerli presente, ed ogni violazione dovrebbe essere una scelta consapevole.

Per approfondire:

Configurazione di un client JBoss4 con Spring

novembre 7th, 2011 § Lascia un commento

Questa è la configurazione con Spring di un client verso un ejb esposto su JBoss AS 4.2.3 tramite rmi:

<jee:remote-slsb id="ejbClient"
  business-interface="com.nexse.swat.ExampleService"
  jndi-name="example/remote"
  cache-home="false"
  cache-session-bean="false"
  refresh-home-on-connect-failure="true"
  lookup-home-on-startup="false">
  <jee:environment>
    java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
    java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
    java.naming.provider.url=${example.provider-url}
    jnp.disableDiscovery=true
    jnp.timeout=${example.connectionTimeoutMillis}
    jnp.sotimeout=${example.readTimeoutMillis}
  </jee:environment>
</jee:remote-slsb>

Ci sono alcuni dettagli su cui vale la pena soffermarsi:

cache-home, cache-session-bean:
per via di una perversa combinazione fra l’implementazione del proxy rmi di Spring ed il client rmi di JBoss AS 4.2.3, se queste proprietà non sono entrambe impostate su false, qualora il client dovesse perdere la connessione al server (ad esempio per un redeploy del backend o per un problema temporaneo di rete), il client non sarà più in grado di riprendere a funzionare una volta che il link sia ripristinato. Il nostro client continuerebbe a non funzionare fin quando l’applicazione in cui gira il contesto di Spring non verrà riavviata.
jnp.timeout:
timeout sulla connessione, espresso in millisecondi. Il timeout sulla connessione indica per quanto tempo il client aspetta di stabilire un link prima di abbandonare il tentativo e lanciare un errore.
jnp.sotimeout:
read timeout, espresso in millisecondi. Il timeout di lettura indica quanto tempo occorre aspettare perché un canale già aperto, sul quale sono stati inviati dei dati di cui non si è ricevuto un acknowledgment, venga dichiarato morto e sia generato un errore.

Burlap remoting: come impostare il timeout sui client

novembre 2nd, 2011 § Lascia un commento

Burlap è un protocollo di remotizzazione che può essere utilizzato facilmente tramite spring. Il problema che abbiamo incontrato è stato nell’impostare un timeout di connessione lato client. Caucho come al solito non è prodigo di documentazione ma, scaricando i sorgenti di burlap (che sono nel modulo hessian), ci siamo accorti che la configurazione del timeout non viene esposta.

Ad ogni modo, poiché l’implementazione si basa sul trasporto http nativo della JVM, una soluzione è quella di impostare il timeout di connessione http per l’intera piattaforma tramite l’impostazione dell’apposita proprietà di ambiente.

Iscriviti

Get every new post delivered to your Inbox.

Join 75 other followers