Andy Niu Help
1.0.0.0
|
软件工程和思想
变量 | |
机制与策略 | |
软件的本质就是封装 | |
软件的功能就是增删改查和数据可视化 | |
软件的运行 | |
概要设计 | |
通用性和针对性 | |
缓存 | |
流程驱动和事件驱动 | |
详细描述
变量说明
机制与策略 |
1、透过现象看本质,机制与策略到底是什么?为什么要将机制与策略分离? 2、反映在系统设计上,机制是目标功能,策略是实现方法,也可以认为是接口与实现。 3、反映在管理上,领导负责机制,员工负责策略,也就是说,领导决定做什么,怎么做是员工的事情。 4、为什么要将机制与策略分离? 假如不分离,会出现什么问题?考虑下面的场景,要完成排序的功能,如果接口和实现捆绑在一起,并使用冒泡排序完成。 那么问题来了,我想换一种排序算法,比如快速排序,接口和实现都要替换。怎么解决这个问题? 也就是机制与策略分离,提供一个排序接口,继承接口,提供不同的实现,这也就是策略模式。 Context关联一个抽象的策略(也就是接口),用不同的具体策略初始化抽象策略,就能调用具体策略的处理流程。
- 参见
概要设计 |
概要设计过程:确定边界,划模块,定接口,理流程。分别如下: 1、确定边界:确定边界后,才能明确与外部哪些实体交互,交互需要确定:通信方式是串口还是网络, 消息的大小,消息的格式,消息是同步还是异步。 2、划模块:模块之间有竖直关系和水平关系,比如MVVM模式可以认为是竖直关系,从外部的界面到内部的数据。 水平关系比如:接受消息,处理消息,转发消息。 3、定接口:模块可以认为是一个IPO(Input-Process-Output)控件,概设的时候,模块是一个黑盒,对外的接口要尽量小。 4、理流程:使用时序图,说明对于一个功能,若干模块是如何协作完成的。
- 参见
流程驱动和事件驱动 |
1、每个模块都是消息处理单元,外部线程往这个模块里面Push消息,这个模块启动一个线程,用来处理消息。 启动线程while死循环,主动轮巡检查消息队列,然后处理消息。这就是流程驱动。 2、有没有更好的处理办法呢? 也就是,外部线程Push进去一个消息,回调上来一次,然后处理消息。这就是事件驱动。 给人感觉就是,这里触发一下,从另外一个地方回调上来处理消息。 3、怎么实现事件驱动呢? 第一种方法:把while死循环,下沉到底层(也就是底层启动一个线程,进行主动轮巡),向底层注册回调方法。 检测到一个消息,从底层回调上来。也就是说,事件驱动是对流程驱动的封装,while循环下沉到底层,底层进行主动轮巡。 第二种方法:使用PV操作,当前线程底层while死循环,每次进行P操作。 其他线程Push消息的时候,内部调用notify一下底层(也就是V操作),然后底层回调上来。 也就是,任何模块向当前模块发送一个消息,当前模块都回调上来。
- 参见
缓存 |
1、《精通正则表达式》,孟岩作序:Bill Joy 软件世界的爱迪生,这家伙发明了BSD,TCP/IP,csh,vi和NFS,是SUN的首席科学家, 现在已离职,2003年离职的时候,SUN股票应声下跌3.2% 2、Bill Joy曾经调侃说,在计算机领域中,缓存是唯一称得上伟大的思想,其他的发明和技术不过是在不同场景下应用这一思想而已。 3、典型的场景应用: Mysql的缓存 线程池 对象池 客户端频繁查询某些信息,这些信息保存到内存中,避免重复读取数据库。 注意:保证内存和数据库的信息同步,信息变化需要从数据库读取,并更新内存。 插入数据库,缓存起来批量写入。
- 参见
软件的功能就是增删改查和数据可视化 |
所有的软件,无非是增删改查和数据的可视化。Google也就是做了一个查,只不过查的对象是整个互联网内容, 互联网上的用户进行增删改操作。淘宝也就是对商品的增删改查。
- 参见
软件的本质就是封装 |
软件的本质就是封装。根据已知的实现,对这些实现封装,对外暴露接口。操作系统对硬件封装,对外暴露接口。 高级编程语言对操作系统进行封装,对外暴露接口。应用软件对高级语言封装,对外暴露接口,很多是人机接口,提供UI界面。
- 参见
软件的运行 |
可以把软件的运行看成做一件事,比如做菜。做菜需要菜谱,菜谱列出了需要哪些原料和操作步骤, 人按照操作步骤,加工数据。菜谱就是程序,原料就是数据,操作步骤就是程序的控制流程,人就是CPU, 人做菜就是CPU执行程序,就是进程。
- 参见
通用性和针对性 |
1、所有工具都是为了人类解决问题的,这也是人类发明工具的动力。 2、通用型的好处在于适用较大的范围,缺点是对于特定的场景会退化。通用性意味着冗余、笨重、效率低下, 因为通用性要考虑不同的情况,这些情况要均衡地处理。 3、针对性在特定场景下很好地满足用户需求,如果用户需求经常变化,就很难处理。 4、通用性和针对性解决不同的问题,也就是有不同的应用场景。举例来说,市场上有万能锅,能煮饭,能炒菜,能炖汤, 但是它的效果肯定比不过专业的炖汤锅(注:同等价位)。如果家里有多种用处,煮饭,炒菜,炖汤,那就要买万能锅。 如果只是拿来炖汤,就要买专业的炖汤锅。 5、这就能解释,已经存在很多成熟的开源库,为什么有些公司还要自己重新开发? 这里存在两个问题: 开源的网络库不能很好地满足自己特定的需求。 功能丰富的开源库,代码量很大,不吃透就使用,有很大的风险。如果全部吃透,人力物力的开销可能比自己实现还要大很多。
- 参见
Copyright (c) 2015~2016, Andy Niu @All rights reserved. By Andy Niu Edit.