这些不是面向对象设计
现在几乎到处都是在讲面向对象设计和泛型程序设计这方面的内容。我个人觉得自己对面向对象设计还是有一点了解的。但是,总觉得很多设计貌似面向对象设计,其实本质上并不是这样的。
下面我就举两个例子来说明一下:
第一个:
class Example
{
public:
Example(int init=0):data_(init){}
void change(Example&, int);
private:
int data_;
};
void Example::change(Example& other, int dest)
{
other.data_ = dest;
}
int main()
{
Example a,b;
b.change(a,10);
return 0;
}
大家可以看到,这个绝对是符合C++中面向对象方面的语法的,但是这个完全不是面向对象的设计。为什么呢?
我们可以看到,change成员函数做了什么,如果用对象的思想,而不是类来想问题的话,就可以看出,这个成员函数直接改变了另外一个对象的内部状态,虽然这个另外一个对象也是这个类的对象。当然,我们可以说这是这个类设计者个人的问题,我也同意这种说法。但是实践中我们确实能保证不犯这种错误吗?
看下面这个例子就可以看出我们实践中到处都是这种错误!
第二个:
class Inner
{
public:
Inner(int init):mem_(init){}
void change(int);
private:
int mem_;
};
class Outer
{
public:
Inner& get(){ return inn_; }
private:
Inner inn_;
};
int main()
{
Outer o;
o.get().change(10);
return 0;
}
可以看到,这个也是绝对是符合C++中面向对象方面的语法的,但是这个也完全不是面向对象的设计。为什么呢?
我们可以看到,Outer类的get成员函数做了什么,这个成员函数直接返回了这个对象的内部状态,结果就是允许外部直接改变Outer类的对象o的成员inn_的内部状态,也就是说间接的改变了对象o的状态,因为其成员inn_是它的一部分。现在,这个问题就不如前面一个明显了吧?并且很多有名的库中这种表达方法到处都是。当然了,抛开面向对象不谈,这确实也很有实际使用价值,但是我这里要说的是这不是面向对象的思想,背离了初衷。当然,我们也不需要完全用面向对象的思想来做,而是什么方便用什么。但是不要挂面向对象的帽子做其他事。
这里举这两个例子,其实是想说面向对象是很简单很纯粹的思想,但是被人故意弄杂乱了。如果内容有什么错误,希望能得到斧正,谢谢!
by:kangtian0