当我将大方法(或过程或函数)拆分为特定于OOP的问题时,但由于我99%的时间都使用OOP语言,这是我最熟悉的术语,所以请分成许多小方法,我经常发现自己对结果不满意。与这些小方法只是大代码中的代码块相比,要推理这些方法变得更加困难,因为当我提取它们时,我失去了很多来自调用者上下文的基础假设。
后来,当我查看这段代码并看到各个方法时,我不立即知道它们从何处调用,而是将它们视为可以从文件中任何位置调用的普通私有方法。例如,想象一下一个初始化方法(构造方法或其他方法)分成一系列小的方法:在方法本身的上下文中,您清楚地知道对象的状态仍然无效,但是在普通的私有方法中,您可能会假设该对象已经初始化并且处于有效状态。
我所看到的唯一解决方案是where
Haskell中的子句,该子句允许您定义仅在“父”函数中使用的小函数。基本上,它看起来像这样:
len x y = sqrt $ (sq x) + (sq y)
where sq a = a * a
但是我使用的其他语言没有这样的东西-最近的事情是在本地范围内定义lambda,这可能会更加令人困惑。
因此,我的问题是-您是否遇到了这个问题,甚至看到了这个问题吗?如果这样做,通常如何解决,特别是在“主流” OOP语言中,例如Java / C#/ C ++?
编辑重复项:正如其他人所注意到的,已经有讨论拆分方法的问题和只有一线的小问题。我阅读了它们,他们没有讨论可以从调用者的上下文派生出来的基础假设的问题(在上面的示例中,对象已初始化)。这就是我的问题的重点,这就是为什么我的问题与众不同。
更新:如果您关注下面的问题和讨论,您可能会喜欢John Carmack的这篇文章,尤其是:
除了了解正在执行的实际代码外,内联函数还具有无法从其他位置调用该函数的好处。这听起来很荒谬,但是有一点是正确的。随着代码库在多年使用中的增长,将有很多机会采用快捷方式并仅调用仅执行您认为需要完成的工作的函数。可能有一个FullUpdate()函数调用PartialUpdateA()和PartialUpdateB(),但是在某些特定情况下,您可能意识到(或认为)您只需要执行PartialUpdateB(),并且通过避免使用其他方法可以提高效率。工作。大量的错误源于此。大多数错误是由于执行状态不完全符合您的想法而导致的。