2010-09-02 6 views
0

J'ai écrit beaucoup de code comme le suivant assez récemment.Quel est le moyen le plus propre de coder la logique pour la recherche, créer si non trouvé, rechercher à nouveau

Je n'aime pas le code dupliqué dans le bloc else.

Y at-il une chose évidente qui me manque? J'ai réfléchi à 'goto' mais je l'ai abandonné quand j'ai vu une possibilité de boucle infinie.

Je sais que la chose la plus évidente à faire est de créer une fonction séparée. La raison pour laquelle j'hésite, c'est parce que, comme je l'ai dit, j'ai souvent été confronté à ce scénario, ce qui fait qu'il y a pas mal de fonctions. Cela semble trop complexe pour ce que je reçois en échange (c'est-à-dire pas de duplication de code).

 Logger.Log("Finding parent.", 
      System.Diagnostics.TraceEventType.Start); 

     query = string.Format(
      "Select Id, a " + 
      "From Parent__c " + 
      "Where a ='{1}' limit 1", childId); 

     queryResult = DoSOQLQuery(queryResult, query); 

     string parentId; 

     if (queryResult != null && queryResult.size > 0) 
     { 
      parentId = ((Parent__c)queryResult.records[0]).Id; 

      Logger.Log(string.Format("Parent__c.Id={0}", 
       parentId), 
       System.Diagnostics.TraceEventType.Verbose); 
     } 
     else 
     { 
      Logger.Log("Parent not found.", 
       System.Diagnostics.TraceEventType.Error); 

      Logger.Log("Creating parent.", 
       System.Diagnostics.TraceEventType.Start); 

      string apexToExecute = string.Format(
       "Utility.CreateParent('{0}');", 
       childId); 

      this.webServices.execute(apexToExecute); 

      queryResult = DoSOQLQuery(queryResult, query); 

      if (queryResult != null && queryResult.size > 0) 
      { 
       parentId = ((Parent__c)queryResult.records[0]).Id; 

       Logger.Log(string.Format("Parent__c.Id={0}", 
        parentId), 
        System.Diagnostics.TraceEventType.Verbose); 
      } 
     } 

     Logger.Log("Done finding parent", 
      System.Diagnostics.TraceEventType.Stop); 

Répondre

3

Donc, si je devais résumer votre code comme

SEARCH 

IF (FOUND) THEN 
    RETRIEVE 
ELSE 
    CREATE 
    RETRIEVE 

pourriez-vous pas faire comme

SEARCH 

IF (NOT FOUND) THEN 
    CREATE 

RETRIEVE 
+0

Doh! Je suis confus :) J'y reviendrai plus tard ... –

+0

LOL, ce que je dis, c'est que vous devriez d'abord tester le scénario négatif. De cette façon, vous pouvez créer l'entité pour vous assurer que lorsque l'exécution atteint l'étape de récupération, vous pouvez être sûr de trouver ce que vous recherchez. – CyberDude

+0

Oui, je vois votre point maintenant. Merci! –