第七章.架构——减少风险

必须从某处开始,但是最好挑个对的地方!

架构三问(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 }
View Code

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 }
View Code

Unit.java://单元格

1 package headfirst.gsf.unit;
2 
3 public class Unit {
4     public Unit(){
5     }
6 }
View Code

为什么给的代码不全?这个不用着急,因为前期工作还在继续,没有完成准备。只是一个大致的框架。

posted @ 2017-07-20 14:41  lanshanxiao  阅读(279)  评论(0编辑  收藏  举报