Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Motorola razr fold, dalla conchiglia al formato a libro. La recensione
Abbiamo provato Motorola razr fold, il pieghevole a libro con display interno LTPO da 8,09 pollici, Snapdragon 8 Gen 5 e batteria da 6000 mAh in 243 grammi. Pennino e custodia sopno già nella confezione, per un foldable che si caratterizza per il pannello luminoso, l'autonomia ottima per la categoria e le fotocamere coerenti e ben sfruttabili. Il listino è di 1999 euro, ma in vendita si trova già a molto meno
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente
Google Pixel Watch 5 ha affinato una formula già convincente con hardware più veloce, Gemini offline e nuovi strumenti per sport e benessere. Abbiamo provato la versione LTE da 41 mm, comoda anche di notte e ben proporzionata sui polsi piccoli. Il design resta un punto di forza, ma l'autonomia premia ancora il 45 mm e alcune funzioni AI non sono disponibili in Italia: ecco che cosa cambia rispetto a Watch 4 e quale formato conviene scegliere oggi
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo
Politica, accademia e industria a confronto su mercato unico, sicurezza e competitività. Nei laboratori di Vimercate, Nokia ha mostrato le nuove generazioni di chip ottici e i test che ogni prodotto deve superare prima di arrivare sul mercato
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: 11794
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: 12113
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


Motorola razr fold, dalla conchiglia al formato a libro. La recensione Motorola razr fold, dalla conchiglia al formato ...
Recensione Google Pixel Watch 5: sembra lo stesso, ma al polso la differenza si sente Recensione Google Pixel Watch 5: sembra lo stess...
Nokia Innovation Day 2026: la sovranità europea passa dal mercato unico e dai laboratori italiani del gruppo Nokia Innovation Day 2026: la sovranità e...
In sella alla Fiido Nomads Pro: e-bike con motore centrale da 100 Nm per il divertimento a 360 gradi In sella alla Fiido Nomads Pro: e-bike con motor...
ASUS Zenbook 14 (UX3480AA): tanta autonomia con uno chassis bello e robusto ASUS Zenbook 14 (UX3480AA): tanta autonomia con ...
Samsung lavora al Privacy Display v2: sa...
SBS presenta i nuovi accessori Track Fir...
Castlevania: Belmont's Curse, la caccia ...
Nuova promozione Amazon Haul: 5% di scon...
Netflix taglia circa mille posti di lavo...
Bodywel F20PRO a 759€: e-bike pieghevole...
iPhone Duo, senza AppleCare+ riparare lo...
Amazon, offerte da non perdere oggi: Mac...
1.500 km con una ricarica: CATL e Changa...
Rockstar Games punta a ridurre i tempi d...
Accessori auto su Amazon da 22€: aspirab...
Oltre 436 km senza ricaricare: questa mo...
Samsung Health si aggiorna: il coaching ...
XBOX Nano Controller: il nuovo gamepad c...
MSI diversifica il suo business: con EVS...
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: 12:30.


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