Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque
Dal salotto al giardino, il nuovo proiettore laser di Hisense promette esperienze cinematografiche in qualsiasi contesto: qualità d’immagine, semplicità d’uso, versatilità e prezzo competitivo il suo poker d'assi
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe
La flessibilità di configurazione è il punto di forza di questo 2-in-1, che ripropone in un form factor alternativo tutta la tipica qualità dei prodotti Lenovo della famiglia ThinkPad. Qualità costruttiva ai vertici, ottima dotazione hardware ma costo che si presenta molto elevato.
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart
Mentre Ubisoft vorrebbe chiedere agli utenti, all'occorrenza, di distruggere perfino le copie fisiche dei propri giochi, il movimento Stop Killing Games si sta battendo per preservare quella che l'Unione Europea ha già riconosciuto come una forma d'arte. Abbiamo avuto modo di parlare con Daniel Ondruska, portavoce dell'Iniziativa Europa volta a preservare la conservazione dei videogiochi
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-04-2008, 11:40   #1
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
[Java] Domain Specific Languages, Martin Fowler ed esperimenti

Leggendo un pò il work in progress sui DSL di Fowler, e cercando di impadronirmi delle tecniche che descrive, ho buttato giù un piccolo DSL per cominciare a gestire le collections standard Java attraverso un'interfaccia cosidetta 'fluent'.

Questo è un esempio di come si potrebbero utilizzare le liste in java:
Codice:
import static it.fluent.builders.ListBuilderHelper.list;
import static java.lang.System.out;

public class FluentTest {

  public static void main(String[] args) {
    list("I", "can", "has", "cheezburger", "plz", "?")
      .shuffle()
      .sort()
      .reverse()
      .println(out);
  }
}
Sembra quasi un linguaggio dinamico, e invece è puro Java 100%, con type check a compile time, il framework e tutto quanto.

Le classi che ci stanno dietro sono molto semplici (per il momento...ma questo è solo un esercizio di stile):

Codice:
package it.fluent.builders;

import java.util.Arrays;

public class ListBuilderHelper {
  public static <T extends Comparable<? super T>> ListBuilder<T> list(T ... elements) {
    return new ListBuilder<T>(Arrays.asList(elements));
  }
}


package it.fluent.builders;

import java.io.PrintStream;
import java.util.Collections;
import java.util.List;

public class ListBuilder<T extends Comparable<? super T>> {
  private List<T> list = null;
  
  public ListBuilder(List<T> list) {
    this.list = list;
  }
  
  public List<T> get() {
    return list;
  }
  
  public ListBuilder<T> sort() {
    Collections.sort(list);
    return this;
  }
  
  public ListBuilder<T> reverse() {
    Collections.reverse(list);
    return this;
  }
  
  public ListBuilder<T> shuffle() {
    Collections.shuffle(list);
    return this;
  }
  
  public void println(PrintStream out) {
    out.println(list.toString());
  }
}
Non so se avete già letto gli stralci del libro che Fowler ha pubblicato sul suo sito, ma l'approccio mi sembra quantomeno interessante (anche se non credo sia la panacea di tutti i mali, come anche l'autore specifica) e credo meriti uno studio più approfondito.

Altro materiale si trova sul sito di Fowler, e precisamente qua:
http://martinfowler.com/dslwip/

Che ne pensate di questo approccio?
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2008, 19:48   #2
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Ok, magari non interessa niente a nessuno, ma ci ho lavorato un pochino su...adesso ho un piccolo DSL per fare qualcosa di più serio.
Ho aggiunto una map per applicare una funzione al volo a una lista, una funzione range stile python e qualche altre cosina wrappando la libreria standard.

Codice:
import static it.jfluent.builders.ListBuilderHelper.*;
import static it.jfluent.builders.RangeBuilderHelper.*;
import static java.lang.System.*;

import it.jfluent.builders.Function;

public class FluentTest {
  public static void main(String[] args) {
    out.println("Test1"); test1();
    out.println();
    out.println("Test2"); test2();
    out.println();
    out.println("Test3"); test3();
    out.println();
    out.println("Test4"); test4();
  }
	
  private static void test4() {
    list(range('A','Z'))
      .println(out);
	  
    list(range(1,10))
       .println(out);
  }

  private static void test3() {
    list(0,1,2,3,4,5,6,7,8,9)
      .println(out)
      .map(new Function<Integer, Integer>() {
        public Integer apply(Integer elem) {
          return elem.intValue() + 1;
        }
      })
      .println(out)
      .mapCopy(new Function<Integer, String>() {
        public String apply(Integer elem) {
          return elem.toString() + " -> is string now!";
        }
      })
      .println(out);
  }
	
