【问题标题】:Should two separate methods that call a shared base method individually validate inputs? [closed]调用共享基本方法的两个单独方法是否应该单独验证输入? [关闭]
【发布时间】:2018-07-10 20:29:50
【问题描述】:

假设我有一个从数据库中获取歌曲的基本方法 GetSong(),以及两个调用它的方法 - GetRockSong()GetPopSong()

这两种方法都接受歌曲名称的字符串输入,然后将该输入与流派一起传递给GetSong() 方法。

基础方法是否应该负责验证字符串输入?

我认为前两种方法应该,但这会导致重复完全相同的代码(即检查字符串是否为空)。

显然我使用了一个非常简单的插图,但问题几乎相同。

示例代码:

public Song GetRockSong(string title)
{
    // could null check title here before calling the method?
    return GetSong(title, "Rock");
}

public Song GetPopSong(string title)
{
    // could null check title here before calling the method?
    return GetSong(title, "Pop");
}

public Song GetSong(string title, string genre)
{
    // example validation, if null checking title above 
    // then could just check genre here
    if (!string.IsNullOrEmpty(title) && !string.IsNullOrEmpty(genre))
    {
        // fetch song logic here
    }

    // etc
}

【问题讨论】:

  • 如果与任何一种特定方法相关的标题没有任何独特之处(即只有流行歌曲可以有数字,而摇滚歌曲不能(我知道不好的例子))然后我不明白为什么不能只在共享方法中进行验证。
  • 我想说签入GetSong() 是要走的路。不仅因为您减少了检查次数,而且还避免了依赖其他两种方法来为您提供正确的输入。
  • @BenKrueger 是的,两种方法的验证完全相同
  • 视情况而定。如果您不需要在这两种方法中处理其验证形式的输入,您可以简单地将这个任务委托给公共方法。如果需要,可以编写一个验证方法,从两者中调用。 DRY-不要重复自己。另一方面,简单的检查,如 NullOrWhitespace 可能值得在更复杂的场景中重复。
  • @ZorgoZ 在我正在处理的项目中,有一种验证方法基本上可以检查所提供的值。此方法用于验证所有字符串和其他类型的输入。我想我只是不认为我应该在两个单独的方法中多次使用这个 ValidateInput(x) 方法,因为我可以将它们合并到共享中

标签: c# .net validation


【解决方案1】:

我个人认为如果验证相同,则在共享方法中进行检查。 这将使您可以更轻松地维护代码,并且最好让执行繁重工作的方法也验证传递给它的值。

我做过类似的事情,发现我需要编写和维护的代码量是我在调用它的每个方法中都进行验证时的一半。

我希望这会有所帮助!

【讨论】:

  • 谢谢,看来这是普遍看法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 2017-08-26
  • 2018-04-15
  • 1970-01-01
  • 2014-04-18
  • 2013-07-27
相关资源
最近更新 更多