4

假设我有一个名为 do3() 的函数为了使该函数工作,我需要执行函数 do1() 和 do2()。

但是,其他东西也可能需要 do1() 和 do2()(可能是 do4())

所有这些功能都是公共的(并且必须是公共的)。

问题,我应该如何实现代码?

选项1 :

function do3() {
    do2()
    do whatever is needed for do3
}

function do2() {
    do1()
    do whatever is needed for do2
}

function do1() {
    do whatever is needed for do1
}

因此,如果我调用 do3(),我确信一切都会完成,尽管会出现耦合

选项 2

function do3() {
    do whatever is needed for do3
}

function do2() {
    do whatever is needed for do2
}

function do2() {
    do whatever is needed for do1
}

所以当我想调用 do3() 我必须

do1()
do2()
do3()

我觉得第二种选择更好,因为它的耦合更少,但是我无法解释为什么,它更像是一种感觉。我认为如果我使用选项一和一天我更改 do2() 我可能会遇到问题。

但是,对于选项 2,我必须确保每次我想使用 do3 时都调用 do1 和 do2。

如果有人有更好的主意(选项 3?)会很棒。

谢谢

4

3 回答 3

1

耦合是一个与类而不是函数相关的概念。一个函数应该能够调用它所在的同一类的任何其他函数。那里没有耦合问题。

你的第一个选项很好,do3 调用 do2 和 do2 调用 do1 没有任何问题,只要它们都在同一个类中。

您不应该选择您的选项 2,因为它需要您在任何地方重复代码。

于 2011-10-07T05:25:45.213 回答
0

“假设我有一个名为 do3() 的函数,为了使该函数工作,我需要执行函数 do1() 和 do2()。”

胡安:根据你的描述,do3() 依赖于 do1() 和 do2()。依赖图是

    - ->do2()
do3()
    - ->do1() 

在这种情况下,您应该采用第二种方法。

如果您的依赖关系图是:

do3()- ->do2() - -> do1()

IE

  • do3 依赖于 do2

  • do2 取决于 do1

在这种情况下,您应该采用第一种方法。

--> : shows the dependency.
于 2011-10-07T06:15:04.663 回答
0

简短的回答是,如果 do3() 总是必须继续对 do2/do1 的调用,并且当调用者可能需要在这些调用之间执行某些操作时没有上下文,那么 do2 确实应该包含在 do3 中,依此类推。我还要断言,除非 doX 调用是 API 或其他难以更改的环境的一部分,否则明智的做法是避免将调用“以防万一”分开,以防将来出现需要拆分的情况(谨慎设计的原则)。

更长的答案:检验某事真相的一种方法是探索病理案例。将您的第二种选择发挥到极致,基本上需要完全分解功能组合,直至完全消除功能;毕竟,某些函数正在调用 do1() do2() do3() 并因此“耦合”到这些函数。

[soap box]静态依赖(耦合)必然是一种恶习,这根本不是一个正确的命题,尽管这个概念现在很流行。静态依赖可能看起来不灵活,但它们也很容易理解、机器可验证和高度优化。为了说明这一点,请考虑以下假设代码:

person = WebRequest('/GetPerson');
if (person.Phone.AreaCode = '')
    person.Phone.AreaCode = GetAreaCodeFromZip(person.Zip);
...

像这样的逻辑可以,并且经常因为无数的原因被分解为:

requestService = CreationFactory(IRequest);
requestService.Configure(ConfigurationService.GetConfiguration(requestService));
requestService.SetEntityContext('Person');
response = requestService.Invoke();
entity = EntityService.ProcessEntity(response.Data);
EntityService.RegisterEntityCorrectionService(entity, IAreaCorrectionService);
...
interface IAreaCorrectionService
...
class AreaCorrectionService : IAreaCorrectionService
...
ServiceFactory.Register(AreaCorrectionService...

我的观点很简单,就是在性能、可读性、甚至减少对“解耦”的声明性方面都有成本。当控制反转和其他框架被考虑时,很少明确考虑这一点。

于 2011-10-07T06:17:58.790 回答