第一章 基础

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

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

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. 【读书笔记《Android游戏编程之从零开始》】18.游戏开发基础(碰撞检测)

    1.矩形碰撞 所谓矩形碰撞,就是利用两个矩形之间的位置关系来进行判断,如果矩形的像素在另外一个矩形之中,或者之上都可以认为这两个矩形发生了碰撞. 如果单纯的去考虑哪些情况会判定两个矩形发生碰撞,倒不如 ...

  2. 在linux下安装某个硬件驱动到方法

    东西很简单,几句话就能说清除. 使用lsipc检查你需要安装到硬件,记住硬件到关键型号,去搜索引擎搜索linux下的驱动文件 对文件进行安装简单的解压后基本上是 ./configure &&a ...

  3. maven总结3

    POM文件 maven版本:apache-maven-3.1.1 1.<modelVersion>4.0.0</modelVersion>  pom模型的版本,对于maven2 ...

  4. java9-1.类,抽象类,接口的综合小练习

    /* 教练和运动员案例(学生分析然后讲解) 乒乓球运动员和篮球运动员. 乒乓球教练和篮球教练. 为了出国交流,跟乒乓球相关的人员都需要学习英语. 请用所学知识: 分析,这个案例中有哪些抽象类,哪些接口 ...

  5. 转: 借助GitHub托管你的项目代码

    转自:http://www.cnblogs.com/edisonchou/p/5990875.html 备注: 原贴关于github使用说明,非常详细易懂.建议看原帖. 借助GitHub托管你的项目代 ...

  6. Dvwa writeup

    DVWA(Dam vulnerable Web Application)是使用PHP+Mysql编写的一套用于常规漏洞教学和漏洞挖掘的一个测试学习程序,在此程序中包含了常见的web方面的漏洞,如命令行 ...

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

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

  8. oracle用sqlplus创建新用户,不是plsql developer

    1.sqlplus /nolog 2.conn /as sysdba 3.alter user system identified by "123456"; 4.alter use ...

  9. flex布局滑动页面

    html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  10. 【C#】【邮件】C#发送邮件出现 "指定字符串与主题所要求的形式不符"

    用C#发送邮件的时候有时会出现指定字符串与主题所要求的形式不符的问题. 经过查阅资料发现原因是主题里面你的字符串中有一些特殊字符导致出错.去掉改类字符即可成功. 比如: 我出现的错误原因是主题中有回车 ...