带参数的void方法和没有参数的返回值方法?

时间:2013-05-15 08:24:25

标签: c# object methods

我正在用C#开发软件,我记得我读过一篇文章,内容如下:

设计类的方法:

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

我再也找不到这篇文章,我想知道这样一个约定的好处和缺点,以提高我正在编写的代码的质量和可维护性。

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

3 个答案:

答案 0 :(得分:3)

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

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

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

在上面的示例中,我将用户名设置为foo并检索用户的密码。确切地说,我如何设置和检索信息是隐藏的。它现在可以保存在.xml文件中,但后来我决定更改为将其保存在数据库中或直接保存在内存中。使用这些课程的外部世界永远不会更明智。这是OOP的众多美女之一。

你问题中的两颗子弹可以响应一个吸气剂和一个属性的设定者。如果我想从我的类中检索数据而没有任何参数,那么拥有一个属性会更有意义。同样,如果我想更改对象的状态,我可以使用setter属性。我可以对输入执行验证,使其成为线程安全的,添加日志记录,我可以使用带有单个参数的方法执行的所有操作。

答案 1 :(得分:2)

我认为要点是命令查询责任分离。在实践中,您仍然需要将一些参数传递给return方法,以便过滤结果。使用空格来改变状态是明智的,并且使你的返回方法不会改变状态也是好的,但实际上你传入的参数数量并不取决于你是否有getter或setter方法。这实际上是一个方法需要知道什么来完成它的工作。

但是,传入的参数数量应保持最小。如果你有多个参数,你应该考虑你的方法是做多个事情。我想这个消息是,“你的方法做了一件事,做得好”。你可以从Bob叔叔那里获得大量有关这方面的信息,Bob Martin的Clean Coders系列是关于这个主题的很好的信息来源。

答案 2 :(得分:1)

使用get方法返回一个值并且不接受任何参数会使得你的方法正在做什么非常清楚。

GetFirstName()GetName(bool first)GetFirstName(User user)更明确地了解它的作用。

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

这些类型的getter方法在C#中也不是我的标准,我更有可能将属性用于这种性质的getter。

当涉及带参数的void方法时,这主要用于设置对象中某事物状态的setter。再次,使用C#中的属性轻松处理。

大多数情况下,这些指南可帮助您保持代码的可测试性。

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

如果您有一个接受5个参数的方法,请考虑可能需要覆盖的测试用例数。

最后,这些是适用于代码的可测试性和清晰度的一般准则,但有时您会发现遵循这些准则没有意义。

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