18.3.7 第5周 设计原则 5.1城堡游戏+5.2消除代码赋值+5.3封装
2018-03-07 21:10
393 查看
首先贴出未修改的代码Game.java
对代码做维护的时候最能看出代码的质量
用封装来降低耦合Room类和Game类都有大量代码和出口有关
尤其是Game类中出现大亮使用了Room类的成员变量
类和类之间的关系称作耦合
耦合越低越好,保持距离是形成良好代码的关键
修改了一半的代码:
package castle; import java.util.Scanner; public class Game { private Room currentRoom; public Game() { createRooms(); } private void createRooms() { Room outside, lobby, pub, study, bedroom; // 制造房间 outside = new Room("城堡外"); lobby = new Room("大堂"); pub = new Room("小酒吧"); study = new Room("书房"); bedroom = new Room("卧室"); // 初始化房间的出口 outside.setExits(null, lobby, study, pub); lobby.setExits(null, null, null, outside); pub.setExits(null, outside, null, null); study.setExits(outside, bedroom, null, null); bedroom.setExits(null, null, null, study); currentRoom = outside; // 从城堡门外开始 } private void printWelcome() { System.out.println(); System.out.println("欢迎来到城堡!"); System.out.println("这是一个超级无聊的游戏。"); System.out.println("如果需要帮助,请输入 'help' 。"); System.out.println(); System.out.println("现在你在" + currentRoom); System.out.print("出口有:"); if(currentRoom.northExit != null) System.out.print("north "); if(currentRoom.eastExit != null) System.out.print("east "); if(currentRoom.southExit != null) System.out.print("south "); if(currentRoom.westExit != null) System.out.print("west "); System.out.println(); } // 以下为用户命令 private void printHelp() { System.out.print("迷路了吗?你可以做的命令有:go bye help"); System.out.println("如:\tgo east"); } private void goRoom(String direction) { Room nextRoom = null; if(direction.equals("north")) { nextRoom = currentRoom.northExit; } if(direction.equals("east")) { nextRoom = currentRoom.eastExit; } if(direction.equals("south")) { nextRoom = currentRoom.southExit; } if(direction.equals("west")) { nextRoom = currentRoom.westExit; } if (nextRoom == null) { System.out.println("那里没有门!"); } else { currentRoom = nextRoom; System.out.println("你在" + currentRoom); System.out.print("出口有: "); if(currentRoom.northExit != null) System.out.print("north "); if(currentRoom.eastExit != null) System.out.print("east "); if(currentRoom.southExit != null) System.out.print("south "); if(currentRoom.westExit != null) System.out.print("west "); System.out.println(); } } public static void main(String[] args) { Scanner in = new Scanner(System.in); Game game = new Game(); game.printWelcome(); while ( true ) { String line = in.nextLine(); String[] words = line.split(" "); if ( words[0].equals("help") ) { game.printHelp(); } else if (words[0].equals("go") ) { game.goRoom(words[1]); } else if ( words[0].equals("bye") ) { break; 4000 } } System.out.println("感谢您的光临。再见!"); in.close(); } }Room.java
package castle; public class Room { public String description; public Room northExit; public Room southExit; public Room eastExit; public Room westExit; public Room(String description) { this.description = description; } public void setExits(Room north, Room east, Room south, Room west) { if(north != null) northExit = north; if(east != null) eastExit = east; if(south != null) southExit = south; if(west != null) westExit = west; } @Override public String toString() { return description; } }消除代码复制的两个基本手段,就是函数和父类。代码复制是代码不良的一种体现要评判某些设计比其他的设计优秀,就得定义一些在类的设计中重要的术语,以用来讨论 设计的优劣。对于类的设计来说,有两个核心术语:耦合和聚合。 耦合这个词指的是类和类之间的联系。之前的章节中提到过,程序设计的目标是一系列通 过定义明确的接口通信来协同工作的类。耦合度反映了这些类联系的紧密度。我们努力要获得 低的耦合度,或者叫作松耦合(loose coupling)。耦合度决定修改应用程序的容易程度。在一个紧耦合的结构中,对一个类的修改也会导致 对其他一些类的修改。这是要努力避免的,否则,一点小小的改变就可能使整个应用程序发生 改变。另外,要想找到所有需要修改的地方,并一一加以修改,却是一件既困难又费时的事情。 另一方面,在一个松耦合的系统中,常常可以修改一个类,但同时不会修改其他类,而且 整个程序还可以正常运作。本周会讨论紧耦合和松耦合的例子。 聚合与程序中一个单独的单元所承担的任务的数量和种类相对应有关,它是针对类或方法 这样大小的程序单元而言的理想情况下,一个代码单元应该负责一个聚合的任务(也就是说,一个任务可以被看作是 一个逻辑单元)。一个方法应该实现一个逻辑操作,而一个类应该代表一定类型的实体。聚合 理论背后的要点是重用:如果一个方法或类是只负责一件定义明确的事情,那么就很有可能在 另外不同的上下文环境中使用。遵循这个理论的一个额外的好处是,当程序某部分的代码需要 改变时,在某个代码单元中很可能会找到所有需要改变的相关代码段。增加可扩展性:可以运行的代码!=良好的代码
对代码做维护的时候最能看出代码的质量
用封装来降低耦合Room类和Game类都有大量代码和出口有关
尤其是Game类中出现大亮使用了Room类的成员变量
类和类之间的关系称作耦合
耦合越低越好,保持距离是形成良好代码的关键
修改了一半的代码:
package castle; import java.util.Scanner; public class Game { private Room currentRoom; public Game() { createRooms(); } private void createRooms() { Room outside, lobby, pub, study, bedroom; // 制造房间 outside = new Room("城堡外"); lobby = new Room("大堂"); pub = new Room("小酒吧"); study = new Room("书房"); bedroom = new Room("卧室"); // 初始化房间的出口 outside.setExits(null, lobby, study, pub); lobby.setExits(null, null, null, outside); pub.setExits(null, outside, null, null); study.setExits(outside, bedroom, null, null); bedroom.setExits(null, null, null, study); currentRoom = outside; // 从城堡门外开始 } private void printWelcome() { System.out.println(); System.out.println("欢迎来到城堡!"); System.out.println("这是一个超级无聊的游戏。"); System.out.println("如果需要帮助,请输入 'help' 。"); System.out.println(); System.out.println("现在你在" + currentRoom); System.out.print("出口有:"); showPrompt(); } // 以下为用户命令 private void printHelp() { System.out.print("迷路了吗?你可以做的命令有:go bye help"); System.out.println("如:\tgo east"); } //消除代码复制 public void showPrompt() { System.out.println("你在" + currentRoom); System.out.print("出口有: "); System.out.print(currentRoom.getExitDesc()); System.out.println(); } private void goRoom(String direction) { Room nextRoom = currentRoom.getExit(direction); if (nextRoom == null) { System.out.println("那里没有门!"); } else { currentRoom = nextRoom; showPrompt(); } } public static void main(String[] args) { Scanner in = new Scanner(System.in); Game game = new Game(); game.printWelcome(); while ( true ) { String line = in.nextLine(); String[] words = line.split(" "); if ( words[0].equals("help") ) { game.printHelp(); } else if (words[0].equals("go") ) { game.goRoom(words[1]); } else if ( words[0].equals("bye") ) { break; } } System.out.println("感谢您的光临。再见!"); in.close(); } }
package castle; public class Room { private String description; private Room northExit; private Room southExit; private Room eastExit; private Room westExit; public Room(String description) { this.description = description; } public void setExits(Room north, Room east, Room south, Room west) { if(north != null) northExit = north; if(east != null) eastExit = east; if(south != null) southExit = south; if(west != null) westExit = west; } @Override public String toString() { return description; } public String getExitDesc() { StringBuffer sb=new StringBuffer(); if(northExit!=null) sb.append("north"); if(eastExit!=null) sb.append("east"); if(southExit!=null) sb.append("south"); if(westExit!=null) sb.append("west"); return sb.toString(); } public Room getExit(String direction) { Room ret=null; if(direction.equals("north")) { ret = northExit; } if(direction.equals("east")) { ret = eastExit; } if(direction.equals("south")) { ret = southExit; } if(direction.equals("west")) { ret = westExit; } return ret; } } }转载原创文章请注明,转载自: Elton - 18.3.7 第5周 设计原则 5.1城堡游戏+5.2消除代码赋值+5.3封装(http://www.elton.site/?p=368)
相关文章推荐
- Java设计原则1—城堡游戏之消除代码复制
- JAVA进阶 面向对象程序设计——第5周 设计原则(耦合和聚合,代码结构设计,程序维护拓展发展)
- Java设计原则2—城堡游戏之封装
- Java设计原则3—城堡游戏之可扩展性
- 对JAVA代码设计六大原则的理解
- 《重构--改善既有代码的设计》总结一之重构原则
- 重构-改善既有代码的设计:重构原则(二)
- 重构改善既有代码设计--重构手法07:Remove Assignments to Parameters (移除对参数的赋值)
- 学习设计模式原则之依赖倒置原则,代码笔记
- 几条简单的代码设计原则
- 设计中的微创手术――使用重构原则消灭重复代码
- 【重构-改善既有代码的设计1】重构原则
- 【重构-改善既有代码的设计1】重构原则
- Java中2.5D游戏的设计与实现(3)—八方走法实现原理及相关代码
- 游戏与代码设计(Java)目录
- 项目经验--代码设计原则
- 团队-象棋游戏-代码设计规范
- 怎样写出好代码——设计原则
- 码农小汪-设计模式之-简单工厂模式 单一职责原则 重用代码
- Unity3d 基本设计开发 原则(提高代码可读性)