设计模式所感

      刚接触高级语言编程的人是不会考虑怎么去设计类之间的关系的,只求能够以最简短最直白的方式实现系统需要的功能。同样的从c语言的面向过程的编程语言转行来做java、c#等的程序员也很难一时理解何为面向对象编程。面向对象与面向过程究竟有何区别?

      我们随便去网上搜搜,照本宣科的就能说出面向对象的三大显著特点:继承、封装和多态。答案很容易搜到,但是我们真的理解吗?自从出了一本《21天学通c++》后,像类似的《21天学通……》层出不穷。学一门语言,或者说是学习一门知识,需要长久以来日积月累的经历做基石,岂非21天能够真正领会?曾经看到一个帖子上说着多少c++程序员认为他们非常精通c++,殊不知他们都是拿着VC编译器去跑c程序。

      接触java编程半年多以来,我可以说还是一个菜鸟,也可以说在java的道路上跑了1/3(学习跟上目前的技术需要18个月,但是想要一直保持下去则需要终生不断关注该领域的发展),虽然肯定曾经在不知不觉中用到了继承、多态和封装,但是真正说到了解缘由,却还是处于一片混沌。在从编写“Hello World”开始,如果我们毕业之后不去大型公司面试,或者是不走程序员道路,可能一直到最后,我们都不会去编写一些大型程序,而是简简单单用eclipse新建一个java project,然后在这个工程下的一个包里就完成了全部的程序开发。这样固然简单,也可以很轻松的逃避设计类之间关系的困扰(即使遇到,也可以手动去修改代码,因为代码量并不是很多,当然在改完之后代码就变得面目全非了,高耦合),但是始终不是软件开发的真谛。在接触到通信这一部分后,由于开始设计更大的程序,我们开始遇到了架构类与设计之间的阻碍。这是一个重要的时期,如果我们跨过了这条河,面对软件开发的领域,我们的天空会变的广阔无边;如果我们卡死在这里,即使曾经编写出过多少功能强大的程序,也变得毫无价值,所谓一将功成万骨枯。人们常说程序的灵魂是算法,我曾经苟同这个观点,但是现在,我还要加上一点,那就是架构。为什么在一个公司里架构师的职位比程序员要高得多?为什么程序员一抓一大把,只能做基层工作,而架构师、需求分析师、设计师等却能当上主管?语言是死的,思想是活的,那种只会copy、paste的程序员其实并不能算为程序员,他们甚至可以被称作苦力了。苦力虽然工作是苦了点,但是他们起码还是可以通过高负荷的工作量来锻炼身体嘛~~,但是程序员每天盯着电脑屏幕看,时而工作至深夜,这种生活方式,造就了其高危职业的称号,而我们,也不乏看到程序员猝死的例子。有时会想想,我们以后呢,能否冲破这个牢笼前途光明,还是只能做一个苦逼的程序员?

      呵呵,本来想写一遍技术博客的,却在写的过程中不知不觉吐槽了。我想我事先拟定好的标题也该改了。关于设计模式,说实话,在看的过程中,我觉得这些东西都太Wonderful了,同时也佩服前人能够总结出这23种设计模式,我能够跟着他们的思想漫处漂游,为他们举的一个个诙谐而有趣的例子拍案叫绝。但是,真正合上书本之后,我能够自己想到的,却是寥寥可数,更别提应用了。在设计模式中,我记得最清楚的两句话是:

      一、抽象类是自底而上抽象出来的,而接口则是自顶向下设计出来的。抽象类是需要考虑到具体每个类之间的关系,是继承、同级还是毫无相关?我们需要在抽象类里尽量多的定义他们的共有方法,而把他们各自的特色写在自己的类里面;而接口则是表现不同类所具有的相同的方法,比如说老鸭 extends 鸭类 extends 动物米老鼠 extends 鼠类 extends 动物,他们是不同的类但都来源于动物类,但是他们都可以说人话,显然这不是动物所具有的特征,所以不能通过继承父类的方法得到。我们当然可以在他们各自的类里面定义这个方法,但是如果还有很多其他的类呢?比如说孙悟空、阿童木等啊。逐一定义实在太麻烦,这时就是接口的作用了,我们可以把他们共有的这个方法定义在接口里,然后都继承并实现这个接口。所以在软件开发的过程中,我们在动手开发之前还必须得想清楚需要什么,什么关系(也就是所谓的UML图),然后再根据这些想法来先定义接口,所谓软件开发是针对接口开发的,而不是针对实现开发的(依赖倒转原则),也即接口是自顶向下设计出来的。

      二、当一个类在整个软件开发中只被一个类继承的话,那么这就是一种过度设计了,可以将这两个类合并起来。事实上过度设计也是编写代码中的一种诟病。设计模式有四境界:1.没学之前是一点不懂,根本想不到用设计模式,设计的代码很糟糕;2.学了几个模式之后到处想用而时常造成误用模式不自知;3.学完之后感觉各个模式之间十分相似,无法区分其不同点,在运用是常常犹豫不决;4.修行到位了~~。其实从某种程度上讲不会用设计模式的人要远远超过过度使用设计模式的人。但是我们不能因噎废食啊,有时候做任何事情我们是需要抱着一种悲壮的心态,即使明知道以后会全部推倒重来,却仍然能够义无返顾的去做这一件事。除非我们是天才,否则这前三个阶段,我们是一定要经历的。而每个人,也都是这样成长起来的。

      关于设计模式,就算是再精彩的讲解,再生动的比喻,也只能给我们留下一时的印象,想要真正地掌握它,只有自己不断的前行,并在一次次的跌倒中总结经验,收获所得,这样才能把它变为自己的财富。最后回答一下上面的一次发问:做主管,或是做程序员,完全取决于当下

      一时兴起,小小吐槽,希望能给大家一点激励。

猜你喜欢

转载自zhuyifeng.iteye.com/blog/1449980