《编程匠艺》之软件的架构与改良

第三部分: 代码的形成过程(软件的架构)

1. 崇尚设计(如何做良好的软件设计)

  1. 软件设计的层次

    • 系统体系结构(整体系统和子系统,以及子系统之间的连接方式)
    • 模块于组件
    • 类和数据类型
    • 函数
  2. 设计良好的特征
    • 简洁和优雅
    • 模块化(高内聚,低耦合)
    • 良好的接口(为了创建良好的接口,可以遵循下面的步骤:)
      • 确定客户端, 了解它的需求
      • 确定供应端, 了解它的能力
      • 推断所需的接口类型(函数, 类, 网络协议?)
      • 确定操作的性质(究竟需要提供什么样的功能?)
    • 可扩展性(需要仔细评估现在的功能, 以后可能有的功能, 以后一定会有的功能)
    • 避免重复
    • 可移植性(尽量减少对特定平台的依赖; 可以添加一个平台抽象层来屏蔽差异)
    • 良好的文档(主要针对顶层的设计;在代码层面实现自说明)
  3. 如何做好的设计?
    • 设计方法和过程

      • 结构化设计(以分治作为主要特征,把问题不断分解为更小的问题)
      • 面向对象的设计(面向对象的焦点在于系统中的数据,结构化设计焦点在于系统执行的操作; 可以花点时间看看设计模式)
    • 设计工具
      • UML
      • 设计模式
      • 流程图
      • 伪代码
      • CASE工具
  4. 你如何衡量一段代码的设计质量?
    • 设计是很难量化的, 只是对设计的审美评价.判断设计质量的唯一途径就是阅读代码.

2. 软件的体系结构(奠定软件设计的基础)

  1. 什么是软件体系结构?

    • 体系结构有时候被称为高层次设计.
  2. 软件蓝图
    • 蓝图的作用:

      1. 确定软件的模块,库,组件
      2. 确定组件之间是如何通信的
      3. 有助于鉴别和确定系统中的接口特性,阐明子系统的角色和职责
  3. 视图
    • 在体系结构的设计中,一般会有多个系统层来看待,就如同建筑有外观图, 布线图, 管道图等.主要包含:

      1. 概念视图,也称逻辑视图,显示了系统的主要部分和他们之间的关系.
      2. 实现视图,包含了实现模块的角度.
      3. 进程视图,使用任务,进程,通信来显示动态的结构.
      4. 部署视图,显示任务在分布式系统不同物理节点上的分布.
  4. 在何时何处进行体系结构设计
    • 体系结构是需求达成一致后的第一个开发步骤.
    • 体系结构设计是独立于模块设计阶段的,虽然后续的详细设计可能会反过来修正体系设计.
  5. 体系结构用来做什么?
    • 验证(可以来总体验证是否可行, 是否满足需求, 是否有重复的工作)
    • 沟通(体系结构将问题域映射到解决域, 并指明了如何扩展, 应该与软件保持一致)
    • 判断优劣(来评判是否需要开发这个东西;并标识出重要的易错点)
  6. 体系结构最关注的是组件和连接.
    • 组件可以是对象,进程,数据库或者第三方产品.每个组件都是一个独立的功能单元.还会有描述外部可见性的东东.
    • 连接. 连接可以是简单的函数调用,也可以是穿过管道的数据流.可以是事件处理程序,也可以是传递的消息机制.连接可以是同步的,也可以是异步的.
  7. 什么是良好的体系结构?
    • 一个良好的体系结构是简洁的.是精心选择的模块和合理的通信方式组成的.
    • 体系结构设计需要平衡好组件的粒度.体系结构不规定各个模块内部的工作机制.需要是尽可能的高内聚,低耦合.
    • 体系结构会列出已做出的设计决策,并阐明为什么比别的可选策略好.
  8. 体系结构风格
    • 每种结构都有不同的特征:

      • 更改数据表示法,算法和所需功能的适应能力
      • 模块分割和连接的方法
      • 全面性
      • 满足性能要求的能力
      • 组件重用的考虑
  9. 常见的体系结构
    • 分层的体系结构(如OSI参考模型)
    • 管道和过滤器体系结构(数据流是串行的,每个过滤器完整自己的功能,然后向下游传递,缺点是错误处理麻烦)
    • c/s体系结构(他将功能分在客户机和服务器上两部分)
    • 基于组件的体系结构(核心就是通信的基础结构或者中间件)
    • 框架()
  10. 常见的接口类型:
    • API
    • 类层次结构
    • 组件技术
    • 数据格式

3. 改良与革命(代码是如何成长的)

  1. 要下面的警告信息,防止代码开始腐烂:

    • 代码中遍布着大型的类和复杂的函数
    • 函数的名称很隐晦
    • 没有任何结构(不知道去哪里寻找某个功能)
    • 内容重复(有许多相互独立的代码做着相同的事)
    • 高耦合性
    • 在数据流过系统时,它在各种表示法之间反复转换
    • API变得模糊不清
    • 代码中导出都是权宜之计:治标不治本的修改.系统的外围尽是这种修改.
    • 有些函数的参数太多了
    • 添加新功能时,没有提供任何支持文档;现有的文档过时了.
    • 代码在编译时产生了很多告警
    • 你发现注释说:‘不要动这些代码‘

