第一章 基础

第一节 软件架构与软件架构师

 简单的说软件架构即是为客户构建一个软件系统。架构师随便软件架构应运而生,架构师是一个角色。

2000年9月ANSI和IEEE发布了《密集性软件架构建议章程》Recommended practice for architectural description of software-intensive systems

1.  软件架构的目的

2.  架构师的角色与职责

第二节 成功的设计

成功的软件项目是充分实现了软件的需求,成功的软件设计是指成功的软件项目的实践,是根据已知技术设计可重用基础架构的最佳实现。

一、 软件的大泥球

大泥球是一夜之间形成,开始不会很大,它是一个团队的产物。

1. 大泥球形成原因

  • 无法捕捉用户需求

    业务需求、 利益相关者的要求、 功能要求、 测试要求

  • 当项目不断增长时仍然坚持使用快速开发

项目开始时可能用户或产品经理承诺需求很简单,不会有变动,这是可能会选择一个简单的架构模式来实现。但随着开发深入,新需求会被不段挖掘出来,这里面监的问题是继续还是重做!

  • Imprecision of estimates 不精确的估计

    在需求规格确认之后又有新的需求扩展,无法与项目预算达成一致

  • Lack of timely testing 测试的滞后

集成测试问题

2. 大泥球症状

Rigid, therefore fragile 刚性,因此脆弱

Easier to use than to reuse 可重用难

Easier to work around than to fix 变通解决比修复更简单

二、软件的力学原理

什么导致一个软件项目失败?通常会归结于商务上的过失,需求没有明确,项目管理不足、成本估算错误、沟通延时滞后,甚至是人员关系不合!你很难意示到差的软件设计和代码对项目带来的伤害。

1. 组织文化

2. 团队和成员

3. Scrum 消防员

敏捷开过程序遇到的每一个问题都需要快速解决,所以要有人专门来解决这些问题,可能是一个人或是多个人

4. 领导和老板

软件项目成本预算是一个不可回避的问题,项目成本预算包括代码实现、测试、bug fix、文档等等。项目经理管理这些事务,项目汇报对象是项目经理。通常两者都缺乏信任,项目经理认识项目组阻碍项目推进,项目组认为项目经理压缩成本,想用更新钱办更多的事。

领导是一项目技能,领导都不会双向报怨,而是达成一致。

5. 改进团队代码质量

质量差的代码会带来更高的软件成本,因为它涉及到测试,维护,扩展等……

  • 使用工具来改进代码 
  • 如何告诉他人他的代码有问题  由于心理方面,直接指证不好,需要沟通技巧
  • 让每个开发人员做的更好  针对代码,而不是针对人员,通过人员素质提升来改进代码,加强培训。

6. 变更是软件项目的一部分

三、走出困境

  • 遗留代码问题

我们经常要面对已有代码,必需要维护它、与新功能集成,这些代码称之遗留代码。

  • 停止新的开发
  • 隔离异常
  • 测试覆盖
  • 持续重构
  • 是否需要添加人员
  • 是否需要延时

第三节 软件设计原则

