0
votes

Comment refactoriser le code qui utilise Neth SISSES?

J'ai un certain code écrit en C # pour lequel je dois ajouter des conditions. D'une de mes méthodes, j'appelle une autre méthode "Updateateata ()", qui met à jour certaines données dans la base de données. Maintenant, pour cela, je dois ajouter des conditions.

  1. Il y aura appSeting dans le fichier de configuration, qui est une valeur booléenne. Si la valeur est vraie, les conditions de point2 doivent être vérifiées si la valeur est fausse, elle doit directement appeler la méthode mise à jour de mise à jour 2.).
  2. Il existe peu de types et de statuts qui doivent être vérifiés si le point1 est vrai.

    Condition 1: Si le type est "A" et le statut est "complet" - appelez "Updateateata ()".

    Condition 2: Si le type est "B" et l'état est "complet" ou "partiel" ou "certains xyz" - appelez "updateateata ()".

    Donc, pour cela, j'ai écrit le code ci-dessous: xxx

    Ceci fonctionne comme prévu. Mais je ne veux pas écrire Nethé si-d'autre. Si demain il y a un autre statut et que je dois inclure, j'ai besoin d'ajouter une autre condition ici.

    existe une manière meilleure ou optimisée de l'écrire?


3 commentaires

Indépendamment de la condition, ils vont tous passer par updateateata () , est-ce intentionnel?


@Steven, il existe de nombreuses valeurs pour le statut.Les données doivent être mises à jour uniquement si l'état est l'une des remorqueurs ou trois mentionnés dans le code.


Si vous divisez ces conditions en méthodes, une méthode pour a & complète, une pour B & Complete ou autre statut, ou un autre statut, vous pouvez faire 1 si, et faire si (Cond1 () || cond (2) ||! CheckStatus) Updateateata


5 Réponses :


3
votes

Je pense personnellement à ce que vous avez bien. Cependant, si vous ne l'aimez vraiment pas, vous pouvez jouer des méthodes locales, je suppose

bool Check(string val, params string[] list) => type == val && list.Contains(status);

// uglay, yet approachable
if (!checkStatus ||
    Check("A", "Complete") ||
    Check("B", "Complete", "Other status", "someother status"))
{
   UpdateData();
}


5 commentaires

Merci pour la réponse. Mais puis-je savoir pourquoi vous avez dit que vous ne l'utiliseriez pas. N'est-ce pas le moyen standard de l'écrire?


@CrazyCoder Je veux dire, je ne commencerais pas à optimiser cela à moins que les choses commencent à être compliquées et étaient illisibles, c'est-à-dire si vous deviez vérifier contre des listes de statuts, ect. Ce que vous avez est assez lisible comme c'est


@ Ok compris. Je ne veux pas non tendre si, comme cela échouerait, la porte de qualité définie par la Sonarqube. Donc, j'essaie d'éviter tout autre si, d'autre. Mais de toute façon, merci de la suggestion.


@fubo tu m'as fait gratter ma tête là-bas pendant une seconde: p


J'ai essayé d'utiliser la première méthode que vous avez mentionnée à utiliser des fonctions locales. Il me donne une erreur de temps compilée: attendu; ou =. J'ai lu que c'est une fonctionnalité en C # 6.0. J'utilise VS2015. Donc, c # 6.0 est la version par défaut dedans. Quoi d'autre doit être fait pour le faire fonctionner?



0
votes

S'il est d'optimiser la possibilité d'ajouter une nouvelle une nouvelle, je l'aurais placé dans un tableau.

bool[] checks = new bool[]{
    (type == "A" && status == "Complete"),
    (type == "B" && (status == "Complete" || status == "Other status" || status == "someother status"))
}

if (!checkStatus || checks.Contains(false)) //'Contains' requires Linq, it also works with 'checks.Any(c => !c)'
{
    UpdateData();
}


0 commentaires

0
votes

Je suppose que le point principal de ce code consiste à assurer que la mise à jour fonctionne lorsque les conditions sont remplies, ce qui est effectué via des tests unitaires.

Donc, je regarderais comment je pourrais écrire ce code de manière testable afin Je peux être sûr que cela fait ce qu'il dit sur l'étain.

Un moyen de le faire pourrait être quelque chose comme ça: xxx

ceci commence Pour former en tant que moteur de règles et que vous pouvez avoir autant de règles que vous avez besoin

chacun si l'instruction peut maintenant appeler une méthode et chaque règle est séparée dans sa propre méthode qui peut maintenant être facilement testée correctement. < / P>

Vous pouvez mettre toutes les règles dans leur propre classe (ES), le moteur renvoie-t-il un statut et si cet état est vrai, puis exécutez la mise à jour. L'idée principale est de séparer le code de configuration, à partir de l'analyse d'état et du code qui exécute la mise à jour et fait ce qu'il faut faire.


0 commentaires

0
votes

Je préférerais faire quelque chose comme ça, de sorte que, lorsque de nouveaux cas apparaissent ou que des critères de validation changent, nous ne pouvons que trouver un nouveau cas blanche. Ceci est simple / maintenable, fonctionne bien pour une série de valides de valid_cases avec de petits changements.

using System;
using System.Collections.Generic;

public class Program
{
      class Case{
        string type;
        string status;
         public Case(string type_val, string status_val ){
              status = status_val;
             type = type_val;
         }

        public override int GetHashCode()  
        {  
            return type.GetHashCode()+status.GetHashCode();  
        }  
        public override bool Equals(object obj)  
        {  
            Case test = obj as Case;  
            if (test== null)  
                return false;  
            return type == test.type &&  status == test.status ;  
        } 

    }
    public static void Main()
    {
        bool checkStatus = true;
        HashSet<Case> vaild_cases = new HashSet<Case>();
        vaild_cases.Add(new Case("A","Complete"));
        vaild_cases.Add(new Case("B","Complete"));
        vaild_cases.Add(new Case("B","Other status"));
        vaild_cases.Add(new Case("B","someother status"));
        Case current_case = new Case("A","Complete");
        if (!checkStatus || vaild_cases.Contains(current_case))
            UpdateData();
    }

    static void UpdateData()
    {
        Console.WriteLine("Hello, World!");
        return;
    }
}  


0 commentaires

0
votes

Une autre option est la suivante:

if((new string[] {"Complete", "Other status", "someother status"}.Contains(status) && type == "B") ||
   (status == "Complete" && type == "A") ||
   !checkStatus)
{
    UpdateData();
}


0 commentaires