0
votes

C #: Obtenez le retour bool et string

Je suis nouveau à OOP et C # et j'espère que je manque quelque chose de base ici..je peut probablement utiliser la syntaxe des tuples ici, mais j'essaie d'obtenir ceci pour travailler avec des concepts de base de OOP. J'ai une classe de validateur et Si les entrées ne sont pas correctes, je veux savoir pourquoi il a échoué. Voici ma tentative..Comment obtenir une valeur de chaîne "msg" de Main ()? Avertissement ... Bad code à venir ...

class Validator
    {
        public int Age { get; set; }
        public string Location { get; set; }

        public string Msg { get; set; }


        public bool IsAgeValid()
        {
            if (Age < 18)
            {
                Msg = "Not old enough";
                return false;
            }
            else if (Age > 25)
            {
                Msg = "you are very old";
                return false;
            }
            else
            {
                return true;
            }
        }

        public bool IsLocationValid()
        {
            if (Location == "EARTH")
            {
                return true;
            }
            else
            {
                Msg = "sorry..only for humans";
                return false;
            }
        }

        public bool IsValid()
        {
            if (IsAgeValid() && IsLocationValid())
            {
                return true;
            }
            return false;
        }

        public string getErrorMessage()
        {

            return Msg;
        }

    }

    static void Main()
    {
        Validator myValidator = new Validator();
        myValidator.Age = 34;
        myValidator.Location = "EARTH";

        if(myValidator.IsValid())
        {
            Console.WriteLine("good");
        }
        else
        {
        // Not working- myValidator.getErrorMessage()
            Console.WriteLine("bad because " + myValidator.getErrorMessage());
        }
    }


4 commentaires

Question, voulez-vous connaître une seule validation à la fois ou à toutes les validations qui ne transmettent pas d'objet que vous validez? Cela dépend de votre réponse, comment concevoir votre mécanisme de validation


Très pas clair ce que vous avez du problème avec. Votre question est-elle "Qu'est-ce que la syntaxe d'obtenir la valeur de la propriété en C #"? Assurez-vous également de revoir exemple de reproductible minimal guide Sur le code d'affichage - Si le code ne compile pas (comme un affiché) mais que vous avez un problème avec autre chose, il est très difficile de savoir quel type de réponse aux besoins de la question.


@Marlonchosky - Si au moins une validation échoue, je peux m'arrêter là et vouloir obtenir le message d'erreur à Main () .. J'ai 5 ou 6 autres validations à faire et à quelques entrées de plus


Merci pour l'aide..Je a pu résoudre le problème..soly, je ne pouvais pas donner plus de détails sur l'application réelle et les validations réelles que je fais dans le code réel ..Le code donné dans ma question est un pseudo-code qui Un peu reproduisez la question que j'étais confrontée ... Quoi qu'il en soit, ça marche maintenant..la une nouvelle langue dans cette phase de blocage de ma vie !!!


4 Réponses :


0
votes

On dirait que la seconde si la déclaration s'ils sont entrées, ce qui est redondant si Isvalid retourne un bool. Donnez au code ci-dessous un essai d'essayer de voir si cela fonctionne comme prévu:

if(myValidator.IsValid())
{
    Console.WriteLine("good");
}
else
{
    Console.WriteLine("bad because " + myValidator.getErrorMessage());
}


2 commentaires

Désolé, mon mauvais .. j'ai édité ma question à montrer où j'ai un problème


Votre méthode principale est-elle dans la classe de validateur ou à l'intérieur de la classe de programme?



0
votes

Créer uniquement une méthode de validation unique et mettre toute la logique de validation dans une méthode unique. Placez une liste de chaîne qui contient tous les messages d'erreur et renvoyez que la liste des erreurs de vérification des erreurs dans la principale s'il s'agit de zéro sans erreur si elle est supérieure, alors zéro Afficher la liste des erreurs de cette façon, vous pouvez afficher plusieurs erreurs à l'utilisateur. . Ou vous pouvez retourner booléen et utiliser la liste de la chaîne comme paramètre réf / Out et remplissez-la avec des erreurs.

Voir l'exemple ci-dessous p>

        class Validator
    {
        public int Age { get; set; }
        public string Location { get; set; }


        public bool IsValid(ref System.Collections.Generic.List<string> errors)
        {
            bool isValid = true;

            try
            {
                if (Age < 18)
                {
                    errors.Add("Not old enough");
                }
                else if (Age > 25)
                {
                    errors.Add("you are very old");
                }

                if (Location != "EARTH")
                {
                    errors.Add("sorry..only for humans");
                }
            }
            catch (Exception ex)
            {
                errors.add(ex.Message);
            }

           IsValid = (errors.Count > 0);

           return IsValid;

        }
    }

    static void Main()
    {
        Validator myValidator = new Validator();
        myValidator.Age = 34;
        myValidator.Location = "EARTH";

        System.Collections.Generic.List errors = new System.Collections.Generic.List<string>();

        if (myValidator.IsValid(ref errors))
        {
            Console.WriteLine("good");
        }
        else
        {
            foreach (string error in errors)
            {
                Console.WriteLine("bad because " + error);
            }
        }
    }


0 commentaires

1
votes

Essayez avec StringBuilder () CODE>:

