首页 > 解决方案 > 为什么使用简单类的访问器和修改器?

问题描述

对于简单的类(我的意思是非常简单的类),我们为什么要使用访问器和修改器方法?为什么我们不直接公开数据成员?

例如,下面的类头文件(在 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

标签: classoopobject

解决方案


这是 OOP 中一个非常基本、基本且定义明确的设计原则——为什么要使用访问器和修改器,不管类是大还是小。

我仍然要说,这个原则的实现——这个原则的使用仍然因语言而异,但是面向对象设计的核心原则——封装——始终保持不变,并且要求你总是隐藏所有可能隐藏的东西

是您问题的一种重复,它指的是为什么getter和setter在游戏中;但是,我也会尝试提出其他一些观点。

封装,其方面是问题的主题(修改器/访问器),是面向对象编程的基本原则,可能也是最重要的原则。

首先也是最重要的:

封装的重点不是(!)限制/阻止对成员变量的访问,而是约束访问策略并强制进行合理访问,从而避免任何意外干扰、隐式滥用或意外访问。

想一想:如果用户调用.setUserName("MyUser")的人真的打算将数据写入成员字段,那是明确的!否则,这将意味着客户端 (1) 不小心将“MyUser”数据作为参数提供给 setter 方法,并且他们 (2) 不小心调用了该.setUserName方法,这不太可能同时发生,然后只是公开访问该字段,只需一步即可完成。

话虽如此,使用封装原则并提倡将其作为 OOP 的核心特性,软件开发人员、许多框架和库通常会约定并使用数据类、普通类、业务类、服务或任何其他类型,依赖于广泛的常规设计和如何使用成员变量的最佳实践 - 使用 mutator 来改变和访问器来访问字段。

许多框架在实现 IoC 或 DI 时显式调用 setter 和 getter。

因此,使用封装并通过 mutator 和 accessor 与它们交互是最佳实践、约定俗成的、无异味​​的代码风格,也是类成员最安全的设计。


推荐阅读