首先我们用一个平常的写法和一个面向对象方法去解决同样一个案例,
C102_01:设计一个程序,存储学生的基本信息(姓名、性别、学历层次和年级),实现学生信息的编辑(设置姓名、性别、升级、降级)
public class C102_01_结构化程序设计 { static String name;//姓名 static String sex;//性别(男/女) static String level;//学历层次(本科/专科) static int grade;//年级 public static void main(String[] args) { name = "张三"; sex = "男"; level = "本科"; grade = 2; print(); upgrade(); print(); } //升级 public static void upgrade(){ grade++; if(level.equals("本科") && grade>4){ grade = 4; } if(level.equals("专科") && grade>3){ grade = 3; } } //降级 public static void degrade(){ grade--; if(grade < 1){ grade = 1; } } //打印 public static void print(){ System.out.println("姓名:"+name); System.out.println("性别:"+sex); System.out.println("学历:"+level); System.out.println("年级:"+grade); } }
C102_02:改写案例C102_01,用0|1表示性别和本科|专科
public class C102_02_结构化程序设计 { static String name;//姓名 static byte sex;//性别(0-男/1-女) static byte level;//学历层次(1-本科/0-专科) static int grade;//年级 public static void main(String[] args) { name = "张三"; sex = 0; level = 1; grade = 4; print(); upgrade(); print(); } //升级 public static void upgrade(){ grade++; if(level==1 && grade>4){ grade = 4; } if(level==0 && grade>3){ grade = 3; } } //降级 public static void degrade(){ grade--; if(grade < 1){ grade = 1; } } //打印 public static void print(){ System.out.println("姓名:"+name); System.out.println("性别:"+(sex==0?"男":"女")); System.out.println("学历:"+(level==1?"本科":"专科")); System.out.println("年级:"+grade); } }
对比以上两个案例我们得出以下结论:在结构化程序设计中如果数据有一点小修改,会导致修改的扩大化,不利于程序的维护,这在大型项目开发中是非常不利的。
如何去解决这个问题,也就是要将这种修改控制在一个尽量小的范围之内,或者说某个模块的修改尽量不要去影响其它模块。面向对象程序设计方法可以较好地解决这个问题。
C102_03:使用面向对象方法改写案例C102_01
首先定义学生类
public class C102_03_Student { public final static String MALE = "男"; public final static String FEMALE = "女"; public final static String UNDERGRADUATION = "本科"; public final static String SPECIAL = "专科"; private String name;//姓名 private String sex;//性别(男/女) private String level;//学历层次(本科/专科) private int grade;//年级 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { if(!sex.equals(MALE) && !sex.equals(FEMALE)){ return; } this.sex = sex; } public String getLevel() { return level; } public void setLevel(String level) { if(!level.equals(UNDERGRADUATION) && !level.equals(SPECIAL)){ return; } this.level = level; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } //初始化 public void init(){ name = "未知"; sex = MALE; level = UNDERGRADUATION; grade = 4; } //升级 public void upgrade(){ grade++; if(level.equals("本科") && grade>4){ grade = 4; } if(level.equals("专科") && grade>3){ grade = 3; } } //降级 public void degrade(){ grade--; if(grade < 1){ grade = 1; } } //打印 public void print(){ System.out.println("姓名:"+name); System.out.println("性别:"+sex); System.out.println("学历:"+level); System.out.println("年级:"+grade); } }
使用学生类
public class C102_03_面向对象程序设计 { public static void main(String[] args) { C102_03_Student stu = new C102_03_Student(); stu.init(); stu.setName("张三"); stu.setSex(C102_03_Student.MALE); stu.setLevel(C102_03_Student.SPECIAL); stu.setGrade(3); stu.print(); stu.upgrade(); stu.print(); } }
结果表示使用面向对象方法也可以实现同样的功能。
C102_04:改写C102_03_Student,修改性别和学历的表示形式,看看是否会影响其使用
修改性别和学历的表示形式和相应的代码
public class C102_04_Student { public final static byte MALE = 0; public final static byte FEMALE = 1; public final static byte UNDERGRADUATION = 1; public final static byte SPECIAL = 0; private String name;//姓名 private byte sex;//性别(男/女) private byte level;//学历层次(本科/专科) private int grade;//年级 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex==MALE?"男":"女"; } public void setSex(byte sex) { if(sex!=MALE && sex!=FEMALE){ return; } this.sex = sex; } public String getLevel() { return level==UNDERGRADUATION?"本科":"专科"; } public void setLevel(byte level) { if(level!=UNDERGRADUATION && level!=SPECIAL){ return; } this.level = level; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } //初始化 public void init(){ name = "未知"; sex = MALE; level = UNDERGRADUATION; grade = 4; } //升级 public void upgrade(){ grade++; if(level==UNDERGRADUATION && grade>4){ grade = 4; } if(level==SPECIAL && grade>3){ grade = 3; } } //降级 public void degrade(){ grade--; if(grade < 1){ grade = 1; } } //打印 public void print(){ System.out.println("姓名:"+name); System.out.println("性别:"+getSex()); System.out.println("学历:"+getLevel()); System.out.println("年级:"+grade); } }
其使用代码如下,和上一个案例的代码是一样的,也就是使用的代码没有变化
public class C102_04_面向对象程序设计 { public static void main(String[] args) { C102_04_Student stu = new C102_04_Student(); stu.init(); stu.setName("张三"); stu.setSex(C102_04_Student.MALE); stu.setLevel(C102_04_Student.SPECIAL); stu.setGrade(3); stu.print(); stu.upgrade(); stu.print(); } }
运行得到同样的结果
通过以上案例我们得到如下结论:
使用面向对象程序设计方法,能有效控制修改所带来的影响范围,也就是一个模块的修改不影响另一个模块(解耦)。
现实中解耦的例子就是一体机或者笔记本解耦成台式机,这样的话我们即使有一些问题也不用拆开全部的包装,比如换一个显示屏,那么以前我们要拆整个电脑,而现在我们是换个屏幕就行。
总结就是:事情更方便了,可以分开来去弄,即使我们改写其中一个的程序,也不用全部都改写。
|