class Validator
    {
        public int Age { get; set; }
        public string Location { get; set; }

        public string Msg { get {return sb.ToString();} set; }
        private StringBuilder sb = new StringBuilder();


        public bool IsAgeValid()
        {
            if (Age < 18)
            {
                sb.Append("Not old enough");
                return false;
            }
            else if (Age > 25)
            {
                sb.Append("you are very old");
                return false;
            }
            else
            {
                return true;
            }
        }

        public bool IsLocationValid()
        {
            if (Location == "EARTH")
            {
                return true;
            }
            else
            {
                sb.Append("sorry..only for humans");
                return false;
            }
        }

        public bool IsValid()
        {
            if (IsAgeValid() && IsLocationValid())
            {
                return true;
            }
            return false;
        }

        public string getErrorMessage()
        {

            return Msg;
        }

    }

    static void Main()
    {
        Validator myValidator = new Validator();
        myValidator.Age = 34;
        myValidator.Location = "EARTH";

        if(myValidator.IsValid())
        {
            Console.WriteLine("good");
        }
        else
        {
            Console.WriteLine("bad because " + myValidator.getErrorMessage());
        }
    }


0 commentaires

3
votes

Bienvenue dans le monde de OOP et C #. Après avoir lu votre question et votre commentaire, je pense que votre problème est lié à la manière dont vous devez concevoir les validations de votre application dans votre cas particulier. Comme vous l'avez dit, vous avez une série de validations (au moins 5 validations) à effectuer sur un objet d'une classe, mais vous voulez que la première validation qui ne soit pas remplie, de ne plus continuer avec les autres validations et indiquent lequel était la Validation qui n'a pas été transmise et son message.

Premièrement, vous devez garder à l'esprit que dans OOP, tout est axé sur la classe (contrairement aux autres paradigmes tels que la programmation procédurale ou fonctionnelle). Donc, vous devez modéliser ce concept que vous souhaitez valider dans une classe C #. Comme je le vois dans le code que vous écrivez, c'est un concept qui a l'âge et l'emplacement, ainsi que sur les validations, je peux supposer que c'est un concept semblable à un individu (une personne a un âge et a également un emplacement. de naissance? (Terre, Mars, etc.)). Alors, définissons cette classe en C # comme: p> xxx pré>

Ensuite, vous souhaitez avoir un validateur pour cette entité avec certaines conditions qui doivent être remplies. Ces conditions s'appellent également des règles de validation ou des règles commerciales (terminologie utilisée dans la programmation). Les règles commerciales peuvent être générales ou pour un processus particulier de votre candidature (par exemple, une validation de personnes pour un processus d'achat de billets de voyage pour une autre planète, acheter des billets pour un cinéma, etc.). Dans ce cas, je supposerai qu'il s'agit d'une validation générale, nous allons donc modéliser ce "concept de validation" dans une classe, quelque chose comme ceci: p> xxx pré>

maintenant, dans OOP Il y a beaucoup de principes, un principe connu est le Responsabilité unique , c'est-à-dire que chaque classe Cela est créé doit être responsable de certaines tâches et ne doit pas s'étendre pour donner d'autres responsabilités différentes de celles conçues dans sa création. Dans cet esprit, la classe General Validator ne devrait être chargée que d'effectuer des validations générales pour l'individu et de signaler les erreurs de validation. Donc, une méthode de validation est définie, qui effectuera la tâche de valider une personne, quelque chose comme ceci: p> xxx pré>

Comme vous le voyez, la méthode de validation reçoit un objet individuel, représentant l'individu à valider. Maintenant, définissons ces séries de validations générales, en considérant: p>

  • Comme vous l'avez mentionné, si une validation n'est pas remplie, vous ne devez plus continuer avec les autres validations. Li>
  • Vous voulez seulement obtenir le message d'erreur; Vous ne voulez rien obtenir d'autre. Â li> ul>

    En raison de ces considérations, la méthode de validation ne reviendrait plus non modifiée, mais elle pourrait renvoyer une chaîne, contenant la raison de la validation qui n'a pas été remplie. Ainsi, nous pourrions redéfinir cette méthode comme suit: p> xxx pré>

    Maintenant, dans une application d'exemple de console, nous testerons comment ce validateur serait utilisé: P>

    class Program {
        static void Main(string[] args) {
            var individual = new Individual { Age = 12, Location = "EARTH"};
            var validator = new GeneralIndividualValidator();
            var result = validator.Validate(individual);
    
            if (result != null) {
                Console.WriteLine($"Validation error: {result}");
            }
    
            Console.ReadLine();
        }
    }
    
    • Dans ce code, la méthode de validation ne renvoie qu'une seule chaîne indiquant la raison. Toutefois, dans les mises à jour futures de votre demande, vous pouvez avoir besoin d'autres informations en plus du message, telles qu'un code de validation qui n'a pas été rempli, de sorte que vous puissiez agir avec ces informations de manière différente. LI>
    • Dans ce code, il existe une approche de "si une validation n'est pas remplie, ne continue pas avec les autres validations". Cependant, il s'agit d'une seule approche, une autre approche pourrait être de vouloir savoir tout (ou partiellement toutes) des validations non conformes à un objet donné. Si tel était le besoin, le code du validateur pourrait être réécrit ou une nouvelle classe de validateur pourrait être écrite avec cette nouvelle approche. Li>
    • Il existe des outils sur Internet qui aident (et beaucoup) avec des validations. Un outil est le fluentvalidation bibliothèque. Une fois que vous avez amélioré vos connaissances avec les principes d'OOP et de fonctionnalités de la langue C #, vous devriez vérifier cette bibliothèque. LI> ul> p>


0 commentaires