带参数的无效方法和不带参数的返回值方法



我正在用c#开发软件,我记得我读过一篇文章,上面写着:

像这样设计类的方法:

  • 使用带有参数的void方法来改变类实例的状态。方法将对类
  • 的数据进行一些更改。
  • 使用返回值和不带任何参数的方法,以便从类
  • 中检索数据

我找不到那篇文章了,我想知道为了提高我正在编写的代码的质量和可维护性,这种约定的优点和缺点。

我的问题是:你知道关于这个问题的参考文献/文章吗?遵循这些陈述有意义吗?

我认为c#的一些特性使得这些建议不太实用。最重要的一点是,类中的数据应该被封装(外部世界不能直接访问它)和抽象(细节被隐藏)。这是类的主要目的之一。由于这个原因,我认为这个建议对于像c++这样没有属性的语言会更有意义。

其中一个问题是,人们会编写一个带有私有字段的类,然后必须为每个私有字段编写getter方法和setter方法,这将导致冗余的锅炉板代码。属性有助于简化此策略,同时仍然保持封装和抽象。例如,

UserInfo user = new UserInfo();
user.Username = "foo";
Console.WriteLine(user.Password);

在上面的示例中,我将用户名设置为foo并检索了该用户的密码。我究竟是如何设置和检索信息是隐藏的。它可以保存在一个。xml文件现在,但后来我决定改变,以保存在数据库或直接在内存中。使用这些类的外部世界永远不会知道。这是OOP的众多优点之一。

问题中的两个项目符可以响应属性的getter和setter。如果我想在没有任何参数的情况下从类中检索数据,那么使用属性更有意义。同样,如果我想改变对象的状态,我可以使用setter属性。我可以对输入执行验证,使其线程安全,添加日志记录,我可以用单个参数的方法做的所有事情。

我想这些要点指的是命令查询职责分离。在实践中,您可能仍然需要向return方法传递一些参数,以便过滤结果。使用void来改变状态是明智的,并且让你的返回方法不改变状态也很好,但实际上你传入的参数数量并不是由你是否有getter或setter方法决定的。它实际上是一个方法需要知道什么才能完成它的工作的因素。

然而,传入的参数数量应该保持在最小值。如果你有多个参数,你应该考虑你的方法是否做了不止一件事。我想这句话的意思是,"让你的方法只做一件事,并把它做好"。你可以从Bob大叔那里得到大量的信息,Bob Martin的Clean Coders系列是关于这个主题的一个很好的信息来源。

让get方法返回一个值,而不接受任何参数,这使得你的方法非常清楚你在做什么。

GetFirstName()GetName(bool first)GetFirstName(User user)更清楚自己在做什么。

清晰是关键。方法签名可能看起来相当清楚,但是当您在代码中的某个地方读取GetName(false)时,它将引起一些混淆。

这些类型的getter方法也不是我在c#中的标准,我更倾向于为这种性质的getter使用属性。

当涉及到带参数的void方法时,这主要用于设置对象中某些东西的状态的setter。同样,在c#中使用属性很容易处理。

大多数情况下,这些指导方针是为了帮助保持代码的可测试性。

参数较少的方法更容易测试——假设您将依赖项注入到方法签名中,而不是在方法本身中创建新对象,这可能难以模拟和测试。

想想如果你有一个接受5个参数的方法,你可能需要覆盖多少个测试用例。

最后,这些都是对代码的可测试性和清晰度有好处的一般指导方针,但当然有时你会发现遵循这些指导方针是没有意义的。

与任何编码一样,只要知道你在做什么以及为什么要这样做。

最新更新