Esiste un buon approccio standard per l'esecuzione di una lunga lista di metodi / funzioni?

5

Sto creando un software che gira su una macchina che esegue più test su un prodotto costruito nella mia azienda. Sto anche cercando di migliorare la mia codifica e recentemente ho studiato i modelli di progettazione e ho visto come posso applicarli al mio codice.

La parte che sto esaminando attualmente è la sequenza di test effettiva. Al momento il mio codice sembra simile a questo

public class TaskItem
{
  public string TaskName {get;set;}
  public DateTime StartTaskDateTime {get;set;}
  public DateTime EndTaskDateTime {get;set;}
  public Funct<bool> TaskFunction {get;set;}

  public bool Execute()
  { 
    StartDateTime = DateTime.Now;
    var taskResult = TaskFunction.Invoke();
    EndDateTime = DateTime.Now;
    return taskResult;
  }
}

Quindi la mia classe che crea la sequenza e la esegue è come questa

List<TaskItem> TestTaskItems = new List<TaskItem>();

public void BuildTestSquence()
{
    TestTaskItems.Add(new TaskItem()
    {
       TaskFunction = () =>
       { 
          // Do some Stuff
       }
    };

    // ... add more task items
}

public bool RunTestSequnce()
{
   foreach(var taskItem in TestTaskItems)
   {
      if(!taskItem.Execute())
      {
        return false;
      }
   }

   return true;
}

Poiché il metodo BuildTestSquence può essere aggiunto ovunque tra 1 attività e 100 attività, è possibile immaginare che il metodo possa contenere molto codice. Nel mio codice attuale ho corrente 400 linee di codice in quel metodo. Mi sto solo chiedendo se quello che ho fatto sia davvero il modo giusto per farlo.

Stavo pensando che forse il Chain of Responsibility potrebbe essere un'idea, e se è così, non sono troppo sicuro sul modo migliore per implementarlo. Da quanto ho visto finora, la maggior parte degli esempi mostra che passi in un oggetto e ogni catena fa qualcosa con questo oggetto prima di decidere se passarlo o meno. Non passerò in nessun oggetto.

    
posta Gaz83 29.01.2017 - 17:32
fonte

2 risposte

4

Non esiste uno schema di progettazione che io conosca per realizzare questo.

Ma puoi migliorare il tuo codice (riduci le dimensioni della tua funzione BuildTestSequence() ) scrivendo ogni TaskFunction come metodo normale e poi passandolo al tuo TaskItem appena creato come segue:

TestTaskItems.Add( new TaskItem()
    {
        TaskFunction = TaskFunction1
    } );

o, meglio ancora, come segue:

TestTaskItems.Add( new TaskItem( TaskFunction1 ) )

(assumendo che tu abbia aggiunto TaskFunction come parametro al costruttore di TaskItem .)

Un ulteriore miglioramento consiste nel compilare la raccolta TestTaskItems a livello di codice, utilizzando la riflessione, in modo da ridurre ulteriormente le dimensioni della funzione BuildTestSquence() e assicurarsi di non aver dimenticato di includere alcuna funzione.

Inizia facendo GetType() sulla classe che contiene BuildTestSquence() e RunTestSequnce() , e dal ritorno Type ottieni tutti i metodi non statici. Quindi, hai un certo numero di modi per decidere se un metodo è una Funzione Funzione: puoi mandare che i nomi di tutte le tue Funzioni Operative iniziano con un certo prefisso, o, (il modo migliore, puoi dichiararlo tuo " Attributo "(cerca gli attributi C #) e aggiungilo alle tue Funzioni attività, in modo che se trovi un metodo che ha questo attributo, sai che è una Funzione Funzione.

    
risposta data 29.01.2017 - 17:46
fonte
3

Per me avere una funzione BuildTestSequence hardcoded contenente il codice da eseguire è una cattiva progettazione.

Se questa funzione è hardcoded, vale a dire che hai il codice effettivo che viene eseguito elencato lì. Quindi sarebbe meglio rinominare semplicemente quella funzione RunTestSequence e farlo eseguire i passaggi.

L'unica giustificazione per avere una tale funzione è dove stai declassificando i passaggi per chiamare da un archivio dati di qualche tipo (o riflettendoli) Quindi la tua funzione di compilazione è generica e solo poche righe di codice.

Anche in questo caso, prenderei in considerazione l'esecuzione del passaggio immediatamente prima di passare a quello successivo, a meno che tu non possa trarre vantaggio dalla parallelizzazione, poiché potresti inutilmente utilizzare molta memoria per costruire l'elenco delle attività.

    
risposta data 29.01.2017 - 22:40
fonte

Leggi altre domande sui tag