Sto utilizzando molto il codicecon std::for_each
, bind
e così via, ma ho notato che a volte l'utilizzo di STL
non è una buona idea.Quanto di STL è troppo?
Per esempio, se si dispone di un std::vector
e volete fare una sola azione su ciascun elemento del vettore, la prima idea è quella di utilizzare questo:
std::for_each(vec.begin(), vec.end(), Foo())
ed è elegante e ok, per un po '. Ma poi arriva la prima serie di segnalazioni di bug e devi modificare il codice. Ora si dovrebbe aggiungere il parametro di chiamare Foo()
, così ora diventa:
std::for_each(vec.begin(), vec.end(), std::bind2nd(Foo(), X))
ma che è solo soluzione temporanea. Ora il progetto sta maturando e comprendi molto meglio la logica di business e vuoi aggiungere nuove modifiche al codice. È a questo punto che ti rendi conto che dovresti usare il vecchio bene:
for(std::vector::iterator it = vec.begin(); it != vec.end(); ++it)
Questo sta accadendo solo a me? Riconosci questo tipo di pattern nel tuo codice? Hai riscontrato anti-pattern simili usando STL
?
BTW, se nel tuo secondo esempio, "X" è uguale per tutti gli elementi. Basta passarlo al costruttore di Foo e conservarlo nel funtore invece di legarlo. Molto più semplice –
Stai effettivamente utilizzando nessuno degli STL, quindi sei al sicuro :) –
Solo un'opinione, ma "troppo" è quando usi funzionalità che non ti servono solo per il gusto di usarle. Se è utile, usalo. Se sei preoccupato per nomi troppo lunghi, puoi sempre usare un alias typedef o namespace per accorciarli (ad esempio, typedef std :: vector :: iterator VecIter; '). La cosa con la libreria standard è, di solito è il modo più generico per fare qualcosa su un determinato compilatore, semplicemente perché i creatori del compilatore o le persone che lo conoscono meglio (se non i creatori) scriveranno la sua implementazione. Non aver paura di usarlo quando è utile. –