C# 当一些方法无效而另一些无效时,如何从控制器调用这些方法?

C# 当一些方法无效而另一些无效时,如何从控制器调用这些方法?,c#,C#,我是一名学生,目前正在准备OOP基础考试 当在控制器中有返回值的方法时,这些方法是无效的-如何在不使用if-else语句的情况下调用它们 在我的代码中,“status”是唯一一个应该返回要在控制台上打印的字符串的,其他的都是空的。所以我在CommandHandler中放了一个if-esle和两个方法 既然我知道“if-else”是一种代码味道,那么有没有更高质量的方法来处理这种情况呢 if (commandName == "status") { this.Writ

我是一名学生,目前正在准备OOP基础考试

当在控制器中有返回值的方法时,这些方法是无效的-如何在不使用if-else语句的情况下调用它们

在我的代码中,“status”是唯一一个应该返回要在控制台上打印的字符串的,其他的都是空的。所以我在CommandHandler中放了一个if-esle和两个方法

既然我知道“if-else”是一种代码味道,那么有没有更高质量的方法来处理这种情况呢

    if (commandName == "status")
    {
        this.Writer.WriteLine(this.CommandHandler.ExecuteStatusCommand(commandName));
    }
    else
    {
        this.CommandHandler.ExecuteCommand(commandName, commandParameters);
    }
这是最新的


非常感谢。

首先,不要担心是否。如果有人告诉你是否有代码气味,请通过翻译:结果是他告诉你他太疯狂、无知和/或狂热,不值得认真对待

如果你碰巧遇到一位老师,他要求你说地球是平的,你才能得到A,当然,告诉他地球是平的。但是,如果你打算从事航海家的职业,甚至是一项爱好,千万别忘了它实际上是圆的

所以。对我来说,这听起来像是
CommandHandler.ExecuteStatusCommand()
执行命名的命令,该命令在某处作为方法实现。如果命令方法为
void
ExecuteStatusCommand()
返回
null
。否则,命令方法可能会返回一个字符串,在这种情况下,您希望将其写入看起来像流的内容

好的,这里的一种方法是说“一个命令是通过一个方法实现的,该方法接受一个参数并返回null或一个表示状态的字符串。如果它不返回null,则将其写入流”

这是标准的东西:你正在定义一个“合同”。对于实际上不返回任何内容的命令方法来说,使用
String
返回类型并不是不合适的,因为它们符合合同条款。“返回字符串”是一个对所有命令开放的选项;有些人利用,有些人不利用

这使得对命令内部的了解仅限于命令方法本身,这是一个巨大的优势。在调用方法时,不需要担心特殊情况。下面的代码不需要知道哪些命令返回状态,哪些命令不返回状态。命令本身提供了一种将该信息传达回调用方的方法,因此只有它们才需要知道。拥有一个允许代码的不同部分不关心其他部分细节的设计是非常有益的。像这样干净的“接口”使之成为可能。调用代码变得更简单,并且保持更简单。更少的代码,更少的需要随着时间的推移进行更改,意味着更少的工作量和更少的bug

正如您所指出的,如果您有一个打印结果的“status”命令,然后您添加了一个也打印结果的“print”命令,那么您不仅要实现print命令本身,还要记住返回到代码的这一部分,并向if/else添加一个特例分支

这种乏味的容易出错的PITA正是OOP想要消除的那种毫无意义的PITA。如果可以添加一个新特性而无需对现有代码进行任何编辑,那就是一种柏拉图式的OOP理想

因此,如果
ExecuteCommand()
返回void,我们将调用
ExecuteStatusCommand()
。我在猜一些事情。如果您已经勾勒出这两种方法的语义,这会很有帮助

var result = this.CommandHandler.ExecuteCommand(commandName, commandParameters);

if (result != null)
{
    this.Writer.WriteLine(result);
}

如果我对你的设计的假设是准确的,那就是全部<代码>命令参数,与状态结果一样,是合同的可选部分。if/else本身并没有什么问题,但有时候你并不需要它

我不明白问题是什么,也不明白这里问的是什么。如果“if else”是糟糕的代码味道,那么几乎所有现实世界的代码都会stink@MiBuena,是否有一个规则,即每个被调用的方法都必须具有相同的返回类型或其他类型?对条件逻辑使用if/else就是它的目的。如果一个分支写出一个状态,而另一个分支没有,那么这并不是一个真正需要解决的问题。至少在我看来,也许我遗漏了什么…@MiBuena你是在告诉我,如果连续100个if/else是个坏主意,那么归纳99也同样坏,一直到一个?那太荒谬了。如果它变得难以管理,就用其他方法来处理。10已经过了我的门槛。单个if/else不是。这不是宗教。任何告诉你if/else是“代码气味”的人都在给你灌输废话,而且很可能是不称职的。这个“HQ编程”东西有一种“方法论的味道”,如果你喜欢的话。@MiBuena那么,
This.CommandHandler.ExecuteCommand
是否返回命令返回的值,如果命令不返回任何值,是否返回
null
?我会考虑
var r=CommandHandler.ExecuteCommand(name,params);如果(r!=null){Writer.WriteLine(r);}
。这样,当您在其他地方添加命令时,就不必担心在这里添加特殊情况。如果这里有什么味道的话,那就是它,而不是If/else。