原文地址:https://www.cnblogs.com/yhp-smarthome/p/11079350.html

时间: 2024-08-29 16:33:36

《编程匠艺》之软件的架构与改良的相关文章

《编程匠艺》读书笔记

<编程匠艺>读书笔记之一 <编程匠艺>读书笔记之二 <编程匠艺>读书笔记之三 <编程匠艺>读书笔记之四 <编程匠艺>读书笔记之五 <编程匠艺>读书笔记之六 <编程匠艺>读书笔记之七 <编程匠艺>读书笔记之八 <编程匠艺>读书笔记之九 <编程匠艺>读书笔记之十 <编程匠艺>读书笔记之十一 <编程匠艺>读书笔记之十二 <编程匠艺>读书笔记之十三 <编

《编程匠艺》之代码的表面

第一部分: 处理代码的细节(代码的表面) 处理代码的细节,主要分为如下的几个方向,check: 善于防守, 考虑代码的健壮性. 好的样式.精心布局. 为文件和函数以及各部分起个好名字. 良好的注释. 错误处理,处理好可能会出现的错误.保证不崩溃. 逻辑清晰,可理解. 1. 防御性 防御性的诱因: 恶意用户 客户端错误的使用 运行环境不完整 外部运行库问题 如果可以使用函数局部变量,就不要使用全局变量.如果能使用循环体内的变量,就不使用函数级变量. 防御要义: 使用合适的风格和规范. 逻辑清晰,

《编程匠艺》之开发工具与技巧

第二部分: 代码的神秘生命(代码开发的技术与技巧) 1. 欲善其事,先利其器(使用工具) 尽可能全面的了解你的常用工具, 为此投入的时间是值得的. 使用工具发挥作用: 了解它能做什么 学习如何驾驭它 了解它适合什么任务 检查它是否可用 找到了解更多信息的途径 工具链的组成 源代码编辑工具 代码编辑器 代码处理工具(diff比较工具, sed流查找修改工具, awk样式匹配工具, grep正则匹配工具, find/locate文件查找工具) 代码浏览工具 版本控制工具 源代码生成工具 源代码美化工

软件体系架构课下作业06

题目:对上学期学习的软件设计模式进行复习,对所有设计模式进行分析,用自己的话来阐述对他们的理解.(不少于2000字) 正如本学期所学习的软件体系架构,还有很多其他的软件工程技术一样,设计模式同样起源于建筑领域他是对前人经验的总结,为后人设计与开发基于面向对象的软件提供指导方针和成熟的解决方案. 从模式的目的而言,设计模式可以分为创建型.结构型和行为型三种.创建型模式主要用于创建对象,它包含5种模式,分别是:工厂方法模式.抽象工厂模式.建造者模式.原型模式和单例模式:结构型模式主要用于处理类和对象

软件设计架构

微信.陌陌等著名IM软件设计架构详解 http://wenku.it168.com/wenji/825 架构无小事:QQ碰微信 贴吧遇微博

软件开发架构分析和架构模式一

架构分析: 架构分析工作主要从宏观上考虑一个软件系统应该如何组织.通常,在架构分析工作中,我们需要确定一些策略性的设计方针,原则和基本模式.在它们的指导下,我们可以高屋建瓴地分析软件系统的宏观结构,认识软件系统由哪些组件构成,了解组件之间的接口和协作关系.架构分析的结果对于后续的面向对象设计工作也是一种约束,有助于消除设计和实现过程中的随意性.因此,架构分析有时也被称为策略设计 组件指的是一组对象构成的,有固定接口的有机体,当设计者的观察视角不同,组件的规模不同或者组件内部的封装度程度不同时,这

aps - (Advanced Planning And Scheduling)高级生产计划软件的架构和设计

aps - (Advanced Planning And Scheduling) 高级生产计划软件的架构和设计 3 主资源和副资源 主资源简单的说就是某道工序在什么机器或生产线上生产,一般来说,一台机器可以用于生产多个产品,但一个产品也可以在多个机器上生产,比如车间有自动化生产线,半自动化生产线,都可以用来生产某个产品 如果好几类机器都可以加工某道工序,这就涉及到多主资源的选择,一般的企业对多主资源的选择有自己的要求,比如尽量使用半自动机器,安排不下再使用自动机器或相反,或者不管安排到那类机器,

基于AngularJS的企业软件前端架构(LINK)

这是我关注AngularJS的原因,做企业软件的开发. 基于AngularJS的企业软件前端架构: http://www.ituring.com.cn/article/109771 基于AngularJS的企业软件前端架构(LINK)

基于AngularJS的企业软件前端架构[转载]

这篇是我参加QCon北京2014的演讲内容: 提纲: 企业应用在软件行业中占有很大的比重,而这类软件多数现在也都采用B/S的模式开发,在这个日新月异的时代,它们的前端开发技术找到了什么改进点呢? B/S企业软件前端开发模式大体上与桌面软件类似,都是偏重量级的,在前端可能会有较多的业务逻辑,这些业务逻辑如何被合理模块化,与界面分离,以便测试,成为这个领域的一个重要挑战.另一方面,由于企业应用的界面相对规整,偏重的是数据存取,没有太多花哨的东西,所以常见的界面控件也是可枚举的,如何让开发界面的工作能