C#:获取布尔值和字符串返回

时间:2020-05-09 02:37:31

标签: c# oop

我是OOP和C#的新手,我希望这里缺少一些基本知识。.我可能可以在这里使用Tuples语法,但是我试图将其与基本OOP概念一起使用。.我有一个Validator类,如果输入不正确,我想知道为什么会失败。这是我的尝试..如何从Main()获取'Msg'字符串值?警告...前面的错误代码...

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 个答案:

答案 0 :(得分:3)

欢迎来到OOP和C#的世界。 阅读您的问题和评论后,我认为您的问题与您应如何针对特定情况设计应用程序的验证有关。 如您所说,您有一系列要对一个类的对象执行的验证(至少5个验证),但是您希望第一个未实现的验证不再继续进行其他验证并指出哪个是未通过的验证及其消息。

首先,您应该记住,在OOP中,所有内容都是面向类的(不同于过程或函数式编程等其他范例)。因此,您必须对要在C#类中验证的概念进行建模。正如我在您编写的代码中所看到的那样,它是一个具有年龄和位置的概念,并且基于验证,我可以假定它是一个类似于“个人”的概念(一个人具有年龄,并且也具有“位置” (出生,火星等)。因此,让我们在C#中定义此类,例如:

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

然后,您想为此实体提供一个验证器,其中必须满足一些条件。这些条件也称为验证规则或业务规则(编程中使用的术语)。业务规则可以是通用的,也可以是您应用程序的特定过程的(例如,针对购买另一个星球的旅行票,电影院的票等过程的个人验证)。在这种情况下,我将假定这是一个常规验证,因此我们会将“验证器概念”建模到一个类中,如下所示:

public class GeneralIndividualValidator { }

现在,在OOP中有很多原则,single responsibility是已知的原则,也就是说,创建的每个类都必须负责某些任务,并且不能扩展以承担与那些职责不同的其他职责是在其创作中设计的。考虑到这一点,常规Validator类仅应负责对个人执行常规验证并报告验证错误。因此,定义了一个validate方法,它将执行验证个人的任务,如下所示:

public class GeneralIndividualValidator {
    public void Validate(Individual individualToValidate) { }
}

如您所见,validate方法接收一个单独的对象,代表要验证的个人。 现在,让我们定义以下一系列常规验证,考虑:

  • 如前所述,如果一个验证未完成,则您不应再继续进行其他验证。
  • 您只想获取错误消息;你不想得到任何其他东西。

由于这些考虑,validate方法将不再返回void,但可以返回一个字符串,其中包含未实现验证的原因。因此,我们可以如下重新定义此方法:

public class GeneralIndividualValidator {
    public string Validate(Individual individualToValidate) {
        // Validating the age.
        if (individualToValidate.Age < 18) {
            return "Not old enough";
        }

        if (individualToValidate.Age > 25) {
            return "you are very old";
        }

        // Validating the location.
        if (individualToValidate.Location != "EARTH") {
            return "sorry..only for humans";
        }

        return null;
    }
}

现在,在示例控制台应用程序中,我们将测试如何使用此验证器:

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();
    }
}

我希望它能为您提供有关如何根据业务需求或问题设计应用程序的指南。

我应该考虑的其他几点:

  • 在此代码中,validate方法仅返回一个指示原因的字符串。但是,在将来的应用程序更新中,除消息外,您可能还需要其他信息,例如未完成的验证代码,以便您可以以其他方式使用此信息。
  • 在此代码中,存在一种方法“如果未完成一个验证,则不要继续进行其他验证”。但是,这只是一种方法,另一种方法可能是想知道给定对象的所有(或部分全部)不符合要求的验证。如果需要,可以重写验证器代码,或者可以使用这种新方法编写新的验证器类。
  • Internet上有很多工具可以帮助(以及很多)验证。一种工具是FluentValidation库。使用OOP原理和C#语言功能提高了知识水平之后,应该检查该库。

答案 1 :(得分:1)

尝试使用StringBuilder()

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());
        }
    }

答案 2 :(得分:0)

似乎第二个if语句妨碍了操作,如果IsValid返回布尔值,则这是多余的。尝试以下代码,看看它是否按预期工作:

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

答案 3 :(得分:0)

仅创建单个验证方法,并将所有验证逻辑放入单个方法中。放置一个包含所有错误消息的字符串列表,并返回该列表,检查main中的错误计数(如果为零则表示有效),如果大于零则为零,则显示错误列表,以这种方式可以向用户显示多个错误。或者,您可以返回布尔值,并使用字符串列表作为ref / out参数,并用错误填充它。

请参见下面的示例

        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);
            }
        }
    }