Sono nuovo ai concetti di programmazione funzionale in C #, ma ho una certa esperienza con le funzioni di ordine superiore tramite Haskell, Scala, Python e Ruby. Attualmente sto utilizzando una vecchia base di codice .NET 2.0 con un sacco di duplicati. La maggior parte è semplice "copia / incolla" con alcune variabili modificate. Sto cercando di condensare il più possibile.
Un pezzo di codice all'interno di una routine su cui sto lavorando ora è un po 'come questo, ad esempio:
if (PostProcess.UsesFirstPass)
{
w.WriteLine(V1 + " = 0" + " !! SET FOO");
w.WriteLine(V2 + " = 0" + " !! SET BAR");
w.WriteLine(V3 + " = 0" + " !! SET BAZ");
if (PostProcess.IsSpecial){
w.WriteLine(V3 + " = 20" + " !! INCREASE BAZ");
}
w.WriteLine(V4 + " = 0" + " !! SET QUUX");
}
if (PostProcess.UsesSecondPass)
{
w.WriteLine(V5 + " = 0" + " !! SET FOO");
w.WriteLine(V6 + " = 0" + " !! SET BAR");
w.WriteLine(V7 + " = 0" + " !! SET BAZ");
if (PostProcess.IsSpecial){
w.WriteLine(V7 + " = 20" + " !! INCREASE BAZ");
}
w.WriteLine(V8 + " = 0" + " !! SET QUUX");
}
if (PostProcess.UsesFinalPass)
{
w.WriteLine(V9 + " = 0" + " !! SET FOO");
w.WriteLine(V10 + " = 0" + " !! SET BAR");
w.WriteLine(V11 + " = 0" + " !! SET BAZ");
if (PostProcess.IsSpecial){
w.WriteLine(V11 + " = 20" + " !! INCREASE BAZ");
}
w.WriteLine(V12 + " = 0" + " !! SET QUUX");
}
Dove una delle "V" che vedi è una variabile di stringa definita in precedenza. Fa parte di un metodo abbastanza grande. Potrei scrivere un altro metodo chiamato, per esempio, WriteVariables()
e passare le informazioni richieste e chiamarlo tre volte, ma si applica solo a questa sezione di metodo. Penso che questo sarebbe un posto dove scrivere una funzione interiore anonima avrebbe senso.
L'ho fatto per testarlo e sembra che funzioni bene. Ora ho un singolo delegato che assomiglia a qualcosa:
private delegate void WriteCutVars(string V1,
string V2, string V3, string V4, CuttingParameters cutParam);
// snip //
WriteCutVars WriteVars = (Va, Vb, Vc, Vd) => {
w.WriteLine(Va + " = 0" + " !! SET FOO");
w.WriteLine(Vb + " = 0" + " !! SET BAR");
w.WriteLine(Vc + " = 0" + " !! SET BAZ");
if (PostProcess.IsSpecial){
w.WriteLine(Vc + " = 20" + " !! INCREASE BAZ");
}
w.WriteLine(Vd + " = 0" + " !! SET QUUX");
}
if (Process.UsesFirstPass) WriteVars(V1, V2, V3, V4);
if (Process.UsesSecondPass) WriteVars(V5, V6, V7, V8);
if (Process.UsesFinalPass) WriteVars(V9, V10, V11, V12);
Le mie domande principali:
- È un uso corretto delle funzioni interiori?
- È accettabile quando sono l'unico laureato in CS in una squadra di per lo più ingegneri meccanici?