Antefatto:
Quest'estate, nel tradurre un semplice programma scritto in java tratto dal libro Head First OOA&D, mi sono imbattuto in una singolare difficoltà, tentando di fare una cosa a mio avviso davvero semplice: si tratta di cercare in una lista di oggetti di tipo Instrument quello che ha un determinato numero seriale.
Abbiamo quindi:
una classe Instrument con una proprietà serialNumber di tipo String
una classe Inventory con una proprietà instruments di tipo List<Instrument>.
Avendo deciso di utilizzare List<T>.Find(metodo), ed essendo alle prime armi con i generics e i predicate vado a leggermi l'help.
Dando per scontato che chi legge ne sappia sin troppo sull'argomento (tutti tranne me!), vado al punto: l'esempio riportato nell'help mi sembra assai poco generico, visto che tratta la ricerca di tutti i nomi di dinosauri che terminano con "saurus" e non con una stringa a piacere.
Fatto:
Così posto, mi sembra che List<T>.Find(metodo) non serve a una mazza visto che devo scrivere una funzione predicato per ogni possibile ricerca, perchè non ho modo di passare il valore del serialNumber cercato al metodo.
Unico workaround che mi è venuto in mente è quello di salvare la stringa su una proprietà privata della classe Inventory, in modo da poterla usare all'interno del metodo.
class Inventory
{
private List<Instrument> instruments;
private String _serialNumber;
public Inventory()
{
instruments = new List<Instrument>();
}
public Instrument GetInstrumentBySN(String serialNumber)
{
_serialNumber = serialNumber;
return instruments.Find(MatchSN);
}
private bool MatchSN(Instrument instrument)
{
if (instrument.SerialNumber == _serialNumber)
{
return true;
}
else
{
return false;
}
}
}
Ma è un workaround orrendo!!!
Solo ieri ho potuto riprendere gli studi (lavoro tiranno e molta stanchezza la sera... oltre a un po' di sana televisione) e mi sono messo a cercare su google, convinto di essere una pippa che non ha capito nulla, sino a che mi sono impattuto sul seguente articolo: Passing parameters to predicates .
La soluzione proposta è molto più "robusta" ed elegante, ma mi chiedo se non ci sia un modo migliore di risolvere la questione.
Ohhh, Numi tutelari del Sacro Graal, illuminate le povere menti degli eterni bambini, fate sentire la vostra possente voce (ecc., ecc., eccetera!).
posted @ martedì 9 ottobre 2007 04:41