【发布时间】:2009-11-11 02:12:26
【问题描述】:
对于我的软件开发编程课程,我们应该为 RSS 提要制作一个“提要管理器”类型的程序。以下是我如何处理 FeedItems 的实现。
又好又简单:
struct FeedItem {
string title;
string description;
string url;
}
为此我被打分了,“正确”的示例答案如下:
class FeedItem
{
public:
FeedItem(string title, string description, string url);
inline string getTitle() const { return this->title; }
inline string getDescription() const { return this->description; }
inline string getURL() const { return this->url; }
inline void setTitle(string title) { this->title = title; }
inline void setDescription(string description){ this->description = description; }
inline void setURL(string url) { this->url = url; }
private:
string title;
string description;
string url;
};
现在对我来说,这似乎很愚蠢。老实说,我不敢相信我被降价了,因为这与我的完全相同,但开销更大。
这让我想起在 C# 中人们总是这样做的:
public class Example
{
private int _myint;
public int MyInt
{
get
{
return this._myint;
}
set
{
this._myint = value;
}
}
}
我的意思是我 GET 他们为什么这样做,也许稍后他们想验证 setter 中的数据或在 getter 中增加数据。但是为什么你们不这样做直到这种情况出现?
public class Example
{
public int MyInt;
}
抱歉,这是一种咆哮,并不是真正的问题,但冗余让我抓狂。为什么 getter 和 setter 在不需要时如此受欢迎?
【问题讨论】:
-
如果您认为这很荒谬,您还没有使用带有单例工厂类的库包含 SQL 语句的字符串。哦,每个中间类都有一个接口。
-
就我个人而言,我讨厌 geters/setter(它类似于 Java,而不是 C++)。你为什么要摆弄对象的内部结构。创建后更改这些成员似乎没有意义(但这取决于使用要求)。我会将所有成员设为私有,构造函数来创建它们并查看对象的使用方式。添加不必要的 getter/setter 几乎和使用公共变量一样糟糕。
-
@Martin - 我认为“API 已经公开,所以为时已晚”的论点是错误的,并且使用得太频繁了。当然,如果您要更改的all 是内部实现机制,那么getter/setter 可以保护客户端免受更改。但是如果你想改变行为,假装 getter/setter 保护用户免受改变是一个谎言。如果 setX() 现在可以在以前从未失败的情况下失败(例如,由于访问控制),那么类的接口已经改变,用户无论如何都会中断。更糟糕的是,它会在运行时而不是编译时中断。
-
在 C# 中,我会编写 public class Example{ public int MyInt{get;set;} },这不会比字段长多少。
-
关于 C# 的注释:
public int MyInt;是一个类成员,与public int MyInt{get;set;}是一个属性不同。如果您以后需要用属性替换成员,您将更改类的签名。先前指向该成员的代码将不知道相同名称的属性是有意的。不同之处在于,在 IL 中更改成员是更改变量,而更改属性是调用方法。这是这种原本美丽的语法糖可以咬你的少数几次之一。
标签: c# c++ encapsulation yagni