![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
架构设计
文章平均质量分 57
ices
专注架构设计、OOAD、设计模式、重构、Java EE!
展开
-
全面解析数据的网络传输
1.1 带宽带宽的单位是“bit/s”,也就是单位时间的比特数。我们常说的比如100M带宽,全称应该是100Mbit/s,或者100Mbps。1.2 数据如何发送数据的发送一般经过以下几个环节:1) 应用程序首先将要发送的数据写入该进程的内存地址空间中。通常在程序开发中这只需要一般的运行时变量赋值即可。2) 应用程序通过系统函数库接口(比如send函数)向内核发出系统调用,原创 2013-11-02 13:41:01 · 2798 阅读 · 0 评论 -
软件质量有什么特性?
软件质量有什么特性?《软件工程—产品质量》(GB/T 16260-2006)中规定对软件的每个质量特性与子特性都有定义:一、功能性:是指当软件在指定条件下使用,软件产品满足明确和隐含要求功能的能力。适合性:是指软件产品与指定的任务和用户目标提供一组合适的功能的能力。准确性:是指软件产品具有所需精确度的正确或相符的结果及效果的能力。互操作性:是指软件产品与一个或多个规定系统进转载 2013-01-09 12:40:17 · 1022 阅读 · 0 评论 -
创建业务层的模式
在业务层的模式上有几种选择。首先是过程式模式,在面向对象开发兴起之前,业务逻辑只不过是一系列过程的集合,每个集合都用来处理来自于表现层的一个请求。因此好的设计都在于更好的去组织这些过程,减少代码和流程的冗余。基于对象的模式抽象程度越高,与数据模型的差距也会越大,因此若想创建一个领域驱动的对象模型,一般应该从领域着眼,而不是从数据库结构开始。领域驱动的设计一定会使数据库模型和领域模型之间存在不小差异原创 2013-01-08 16:24:33 · 1510 阅读 · 0 评论 -
业务逻辑层剖析
在业务逻辑层中,你会发现一个对业务实体进行建模的对象模型、表达了客户所有策略和需求的业务规则、实现了自治功能的服务,以及定义文档和数据如何在模块与层间传递的工作流。1 领域的对象模型领域的对象模型力求为系统提供一个结构上的描述,包括每个实体的功能描述、实体之间的关系以及实体的职责等。该模型有用户需求总结得出,并通过UML用例图和类图表示。业务实体描述了真实世界的元素,其中包括数据和原创 2013-01-08 11:00:44 · 4465 阅读 · 0 评论 -
BO与DTO的区别
业务对象(Business Object,BO)与数据传输对象(Data Transger Object, DTO)的区别:1) 业务对象同时包含了数据和行为,是一个可以参与到领域逻辑中的完整对象。2) DTO更像一种值对象,即一系列数据的容器而没有相关的行为。3) 为了序列化,业务对象中的数据会复制到DTO中。4) DTO并不仅仅是领域对象去掉了行原创 2013-01-08 10:28:57 · 13711 阅读 · 2 评论 -
软件设计不同阶段的关注点
软件设计应该分成不同阶段,不同时期,在不同的设计阶段,我们的关注点是有很大程度不同的。这里我先声明一下,我说的软件设计的三个阶段更多的是针对中小型软件系统而言的,对于大型软件系统而言,应该根据时间、金钱、人员、项目内容等条件进行相应阶段的增减。对于大型系统而言,由于其内容多、服务多、功能更加复杂、抽象层次更高,所以希望朋友们结合实际情况进行关注点分离。我个人认为软件设计的三个阶段应分为:系统架原创 2012-12-20 20:40:33 · 2316 阅读 · 0 评论 -
架构设计的关键原则
关键的设计原则在开始设计之前,思考一下关键的原则,将会帮助你创建一个最小花费、高可用性和扩展性的架构。分离关注点,将应用划分为在功能上尽可能不重复的功能点。主要的参考因素就是最小化交互,高内聚、低耦合。但是,错误的分离功能边界,可能会导致功能之间的高耦合性和复杂性,职责单一,每一个组件或者是模块应该只有一个职责或者是功能,功能要内聚。最小知识原则,一原创 2012-12-20 08:19:12 · 10712 阅读 · 0 评论 -
Web开发中的分层原则和各层之间的数据传递问题
目前的Web Application大多采用流行的基于B/S模式的三层架构开发,这里的三层架构指的就是Web层、业务层和数据访问层。采用分层的开发方式有很多好处,下面只简单地来说两点:(1) 分层开发使不同的开发人员关注他们擅长的特定层面,有助于开发优质的系统。因为很少有程序员可以精通从JS,CSS,DHTML到struts再到hibernate直至最后的数据库设计这一整套开发流程所要原创 2012-12-23 10:17:07 · 4527 阅读 · 0 评论 -
系统架构设计应考虑的因素
摘要:本文从程序的运行时结构和源代码的组织结构两个方面探讨了系统构架设计应考虑的各种因素,列举了系统构架设计文档应考虑的一些问题。1. 与构架有关的几个基本概念1、 模块(module):一组完成指定功能的语句,包括:输入、输出、逻辑处理功能、内部信息、运行环境(与功能对应但不是一对一关系)。2、 组件(component):系统中相当重要的、几乎是独立的可替换部分,它在明确原创 2012-12-23 10:19:24 · 19482 阅读 · 2 评论 -
一套较完整的技术框架
一套较完整的技术框架1 引言1.1 前言本文将基于目前现有的软件开发架构(以下简称‘架构’)(Packer for Delphi),同时如何合理地引进新技术等问题,进行系统地分析和研究,以指导新架构的研发。1.2 研发依据1.2.1 公司发展1.2.2 开发方式1.2.3 技术升级1.2.4 产品线行业领域软件需要个性化的服务,如果对应以作坊式的开发方式,将会陷转载 2013-01-09 12:56:00 · 3688 阅读 · 0 评论 -
领域逻辑与业务逻辑的关系
领域逻辑用来表达业务概念,保证业务规则,存放业务数据和业务状态等。领域逻辑通常是通过领域模型中的对象来实现的,且这些对象并不知晓其持久化方式,不过数据仍旧被存储且行为也与相关的业务概念和规则保持一致。作为一个概念,强类型DataSet也可用来对领域进行建模。虽然存储的技术细节将委托给基础设施完成,不过反映业务情况的状态将在这里控制并使用,领域逻辑这一层是业务软件的核心。在有了软件需要实现的原创 2013-01-09 11:03:14 · 5459 阅读 · 0 评论 -
使用Apache Jmeter编写自定义Java测试代码开展并发测试
我们在做性能测试时,有时需要自己编写测试脚本,很多测试工具都支持自定义编写测试脚本,比如LoadRunner就有很多自定义脚本的协议,比如"C Vuser","Java Vuser"等协议。同样,Jmeter也支持自定义编写的测试代码,不过与LoadRunner不同的是,Jmeter没有自带编译器,需要借助第三方编译器才能实现。1) 下面举一个简单的Java自定义测试代码例子,使用Java编译原创 2013-04-20 12:34:52 · 17527 阅读 · 0 评论 -
开发架构设计
开发架构设计关注软件开发环境中软件模块的实际组织方式,即软件系统由那些程序包组成,以及它们之间的关系。程序包不仅包括要编写的源程序,而且包括直接使用的第三方SDK和现存的框架、类库,支持系统运行的操作系统或中间件。开发架构设计的重点考虑开发期质量,软件模块的组织有利于可扩展性、可重用性、可移植性、易理解性、易测试性等,设计中的关键技术主要体现软件开发期质量有关的设计,如设计模式的运用,框架的选原创 2013-02-27 17:47:00 · 2525 阅读 · 0 评论 -
逻辑架构设计
逻辑架构关心的是如何将系统分为不同部分以及各部分之间如何交互。但系统划分为不同单元后,必须考虑这些逻辑单元之间是如何协作的。识别协作,并将具有共性的协作抽象成通用机制,是逻辑架构设计的重点和难点。在大型软件系统中不同子系统之间的协作,在分布式集成系统中不同系统之间的协作,不是编程时根据局部需要去考虑,都是通过通用机制来综合考虑,避免子系统/系统之间的紧耦合。通用机制的发现可能抽象出新的连接原创 2013-02-27 17:46:17 · 9270 阅读 · 0 评论 -
概念性架构设计的步骤
概念性架构设计的输入是关键的功能需求、关键的质量属性需求和关键的商业需求。温昱在《软件架构设计》中给出了三个基本步骤:第一步,鲁棒性分析。通过分析表示关键功能需求的用例规约中的事件流,识别出实现用例规定的功能的主要对象及其职责,形成以职责模型为主的初步设计。鲁棒性分析是从用例到面向对象设计进行过度的一种技术。鲁棒性分析用鲁棒图作为描述工具。鲁棒图用边界对象、控制对象和实体对象三种元素。原创 2013-02-27 17:44:43 · 2489 阅读 · 0 评论 -
划分子系统的三种必用策略
分层的细化:分层最常用的架构模式,在架构设计初期,100%的系统都可以用分层架构,就算随着设计的深入而采用了其他的架构模式也未必和分层架构矛盾。于是,架构师最熟知、最自然的划分模式就是分层的细化。分区的引入:为了支持迭代开发,逻辑架构设计中必须引入分区,分区是一个单元,其粒度比层要小。一旦架构师针对每个层进行了分区设计,“深度优先”式的迭代开发就非常自然。机制的提取:机制是指预原创 2013-02-27 17:41:20 · 5435 阅读 · 0 评论 -
数据分布的六种策略
独立Schema当一个大系统有相关的多个小系统组成,且不同小系统具有互不相同的数据库Schema定义,这种情况称为“独立Schema”;集中只一个大系统必须支持来自不同地点的访问,或者该系统有相关的多个小系统组成,而持久集中化数据进行集中化的、统一的格式的存储;分区分区方式包含水平分区和垂直分区两种;复制在整个分布式系统中,数据保存多个副本,并且以某种机制(实时或快照)原创 2013-02-27 17:40:52 · 4315 阅读 · 0 评论 -
关注点分离
好的架构设计必须把变化点错落有致地封装到软件系统的不同部分。要做到这一点,必须进行关注点分离。Iuar Jacobson在《AOSD中文版》中写道:“好的架构必须使每个关注点相互分离,也就是说系统中的一个部分发生了变化,不会影响其他部分。即使需要改变,也能够清晰地识别出那些部分需要改变。如果需要扩展架构,影响将会最小化,已经可以工作的每个部分都将继续工作。上述论述中的三句话:“系统原创 2013-02-27 16:50:52 · 5028 阅读 · 0 评论 -
java平台统一异常框架的设计与实现
在一个framework的设计中,异常框架的设计占据着很重要的位置,因为它会直接影响到整个应用的健壮性、稳定性和易用性,因此笔者结合自己在产品开发中的经验给出了一个异常框架的设计及实现与大家共享,有考虑不周或欠妥的地方还望大家一起讨论,共同提高。 1.1 Java异常框架总体设计异常框架的总体结构图11.1异常框架总体结构图如上图所示,java平台框架的异常转载 2013-03-11 08:35:48 · 1949 阅读 · 0 评论 -
如何做系统分层
数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问。简单的说法就是实现对数据表的Select,Insert,Update,Delete的操作。如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。在PetShop的数据访问层中,并没有使用ORM,从而导致了代码量的增加,可以看作是整个设计实现中的一大败笔。业务逻辑层:是整个系统的核心,它与这个系原创 2012-11-25 09:44:27 · 14046 阅读 · 2 评论 -
架构设计的基本原则
低耦合、高内聚、防止变异(使用接口和适配器防止变异)、关注分离。1 关注分离横向分层、纵向分区(1) 将有关事务模块化,封装到单独的构件(例如子系统)中,并且调用其服务;(2) 使用装饰者,将所关注的事物(例如安全)置入Decrator对象中,Decorator对象包裹内部类并提取其服务,装饰者在EJB技术中被称为容器,EJB容器围绕内部对象的业务逻辑,在外部的装饰者中增添原创 2012-11-23 22:52:37 · 4567 阅读 · 0 评论 -
单一职责原则(Single Responsibility Principle)
1 作用它指导我们如何提高代码的可重用度!2 定义一个类应该仅有一个引起它的变化的原因(职责),或者说一个类只负责一个功能领域中的相应职责。这条原则也称为类设计的“高内聚性原则”。(l)含义之一:避免相同的职责(也称为功能)分散到不同的类中实现。(2)含义之二:也应该要避免一个类承担过多的职责。将过多的职责耦合在一个类中导致了脆弱设计。软件设计真正要做的许多内容,就是发原创 2012-11-18 00:22:41 · 3429 阅读 · 6 评论 -
小例子背后的大道理——从DIP中“倒置”的含义说接口的正确使用
小例子背后的大道理——从DIP中“倒置”的含义说接口的正确使用提纲开灯的例子暗流涌动Guru眼中的依赖DIP(依赖倒置原则)为什么要解耦合?接口的坏味道同一张类图的不同解释——真假DIP了解DIP有什么用?DIP用在什么地方?下回预告参考文献开灯的例子 选开灯做例子,是因为这个例子既常见又简单,而且潜在的需转载 2012-11-18 09:54:30 · 1006 阅读 · 0 评论 -
依赖倒转原则(Dependency Inversion Principle)
作用:它指导我们如何正确地消解模块间的依赖关系,同时它也是框架设计的核心原则。 依赖倒置原则的本质就是要求将类之间的关系建立在抽象接口的基础上的。Robert Martin这样描述依赖倒置原则[Martin 1996]:传统的策略是把复杂的系统“化整为零,各个击破”。这就是通常所说的分解。SA方法(结构化的分析)也是采用这样的分解策略,把大型和复杂的软件系统分解成若干个人们易于理解和易原创 2012-11-18 00:33:43 · 2518 阅读 · 0 评论 -
系统设计概述
1 系统设计的关键软件设计活动的关键又是什么呢?还是让我们回到现实世界去寻找答案吧!在远古时期,人类只能通过徒步从一个地方到达另一个地方。后来发现马可以被驯服,通过马车能更快地从一处到达另一处。再后来,人类逐步发明了自行车、汽车和飞机,且每一次发明都使得交通效率得以大幅提高。在这里,马车、自行车、汽车和飞机都共同地为了解决交通效率问题。很显然,马车、自行车、汽车和飞机都是不同的概念,人类原创 2012-11-17 13:55:09 · 3815 阅读 · 0 评论 -
包结构设计原则
1 共同封闭原则Common Closure Principle(CCP)一个包中所有的类应该对同一种类型的变化关闭。一个变化影响一个包,便影响了包中所有的类。一个更简短的说法是:一起修改的类,应该组合在一起(同一个包里)。如果必须修改应用程序里的代码,我们希望所有的修改都发生在一个包里(修改关闭),而不是遍布在很多包里。CCP原则就是把因为某个同样的原因而需要修改的所有类组合进一个包里。原创 2012-11-17 13:52:11 · 1610 阅读 · 0 评论 -
多种设计模型(失血模型,贫血模型,充血模型,胀血模型)比较
1.失血模型失血模型简单来说,就是domain object只有属性的getter/setter方法的纯数据类,所有的业务逻辑完全由business object来完成(又称TransactionScript),这种模型下的domain object被Martin Fowler称之为“贫血的domain object”。下面用举一个具体的代码来说明,代码来自Hibernate的ca原创 2011-05-15 21:47:00 · 7227 阅读 · 0 评论 -
关注点分离
关注点分离Separation of Concerns 是计算机科学中最重要的努力目标之一。这个原则,就是在软件开发中,通过各种手段,将问题的各个关注点分开。如果一个问题能分解为独立且较小的问题,就是相对较易解决的。问题太过于复杂,要解决问题需要关注的点太多,而程序员的能力是有限的,不能同时关注于问题的各个方面。正如程序员的记忆力相对于计算机知识来说那么有限一样,程序员解决问题的能力相对于原创 2012-11-17 15:39:04 · 2051 阅读 · 0 评论 -
面向对象设计原则
设计原则名称设计原则简介重要性单一职责原则(Single Responsibility Principle, SRP)类的职责要单一,不能将太多的职责放在一个类中。 ★★★★☆ 开闭原则(Open-Closed Principle, OCP) 软件实体对扩展是开放的,但对修改是关原创 2012-11-17 13:58:09 · 1178 阅读 · 0 评论 -
Web开发中的分层原则和各层之间的数据传递
<br />目前的Web Application大多采用流行的基于B/S模式的三层架构开发,这里的三层架构指的就是Web层、业务层和数据访问层。采用分层的开发方式有很多好处,下面只简单地来说两点:<br />(1) 分层开发使不同的开发人员关注他们擅长的特定层面,有助于开发优质的系统。因为很少有程序员可以精通从JS,CSS,DHTML到struts再到hibernate直至最后的数据库设计这一整套开发流程所要使用到的所有技术。大家各司其职,全力关注自己擅长的层面,这要比一个人或一个小组负责某一模块从页面原创 2011-05-15 21:45:00 · 1007 阅读 · 0 评论 -
GRASP通用职责分配软件模式
1. 概述它的核心思想是“职责分配(Responsibility Assignment)”。GRASP提出了几个基本原则,用来解决面向对象设计的一些问题。Craig Larman在《Applying UML and Patterns》一书中提出了GRASP设计模式的概念。作者称其为设计模式,其实,更好的理解应该为设计原则。因为,与GoF等设计模式不同的是,GoF等设计模式是针对特定问题而原创 2012-11-18 00:00:12 · 6853 阅读 · 1 评论 -
GRASP模式(转)
GRASP,全称为General Responsibility Assignment Software Pattern,即通用职责分配软件模式,它由《UML和模式应用》(Applying UML and Patterns)一书作者Craig Larman提出。与其将它们称之为设计模式,不如称之为设计原则,因为它是站在面向对象设计的角度,告诉我们怎样设计问题空间中的类与分配它们的行为职责,以及明转载 2012-11-18 00:04:33 · 784 阅读 · 0 评论 -
里氏代换原则(Liskov Substitution Principle)
作用它指导我们如何正确地进行继承与派生,并合理地重用代码!定义子类型必须能够替换掉它们的父类型、并出现在父类能够出现的任何地方。这个就是尽量用多态的方法编程,也就是GRASP模式中的多态。如果对于每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换成o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型。换言之,一个软原创 2012-11-18 00:31:21 · 1763 阅读 · 0 评论 -
小例子背后的大道理——Adapter模式详解
小例子背后的大道理——Adapter模式详解上回问题回顾 前文说到一位用户拿着业界标准开关(一个标准的StandardSwitcher,它依赖IStandardSwitchable接口才能工作,然而目前我们的灯并不支持这个接口)出现在我面前,叫嚣着他的“标准开关”应该能打开我们的灯。好吧,这个需求是合理的,的确应该支持。但是该死的是,为什么没有早一点儿知道这个标准的存在转载 2012-11-18 09:55:25 · 1202 阅读 · 1 评论 -
小例子背后的大道理——用户需求+设计原则+正确应用 =设计方案
上回的最后,来了两个用户,分别提出了两个不同的需求。一个要求用两个开关控制一个灯,一个要求用一个开关控制所有的灯。本回将就这两个需求进行分析。我写这段话的时候并没有想出这个需求的具体方案,重要的过程,思路有时候比结果更重要。所以,我的方案可能会"跑偏";但是如果你能从过程中体会到些什么,那这篇就没有白写。 两个开关控制一个灯。这个问题好像很简单,把两个Switcher的Switch转载 2012-11-18 09:49:46 · 1036 阅读 · 0 评论 -
迪米特法则(Law of Demeter)
迪米特法则(Law of Demeter, LoD)又称为最少知识原则(Least Knowledge Principle, LKP),它有多种定义方法,其中几种典型定义如下:(1) 不要和“陌生人”说话。 (2) 只与你的直接朋友通信。 (3) 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。 (4) 一个对象原创 2012-11-18 00:36:33 · 1326 阅读 · 0 评论 -
组合/聚合复用原则(Composition/Aggregation Principle)
定义又叫合成复用原则。原则就是在一个新的对象里面通过关联关系(包括组合关系和聚合关系)使用一些已有的对象,使之成为新对象的一部分,新对象通过委派调用已有对象的方法达到复用其已有功能的目的。也就是,要尽量使用类的合成复用,尽量不要使用继承。组合/聚合复用原则要点:就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分,新的对象通过向这些对象的委派达到复用已有功能的目的。这个原则原创 2012-11-18 00:35:32 · 2158 阅读 · 0 评论 -
接口隔离原则(Interface Segregation Principle)
作用:它指导我们如何正确地进行接口设计!定义1) 一个类对另外一个类的依赖性应当是建立在最小的接口上Ø 一旦一个接口太大,则需要将它分割成一些更细小的接口,使用该接口的客户端仅需知道与之相关的方法即可。Ø ISP可以达到不强迫客户(接口的使用方)依赖于他们不用的方法——在接口设计中应该保证,接口的实现类应该只呈现为单一职责的角色(遵守SRP原则);Ø原创 2012-11-18 00:29:08 · 1980 阅读 · 2 评论 -
“开-闭”原则(Open-Closed Principle)
1.1 “开-闭”原则(Open-Closed Principle)1.1.1 作用它指导我们如何提高代码的可扩展性!1.1.2 定义(1)Open(Open for extension)模块的行为必须是开放的、支持扩展的,而不是僵化的。(2)Closed(Closed for modification)在对模块的功能进行扩展时,不应该影响或大规模地影响已有的程原创 2012-11-18 00:18:01 · 5133 阅读 · 0 评论 -
共性和可变性分析
考虑设计中什么应该是可变的。这种方法与关注引起重新设计的原因刚好相反。它不是考虑什么会迫使设计发生改变,而是考虑什么能够在不引起重新设计的前提下改变。这时主要关注的就是对变化的概念进行封装,这时许多设计模式的主题。如何在问题领域中找到不同变化,如何找到不同领域中的共同点。找到变化的地点,称为“共性分析”,找出如何变化,称为“变性分析”。共性分析就是寻找一些共同的要素,它们能够帮助我们理解系原创 2012-11-18 00:15:57 · 4501 阅读 · 0 评论