class - 为什么使用简单类的访问器和修改器?
问题描述
对于简单的类(我的意思是非常简单的类),我们为什么要使用访问器和修改器方法?为什么我们不直接公开数据成员?
例如,下面的类头文件(在 C++ 中)可以用更少的努力实现;因为它实际上是几个具有访问器和修改器的数据成员,它们除了访问/修改这些数据成员之外什么都不做。
我很欣赏在更复杂的类中使用访问器和修改器的优势。
template<class T>
class Node
{
private:
T item; // A data item
Node<T>* next; // Pointer to next node
public:
Node();
Node(const T& anItem);
Node(const T& anItem, Node<T>* nextNodePtr);
void setItem(const T& anItem);
void setNext(Node<T>* nextNodePtr);
T getItem() const;
Node<T>* getNext() const;
}; // end Node
解决方案
这是 OOP 中一个非常基本、基本且定义明确的设计原则——为什么要使用访问器和修改器,不管类是大还是小。
我仍然要说,这个原则的实现——这个原则的使用仍然因语言而异,但是面向对象设计的核心原则——封装——始终保持不变,并且要求你总是隐藏所有可能隐藏的东西。
这是您问题的一种重复,它指的是为什么getter和setter在游戏中;但是,我也会尝试提出其他一些观点。
封装,其方面是问题的主题(修改器/访问器),是面向对象编程的基本原则,可能也是最重要的原则。
首先也是最重要的:
封装的重点不是(!)限制/阻止对成员变量的访问,而是约束访问策略并强制进行合理访问,从而避免任何意外干扰、隐式滥用或意外访问。
想一想:如果用户调用.setUserName("MyUser")
的人真的打算将数据写入成员字段,那是明确的!否则,这将意味着客户端 (1) 不小心将“MyUser”数据作为参数提供给 setter 方法,并且他们 (2) 不小心调用了该.setUserName
方法,这不太可能同时发生,然后只是公开访问该字段,只需一步即可完成。
话虽如此,使用封装原则并提倡将其作为 OOP 的核心特性,软件开发人员、许多框架和库通常会约定并使用数据类、普通类、业务类、服务或任何其他类型,依赖于广泛的常规设计和如何使用成员变量的最佳实践 - 使用 mutator 来改变和访问器来访问字段。
许多框架在实现 IoC 或 DI 时显式调用 setter 和 getter。
因此,使用封装并通过 mutator 和 accessor 与它们交互是最佳实践、约定俗成的、无异味的代码风格,也是类成员最安全的设计。
推荐阅读
- python - 使用 Selenium 和 Python 运行 Headless Chrome 时出错
- pandas - 如何重复数据框 - python
- angular - 错误 TS1238:作为表达式调用时,无法解析类装饰器的签名。角
- reactjs - 从 Yii2 APi 获取 ReactJs 中的数据
- php - 在 Zikula php 和 Symfony 中为模块设置依赖注入
- mysql - 我需要一些 Rails 迁移帮助来添加/删除 foreign_key
- c++ - googlemock 线程和 InSequence
- r - 创建多个总和
- javascript - 如何使滚动条在某个时间后自动移动(JavaScript)
- haskell - 如何理解/使用 Haskell 修复功能