还在内部调用外部(即接口)功能?

时间:2009-04-13 12:13:39

标签: function methods private public

我想知道在内部调用公共函数是否也是一种好习惯。

通过公共函数,我指的是您明确创建的所有方法/函数,可以从其他对象,模块等中调用。例如,您通常将其置于Java接口定义中的方法。通过内部调用,我的意思是在同一个模块,类等中。

我总是感觉关于这个'某种方式'滥用'公共方法,虽然我想不出任何有效的技术理由不这样做。

替代方法是将函数体放在私有函数/方法中,您可以在内部调用它。然后,公共方法的主体将包含对私有函数的单个调用。

我认为这个问题非常主观,但仍然......对此有何看法?

2 个答案:

答案 0 :(得分:3)

没有理由不在内部使用公共方法。不要在公共方法中包装私有方法,它没有任何好处,它会使你的代码不那么清晰。

答案 1 :(得分:2)

是的,你可以做到,这是一个很好的做法,但必须考虑到这种情况。

两个例子:

  • 注意不要在类构造函数中调用方法:在调用期间,您的类被部分初始化,因此对方法(类本身或继承的)的任何调用都可能具有错误且难以跟踪的后果。根据经验,构造函数必须相对于类“自我满足”。

  • 由于您使用的是类的方法,因此您可以自由访问其实现。问问自己“我想通过其界面或通过其实现来访问该类吗?”。

为了更好地解释第二点,假设你有一个方法foo()和bar()的A类。

假设foo()在其代码中调用bar()。在这种情况下,您正在与对象的界面进行交谈。这个界面不是你期望的那个!例如,假设您已经重新实现了类(B类,从A派生),但是您的代码的用户也重新实现了该类,并且该方法bar()已被重写。由于继承,A :: foo()将调用B :: bar(),而不是A :: bar()。

通过不使用bar()方法调用,并访问实现,可以保证您的函数行为相同,即使对于子类也是如此。

其中一些问题进入了所谓的fragile base class problem。这是关于它的a very good article