我无法区分访问者/获取者,它们代表对象的属性和常规方法。在C ++中,访问器和常规方法的命名约定是不同的(例如,Google风格指南建议使用小写的访问器和PascalCase的普通方法)。此外,普通方法和访问者/获取者(之前或之后)的顺序也受约定的约束。在Java中,人们可能会遇到一个两难的问题:方法是应该以“get”还是“compute”/“find”开头,分别表示getter和normal方法。在C#中,存在一个应该是属性以及应该是什么方法的两难选择。每当我创建一个新类时,我都不确定如何将方法分类为普通方法和getter。
是否有一种简单的方法可以确定对象/访问者/获取者的属性是什么以及普通方法应该是什么?
以下任何一项都与区分访问者/获取者和普通方法有关:
为了说明这一点,这里是一个例子(在C ++中):假设我想创建一个可以容纳固定数量元素的数据结构,除了插入/删除操作之外,它提供了一系列工作的方法。包含的元素(即平均值,中位数,最小值,最大值等)。现在,以一个计算平均值的函数为例;有人可能会说这是一个对象的属性,并在插入/删除元素时重新计算它,因此将其视为像const double& average()
这样的getter。另一种方法是按需计算它并将其视为常规方法,即double ComputeAverage()
。另外,假设有一个返回一组包含元素的方法;如果不需要每次都计算它,它可以被视为getter const set<int>& unique_elements()
,但如果每次都计算它,那么set<int> ComputeUniqueElements()
会更合适。
答案 0 :(得分:0)
在访问者和“常规方法”之间创建分离是个坏主意。方法是一种方法;它是一个具有特定效果的成员函数。成员函数只是设置成员变量的值或返回成员变量的值这一事实是实现细节。
良好的 API将外部世界与实现细节隔离开来。外部世界既不知道也不关心特定功能只是一个访问者,如果没有其他原因可以改变。
假设您的课程中有name
“属性”。最初,您将其存储为std::string
。您提供了获取和修改名称的功能。一切都很好。
现在,假设您决定更改名称的存储方式。您需要将名称解析为名字和姓氏。外界是否需要知道你在做这件事?您的setter方法的名称不需要更改。它的界面不需要改变。所有需要改变的是你实现功能的方式。
在C ++中,访问者和普通方法的命名约定是不同的(例如,Google风格指南建议使用较小的访问者,PascalCase使用普通方法)。
Google的风格指南并不代表C ++或其程序员;它只代表谷歌的作用。