当一些方法无效而一些方法没有时,如何从Controller调用方法?

时间:2017-03-03 17:11:05

标签: c#

我是学生,我正在准备我的OOP基础考试。

在控制器中,你有方法返回一个值而且是无效的 - 如何在不使用if-else语句的情况下调用它们?

在我的代码" status"是唯一一个应该返回要在控制台上打印的字符串的 - 其他的是无效的。所以我在CommandHandler中放了一个if-esle和2个方法。

因为我知道" if-else"是一种代码气味,是否有更高质量的方法来处理这种情况?

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

这是project

非常感谢。

1 个答案:

答案 0 :(得分:1)

首先,不要担心if / else。如果有人告诉你是否是代码气味,请通过译者:它出来的是他告诉你他太疯狂,无能和/或狂热被认真对待。

如果有机会你得到一位教练,要求你说地球是平坦的,以获得A,当然,告诉他地球是平的。但是,如果你正在计划一个职业甚至是作为航海家的爱好,不要忘记它实际上是圆的。

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

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

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

这使得命令内部的知识仅限于命令方法本身,这是一个巨大的优势。在调用方法时,您无需担心特殊情况。下面的代码不需要知道哪些命令返回状态,哪些命令不返回。命令本身具有将该信息传递回调用者的方法,因此只有他们需要知道。设计允许代码的不同部分不关心其他部分的细节,这是非常有益的。像这样清洁“接口”使这成为可能。调用代码变得更简单并且更简单。代码越少,随着时间的推移就越少需要更改代码,意味着更少的工作量和更少的错误。

正如您所指出的,如果您有一个打印结果的“status”命令,然后再添加一个也会打印结果的“print”命令,您不仅需要执行print命令本身,但你必须记住返回到你的代码的这一部分,并添加一个特殊的案例分支到if / else。

那种单调乏味的错误PITA 完全那种无意义的OOP意味着要消除。如果可以在不对现有代码进行单一编辑的情况下添加新功能,那么这就是柏拉图式的OOP理想。

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

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

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

如果我对你的设计的假设是准确的,那就是整个交易。与状态结果一样,commandParameters是合同的可选部分。 if / else没有任何内在错误,但有时你不需要。