我正在用 C# 开发软件,我记得我读过一篇带有以下语句的文章:
像这样设计一个类的方法:
- 使用带参数的void方法来更改类实例的状态。方法将对类的数据做一些改变
- 将返回值与不带任何参数的方法一起使用,以便从类中检索数据
我再也找不到这篇文章了,我想知道这种约定的优缺点是为了提高我正在编写的代码的质量和可维护性。
我的问题是:你知道这个问题的任何参考资料/文章吗?遵循这些陈述是否有意义?
C# 具有我认为使这些建议不太实用的属性。要带走的重点是类内部的数据应该被封装(外部世界无法直接访问它)和抽象(隐藏细节)。这是类的主要目的之一。出于这个原因,我认为这个建议对于像 C++ 这样没有属性的语言更有意义。
但其中一个问题是人们会编写一个带有私有字段的类,然后必须为每个私有字段编写一个 getter 方法和一个 setter 方法,这会导致冗余的样板代码。属性有助于简化此策略,同时仍保持封装和抽象。例如,
UserInfo user = new UserInfo();
user.Username = "foo";
Console.WriteLine(user.Password);
在上面的示例中,我将用户名设置为 foo 并检索了用户的密码。我究竟是如何设置和检索信息的。它现在可能保存在 .xml 文件中,但后来我决定更改为将其保存在数据库中或直接保存在内存中。使用此类的外部世界永远不会更聪明。这是 OOP 的众多优点之一。
您问题中的两个项目符号可以响应属性的 getter 和 setter。如果我想在没有任何参数的情况下从我的类中检索数据,那么拥有一个属性更有意义。同样,如果我想更改对象的状态,我可以使用 setter 属性。我可以对输入执行验证,使其成为线程安全的,添加日志记录,以及我可以使用带有单个参数的方法做的所有事情。
我想要点是指命令查询职责分离。在实践中,您可能仍然需要将一些参数传递给返回方法,以便过滤例如结果。使用 void 来改变状态是明智的,并且让你的返回方法不改变状态也很好,但实际上你传入的参数数量并不取决于你是否有一个 getter 或 setter 方法。这确实是一个方法需要知道什么才能完成它的工作的一个因素。
但是,您传入的参数数量应保持在最低限度。如果您有多个论点,您应该真正考虑您的方法是否在做不止一件事。我想信息是,“让你的方法做一件事并做好”。你可以从鲍勃叔叔那里得到大量关于这方面的信息,鲍勃马丁的清洁编码器系列是关于这个主题的一个很好的信息来源。
拥有一个返回值且不带任何参数的 get 方法可以非常清楚您的方法在做什么。
GetFirstName()
比GetName(bool first)
or更清楚它在做什么GetFirstName(User user)
。
清晰是关键。方法签名可能看起来很清楚,但是当您GetName(false)
在某处阅读代码时,它会引起一些混乱。
这些类型的 getter 方法也不是我在 C# 中的标准,我更有可能将属性用于这种性质的 getter。
当涉及带参数的 void 方法时,这主要适用于设置对象的状态的设置器。同样,使用 C# 中的属性可以轻松处理。
大多数情况下,这些准则有助于保持您的代码可测试。
参数较少的方法更容易测试——假设您将依赖项注入方法签名而不是在方法本身中创建新对象,这可能难以模拟和测试。
想想如果你有一个接受 5 个参数的方法,你可能需要覆盖多少个测试用例。
最后,这些是有助于代码的可测试性和清晰性的一般准则,但有时您肯定会发现遵循这些准则没有意义。
与任何编码一样,请注意您在做什么以及为什么要这样做。