类中方法的设计决策冲突

时间:2011-06-08 11:40:36

标签: design-patterns polymorphism overloading

好的,我会尽可能地解释这个。 我有一个类,比如MyLib,其方法将由另一个类使用,比如Consumer类。 在MyLib中有一个名为Navigate()的公共方法,将由Consumer使用。这种方法为Consumer提供了一个抽象级别,因为它可以使用这种方法提供不同类型的导航。以下代码段提供了所需的代码映射。

// 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调用一个合适的方法。现在,navigator()的调用者知道了navigationType,如果这些方法公开为public,他可以自己调用所需的方法。我希望我很清楚。那么可选参数现在一直很重要吗?方法重载更有意义吗?

3 个答案:

答案 0 :(得分:1)

拥有该方法的多个公共版本。对于通过智能感知来看待这一点的消费者来说,这将更有意义。

答案 1 :(得分:0)

使用.NET 4.0中引入的可选参数

答案 2 :(得分:0)

您可以提供重载或更多重载,但请注意,重载会降低API的可解除性。每次API的消费者需要“导航”时,它首先要决定调用哪个重载。如果重载很有意义,并且消费者已经熟悉API,那么这可能没问题。

另一种方法是使用类传递参数。在您的情况下,NavigationType可以是一个封装所有可能参数组合的类。这个类也可以有一些常量,因此它几乎可以用作枚举。此类也可能有过载的使用者或流畅的构建器界面,以方便使用。如果合适,该类还可以包含一些导航逻辑或导航选择逻辑。