  private static void test2() {
    list(0,1,2,3,4,5,6,7,8,9)
      .shuffle()
      .println(out)
      .map(new Function<Integer, Integer>() {
        public Integer apply(Integer elem) {
          return elem.intValue() + 1;
        }
      })
      .println(out);
  }

  private static void test1() {
    list("I", "can", "has", "cheezburger", "plz", "?")
      .shuffle()
      .sort()
      .println(out)
      .reverse()
      .println(out)
      .map(new Function<String, String>() {
        public String apply(String elem) {
          return "LOL " + elem;
        }
      })
      .println(out);
  }
}
Output:
Codice:
Test1
[?, I, can, cheezburger, has, plz]
[plz, has, cheezburger, can, I, ?]
[LOL plz, LOL has, LOL cheezburger, LOL can, LOL I, LOL ?]

Test2
[9, 8, 6, 4, 2, 5, 3, 0, 1, 7]
[10, 9, 7, 5, 3, 6, 4, 1, 2, 8]

Test3
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1 -> is string now!, 2 -> is string now!, 3 -> is string now!, 4 -> is string now!, 5 -> is string now!, 6 -> is string now!, 7 -> is string now!, 8 -> is string now!, 9 -> is string now!, 10 -> is string now!]

Test4
[A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Questa è solo la classe di test ovviamente... se a qualcuno interessano i sorgenti posso postarli.

Nessuno ha niente da dire su quest'approccio? Impressioni?
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2008, 20:01   #3
TuX2K6
Member
 
Iscritto dal: Apr 2006
Messaggi: 225
Sembra piuttosto interessante e se metti anche il codice base domani me lo guardo con calma da lavoro
Lavorare così sulle collection sembra comodo, domani darò una letta anche al link
TuX2K6 è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2008, 21:04   #4
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11782
Quote:
Originariamente inviato da shinya Guarda i messaggi
Leggendo un pò il work in progress sui DSL di Fowler, e cercando di impadronirmi delle tecniche che descrive, ho buttato giù un piccolo DSL per cominciare a gestire le collections standard Java attraverso un'interfaccia cosidetta 'fluent'.

Questo è un esempio di come si potrebbero utilizzare le liste in java:
Codice:
import static it.fluent.builders.ListBuilderHelper.list;
import static java.lang.System.out;

public class FluentTest {

  public static void main(String[] args) {
    list("I", "can", "has", "cheezburger", "plz", "?")
      .shuffle()
      .sort()
      .reverse()
      .println(out);
  }
}
Sembra quasi un linguaggio dinamico, e invece è puro Java 100%, con type check a compile time, il framework e tutto quanto.
E' uno stile che mi piace moltissimo, perche' comunica molto bene. Quando riesco a modellare qualcosa cosi', lo faccio anche in C++. Il rischio e' farsi prendere un po' la mano e complicarsi la vita.

E' uno strumento, e in certe situazioni funziona molto ma molto bene.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 17-04-2008, 23:22   #5
^TiGeRShArK^
Senior Member
 
L'Avatar di ^TiGeRShArK^
 
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12103
a me invece non piace molto questo....
Gli esempi di Fowler mi piacevano di +
Comunque è un pò overkill per i miei gusti crearsi un linguaggio per risolvere dei problemi di uno stesso dominio...
A meno che non si sa già a priori il tipo dei problemi che si dovranno affrontare e che i problemi siano prevelentemente quelli, che ora come ora non è il mio caso.
ah... perchè non è stato fatto lo static import di java.lang.System.out ma solo di java.lang.System.*?
personalmente ritengo + leggibile println() di out.println()...
__________________
^TiGeRShArK^ è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 08:07   #6
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
[quote=^TiGeRShArK^;22071662]a me invece non piace molto questo....
Gli esempi di Fowler mi piacevano di +
Comunque è un pò overkill per i miei gusti crearsi un linguaggio per risolvere dei problemi di uno stesso dominio...
A meno che non si sa già a priori il tipo dei problemi che si dovranno affrontare e che i problemi siano prevelentemente quelli, che ora come ora non è il mio caso.
ah... perchè non è stato fatto lo static import di java.lang.System.out ma solo di java.lang.System.*?
personalmente ritengo + leggibile println() di out.println()... [/QUOi
TE]

lo scopo e di avere un linguaggio con termini più vicini al business/dominio, in modo da poter far vedere il codice a un esperto di dominio(senza un background informatico) senza dover tradurre.

C'è chi in java rimpiange nn aver fatto ritornare ai metodi void l'oggetto stesso, in modo da avere metodi fluent a gratis(c'era anche un JSR per questo, ma la vedo dura che arriverà mai in porto)
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 18-04-2008, 08:37   #7
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da ^TiGeRShArK^ Guarda i messaggi
a me invece non piace molto questo....
Gli esempi di Fowler mi piacevano di +
Comunque è un pò overkill per i miei gusti crearsi un linguaggio per risolvere dei problemi di uno stesso dominio...
A meno che non si sa già a priori il tipo dei problemi che si dovranno affrontare e che i problemi siano prevelentemente quelli, che ora come ora non è il mio caso.
ah... perchè non è stato fatto lo static import di java.lang.System.out ma solo di java.lang.System.*?
personalmente ritengo + leggibile println() di out.println()...
Beh partendo dal presupposto che i gusti son gusti, e che anch'io ritenga che quest'approccio abbia i suoi bei limiti, il mio tentativo ha come scopo quello di cercare di capire come funzionano le tecniche che descrive Fowler scrivendo qualcosa che forse mi può tornare utile. Forse, ripeto, perchè è solo un esperimento.

Sul fatto che sia overkill ti posso dare abbastanza ragione se ci si fa prendere troppo la mano (la funzione println() ad esempio non so se la metterei in una release...la usavo come debug per vedere come veniva modificata la lista). Sul discorso del dominio...beh non è detto che sia lo stesso dominio (non ho capito di cosa poi) perchè questo piccolo DSL che ho fatto serve solo per maneggiare collections (in particolare liste, per ora, ma credo di aver voglia di sperimentare anche con altro).

Sullo static import di System: adesso è come dici tu, era stato l'"organize imports" di eclipse ad averlo impostato cosi. Comunque è una cosa in fase embrionale...ci sono una manciata di classi, di puntini sulle 'i' ce ne sarebbero da mettere! :P
E poi l'esempio nel primo post non è più da guardare, lo stato della "libreria" aggiornato è nel secondo post.

Per chi era interessato ai sorgenti, sono in allegato... ma ripeto, non ha nessuna pretesa di completezza e non è production-ready (mancano dei seri test...è una bozza...non so più come dirlo! :P)
Allegati
File Type: zip jfluent-src-17-04-2008.zip (3.0 KB, 1 visite)
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 19-04-2008, 17:09   #8
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Beh alla fine ho messo il tutto in un progetto su google code.

La libreria può essere scaricata da qui: http://code.google.com/p/jfluent/
Ovviamente ci sono anche i sorgenti in svn e tutto quanto.
E' tutto in alpha ovviamente! Devo scrivere test seri, ecc..ecc...

Comunque ora c'è il supporto a tutte le funzionalità di java.util.List e java.lang.String + java.lang.StringBuilder (sempre che non mi sia dimenticato qualcosa).

In homepage c'è un esempio di come può essere utilizzata. Mi piacerebbe sentire opinioni, suggerimenti e critiche varie ed eventuali...
shinya è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Hisense M2 Pro: dove lo metti, sta. Mini proiettore laser 4K per il cinema ovunque Hisense M2 Pro: dove lo metti, sta. Mini proiett...
Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il convertibile di classe Lenovo ThinkPad X1 2-in-1 G10 Aura Edition: il c...
Intervista a Stop Killing Games: distruggere videogiochi è come bruciare la musica di Mozart Intervista a Stop Killing Games: distruggere vid...
Samsung Galaxy S25 Edge: il top di gamma ultrasottile e leggerissimo. La recensione Samsung Galaxy S25 Edge: il top di gamma ultraso...
HP Elitebook Ultra G1i 14 è il notebook compatto, potente e robusto HP Elitebook Ultra G1i 14 è il notebook c...
Cooler Master MasterFrame 600: modularit...
Questi case sembrano GPU RTX 50 e costan...
Elgato Facecam 4K: ecco la nuova webcam ...
Stampa 3D senza sprechi e senza rifiuti?...
OPPO Find X9 Pro potrebbe battere ogni r...
Le nuove Sony WH-1000XM6 ora disponibili...
ChatGPT Agent come un essere umano: l'AI...
Samsung rivaluta la fabbrica per il pack...
'La potenza di 16 core, nel palmo della ...
Windows 10 compie 10 anni, ma il cambiam...
Un altro Pixel 6a ha preso fuoco: la pro...
NVIDIA, ritorno in Cina in grande stile?...
Tutti contro Windows Recall: un altro se...
PlayStation FlexStrike: il sogno di un f...
WhatsApp sorprende tutti: ecco la nuova ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 20:07.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v