这些不是面向对象设计

这些不是面向对象设计

       现在几乎到处都是在讲面向对象设计和泛型程序设计这方面的内容。我个人觉得自己对面向对象设计还是有一点了解的。但是,总觉得很多设计貌似面向对象设计,其实本质上并不是这样的。

       下面我就举两个例子来说明一下:

第一个:

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_是它的一部分。现在,这个问题就不如前面一个明显了吧?并且很多有名的库中这种表达方法到处都是。当然了,抛开面向对象不谈,这确实也很有实际使用价值,但是我这里要说的是这不是面向对象的思想,背离了初衷。当然,我们也不需要完全用面向对象的思想来做,而是什么方便用什么。但是不要挂面向对象的帽子做其他事。

 

       这里举这两个例子,其实是想说面向对象是很简单很纯粹的思想,但是被人故意弄杂乱了。如果内容有什么错误,希望能得到斧正,谢谢!

bykangtian0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值