Passa ai contenuti principali

Groovy CliBuilder: valori multipli per singolo argomento

Premessa
Sono stato coinvolto ultimamente in un piccolo progetto scritto in groovy e per la prima volta ho potuto provare i vantaggi della classe CliBuilder di Groovy, un builder che si basa sulla libreria di Apache commons-cli. Spesso ci capita di scrivere delle piccole applicazioni al volo e per necessità di tempo evitiamo di scrivere la parte front-end sin da subito.
Per provare la bontà della logica scritta si può pensare di sfruttare la cara e vecchia linea di comando. Ecco che Groovy mette a disposizione un builder per poter scrivere in modo agile un'interfaccia utente da linea di comando.
In questo articolo non tratterò tutti i casi di utilizzo di CliBuilder anche perché è ben documentato in rete, bensì parlerò del caso specifico di valori multipli per singolo argomento.

Vantaggi di CliBuilder

  1. Non ci dobbiamo preoccupare noi del parsing di String[] args del metodo main della nostra classe di avvio
  2. La mappatura dei flag delle opzioni avviene per configurazione in maniera chiara e leggibile
  3. Viene generato in maniera automatica l'output dell'helper
  4. Gestisce anche l'inserimento di valori multipli per lo stesso argomento  

Caso particolare: Valori multipli per un'opzione
Mettiamo per esempio di voler ricevere in ingresso un elenco di stringhe, per esempio un elenco di nomi di città e che vogliamo impostarlo per l'argomento -c o --cities. Vediamo con un esempio pratico come gestire i valori multipli.

import org.apache.commons.cli.Option

import org.apache.commons.cli.Option


class CliBuilderTest {

 public static void main(String[] args) {

  def params = [
   '-c',
   'Padova,Torino,Milano'
  ]
  args = params.toArray(new String[params.size()])

  def cli = new groovy.util.CliBuilder(usage: 'CliBuilderTest')
  cli.with {
   'c' (longOpt: 'cities', 'Names of cities', args: Option.UNLIMITED_VALUES, valueSeparator: ',')
  }
  
  OptionAccessor options = cli.parse(args)
  def cities = options.cs // Aggiungi un 's' al termine del shortName dell'argomento contenente i valori
  if(cities){
   cities.each{city->
    println city
   }
  }
 }

}

Considerazioni
L'uso di valori multipli può essere estremamente utile. Per rendere un argomento capace di ricevere multi valori è necessario configurarlo con Option.UNLIMITED_VALUES, inoltre è possibile specificare un separatore con il parametro valueSeparator.
Nella fase di processing invece basta appendere al nome in formato corto (nel nostro caso 'c') una 's'. A questo punto basta ciclare sui valori e applicare la logica voluta.

Nota per applicazioni costruite con Gradle
Per chi utilizza gradle come sistema di build va ricordato che va aggiunta la dipendenza in compile time di commons-cli di Apache.

compile 'commons-cli:commons-cli:1.2'

Links
http://groovy.codehaus.org/gapi/groovy/util/CliBuilder.html
http://commons.apache.org/proper/commons-cli/

Post popolari in questo blog

Se excel non aggiorna le formule

Oggi in ufficio è capitata una richiesta particolare. In un documento excel dopo aver eseguito un copia-incolla di una formula non si aggiornavano i risultati nelle celle interessate. Dopo attimi di perplessità dal fondo dell'ufficio il capo ci illumina con una funzione ai più sconosciuta e che ha risolto il problema: il tasto F9. Scusate la mia ignoranza in excel ma questo blog è pensato proprio per appuntare esperienze di vita informatica. Tutto sta nel fatto che i "calcolatori d'un tempo" non disponevano di una adeguata potenza di calcolo e nelle operazioni di copia-incolla si verificavano lunghe attese per l'aggiornamento. La soluzione adottata da MS è stata quella di inserire un'opzione per impedire l'aggiornamento automatico e forzarlo con una combinazione di tasti... il tasto F9!
Combinazioni utili per il calcolo delle formule F9 = calcola le formule modificate dall'ultimo calcolo in tutte le cartelle e fogli di lavoro aperte. MAIUSC + F9 = c…

Riflessioni sull'ordinamento

Gli algoritmi di ordinamento sono da sempre i più gettonati e interessanti dal punto di vista didattico (si veda la complessità computazionale) e funzionale (quasi tutti i programmi hanno almeno una funzione di ricerca). Proprio di questi giorni sono alcuni articoli di Programmazione.it dedicati a questo tema (link).Coding Horror in questo articolo presenta una provocazione molto interessante al di là delle opinioni personali:

The default sort functions in almost every programming language are poorly
suited for human consumption.
L'articolo pone l'attenzione sulla differenza tra l'ordinamento alfanumerico e quello ASCII solitamente usato nei metodi nativi dei linguaggi. Il discorso si ampia se poi pensiamo banalmente alla differenza tra Windows e GNU/Linux che è case sensitive.
Spesso i sistemi operativi e i linguaggi di programmazione realizzano ordinamenti rispettando l'ordine della tabella di codifica ASCII e non l'ordinamento naturale della lingua. I commenti a se…

Timeline dei Linguaggi di programmazione

O'Reilly ha reso disponibile per tutti gli appassionati un interessante poster in formato pdf in cui vengono riassunti 50 anni di storia dei linguaggi di programmazione.Il poster mostra una timeline colorata nella quale sono evidenziate le principali derivazioni tra i vari linguaggi... da vedere
http://www.oreilly.com/news/graphics/prog_lang_poster.pdf



fonte programmazione.it