Design patterns 类中方法的设计决策冲突

Design patterns 类中方法的设计决策冲突,design-patterns,polymorphism,overloading,Design Patterns,Polymorphism,Overloading,好的,我会尽可能多地解释这一点。 我有一个类,比如MyLib,它的方法将被另一个类使用,比如Consumer类。 MyLib中有一个名为Navigate()的公共方法,消费者将使用该方法。这种方法为消费者提供了某种程度的抽象,因为它可以使用这种方法提供不同类型的导航。以下代码段提供了所需的代码映射 // this method will be exposed to the consumer class. public bool Navigate (NavigationType type) {

好的,我会尽可能多地解释这一点。 我有一个类,比如MyLib,它的方法将被另一个类使用,比如Consumer类。 MyLib中有一个名为Navigate()的公共方法,消费者将使用该方法。这种方法为消费者提供了某种程度的抽象,因为它可以使用这种方法提供不同类型的导航。以下代码段提供了所需的代码映射

// this method will be exposed to the consumer class.
public bool Navigate (NavigationType type)
{ 
    // this method will decide which private _navigateToXyz() method will be called.
    switch (type)
    {
       case x: return _navigateToX();
       case y: return _navigateToY();
       case z: return _navigateToZ(arg1, arg2);
       case a: return _navigateToA(arg3);
    }
}

private bool _navigateToX() { }
private bool _navigateToY() { }
// two or three additional _navigateTo_() without any parameters
private bool _navigateToZ (arg1, arg2) { }
private bool _navigateToA (arg3) { }
如上所示,除了两个私有方法外,其他所有方法都需要传递一些参数。因此,如果我采用这种方法,那么我基本上也必须在Navigate()中传递这些参数,这些参数是其他方法都不需要处理的

我现在正在这样做。但我想知道在这种情况下是否有更好的方法


更新:经过一些头脑风暴之后,我认为Navigate()方法不是必需的,因为它几乎只是根据传递的navigationType调用适当的方法。现在,Navigate()的调用方知道navigationType,如果这些方法公开为public,他可以自己调用所需的方法。我希望我明白了。那么可选参数现在是否重要呢?方法重载更有意义?

使用.NET 4.0中引入的可选参数具有该方法的多个公共版本。这将使消费者通过intellisense了解这一点更有意义。

您可以提供一个或多个重载,但请注意,重载会降低API的可描述性。每次API的使用者需要“导航”时,它必须首先决定调用哪个重载。如果重载很有意义,并且消费者已经熟悉API,那么这就可以了


另一种方法是使用类来传递参数。在您的例子中,NavigationType可以是封装所有可能的参数组合的类。这个类还可以有几个常量,这样它几乎可以用作枚举。此外,该类还可以具有重载constructor或fluent构建器接口,以方便使用。如果合适的话,该类还可以包含一些导航逻辑或导航选择逻辑。

我考虑过这一点。。但是传递给Navigate()方法的NavigationType参数已经在处理“感知消费者”部分。这正是提供Navigate()的原因;为消费者提供舒适的抽象层次。因此,拥有多个公共版本是没有用的。我现在考虑的是可选参数。@EdgeHost-optional不是表示互斥参数集的好方法。可选意味着“如果您愿意,您可以提供”。重载意味着“您需要提供NavigationType或arg1+arg2”@RobertLevy-好的..首先让我明确NavigationType(实际上是一个枚举)将决定调用哪个_navigateTo()。因此,它将在每个Navigate()调用中传递。Navigate()将具有某种类型的开关大小写,用于确定应调用哪个_navigateTo_uz()。因此,arg1和arg2虽然是_navigateToZ()的专用项,但仍然是Navigate()的可选项。我希望你明白我的意思。你有什么建议吗?如果我的理解有误,也请告诉我:)@empted-根据您提供的信息,如果有人提供arg1和arg2,那么您不需要使用枚举来消除调用方希望发生的事情的歧义(我知道这一点,因为接受arg1和arg2的私有方法不接受导航类型)。我支持使用重载的建议,.NETFramework设计指南将支持这一点。API中的可选参数是一个很大的禁忌,因为默认值被编译到调用方的代码中,以后您不能更改这些参数。@Robert:在您的评论之后,我想我更倾向于您的立场。请看一下我对这个问题的更新,并告诉我我的想法是否正确。基本上,我现在想的是完全抛弃Navigate()方法,将私有方法公开,以便可以直接调用它们。无论如何,调用方都知道导航类型。所以我认为没有必要使用Navigate()方法。是的。我正在考虑使用可选参数。早些时候,我想,当不需要这些参数时,我必须传递null参数。我不知道这些可选参数(我的坏!:))。无论如何,我会等待更多的答案/意见,如果有的话。但是,考虑到我的设计所施加的限制,似乎没有其他方法了。当然可以。等待更多答案,然后从中实现最佳解决方案。是的。在这种情况下,消费者必须知道必须调用哪个方法。这就是为什么在Navigate()中传递NavigationType参数:以指示Navigate()要调用的方法的类型。我不喜欢上课。我宁愿选择超载。