2011-01-14 63 views
1

比方说,我有下面的类:类中使用自己的getter/setter方法

class MyClass 
{ 
    private: 

    int Data; 

    public: 

    MyClass(int Init) 
    { 
     Data = Init; 
    } 

    int GetData() const 
    { 
     return Data; 
    } 
}; 

现在,让我们说,我想补充一点,检查是否Data等于零的方法。有两种方法来实现:

bool DataIsZero() const 
{ 
    return Data == 0; 
} 

或者:

bool DataIsZero() const 
{ 
    return GetData() == 0; 
} 

这被认为是更好的做法?我可以看到如何使用变量本身可以提高可读性,但使用getter可能会使代码更容易维护。

+2

一个文体笔记是,你应该有你的小写成员函数。大写通常保留给静态成员。 – JohnMcG 2011-01-14 14:55:05

回答

4

我不太喜欢getter/setter,因为我不会在这里进入。他们涉及其他问题。但是,既然你问了他们,​​我的答案会假设我使用getters/setter;它不会访问所有可能的选择。

我会使用getter,因为您提到的维护原因。事实上,抽象是让吸气者处于第一位的一半目的(以及稍微严格的访问控制)。

如果使用变量比使用getter更清晰,那么你的getter函数名称很差,应该重新考虑。另外,最好初始化成员,不要在事实之后将它们赋值给构造函数体。事实上,你这样做与常数,所以你还不如现在就开始,并保持一致:

class MyClass 
{ 
private: 
    int Data; 

public: 

    MyClass(int Init) : Data(Init) {} 

    int GetData() const { 
     return Data; 
    } 
}; 

了解如何构造发生了变化。

+0

应该使用* getter *,因为当获取值的代码改变时,所有直接访问该成员的方法都必须改变。维护噩梦。另外,许多编译器将内联简单的getter和setter,所以这些工作在打字员(程序员)上。 – 2011-01-14 20:49:12

+0

@ThomasMatthews:换句话说,“我会使用吸气剂,因为你提到的维护原因”。 :) – 2011-01-15 01:19:18

2

您应该使用getter,因为如果您的类在getter中移动到更复杂的逻辑,那么您将与变化隔离。然而,如果你的类提供了一个公共的getter,我会质疑创建这个方法的逻辑。

+1

关于你的第二句话,虽然我不一定不同意你的意见,但值得注意的是两件事情:(a)OP的例子*可能是一个简化的,人为的代码示例;实际的使用案例可能不太方便; (b)尽管将std :: string :: length()与'0'进行比较是非常简单的,但std :: string :: empty()是非常好的选择。所以有时候会有一些理由让会员功能看起来有点没有意义。 – 2011-01-14 14:02:05

1

这取决于。

前者对简单的类是足够的。

后者隐藏了实现并且可以支持多态,如果该方法是虚拟的。

相关问题