在同一对象实例的私有方法中调用公共方法是否有代码味道?
在同一对象实例的私有方法中调用公共方法是否有代码味道?
Answers:
没有难闻的气味。可能需要这样做,为什么您怀疑它是错误的?原子级别的方法是执行任务的独立实体。只要它执行任务,任何有权访问它的人都可以调用它来完成任务。
代码有异味吗?是的,这不是一个很糟糕的情况,但可以很好地表明班级可能承担了太多责任。
以此表示该类可能需要分解为不同的对象,私有方法实际上不需要调用同一对象的公共方法,当然在干净的OO设计中。
当然,一旦您检查了该类并且明确了方法调用的原因,这可能是一种非常合理的用法,通常,您希望该类的实用方法是私有的,但是如果一个有用的方法足以是公开的并被其他方法利用,我通常希望这些方法也是公开的。
与所有代码气味一样,这是进行进一步代码检查,合理化甚至重构的动机,而不是引起警报的原因。
如果尚未阅读此类源代码的某人尝试将其子类化并覆盖public方法,则可能会导致令人不快的意外。这是否真正令人担忧,显然取决于您的情况。也许您应该考虑使公共方法甚至是类最终化。
我知道这是一篇旧文章,但这是我在工作中一直在争论的问题。我“认为”这是一种代码味道,不明白为什么您会想要这样做。如果私有方法必须调用公共方法,则应采用公共方法的内容并将其放在私有方法中,然后这两种方法都可以调用该私有方法。为什么?
一旦在内部执行代码,公共方法可能包含不必要的测试。例如,它可能会收到一个UserObj,并且想要测试用户权限。
进行公共调用后,如果您正在使用线程,则可能需要锁定对象,因此在内部,您不希望回调到公共方法。
我认为,更有可能引入循环错误和无限循环以及内存异常。
简单明了,糟糕的设计和“懒惰”。使用公共方法可以访问外界。当你已经在里面的时候,没有理由走回外面。
在我的代码中,我经常创建延迟加载获取器,也就是说,对象在第一次被请求时就被初始化,然后重用相同的实例化对象。但是,使用延迟加载实例化的对象意味着不一定必须在任何给定点实例化该对象。与其将我的头放在调用序列周围,以免我知道该对象已被实例化或在另一个方法内重复执行延迟加载的相同代码,我只是在需要该对象时调用延迟加载器。
正如可以聪明地使用公共方法一样,您也可能会错误地使用它们。例如,一个公共方法将在调用另一个私有方法之前处理其参数。仅仅因为您具有相同的参数而随便调用该公共方法将是一个错误。该错误很细微,但它是设计错误,而不是其他任何错误,并且要求您学会使用内部方法的参数而不是公共方法的参数进行管理。
因此,要回答您的问题,如果使用正确,它肯定不是不好的代码。