当前位置: 首页 > news >正文

关于软件架构的一点思考

良好的架构大致包含以下部分,只有尽可能多的考虑到以下方面,才可能成为良好的设计。

 

l  是否覆盖了所有的需求中提到的功能

架构设计一定要涵盖当前所有的需求中提到的功能。

l  数据设计(数据库设计)

数据表的设计,没张表尽可能原子性,使得系统在储存上面,每张表也有各自的存储职责,与类的design是一样的,职责单一,不过有时也适当冗余,因为软件设计基本的原则是简单。

l  主要模块、类的划分与职责的分配

模块的划分、类的设计,在初期应该就要对系统的职责有明确的分配,对系统进行解耦,接口独立于实现,针对接口编程。

l  核心业务

核心业务应当单独拉出来考虑,毕竟是客户最关心的部分,这部分或许对UI,性能上都会有一套独立的策略。

l  UI、业务逻辑、数据结构、算法分离(算法也可以与数据结构合为一层)

UI需要专业美工来设计,制作,并与客户不断进行确认,初期就要完成的,有时候,UI会带来很大的复杂度,也是架构师需要关注的一个部分,进可能使得展示与业务逻辑分离,应对变化。数据结构和算法有时候也可以实现分离,实现更大的灵活度,例如c ++编程语言中的STL。

l  资源管理(线程、数据库连接、网络传输,句柄)的使用量,如何管理这些资源。

例如数据库连接,为了保证每次连接都得到释放,我们需要对其进行一个封装(所谓的dbHelper),网络传输也一样,协议层,连接层,网络代理,也可以根据业务的复杂度弄一个代理工厂。

l  性能

性能是很重要的。有时候不得不牺牲良好的设计来换来必要的性能。这也是我们初期需要规定好的,系统支持多少用户同时在线,用户每次操作的响应时间是多少等等。

l  安全性

身份验证。一个最基本的安全验证机制是身份验证,通常一个系统,一个程序都会需要一个身份验证,来保证系统的安全性。

接口安全。比如暴露一个web service,那么就要保证调用者的身份是安全的(例如IP地址白名单机制)。

网络传输安全,通常网络传输过程中是需要加密的,当然要看系统的安全性要求是什么程度的,有时也是不必要的。

l  需求的可伸缩性

需求是经常变化的,经常添加的。因此,目前架构能否适应需求的变化和伸缩是很重要的。

l  异常处理

为可能出错的地方捕捉异常,尤其是多线程、并发IO、数据库操作等等。

l  LOG

根据不同的需求,不同的场合,把日志分为几种,通常有两大类,一类是正常的事件性日志,另一类是异常日志。

l  容错性

系统接收到了错误的输入时做出的响应。

l  健壮性(系统出错之后可以继续运行的程度)

系统出错之后应该确保变化的部分不会扩张,如果系统设计良好,很好的封装了变化,隔离了系统的实现细节,那么系统就相对健壮。

l  最底层架构是独立于语言的

每一个好的架构都不应该依赖于编程语言的。

l  有哪些功能可复用以前的代码

有些模块是可以复用的,也可以根据项目成本来决定是否需要购买一个模块。

l  本地化

软件是否需要本地化,这点要根据需求来定。

 

 

 

 

 

 

 

 

 

 


相关文章:

  • 在推广单元测试过程中发现的雷人问题
  • JAVA开发环境配置---JDK的安装与配置
  • Java与C#的垃圾回收机制
  • 在UltraWebGrid单元格中绑定WebNumericEdit或其它可编辑控件
  • 正确编写概要设计...
  • HTML5 本地存储DEMO ---localStorage
  • 倘不能独善其身,何谈兼济天下——外企是?
  • 下载和安装jadclipse
  • java中使用protobuf序列化(反序列化)
  • 《软件开发的边界-管理成功的项目》
  • 二叉排序树与二叉堆
  • 再谈外企是——回复一位网友
  • AutoResetEvent WaitOne和Set使用实例
  • 《代码之道》
  • 16进制颜色代码对照表
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • [Vue CLI 3] 配置解析之 css.extract
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • CentOS7 安装JDK
  • es6--symbol
  • Fastjson的基本使用方法大全
  • Linux gpio口使用方法
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • PHP 7 修改了什么呢 -- 2
  • Python学习之路16-使用API
  • Vue 动态创建 component
  • Vue2.x学习三:事件处理生命周期钩子
  • Webpack 4 学习01(基础配置)
  • 经典排序算法及其 Java 实现
  • 人脸识别最新开发经验demo
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • #ifdef 的技巧用法
  • #微信小程序:微信小程序常见的配置传旨
  • $L^p$ 调和函数恒为零
  • (2)(2.10) LTM telemetry
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (十一)图像的罗伯特梯度锐化
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET 8 编写 LiteDB vs SQLite 数据库 CRUD 接口性能测试(准备篇)
  • .net core控制台应用程序初识
  • .Net MVC4 上传大文件,并保存表单
  • .net 使用ajax控件后如何调用前端脚本
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .NET微信公众号开发-2.0创建自定义菜单