【发布时间】:2023-11-02 13:13:01
【问题描述】:
如果我有一个函数(比如 messUp 不需要访问类的任何私有变量(比如 room),我应该像 room.messUp() 那样在类内编写函数还是像 @ 那样在类外编写函数987654324@? 似乎第二个版本对我来说更好读。
【问题讨论】:
标签: class language-agnostic function encapsulation
如果我有一个函数(比如 messUp 不需要访问类的任何私有变量(比如 room),我应该像 room.messUp() 那样在类内编写函数还是像 @ 那样在类外编写函数987654324@? 似乎第二个版本对我来说更好读。
【问题讨论】:
标签: class language-agnostic function encapsulation
这里需要权衡取舍。使用成员函数可以:
使用外部函数可以:
没有真正的方法可以让你的蛋糕也吃,所以你必须做出选择。一个常见的 OO 决定是让一切都成为方法(除非显然是愚蠢的)并牺牲后三点,但这并不意味着您应该在所有情况下都这样做。
【讨论】:
任何一类对象的行为都应该写成实例方法。
所以room.messUp() 是执行此操作的 OO 方式。
messUp 是否必须访问该类的任何私有成员,这无关紧要,它是房间的一种行为,这表明它是一个实例方法,就像 cleanUp 或 paint 一样,等等……
【讨论】:
忽略哪种语言,我认为我的第一个问题是 messUp 是否与任何其他功能有关。如果你有一组相关的函数,我倾向于把它们放在一个类中。
如果它们不访问任何类变量,那么您可以将它们设为静态。这样,无需创建类的实例即可调用它们。
除此之外,我还会关注语言。在某些语言中,每个函数都必须是某个类的方法。
最后,我认为这不会有太大的不同。 OOP 只是一种帮助组织应用程序数据和逻辑的方法。如果你接受它,那么你会选择 room.messUp() 而不是 messUp(room)。
【讨论】:
messup(room) 的行为方式相同。 .. 1. 因为它对我来说似乎更好读; 2.因为觉得喜欢,都不是很好的理由。但更糟糕的是 3。因为我不想在 OO 语言中接受封装。
我以 Sutter 和 Alexandrescu 的 "C++ Coding Standards: 101 Rules, Guidelines, And Best Practices" 以及 Bob Martin 的 SOLID 为基础。我当然同意他们的观点;-)。
如果消息/函数与你的类没有太多的交互,你应该把它变成一个标准的普通函数,以你的类对象作为参数。
你不应该用与你的班级没有密切关系的行为来污染你的班级。 这是为了尊重Single Responsibility Principle:你的课程应该保持简单,瞄准最精确的目标。
但是,如果您认为您的消息/函数与您的对象内脏密切相关,那么您应该将其作为您的类的成员函数。
【讨论】: