必须从某处开始,但是最好挑个对的地方!
架构三问(3 Qs of architecture),风险。
只想出大问题的单独片段是不够的,还需要知道这些片段如何组织在一起以及哪些可能比较重要。这样,你会知道应该先做什么。
Architecture is your design structure, and highlights the most important parts of your app, and the relationships between those parts.
架构:是系统的组织结构,包含分解开来的各个部件、它们的连通性、交互机制以及你在系统设计中使用的指导原则与决策。
我们要把蓝图中的事情,转化为井然有序的应用程序。
三步骤:
1.确认你的软件做客户要它做的事
2.运用基本的OO原则来增加软件的灵活性
3.努力实现可维护、可重用的设计
从功能开始:
第一个步骤总是确认应用程序做它该做的事。在小项目中我们使用需求列表(requirement list)写下功能性(functionality);在大项目中,我们使用功能列表(feature list)整理出那些事。
系统的功能性哪个是最重要的,这是我们要思考的,因为做事情要有第一步,我们要做的第一个功能是什么?
当你试图想出某件事是否对架构很重要时,可以问一问下面的三个问题(架构三问):
1.它是系统本质(essence)的一部分吗?
该功能真的是系统实质意义的核心(core)吗?你能想象系统没有这个功能吗?假如不能,那这个功能就可能是系统本质的一部分。
2.这到底是什么意思?
假如你不确定某项功能的叙述究竟是什么意思,就把注意力放在该功能上可能就很重要。每当你不确定某件事情是什么,它就可能会花费你很多时间或者对系统的其他部分造成很多问题。要在项目早起把时间用在这样的功能上,而不是晚期。
3.我到底该如何做?
另一个在早起就把注意力集中到的地方,是似乎真的很难实现的地方,或者对你来说是全新的编程任务。假如你不知道如何处理某特定问题,最好花点时间去正视该项目功能,这样它就不会在一路上产生诸多麻烦。
系统的本质有很多,每一个本质代表一种功能,每一种功能又代表了你解决该功能的难易程度,而难易程度就是我们所讲的风险。
功能在架构上重要的(architecturally signigicant)理由,是因为它们全都为项目带来了风险。你想要从哪一个功能入手并没有关系——只要你能减少后续的风险。
这里的重点是减少风险,不必争论应该是先从哪个关键功能开始。你可以从中任选一个开始,只要你能把焦点放在构建你应该构建的东西上。
一次把焦点放在一个功能上,减少项目的风险。
不要为无助于减少风险的功能分心。
尽可能在现有基础上构建,我们有了一些程序代码与类,挑选另一个与我们已构建之物相关的关键功能是最容易的。
假如你没有两个相互有关系的部件,真的不能谈论部件之间的关系。
有时候,编写伟大程序代码的最佳方式,是在允许的情况下将程序代码的编写往后顺延。
第六章的游戏框架,大致有一个代码框架:
Board.java://棋盘
1 package headfirst.gsf.board; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 import headfirst.gsf.unit.Unit; 8 9 public class Board { 10 11 private int width, height; 12 private List tiles; 13 14 public Board(int width, int height){ 15 this.width = width; 16 this.height = height; 17 initialize(); 18 } 19 20 private void initialize(){//定义成二维数组的矩形棋盘 21 tiles = new ArrayList(width); 22 for(int i = 0; i < width; i++){ 23 tiles.add(i, new ArrayList(height)); 24 for(int j = 0; j < height; j++){ 25 ((ArrayList) tiles.get(i)).add(j, new Tile()); 26 } 27 } 28 } 29 30 public Tile getTile(int x, int y){ 31 return (Tile) ((ArrayList) tiles.get(x - 1)).get(y - 1); 32 } 33 34 public void addUnit(Unit unit, int x, int y){ 35 Tile tile = getTile(x, y); 36 tile.addUnit(unit); 37 } 38 39 public void removeUnits(int x, int y){ 40 Tile tile = getTile(x, y); 41 tile.removeUnits(); 42 } 43 44 public List getUnits(int x, int y){ 45 return getTile(x, y).getUnits(); 46 } 47 }
Tile.java://棋子
1 package headfirst.gsf.board; 2 3 import java.util.List; 4 import java.util.LinkedList; 5 6 import headfirst.gsf.unit.Unit; 7 8 public class Tile { 9 10 private List units; 11 12 public Tile(){ 13 units = new LinkedList(); 14 } 15 16 protected void addUnit(Unit unit){ 17 units.add(unit); 18 } 19 20 protected void removeUnit(Unit unit){ 21 units.remove(unit); 22 } 23 24 protected void removeUnits(){ 25 } 26 27 protected List getUnits(){ 28 return units; 29 } 30 }
Unit.java://单元格
1 package headfirst.gsf.unit; 2 3 public class Unit { 4 public Unit(){ 5 } 6 }
为什么给的代码不全?这个不用着急,因为前期工作还在继续,没有完成准备。只是一个大致的框架。