@Francesco, lungi me dallo scoraggiarti (anzi, spacca tutto! :-D)
ammetto
che quando ti ho scritto: “Ci sono davvero tante cose da affrontare”
intendevo più o meno ciò che il mio omonimo (ciao Maurì) ed Enrico hanno
detto.
Dal codice che hai prodotto, si vede che stai iniziando a “masticare”
Ruby,
ma ci sono ancora tantissimi concetti che devi conoscere prima.
Ci siamo passati tutti, secondo differenti strade, e l’aspetto positivo
è
che hai un enorme margine di miglioramento 
Oltre ai concetti specifici di Ruby, vedo che ti mancano anche dei
concetti
più basilari della programmazione (ma non demordere :-)).
Prima ancora di scrivere in Ruby, dovresti avere uno schema mentale
rigoroso di come il programma si deve comportare.
Hai mai sentito parlare di diagrammi di flusso?
http://it.wikipedia.org/wiki/Diagramma_di_flusso
Ogni sviluppatore (Ruby, Python, C, Pascal, etc) li conosce e li usa per
definire il comportamento dell’algoritmo che deve implementare.
Mano a mano che diventi più esperto, l’uso dei diagrammi di flusso
diventa
più inconscio perché con l’esperienza assimili automaticamente questo
tipo
di rappresentazione formale degli algoritmi.
Praticamente: prova a rivedere la tua prima versione del ciclo while e
confrontala con quella che ti ho fornito io.
Prova a capire come mai la mia contiene meno istruzioni.
Secondariamente, la ripetizione del codice è male praticamente in ogni
caso
in cui un insieme di operazioni viene ripetuto tante volte, variando
solo
alcuni elementi.
Per esempio, la procedura che carica la quantità rimasta in magazzino:
if File.exists?(qnt0)
qnt_rim0 = File.read(‘qnt_rim0.txt’).to_i
else
qnt_rim0 = 100
File.write(qnt0, qnt_rim0)
end
Se ci pensi, è codice ripetuto tantissime volte che varia solo per
alcuni
parametri.
Hai agito così probabilmente per due motivi:
-
non sai come si scrive una funzione in Ruby
-
non hai maturato ancora abbastanza esperienza da sentire “dolore”
dovuto
a questo tipo di ripetizione
-
si risolve abbastanza facilmente, mentre 2) dipende quasi
completamente
dall’esperienza (diretta, tramite letture di articoli/codice altrui o
tramite il confronto con altri sviluppatori).
Prova a pensare a quanto tedioso e a rischio di errore sia dover
modificare
la procedura di caricamento, per tutti i materiali di ogni reparto.
Un primissimo metodo per migliorare questa situazione è proprio l’uso
delle
funzioni:
def nomefunzione(parametro_1, parametro_2)
fai cose con parametro_1 e parametro_2
eventualmente restituisci un valore a chi ha chiamato questa
funzione
end
def somma(a, b)
a + b
end
x = somma(1, 3)
puts "x = " + x.to_s
Nel tuo caso:
def carica_quantita_rimasta(indice_reparto, indice_prodotto)
nome_file = ‘qnt_rim_’ + indice_reparto.to_s + ‘_’ +
indice_prodotto.to_s
- ‘.txt’
if File.exists?(nome_file)
quantita = File.read(nome_file).to_i
else
quantita = 100
File.write(nome_file, quantita_rimasta)
end
quantita
end
qnt_rim0 = carica_quantita_rimasta(0, 1)
qnt_rim0_1 = carica_quantita_rimasta(0, 2)
…
qnt_rim21_15 = carica_quantita_rimasta(21, 15)
In questo caso, quando avrai necessità di modificare la procedura di
caricamento delle quantità rimaste a magazzino, dovrai modificare solo
un
punto del tuo sorgente.
Ti anticipo anche altre migliorie, lasciando a te l’onere di sbatterci
di
nuovo un po’ la testa 
https://gist.github.com/olistik/cd3673ee0901593f1d96
Tieni bene a mente che ci sono vari modi per risolvere il tuo problema,
il
sorgente che ti ho passato deve solo servire per darti un’idea degli
strumenti e approcci che potresti usare.
Non è sicuramente il metodo migliore, quello lo devi trovare te che
conosci
il dominio applicativo di riferimento 
Al prossimo round 
2015-03-18 23:23 GMT+01:00 Maurizio De Santis
[email protected]: