《易经》与软件开发
《易经》与软件看上去好像是风马牛不相及,他们应该没有任何关系吧?众所周知《易经》乃是群经之首,包罗万象,容其万物,《易经》是伏羲对宇宙的认识,也是中国历代优秀人物智慧的结晶,“其大无外,其小无内”这是对《易经》功能最好的描述,世千万物都容其内,宇宙的秘密也在其中,这本“无字天书”所蕴涵的宇宙奥秘需要我们去破解。然而信息技术高速发展的今天,我们貌似已经遗忘先辈们给我们的宝贵智慧遗产,我们将其抛在脑后,而去追捧西方人为信息技术带来的知识和见解。作为中国人我们是否可以运用中国人的思维去理解当今高速发展的信息时代?特别是软件行业的发展。
《易经》的核心思想是“一阴一阳之谓道”。贯穿于中国历史发展的整个过程,在《易经》的卦象中是以阴,阳二爻两种符号为基础,这两个符号按照阴阳二气消长的规律,经过排列组合就成了八卦,然而八卦的构成与排列,就体现了阴阳互动,对立统一的思想,八卦再经过重叠排列组合就成了六十四卦,所以“阴阳”是其核心思想。“阴阳”我们可以看作是“男为阳,女为阴”,“君为阳,民为阴”,“君子为阳,小人为阴”等等,这也是万事万物都是对立的,然而“一阴一阳”在一起的时候才有所谓“道”的存在,这是就是反应时万物在对立的同时也是相互联系的。这便是“对立”与“统一”的关系。然而在软件行业中,系统设计师总是尽量运用自己所掌握的知识和经验,将客户所需求的软件设计好,但是客户的需求不可能一层不变的,所以软件产品永远都不可能满足客户的需求,软件存在的意义是什么?软件存在的意义是“天行健,君子自强不息”,“天”为客户需求,“君子”为软件,那就可以理解为客户需求是永无止尽得变化,软件能做的就是自强不息,适应客户的需求变化。这才是“顾客是上帝”的真正解释。
在《易经》中的根本精神为“生生之为易”,“易”就是“生”,“生生”就是连续不断地发展变化,没有一刻停息,也没有“上帝”来创造生命,自然界的基本规律也是通过生存,繁衍,进化而来的。“生生”便是《易经》的基本精神。然后在软件开发的过程中,一个基本类想要发展壮大,也是通过其他相关类继承它,成为它的子类,这个基本类所具有的思想,将通过继承的关系,传递给它的子类。“太极生两仪,两仪生四象,四象生八卦”这正是继承表现,如果能将其图形化,很容易看出来这句话正是描述“完全二叉树”具体形态。“太极”可以看作是抽象类,“两仪”则可以看做是他的实现类,“四象”则看做是对“两仪”的实现,以此类推,然而在《易经》中它所追求的是“太极”可以生成“两仪”,“两仪”生成“四象”,“四象”可以生成“八卦”,那么“八卦”也能聚合“四象”,“四象”也可以聚合“两仪”,“两仪”最终聚合为“太极”,这也是“太极无极”的真正意义,软件设计业应该趋向于这种思想去设计,设计师设计抽象类应该尽量将子类所具有的共同属性和方法放在抽象类中,让他尽量包罗,规范子类的行为。
在《系辞》中的“生生之为易”,宇宙的发展变化都是通过“生生”来完成的,现在我们将其“生生”具体到人类中,那么人与人之间最基本的关系就是“父子”或者“母子”,“夫妻”关系,而在软件开发中,类与类之间的关系最基本的关系应该是“继承”,“聚合”关系。比如一个Man类,应该继承它的父类Parents,引用Wife类,Man类有eat(),sleep(),work(),generate(Wife wife),其中generate(Wife wife)返回的Human类即是人类,所有的Man,Parents,Wife都是Human的子类,类图如下
代码清单如下:
Human接口
package com.javapattern.human;
import java.util.Vector;
public interface Human {
public void setGender(String gender);
public String getGender();
public void eat();
public void sleep();
public void work();
public Vector<Human> generate();
}
定义人类这个接口,其中具有的方法有setGender(String gender),getGender()eat(),
sleep(),work(),generate()
HumanAdapter适配器
package com.javapattern.human;
import java.util.Vector;
public abstract class HumanAdapter implements Human{
public void eat(){
//doing some thing
}
public void sleep(){
//doing some thing
}
public void work(){
//doing some thing
}
public Vector<Human> generate(){
return null;
}
}
由于不是所有的人类都具有以上接口定义的方法,所以在此定义了HumanAdapter适配器类
Man类
package com.javapattern.human;
import java.util.Vector;
public class Man extends HumanAdapter {
private Human human;
public String gender = "man";
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Man(){
}
public Man(Human human){
this.human = human;
this.gender = "man";
}
public void eat(){
eat();
System.out.println("eating things");
}
public void sleep(){
sleep();
System.out.println("sleeping");
}
public void work(){
work();
System.out.println("working");
}
public Vector<Human> generate(){
//只生一个好
Vector<Human> vector = new Vector<Human>();
if("woman".equals(human.getGender())){
Human boy = new Man(this);
Human girl = new Wife(human);
System.out.println("generate.....");
vector.add(boy);
vector.add(girl);
}
return vector;
}
}
定义Man类并且实现了generate()方法,返回一个Vector类,它是Man和wife的聚集
Wife类
package com.javapattern.human;
import java.util.Vector;
public class Wife extends HumanAdapter {
private Human human;
public String gender = "woman";
public Wife(){
//this.gender = "woman";
}
public Wife(Human human){
this.human = human;
this.gender = "woman";
}
public void eat(){
eat();
System.out.println("eating things");
}
public void sleep(){
sleep();
System.out.println("sleeping");
}
public void work(){
work();
System.out.println("working");
}
public Vector<Human> generate(){
//只生一个好
Vector<Human> vector = new Vector<Human>();
if("man".equals(human.getGender())){
Human boy = new Man(this);
Human girl = new Wife(human);
System.out.println("generate.....");