【系统分析师之路】第七章 系统设计记忆敲出

【系统分析师之路】第七章 系统设计记忆敲出

一. 人机界面设计

由于最近几年手机APP开发趋势日益剧增,人机界面设计也越来越受到了人们的重视,UI设计也因此被提高到了一个新的高度。

1)置于用户的控制之下

比如某些流氓软件,你按了某个按钮后,它就会让你跳到流氓软件指定的网页,
这样的话用户体验肯定不好,所以我们在设计人机界面时,要求如果在载入进度中不能10秒以上没有响应,还有在处理过程中,任务时可以取消的。

2)减少用户的记忆负担

比如载入进度的时候显示百分比,鼠标变成齿轮状,这些都能减少用户的记忆负担。好的APP开发完成以后,大家都可以凭感觉就可以熟练地操作,因为用户不会一边看你的软件使用说明书,一边学着操控软件了。

3)保持界面的一致性

可以让用户按自己习惯的方式操作就是保持界面的一致性,在软件升级的时候,千万不要把用户喜欢的操作习惯给改变了。很早以前玩过轩辕剑3,轩辕剑3外传天之痕就是继承了轩3的操作和界面,让人可以很快的上手,而轩4开始使用了3D的引擎进行游戏的开发,界面以及操作习惯完全和之前的游戏系列没有了关系,让口碑一下子下降了不少,还有重制版生化3也是基于了重制版生化2的操作,所以很多老玩家可以很快速的上手游戏。这些都是保持界面一致性的很典型的例子。

二. Web开发演化–单机系统

最早的Web开发数据库服务器,应用服务器都部署在一台机器上,发现速度渐渐慢下来的时候优先对应的方法是升级硬件
当升级硬件以后,速度已经没有很明显的提升的时候,我们就要分析并思考能不能把数据库服务器和应用服务器分开放到不同的PC上之下,然后通过中间件将数据库服务器和应用服务器连接起来,看起来像运行在一台服务器上,数据库服务器和应用服务器都需要资源,而且也分开两台PC来处理,于是速度得到了提升

三. Web开发演化–集群于负载均衡

但是这种提升往往还是不够的,当应用服务器负荷量很大变为瓶颈的时候怎么办?我们可以使用多台PC跑应用服务器,这个就是集群技术。这里集群和分布式技术要区分开来。集群就是多台PC机运行同一个内容,而分布式则正好相反,同一个内容拆分为数份,每一小份分别运行在不同的PC上,这就是集群技术和分布式技术的差异点。
集群技术是如何实现的呢?集群技术的实现离不开负载均衡。负载均衡的方式有应用层负载均衡和运输层负载均衡两种类型。Http重定向和反向代理是应用层的负载均衡技术;DNS域名解析和基于NAT的负载均衡是运输层负载均衡技术。

1)DNS域名解析

DNS是动态的域名解析协议,你输入一个域名,传输到域名解析服务器进行域名的解析,在这里为了实现负载均衡,得到不同的IP地址,然后客户端就访问不同的IP地址实现DNS的分流。它是最早的最为简单有效的负载均衡技术。基于DNS协议的负载均衡技术可以有效的分发客户请求,但是缺点就是无法获得集群中哪台机器性能快,哪台机器目前不可用,所以在客户端消息负载均衡时,还是有不足的地方的。

2)基于反向代理服务器的负载均衡技术

这里使用了代理服务器,这里的代理服务器就可以理解为一个中间件。在这个代理服务器中使用算法来实现分发,也就是把请求均匀转发给多台服务器,从而达到负载均衡的目的。

3)基于Http重定向的负载均衡技术

我们在做Web开发的业务逻辑时,当访问某一个URL失败的时候,使用重定向技术将URL重新定位到另一个地址,而这个Http重定向技术配合一定的算法以后,还可以用来实现多台服务器之间的负载均衡。Http重定向的负载均衡方式实现最为简单,但是性能也是最差的。

4)基于NAT的负载均衡技术

