这些不是面向对象设计

来源:互联网 发布:centos ftp传文件 编辑:程序博客网 时间:2024/05/01 19:29

这些不是面向对象设计

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

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

第一个:

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