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


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

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

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

  • 相关阅读:
    Lodash之throttle(节流)与debounce(防抖)总结
    css伪类:before及:after除了插入文字内容还能做点儿啥?画图
    一点对Promise的理解与总结
    前端开发常用网站汇总
    一分钟配置好JDK
    启动任务管理器命令符,doc命令
    判断是否是质数以及类型的转换
    图片数字型的九九乘法表
    1000以内的质数的方法,判断年份是否是闰年,打印水仙花数
    持续交付8-数据管理
  • 原文地址:https://www.cnblogs.com/lanshanxiao/p/7208349.html
Copyright © 2020-2023  润新知