将一个IP地址转化为另一个IP地址的技术,使用这种技术也可以指定不同的主机,实现多台服务器之间的负载均衡。
混合型负载均衡在有些大型网络,由于多个服务器群内硬件设备、各自的规模、提供的服务等的差异,可以考虑给每个服务器群采用最合适的负载均衡方式,然后又在这多个服务器群间再一次负载均衡或群集起来以一个整体向外界提供服务(即把这多个服务器群当做一个新的服务器群),从而达到最佳的性能。将这种方式称之为混合型负载均衡。

四. Web开发演化–负载均衡算法

为了实现负载均衡,不光和使用到的技术策略,还和负载均衡算法有关。负载均衡算法的好坏直接影响者负载均衡的效果。负载均衡算法分为动态算法和静态算法两种。
静态算法是以固定的概率去分配任务给集群中不同的服务器,从而实现负载均衡。轮转算法和加权轮转算法就是静态负载均衡算法的应用。
动态算法于静态最大的不同就是在分配任务的时候,会考虑集群中服务器目前的负荷,根据符合情况再进行任务的分配。最小连接法、加权最小连接法都是动态的算法。

五. Web开发演化–Web页面的状态

访问的页面分为有状态和无状态两种类别。
无状态的页面比较好整,不管用什么样的负载均衡算法,问题都不大。而有状态的页面就不那么容易处理了。因为在考虑负载均衡分配处理服务器的时候,同时还要把Session里面的内容一并告诉被分配到的集群中的某台服务器才可以。所以有状态的页面在实施负载均衡的时候会相对比较麻烦。
为了解决上面的问题,我们可以把这些所谓的状态信息也就是Session里面的信息放在一台专门的Session服务器上,这样对应了以后,比如手机淘宝和PC淘宝上购物车里面的信息,就可以实现同步了。

六. Web开发演化–主从数据库

当应用服务器这边使用了集群技术,并且上了负载均衡技术和相应的算法,为应用服务器进行了减负,
那么接下来,系统的瓶颈就到了数据库服务器这边。数据库服务器这边速度越来越慢而不得不改善的时候,
我们首先可以使用主从数据库的技术,主库负责对数据的读写操作,从库负责对数据的查询操作,分别部署在两台PC机上。
这样两台PC机各司其职,也实现了负载均衡。除了负载均衡,主从数据库还可以起到容灾的作用。
比如一台数据库服务器坏了或者无法使用的时候,我们无需做任何变更,因为主从数据库可以互为BackUp。
主从数据库在使用过程中还涉及到同步的问题,主从数据库的同步,让我想到了企业信息化集成技术中的数据集成。

七. Web开发演化–用缓存缓解读写库的压力

数据库的使用和操作往往也是遵循28法则,20%的数据访问表示往往占用了80%的可能性,而80%的访问每次都去查找数据库取得并计算,有时候还会遇到重复的对数据库的计算和查询,这个时候效率又变得低下了。因为每次查询操作都需要访问数据库的数据,将其读到内存中,然后再计算。这个时候我们使用了缓存,将经常操作或者查询的结果保存在缓存中,这样可以大大减少数据库读写和计算的时间。这样我们的信息系统又进行了有效地改善。
这里的缓存数据,其实和计算机组成原理中的存储结构非常的相似。应该也可以归纳到局部性原理上。

八. Web开发演化–CDN内容分发网络

CDN的全称是Content Delivery Network,即内容分发网络。如果一个大家都要访问的内容放在一个网络节点上,那么大家都需要访问的时候,都会去访问这个节点,这样这个节点的负载就会变大,如果这个时候将这个结点的内容拷贝以后放到各个网络节点上,需要这个节点上数据的人只要就近访问就可以了。 这样就改善了数据传输速度和稳定性这些瓶颈,解决了网络拥挤的问题,提高了网络访问的速度。CDN的基本原理为反向代理(Reverse Proxy)。在我看来CDN更像是一种特殊的集群技术。当然特殊集群化之后,就变相冗余了系统,也减少了被DDOS攻击的可能性。
在国内访问量较高的大型网站如新浪、网易等,均使用CDN网络加速技术,虽然网站的访问巨大,但无论在什么地方访问都会感觉速度很快。而一般的网站如果服务器在网通,电信用户访问很慢,如果服务器在电信,网通用户访问又很慢。