SOLID原则(Single responsibility, Open/close, Liskov's , Interface segregation, and Dependency inversion).单一职责原则、开放封闭原则、里氏替换原则、接口分离原则、依赖倒置原则

一、从杂乱无章到整理有序

High Cohesion、Low Coupling  高内聚底偶合 单一职责,依赖少,可重用

Separation of concerns 关注点分离  如业务逻辑,展示,持久化。(面向方面设计)

Isolation 隔离  对外隐藏逻辑,使用接口通信

二、Object-oriented design

定义类,评估定义类的颗粒度,定义类接口和继承结构和主要关系。

三、Development and design vectors  开发和设计的方向

1. 设计原则

  • Single responsibility 单一职责原则
  • Open/Closed principle 开放封闭原则

通过继承来扩展

  • Liskov's principle 里氏替换原则

类开基类就可以被替换,子类的行为不能受制于父类。

  • Interface segregation

接口尽量单一功能,不能所以所有方法放到一个接口里

public interface IDoor

{

void Lock();

void Unlock();

Boolean IsDoorOpen { get; }

Int32 OpenTimeout { get; set; }

event EventHandler DoorOpenForTooLong;

}

应该分成两个接口

public interface IDoor

{

void Lock();

void Unlock();

Boolean IsDoorOpen { get; }

}

public interface ITimedDoor

{

Int32 OpenTimeout { get; set; }

event EventHandler DoorOpenForTooLong;

}

  • Dependency inversion 依赖倒置

高层模块不应该依赖底层模块都应该依赖于抽象

、依赖处理模式 Patterns for handling dependencies

void Copy()

{

Byte byte;

while(byte = ReadFromStream())

WriteToBuffer(byte);

}

reader和writer依赖于底层实现,强偶合,按照依赖倒置原则应该改为以下代码

void Copy()

{

Byte byte;

IReader reader;

IWriter writer;

// Still need to instantiate reader and writer variables

...

while(byte = reader.Read())

writer.Write(byte);

}

谁来实现reader和writer

  • Service Locator pattern 服务定位模式

void Copy()

{

Byte byte;

var reader = ServiceLocator.GetService<IReader>();

var writer = ServiceLocator.GetService<IWriter>();

while(byte = reader.Read())

writer.Write(byte);

}

ServiceLocator返回具体类,类似工场作用,ServiceLocator可能如下实现

public class ServiceLocator

{

public Object GetService(Type typeToResolve) { ... }

public T GetService<T>() { ... }

public Object GetService(String typeNickname) { ... }

}

使用服务定位模式需要慎重考虑,很多情况下,他实际上是个反模式,因为它依赖类的具体引用。

  • Dependency Injection pattern 依赖注入模式

        更好的选择是使用依赖注入模式

void Copy(IReader reader, IWriter writer)

{

Byte byte;

while(byte = reader.Read())

writer.Write(byte);

}

2.编码原则

Keep It Simple, Stupid

You Ain't Gonna Need It

Don't Repeat Yourself

Tell, don't ask  接口设计应该设计为准备,不应该去问能给我什么数据

什么是设计模式?

设计模式是适用于软件过程中解决一系列问题的核心解决方案

四、Defensive programming 防御性编程

.net架构设计读书笔记--第一章 基础的更多相关文章

  1. .net架构设计读书笔记--第二章 设计体系结构

    第五节 探索领域架构 一.领域驱动设计的价值与意义 最初在java中使用,.net要晚些才引入.领域驱动设计出现之初的争议.一个向导,少走弯路   1. 我们真的需要DDD吗? DDD并不适用于每个软 ...

  2. .net架构设计读书笔记--第二章 第7节 神化般的业务层

    一.编排业务逻辑的模式1. 事务脚本模式TS(The Transaction Script pattern ) TS模式概述     TS 鼓励你跳过任何的面向对象的设计,你直接到所需的用户操作的业务 ...

  3. .net架构设计读书笔记--第三章 第8节 域模型简介(Introducing Domain Model)

    一.数据--行为转变     很长的时间,典型的分析方法或多或少是以下两种,第一,收集需求并做一些分析,找出有关实体 (例如,客户. 订单. 产品) 和进程来实现. 第二,手持这种理解你尝试推断一个物 ...

  4. 《css3实战》读书笔记 第一章 基于CSS需求而编写的HTML.

    笔记说明 <CSS3实战手册第3版(影印版)>可以消除Web设计工作的痛苦,并且带给你:HTML--重新入门.如果你是HTML新手,你会学到如何以CSS友好的方式进行基本页面构造.若你是H ...

  5. 大型分布式架构设计与实现-第一章SOA(面向服务的体系架构)

    拜读了大型分布式架构设计与实现,觉得该书作为入门不错,但内容过于简单,描述过于琐碎,小节之间连续性不强,不适合深入钻研学习.但为了更多的希望向架构师行业靠拢的工程师学习需要,本博客将对上书进行简化讲解 ...

  6. Getting Started With Hazelcast 读书笔记(第一章)

    第一章:数据集群的演化与 早期的服务器架构 显然,应用是可扩展的,但是由于是集中式服务器,随着数据库性能达到极限,再想扩展就变得极端困难,于是出现了缓存.    缓存显然再次提升了可扩展性,减轻了数据 ...

  7. 《疯狂Java:突破程序员基本功的16课》读书笔记-第一章 数组与内存控制

    很早以前就听过李刚老师的疯狂java系列很不错,所以最近找一本拿来拜读,再此做下读书笔记,促进更好的消化. 使用Java数组之前必须先对数组对象进行初始化.当数组的所有元素都被分配了合适的内存空间,并 ...

  8. C缺陷与陷阱----读书笔记---第一章

    第一章:词法陷阱 编译器中负责将程序分解为一个一个符号的部分,一般称为“词法分析器”.例如,对于语句: if ( x == big ) big = x ; 它的第一个符号是C语言关键字if,紧接着下一 ...

  9. 《C++ Primer》读书笔记 第一章

    读<C++ Primer>才知道,自己对C++知之甚少... 写个博客记录下自己C++的成长,只是读书笔记,不是对<C++ Primer>知识点的总结,而是对自己在书上看到的以 ...

随机推荐

  1. selenium如何分别启动IE、firefox、chrome浏览器

    1.火狐浏览器 /* * 初始化火狐浏览器 * */ public static WebDriver initFireFox(WebDriver dr) { String key = "we ...

  2. 详解Webwork中Action 调用的方法

    详解Webwork中Action 调用的方法 从三方面介绍webwork action调用相关知识: 1.Webwork 获取和包装 web 参数 2.这部分框架类关系 3.DefaultAction ...

  3. linux -- read(), write()

    read()函数 2011-03-23 16:28:37|  分类: linux |  标签: |字号大中小 订阅     read函数从打开的设备或文件中读取数据. #include <uni ...

  4. jquery实现整屏翻屏效果:jquery.mousewheel(一)

    实现整屏上下翻效果:需加载的js <script type="text/javascript" src="js/jquery-1.8.3.min.js"& ...

  5. [3d跑酷] Xcode5 打包 发布配置

    主题 Unity导出Xcode项目,使用Xocde打包ipa并提交到AppStore xcode发布配置 1.设置发布相关参数,比如 包名,版本,证书,ios设备版本 2.设置体系结构,支持的平台(I ...

  6. HTML5和css3的总结

    简单的罗列一个HTML5的新东西,以后的几天里详细的过一遍一个挺有用的网站:www.css88.com [H5的新标签] 用之前的标签完全可以代替的:header footer aside atric ...

  7. Windows 2008 R2 配置 DNS 实现二级域名

    本文内容 域名解析 准备工作 安装 DNS 服务器 建立 DNS 区域 建立主机头 服务器网络设置 测试二级域名 IIS 建立 Web 站点 其他 DNS 服务 域名解析 域名解析,是域名到 IP 地 ...

  8. 层叠上下文(The stacking context)

    MDNThe stacking context 层叠上下文是HTML元素的三维概念,这些HTML元素在一条假想的相对于面向(电脑屏幕的)视窗或者网页的用户的z轴上延伸,HTML元素依据其自身属性按照优 ...

  9. 02SpringMvc_springmvc快速入门小案例(XML版本)

    这篇文章中,我们要写一个入门案例,去整体了解整个SpringMVC. 先给出整个项目的结构图:

  10. scrapy 代理

    说明: 本文参照了官网文档,以及stackoverflow的几个问题 概要: 在scrapy中使用代理,有两种使用方式 使用中间件 直接设置Request类的meta参数 方式一:使用中间件 要进行下 ...