1

如果我有复杂的任务要解决,我有时会遇到一种情况,即我有一种方法可以控制执行。由于 null 检查、if 语句、调用类型之间映射的方法等等,这个方法可能会变得非常长,我很难让它变得更简单。

示例 1

public class A
public string MethodA(string stringA)
{
    var fooResult = _fooService.fooMethod(stringA);

    if(fooResult)
    var barResult = _barService.barMethod(fooResult);

    if(barResult)
    // And so on..

    return someResult;
}

我可以链接方法调用,这使得第一种方法更简单。但这使得 fooMethod 依赖于 _barService,barMethod 依赖于 _someService 等等。

示例 2(与上面相同,但使用链式方法调用)

public class B
public string MethodB(string stringB)
{
    return _fooService.fooMethod(stringB);
}

public class Foo
public string fooMethod(string stringB)
{
    return _barService.barMethod(stringB);
}

public class Bar
public string barMethod(string fooString)
{
    return _someService.someMethod(fooString);
    // And so on...
}

我应该如何构建我的代码?当涉及到哪个方法负责调用另一个方法时,我应该怎么想?

换句话说,我应该这样做:

class A
{
  Execute()
  {
    A();
    B();
    C();
  }

  method A()
  {
  ...
  }

  method B()
  {
  ...
  }

  method C()
  {
  ...
  }
}

或者像这样:

class B
{
  Execute()
  {
    A();
  }

  method A()
  {
    B();
  }

  method B()
  {
    C();
  }

  method C()
  {
  ...
  }
}
4

2 回答 2

1

这取决于。

如果阶段定义明确,在大多数情况下按顺序调用它们会更方便。

但是,例如,如果 B 定义明确,但 A 和 C 实际上只是依赖于 B 的工作的开始和结束,那么 A 或 C 本身都没有多大意义,并且难以命名/描述或评估是否他们已经成功了,那么在这种情况下,将 A 和 C 组合在一个调用 B 的方法中更有意义。分离方法以便每个方法执行特定任务是好的,但是如果部分任务本身没有太大意义,则应避免将事物分离到仅执行部分任务的程度。

您应该考虑如何测试代码 - 一种设计比另一种更容易。

考虑如何维护代码。这是易于理解代码最重要的地方,但也要考虑一个阶段是否需要编辑以修复错误或增强功能;哪种设计可以让您以最少的努力做到这一点,以及对其他代码的副作用以及对不应该真正受到影响的区域的相关重新测试?

想一想您将来是否需要改变其中一个步骤——根据某些输入或设置调用 B 的替代版本?

考虑可重用性。如果 A 调用 B 你不能在你不想调用 B 的情况下重用 A,在你的其他设计中你可以重用 A。

他们是否总是需要按该顺序调用 - 是否有通过并行调用 B 和 C 来优化速度的空间(从 B 调用 C 不允许这样做)。

如果 B 失败,您仍然尝试调用 C (我怀疑大多数人会说不是,因为这更有可能是真的,但这确实取决于真正的问题是什么)单独的调用通常比链接更容易。

为了支持从 A 调用 B,您只需要在接口中公开 A,并且(如果您选择的语言允许)您可以将 B 和 C 设为私有。然后更容易确保只从 A 调用 B,因此 B 可能能够避免测试某些初始条件是否为真,而只依赖 A 完成其工作。

当然,以上是一组问题而不是答案,这是因为任何一种设计都可能是正确的,具体取决于您的实际任务是什么,但希望上述考虑因素可以帮助您做出决定。

于 2017-09-06T13:56:16.407 回答
0

您的所有任务都没有通用的决定。基本上,您应该努力编写简短的方法并实现一项任务。正确的方法命名将帮助您做到这一点(似乎这是您的问题)。例如,避免使用类似ExampleClass.DoWork()or的名称,ExampleClass.ManageObject(object)因为它们不准确并导致复杂且冗长的实现。

通常,最后两个示例的“串行”版本更可取,因为它更易于阅读,并且,A()可能具有更简单的实现,并且更容易正确命名它们。B()C()

如需更具体的建议,您可以在Code Review中发布您的代码。

于 2017-09-04T06:08:49.977 回答