九. 面向对象的设计原则

单一职责原则:每一个类只负责一个职责,每个人干什么事情职责清晰可见
李式替换原则:子类可以替换父类。千万不要覆盖父类的东西,不然谁都不会想到,替父从军之时千万不要打破父亲在军队中定下的规则。
依赖倒置原则:针对接口而不是针对实现来编程,名字和实际差别比较大的一个原则。针对接口有点类似多态,还有策略模式就是依赖倒置原则的典型应用。电视机和PC机就是一个很好的例子,电视机一般部件不会升级,所以电视机部件都焊接起来,不能轻易替换,而PC机可以升级,所以针对接口编程了,内容,网卡等都有自己通用接口,可以方便升级。
开放封闭原则:对修扩展开放,对修改关闭,因为修改可能会引入新的bug。
迪米特原则:一个对象要对其他对象有尽可能少地了解。它也叫最少知识法则。
接口隔离原则:它是针对接口设计来说的,接口设计时不要使用多个参数的总接口,因为这样不好,还不如将这个总接口做拆分为多个。
组合重用原则:尽量少用甚至不用继承,因为继承是一种强耦合关系,取而代之使用组合关系去替换它。因为使用继承的话,父类一变子类不变都不行了啊。

十. 业务流程设计—标杆瞄准

这个还是比较容易理解的,类似于在项目管理中的标杆对照,在这里它是参照行业内的标杆企业,看看他们的流程并以他们的流程作为参照来定义自己的业务流程。

十一. 业务流程设计—IDEF

IDEF是一个比较完善的是业务流程定义的体系。
IDEF0是对系统功能进行建模,类似于DFD。
IDEF1是信息建模
IDEF1X是数据建模,可以用到ER图
IDEF2是仿真建模设计
IDEF4是面向对象的建模
IDEF8是用户界面建模
IDEF12是组织结构建模

十二. 业务流程重组与业务流程管理的区别与联系

任务流程重组事宜革命性的大改变。他的关键字是革命性的,再思考和彻底性的再设计。因为他推翻了原来所有的业务流程,所以他的风险也是最高的。
而业务流程管理中最主要的是加入了戴明的PDCA的思想到了里面,更加强调持续改进的思想。还有业务流程管理强调构造端到端的卓越业务流程。
BPR强调对流程的再设计,BPM强调对流程进行规范化的改造,使之成为卓越的业务流程。

十三. 结构化设计

结构化设计分为概要设计和详细设计,结构化设计可以说算是比较古老的设计了,在结构化设计中也需要遵循一系列的原则,比如多扇入,少扇出,因为扇入是调用别人的接口,扇出则是调用别人,调用得少说明依赖耦合度小,也就是可复用性要来得高;还有高内聚低耦合是用来说明和衡量模块的可复用性好坏;还有需要有效地控制调用的层数,层数越多,出栈入栈也会变得频繁,这样效率就会受到影响;每个模块大小适中,自顶向下逐步求精也是结构化设计的特征。

十四. 设计模式的概念

架构模式,设计模式,惯用法之间的关系:架构模式比设计模式大一号,惯用法比设计模式小一号,设计模式和架构模式不依赖于某种特定的语言,而惯用法一般是很具体的语言相关,比如C++中的引用就是一种惯用法。
工厂模式,模板方法,适配器模式,解释器模式这四个是属于类模式。其他的模式属于对象模式
类模式就是不用实例化为对象就能达到我们想要的结果。
对象模式:实例化之后对象去打交道的一种模式;
类的静态方法是不需要实例化为对象便可以使用的方法,它是实现类模式的一个重要手段

十五. 设计模式之创建型模式

