【问题标题】:Should Validation Change Data? [closed]验证应该改变数据吗? [关闭]
【发布时间】:2019-08-27 12:33:34
【问题描述】:

我有一些用于验证的服务。它们既包含简单的数据验证,也包含一些更复杂的业务逻辑。其中一些验证调用还“清理”数据,使其符合我们的标准。这似乎应该在其他地方完成(单一责任)。

我对验证数据的理解是,它只是回答是/否问题(它是否有效)并可能返回一些验证消息。所以它会返回一个布尔值或某种类型的验证错误。

如果我们想在保存或处理之前格式化数据,我们应该有另一层代码来清理数据的格式。

看看下面的例子。我们有两种方法都检查字符串的长度。如果长度正确,第二个还会将其转换为上部。因此,它会在其过程中更改字符串。

问题:我的核心问题是,在谈到验证时,我们是否应该关注清理/格式化数据?换句话说,验证是否应该改变数据?

public class ValidationService
{
    public bool ValidateText(string text)
    {
        bool rtn = false;

        if (IsStringCorrectLength(text))
        {
            rtn = true;
        }

        return rtn;
    }

    public bool ValidateTextAndFormat(string text)
    {
        bool rtn = false;

        if (IsStringCorrectLength(text))
        {
            text = text.ToUpper();
            rtn = true;
        }

        return rtn;
    }

    private bool IsStringCorrectLength(string text)
    {
        bool rtn = false;
        if (text.Length < 11)
        {
            rtn = true;
        }

        return rtn;
    }
}

【问题讨论】:

  • 如果代码可以正常工作,我会在Software Engineering 上问这个问题:我们会“帮助,它不起作用”,他们会说“好的,它有效我>,但是……”。我们称之为“基于意见”。就是说,在我看来,您对事物的看法是正确的(请参阅 Orel 的回答),而且我认为您不会有很多分歧。然而,在生产代码中,我们经常将丑陋的代码保留多年。如果它运行良好并且在其他地方没有引起任何问题,那么修复它是一个低优先级。好问题,错误的地点。
  • 根据我的经验“不”。验证和数据操作是两个不同的主题。每一项都应在指定的服务中妥善处理。否则,您将拥有一个紧密耦合的组件,非常抗拒变化。
  • 更适合User Experience网站。
  • 是的,很抱歉将把它转移到软件工程。不要在这里发布很多东西。我应该让自己更熟悉规则。谢谢!

标签: c# .net validation


【解决方案1】:

正如您“闻到”的那样,这应该是不同的问题。

  1. 验证问题
  2. 操作/规范化问题

这将在调用 Validation 时防止复杂性和“奇怪”的副作用(更改数据),并确保验证只关心检查验证,而不是“如何”格式化数据。

如果您将它们都连接在一起,那么您就无法“重用”这些组件,甚至无法干净地测试它们。 它还会鼓励您在验证中添加更多操作和业务逻辑,慢慢地会削弱您的开发。

【讨论】:

  • 是的,这也是我的阅读方式。将在我们早上的 Scrum 会议上提出这个问题。
  • @KungFuMaster 如果您听到“如果它没有坏,就不要修复它”,不要感到惊讶。如果这是成熟的代码,清理设计将需要付出努力,否则这些工作可能会专门用于积极困扰用户的东西,并且很可能会引入会积极困扰用户的新错误。不太可信的是,他们可能不喜欢听到新的(呃?)家伙告诉他们他们的设计很愚蠢,即使他们知道这是。机智:您可能正在与认为这是一个绝妙的想法并实施它并且五年没有遇到任何问题的人交谈。
  • @KungFuMaster 也就是说,很多团队都有一个隐藏的设计恐怖清单,他们会在时间允许的时候清理它们,所以试一试。幸运的是,负责任的开发人员几年前就继续前进了。如果你真的很幸运,没有人喜欢他。我们曾经有一个人整天吹口哨,认为一旦一个功能完成,就再也没有人需要阅读代码了。他的代码几乎没有留下。
【解决方案2】:

也许这是您想要采取的方法:

public class ValidationService
{
    private const int MaximumStringLength = 11;

    public bool IsStringValid(string text)
    {
        return IsStringLengthCorrect(text) && IsStringUpper(text);
    }

    public bool IsStringLengthCorrect(string text)
    {
        return text.Length < MaximumStringLength;
    }

    public bool IsStringUpper(string text)
    {
        return text.All(x => char.IsUpper(x));
    }

    public string ValidateStringLength(string text)
    {
        if (IsStringLengthCorrect(text))
        {
            return text;
        }
        else
        {
            return text.Substring(0, MaximumStringLength);
        }
    }

    public string ValidateStringUpper(string text)
    {
        if (IsStringUpper(text))
        {
            return text;
        }
        else
        {
            return text.ToUpper();
        }
    }
}

在我看来,验证类应该只检查并返回文本是否有效。

只要有好的命名、顺序和方法,您就可以提供返回有效输入的方法。

【讨论】:

  • 我粘贴的代码只是我为了快速演示而写的。我确实同意“在我看来,验证类应该只在文本有效时检查并返回。”对我来说很有意义。
猜你喜欢
  • 2013-09-07
  • 1970-01-01
  • 2021-06-13
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 2019-09-04
  • 2010-09-11
相关资源
最近更新 更多