从零开始编写自己的C#框架(28)——建模、架构与框架
文章写到这里,我一直在犹豫是继续写针对中小型框架的设计还是写些框架设计上的进阶方面的内容?对于中小型系统来说,只要将前面的内容进行一下细化,写上二三十章具体开发上的细节,来说明这个通用框架怎么开发的就已完全足够了,因为对于中小型系统来说,并不是很复杂,简单的了解三层架构就已经够用了,而使用太多的设计反而有点罗嗦,因为基本上没有什么人会为中小型系统花费太多的设计工作。而对于设计大型平台的框架设计,又深深感到自己的积累还远远不够,写出来怕会误导大家。但不换个思维来讲述也很难说清框架的设计思想,别人拿到一个框架源码后,也很难让人能清晰的理解这个框架到底是什么东东,怎么去改造它。所以只能抱着和大家共同学习的心态,来抛砖引玉,希望能更好的总结一下自己的学习成果,当然有些观点并不一定是正确的,也希望大家能直接拍砖指出来。
前言
很多朋友看到标题可能会很奇怪,为什么弄一个开发框架首先要做的是建模?建模就能做一个框架出来吗?直接的人可能会说,这个2B,设计一个开发框架讲解的核心应该是三层、五层架构,每个层应该有什么用处,他们之间该如何解耦如何协作调用......
如果以前有人告诉我设计一个框架这样做的话,我也会觉得弄一个开发框架搞得这么复杂做什么,直接弄几个层和工具类出来,然后写一些常见功能不就行了。
实际上写本系列以来,理论部分一直在琢磨怎么才能用更通俗易懂的方式讲解出来,像前面章节一样直接从三层架构去讲,只能很简单的说明他们之间的关系,但为什么设计出来的是这样的框架而不是那样的?前面章节所做出来的框架能直接用在网站后端管理上,但如果作为电商平台、OA、CRM、供应链......等软件框架时行不行?会不会存在问题?要如何去改善?如果开发的框架用于电商平台,当访问流量增大,想要增加服务器做分布式、负载均衡进行数据分流时,是在现有框架上改造令它支持还是设计一个新的架构呢?要如何改造或如何设计?设计好的架构支持什么样的业务?如何让需求提供者(未技术人员)能更早的参与到架构设计进来?如何尽早发现系统框架的瓶颈?怎么从设计层就能解决众多的问题?如何让新入职人员快速理解并掌握整个框架知识,快速加入开发的队列中?如果避免核心技术只把握在某一个或几个人员手中,当这些人中有人离职后其他人员无法快速接手的问题?设计的系统能否根据业务拆分为一个个独立的模块,让测试人员提前加入到项目中,提升项目的质量?拆分的模块如何统一起来?......越想问题就越多,怎么去描述都讲不到点上。
经过知识的不断积累,慢慢意识到一直以来使用的都是面向过程的方法来分析需求,在做项目或设计架构时,都是为了功能而设计,为了设计而设计,并不知道其所以然。如果想做出的框架对于项目来说能做到适用,刚好合适,那就需要真正的去分析需求,根据用户实际的需求以及发展方向来设计架构,它是面向对象的,使用用例或领域来驱动设计,为特定需求而定制设计出来的系统,而不是做出来的架构功能过多或未达到设计要求,或者用上一段时间后整个架构甚至数据表都得推倒重来。
当然上面所说的都是理想状态下设计出来的系统,而实际工作中大家开发中的架构或平台,面对每一次大版本的更新都是欲仙欲死的,呵呵......很多时候都得大动手术,进行大改造。
UML、架构与框架的关系
度娘上说:
Unified Modeling Language (UML)又称统一建模语言或标准建模语言,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。
软件架构是一个系统的草图。软件架构描述的对象是直接构成系统的抽象组件。各个组件之间的连接则明确和相对细致地描述组件之间的通讯。在实现阶段,这些抽象组件被细化为实际的组件,比如具体某个类或者对象。在面向对象领域中,组件之间的连接通常用接口来实现。
对于框架来说,就是已做好的钢筋混凝土结构建筑物,里面可以建各个功能的停车场、商场、酒店、饭店、商住房......
架构对于框架来说,它就是绘出好的建筑图纸,它描述建筑物的外部形状、内部布置、结构构造、内外装修、材料做法以及设备、施工等各种图样。而UML就是在这些图纸上所绘制的各种形状的图形(符号)。
有很多朋友会说,我不用UML、不懂架构一样开发出一套套不同功能的框架,干码要学这么多,能做出来不就行了呗。的确是这样的,对于功能简单、中小型的项目,或自己已做过很多类似框架的架构来说,直接编码是一个不错的选择。而对于一个大型的,或复杂程度很高的,或高风险的,或你完全不熟悉的领域的项目来说,开发前先做好相关的设计工作,能帮助你降低项目失败的风险。
框架不是万能的,不是什么系统都适用,就算是通用的管理权限框架,也有它的局限性。就比如本系列前面章节所开源的框架代码,权限管理模块相对来说比较强大,但也存在着各种弊端。比如说将它用于一个简单的企业Web站,它属于过渡设计了,多了很多不必要的功能,让开发变得复杂;而对于一个企业管理软件来说,它的权限粒度还不够细,比如需要实现对于不同角色的人需要展示不同的内容列表就没有实现到;底层应用的ORM框架也限制了只能使用MsSql数据库;UI层执行效率慢......所以我们在设计时,要有针对具体的需求来设计不同的架构,合适才是最好的,而不是无论何时都追求最强大的。
架构好比一个软件的骨架,不同的设计适合不一样的领域,就好像小鸟的骨架适合飞翔,豹子的骨架适合奔跑一样,如果设计好的架构要强硬的去改变它适合其他领域,不是不可以,这会增加很大的难度,就好像想让小鸟变得像豹子一个可以奔跑,又可以飞翔一样。
在实际的开发过程中,很多项目不是你一个人就能单独完成的,在团队协作开发中,如何能让大家都明白你的意图,能配合你将项目开发出来,就需要借助相关的工具(UML或其他建模语言),简单的绘制出业务用例、各种视图和模型,来帮助大家理解与配合。
对于大中小型不同的项目来说,花费在架构设计上的时间都是不同的,据巴利·玻姆(Barry W. Boehm——软件工程估算模型COCOMO模型之父、软件过程螺旋式模型之父)所计算,对于小项目只需投入5%左右的时间;大中型项目需要点总时间的33%~37%的时间;而超大型项目,则需投入40%的时间。
建模应用在实际开发中所带来的好处
1、让非技术人员提前理解所开发出来的系统能处理的业务内容
对于非技术人员来说,他们看不懂各种代码,而业务用例则可以让他们提前理解将要实现的功能是什么,是不是他们想要的内容。
2、让测试人员能提前参与到项目中
当模型创建完成并讨论通过后,相关的测试人员就可以开始编写测试用例,以及相关的自动化测试接口,让开发人员提交了解测试的内容与思路,可以提前参与到测试当中,并为测试提供更多的意见与角度,提升程序的质量,另外当程序完成开发后,也能马上运行自动化测试代码,加快测试进度。
3、让开发人员对所要开发的项目有更深入的了解
对于大多项目来说,除了架构的设计者这外,其他开发人员对于软件框架了解只是一知半解,只熟悉自己那一块的工作,对其他模块了解并不太深。这就造成很多沟通上的障碍,就算让他负责更多的功能模块开发,也只是让他了解太更多一点而已,当软件架构的功能限制对业务扩展的支持,需要改造软件架构时,几乎没几个开发人员敢去随便修改底层框架代码,这主要原因就是对自己架构并不了解,怕改动后影响其他模块的正常运行。而有成熟的架构文档,这将帮助开发人员了解软件框架的运行机制,各模块、组件之前的关系,让他们有能力有条件有信心去对软件框架进行改造。
4、让新加入的开发人员更容易了解项目
一位新成员加入开发团队时,最头痛的就是怎么快速接手项目,投入到开发中去,而有了相关的架构模型,,开发人员可以简单的通过查看架构模型和对应的文档,快速的了解整个开发框架和其技术要点。
还有其他很多好处这里就不一一诉说了。
版权声明:
本文由AllEmpty原创并发布于博客园,欢迎转载,未经本人同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。如有问题,可以通过1654937@qq.com 联系我,非常感谢。
发表本编内容,主要是为了和大家共同学习共同进步,有兴趣的朋友可以加加Q群:327360708 ,大家一起探讨。
在佛山工作的朋友也可以加入:佛山IT朋友群 263767221,大家可以共享资源共同进步,有空大家可以约出来认识一下,交流一下技术,哈哈
更多内容,敬请观注博客:http://www.cnblogs.com/EmptyFS/
从零开始编写自己的C#框架(28)——建模、架构与框架的更多相关文章
- 如何在Visual Studio 2017中使用C# 7+语法 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建NetCore应用框架之实战篇系列 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 NetCore入门篇:(十二)在IIS中部署Net Core程序
如何在Visual Studio 2017中使用C# 7+语法 前言 之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法,然后闲来无事,搞着,搞着没搞出来,然后就写了这篇博文,不 ...
- 从零开始编写自己的C#框架(1)——前言
记得十五年前自学编程时,拿着C语言厚厚的书,想要上机都不知道要用什么编译器来执行书中的例子.十二年前在大学自学ASP时,由于身边没有一位同学和朋友学习这种语言,也只能整天混在图收馆里拼命的啃书.而再后 ...
- 从零开始编写自己的C#框架 ---- 系列文章
目录: 从零开始编写自己的C#框架(1)——前言从零开始编写自己的C#框架(2)——开发前的准备工作从零开始编写自己的C#框架(3)——开发规范从零开始编写自己的C#框架(4)——文档编写说明从零开始 ...
- 从零开始编写自己的C#框架(9)——数据库设计与创建
对于千万级与百万级数据库设计是有所区别的,由于本项目是基于中小型软件开发框架来设计,记录量相对会比较少,所以数据库设计时考虑的角度是:与开发相结合:空间换性能:空间换开发效率:减少null异常.... ...
- 从零开始编写自己的C#框架(25)——网站部署 【转】
服务器安全部署文档 目录1. 前言.. 3 2. 部署环境.. 3 2.1 服务器环境信息.. 3 3. 磁盘阵列配置.. 4 4. 安装操作系统.. ...
- 从零开始编写自己的C#框架(26)——小结
一直想写个总结,不过实在太忙了,所以一直拖啊拖啊,拖到现在,不过也好,有了这段时间的沉淀,发现自己又有了小小的进步.哈哈...... 原想框架开发的相关开发步骤.文档.代码.功能.部署等都简单的讲过了 ...
- 从零开始编写自己的C#框架(25)——网站部署
导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...
- 从零开始编写自己的C#框架(20)——框架异常处理及日志记录
最近很忙,杂事也多,所以开发本框架也是断断续续的,终于在前两天将前面设定的功能都基本完成了,剩下一些小功能遗漏的以后发现再补上.接下来的章节主要都是讲解在本框架的基础上进行开发的小巧. 本框架主要有四 ...
- 从零开始编写自己的C#框架(17)——Web层后端首页
后端首页是管理员登陆后进入的第一个页面,主要是显示当前登陆用户信息.在线人数.菜单树列表.相关功能按键和系统介绍.让管理员能更方便的找到息想要的内容. 根据不同系统的需要,首页会显示不同的内容,比如显 ...
随机推荐
- 可爱的豆子——使用Beans思想让Python代码更易维护
title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...
- Fis3的前端工程化之路[三大特性篇之内容嵌入]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- python开发编译器
引言 最近刚刚用python写完了一个解析protobuf文件的简单编译器,深感ply实现词法分析和语法分析的简洁方便.乘着余热未过,头脑清醒,记下一点总结和心得,方便各位pythoner参考使用. ...
- 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付
微信支付教程系列之公众号支付 今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...
- AFNetworking 3.0 源码解读 总结(干货)(下)
承接上一篇AFNetworking 3.0 源码解读 总结(干货)(上) 21.网络服务类型NSURLRequestNetworkServiceType 示例代码: typedef NS_ENUM(N ...
- Velocity笔记--使用Velocity获取动态Web项目名的问题
以前使用jsp开发的时候,可以通过request很轻松的获取到根项目名,现在换到使用velocity渲染视图,因为已经不依赖servlet,request等一些类的环境,而Web项目的根项目名又不是写 ...
- 深入理解CSS六种颜色模式
前面的话 赏心悦目的颜色搭配让人感到舒服,修改元素颜色的功能让人趋之若鹜.但颜色规划不当,会让网站用户无所适从.颜色从<font color="">发展至今,保留了很多 ...
- Java 中获取类路径 classpath 的方法
System.out.println("++++++++++++++++++++++++"); String path = System.getProperty("jav ...
- VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容
VMware下对虚拟机Ubuntu14系统所在分区sda1进行磁盘扩容 一般来说,在对虚拟机里的Ubuntu下的磁盘进行扩容时,都是添加新的分区,而并不是对其系统所在分区进行扩容,如在此链接中http ...
- a标签绝对定位,点击区域被图片遮挡(IE下)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...