创建型模式一共有下面的五个,主要用来解决创建对象这样一个目标。
工厂模式:只是提供一个创建对象的方法,如何创建对象,创建什么对象由子类决定。实现了动态化的对象生成。
抽象工厂模式:工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。
单例模式:可以让特定的类只生成一个对象
生成器模式:一般用来解决创建对象复杂的问题,它将复杂的创建过程进行了封装
原型模式:Clone对象的一种应用,一个对象生成以后,给了另外一种创建对象的方式
工厂模式与抽象工厂的区别
抽象工厂可以用来创建一系列相互依赖的对象,而工厂模式只适合创建单一的产品对象。如果工厂的产品全部属于同一个等级结构,则使用工厂方法模式;如果工厂的产品来自多个等级结构,则使用抽象工厂模式。

十六. 设计模式之结构型模式

适配器模式:主要做的是接口的转换,把我们不想要的接口转化为想要的接口。
桥接模式:首先让我想到了组合重用原则。它主要是拿来解耦的,继承是紧耦合,如果可以把继承拆分为组合,那么就拆分到组合来使用。通过使用桥接模式,紧耦合的关系可以得到有效的解决。比如可以使用桥接模式,把手机软件通讯录和手机品牌进行解耦。这样一来,类的复用性就可以得到提高。
组合模式:这个模式主要可以用来表示整体和部分的关系,比如文件夹结构就是组合模式的最好的一个应用,因为在文件夹内部还有子文件夹,这就是整体和部分的关系。在编译器对语法进行分析的时候,也用到了组合模式。
装饰模式:它主要做的是动态的给一个类添加一些职责。首先让我想到的是强袭敢达,可以根据不同的地形换装。
外观模式:在我看来就是定义一个抽象化统一接口的模式,使用外观模式后,可以把网状拓扑结构变为星型结构。使用外观模式可以简化某些子系统的调用,用结构化设计的思想来看,可以简化扇入。外观模式说白了就是打包一系列得接口,所以感觉有点像界面集成。
享元模式:在需要生成很多对象,而且很多对象都一样的时候,这个时候就可以使用享元模式来
代理模式:封装对象的访问控制的一个模式。我不喜欢做家务,于是找来了代理,让代理去拖地,洗碗,这样我就不用亲自去做这些事情了。

十七. 设计模式之行为型模式

责任链模式:减少信息发送者和信息接收者的耦合。信息在一条对象链之间游走,看由谁来处理这条信息更加得合适。
中介者模式:银行直接转账复杂,这个时候就有了银联,所有银行之间的转账都变为银行对银联进行转账,这个时候的银联就是中介者。在架构模式中的ESB就是应用到了中介者模式来进行的。再比如买卖房屋,卖家和买家都是通过中介实现交易。
命令模式:命令模式就是把对象之间得通信的命令进行抽象化设计的模式,它最大得特点就是命令是可以撤销的。
解释器模式:提到解释器,不得不联想到还有解释器的架构风格。它们都是用在虚拟机的机制中。
观察者模式:MVC模式中View就在观察Model中数据的变化,一旦数据层发生了变化,就及时通知View层来更新,它强调的是对象之间的联动。观察者模式很像发布订阅的模式。
备忘录模式:打游戏的时候,卡在了某个关卡,死活过不去,载入进度了N次,为什么可以载入,因为我们之前保存了游戏的备忘录。
状态模式:它的UML图和策略模式是完全一样的,状态模式最大的特点就是已经把状态封装成了一组状态类。
策略模式:根据策略载入最为合适的算法的时候,就用到策略模式。策略侧重特定方法的选择和切换。
模版方法:C++中的模版就是使用到了模版方法,在模版中定义方法,在子类中实现方法。
迭代器模式:C++的STL库中就有迭代器,它就是一组对象的集合,一组数据集。
向量集,链表集,Map集,HashMap集都是数据集,都可以用迭代器模式来访问。
访问者模式:用来横向采集各个对象之间的数据的时候,使用访问者模式,其实觉得访问者模式可以和迭代器模式一起使用,因为迭代器就是一组对象的数据集。在C++中对迭代对象进行遍历运算的范型算法,更像是访问者模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值