项目重构方案设计

最近接手到一个已经成型的项目,然后我们的任务就是对它进行重构,这个项目是一个功能很齐全的WPF视频播放器(附带很多其他功能),在仔细 研究了项目的背景和架构以后,初步做出了一下的重构方案:
目前现状:
虽然整个系统做得很漂亮,代码也写得不错,但仍有以下不足:
  1. 1, 架构有待改善。虽然看似MVC架构,却没有遵循MVC的模式,里面逻辑和UI耦合很高,没有清晰的规律。
  2. 2, 没有充分用到WPF的特性。WPF除了给我们很多炫丽的效果外,还给我们提供了诸如 Binding,command等特性,这些特性可以帮我们隔开耦合,同时减少代码量。
  3. 3, 代码和文件没有组织。代码、dll、样式文件和资源文件等没有统一的组织,到处都有,这样看起来就会很混乱。
  4. 4, 没有建立公用代码库。没有把公用的代码库独立出来,很多地方都是另外在写,这样既增加了代码量,同时维护和重构也带来了麻 烦。
  5. 5, 逻辑处理不应暴露在Client。项目是一个C/S架构的系统,没有必要把所有的逻辑都暴露在Client 端,应该用分布式把Logic放在服务器端,这样可以更安全同时使客户端变小。
  6. 6, 没有单元测试。这样一个庞大的程序,没有单元测试是非常危险的,我们不可能做到100%的覆盖率,但是我们可以对主要的逻辑 和Function做单元测试,这样既减少了测试人员的工作量同时整个系统的安全、稳定和可维护性得到了大大的提高。
  7. 7, 性能不够优化。启动项目,通过WPF性能工具Perforator和Visual Profiler分析得出,程序启动和界面操作都导致CPU很高,内存也消耗比较多。
解决方案
  1. 1, 针对缺陷1的“架构问题”。做法是采用MVP或者MVVM模式,目前正在对比和考虑。
  2. 2, 针对缺陷2的“WPF特性”。做法是充分利用Binding,command等特性。
  3. 3, 针对缺陷3的“代码和文件没有组织”。做法是建立一些单独的工程或者文件来分类和组织这些代码,并且充分隔离 耦合。
  4. 4, 针对缺陷4的“没有建立公用代码库”。做法是把一些公用的代码和常用的代码做成单独的Dll,并且有完整的单 元测试,这样才能提高效率。
  5. 5, 针对缺陷5的“逻辑处理不应暴露在Client端”。做法是用WCF做为中间层,把业务逻辑全 部进行封装,通过WCF提供统一的接口供项目调用。
  6. 6, 针对缺陷6的“没有单元测试”。做法是不管用MVP还是MVVM,我们起码保证对逻辑组件的代码有充分的单元 测试覆盖,同时对一些公用的组件也要有单独的单元测试代码。
  7. 7, 针对缺陷7的“性能不够优化”。这个我会单独做一个性能优化列表出来,针对耗资源的操作和其他有损害性能的操 作,我们应该避免。
  8. 那么我们就可以结合实际情况搭建如下的结构
  9.   Arc1
  10. 因为使用了MVVM模式,所以UI结构图就做如下调整
  11. Arc2
  12. 由于整个项目客户部希望我们引用第三方的组件或者工具,所以很多功能都只能通过企业库实现,比如AOP和IOC,log和exception对项 目特征做了定制化,数据访问通过企业库重写实现局部ORM,对性能要求比较高的应用仍然实现存储过程。对所有事务操作都转移到数据库,邮件使用JOB进行 发送。大型数据和客户要求较高的实时操作,用MSMQ和SSB相结合的方式。层次依赖关系
clip_image002
UI: 功能模块使用时候,都会首先通过UI层次Security模块的安全验证(验证是通过Components模块里面的自定义 的用于页面功能以及功能点验证的控件触发), Security模块会通过服务层获取用户身份数据,用于页面验证.
功能模块的实际功能实现,如果需要数据库支持,那么依然会通过服务层进行数据操作.整个架构基于MVVM模式。
Service:通过WCF做中间服务,使应用隔离开来,这样有利于扩展和维护,同事提高了整个应用程序的伸缩性。
Business Logic: 服务层内部之间的组合关系,主要体现再依赖和调用,由上往下调用,逐级依赖,最后Service底层边界Data Access模块将调用Framework中的Data模块,Data模块将调用MS.EntLib3中的Data,向数据服务器发送数据操作命令和数 据.
Framework: 该层次提供许多基础的功能模块(七大块),分别提供给UI,Service层里面的模块直接或者间接的调用,同时也可以看到Framework层次内部各 模块之间再运行时也有互相依赖调用的关系存在.该层次的部分模块会依赖和调用Ms.EntLib3中的模块,一般是按照两个层次里面的模块名称,产生关系 的.
MS.EntLib3: 该层次的各个模块是整个系统框架中最底层的,只会在运行时被更高层次的模块依赖和调用,同时该层次内部各个模块之间也存在依赖和运行时调用关系.
整个架构采用迭代的方式进行开发,这样方便客户进行实时反馈,由于现在还没有开始,所以有很多时间进行准备,如果园子里有这方面经验的朋友,也 可以畅所欲言,谢谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/268188.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker top查看容器中运行的进程信息

docker top :查看容器中运行的进程信息,支持 ps 命令参数。 语法 docker top [OPTIONS] CONTAINER [ps OPTIONS] 容器运行时不一定有/bin/bash终端来交互执行top命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正…

易经给我们的64个人生智慧

《易经》没有那么神秘,它是科学的,它就在我们的身边,我们每天的生活起居,工作事业,健康幸福,都受这64个哲理的左右。我们以科学的态度对待这64个哲理,就形成了64个感悟,64个感悟回答…

华为2018软件岗笔试题解题思路和源代码分享

2017年9月26日,参加了华为技术有限公司的笔试,题目类型是软件题,没有选择填空问答类型,总共是3道编程题目,题目难度适中,在两个小时内完成3道题目的AC,所以分享的代码都是可运行且完全AC的! 和广…

docker镜像加载原理

docker镜像加载原理

设计模式是用来弥补面向对象编程缺陷的方法总结

面向对象和设计模式都是大家耳熟能详的概念。面向对象是以对象为基本元素,对数据与逻辑行为进行封装。实现面向对象过程的方法是使用抽象,同时在使用抽象进行分析设计的时候就产生了类型,并隔离了抽象与实现。这个过程是有很多的优点的&#…

navicat的安装

1.下载 这里使用的是11.1版本。 2.安装到D盘 3.破解 下载 参考:http://www.cnblogs.com/da19951208/p/6403607.html 将PatchNavicat粘贴到安装目录,然后双击 选择navicat、 结果: 4.这个时候可以使用了 转载于:https://www.cnblogs.com/junca…

docker实现宿主机和容器之间映射添加数据卷

docker run -it —privilegedtrue -v /宿主机绝对路径:/容器内目录 镜像名 卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此docker不会在容器删除时删除其挂载的数据卷 在ubuntu容器内 /tmp/docker_data 下新建test.txt文件 在宿主机…

实验四 恶意代码

中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告 实验四 恶意代码技术 学生姓名 冷其航 年级 14级 区队 二区队 指导教师 高见老师 信息技术与网络安全学院 2017年10月24日 实验任务总纲 2017—2018 学年 第 一 学期 一、实验…

Linux系统删掉多个文件

rm -f 2010-10-*.log转载于:https://www.cnblogs.com/dpf-learn/p/7752952.html

docker启动容器指定端口和随机分配端口

例子 我要启动tomcat docker run -d -P tomcat 大些-P表示随机分配端口 docker run -d -p 8086:8080 tomcat 小些-p 表示指定端口,主机端口:docker容器端口

华为 思科 配置

华为路由器交换机配置命令:计算机命令 PCAlogin:root;使用root用户 password:linux;口令是linux #shutdown-hnow;关机 #init0;关机 #logout;用户注销 #login;用户登录 #ifconfig;显示…

Windows 7 下IIS 7.5 结合Zend构建PHP集成开发环境

Windows 7 下IIS 7.5 结合Zend构建PHP集成开发环境 作者:宋杨日期:2010年7月4日星期日FeedBack:songyangsongyang.me系统环境:Windows 7 简体中文旗舰版软件环境:1、 IIS 7.5(安装FastCGI)2、 Z…

在docker安装完tomcat后,访问地址出现404错误

在docker安装完tomcat后,访问地址出现404错误 可以看到我们平时访问的文件在webapps文件夹下,而这里的这个文件夹却为空,因为他把文件都放在webapps.dist文件夹下了,所有你只需要把webapps文件夹里面的内容移到webapps里面即可 …

czy的后宫5

题目描述 Description \(czy\) 要召集他的妹子,但是由于条件有限,可能每个妹子不能都去,但每个妹子都有一个美丽值,\(czy\) 希望来的妹子们的美丽值总和最大(虽然……)。\(czy\) 有一个周密的电话通知网络&…

解决Use ‘docker scan‘ to run Snyk tests against images to find vulnerabilities and learn how to fix th

Use docker scan to run Snyk tests against images to find vulnerabilities and learn how to fix them 解决方案 执行如下命令 export DOCKER_SCAN_SUGGESTfalse

上传附件删除、session清空问题

最近因为项目的需要,将客户端附件上传至服务器,附件上传的位置是IIS目录下的文件夹,经过处理之后。必须将该附件删除。 程序发布之后,使用该功能,结果项目无法运行。必须要重新启动IIS才可以重新运行整个项目。因为项目中的Sessio…

浅谈Junit4和TestNG中的参数化测试

最近在看Junit4的相关知识,由于本身做的是自动化方面的测试,所以工作上着重于应用TestNG。恰好遇到了一个将case进行参数化的需求,故在此记录Junit4和TestNG在参数化方面的区别。 一、Junit4和TestNG的注释支持 特点JUnit 4TestNG测试注释Tes…

使用docker查看和删除虚悬镜像

虚悬镜像是REPOSITORY和TAG为<none>的镜像 none镜像(虚悬镜像),那是因为 构建镜像过程中因为脚本错误导致很多镜像构建终止&#xff0c;产生很多none标签的版本 手动构建镜像的时候没有进行提交&#xff0c;遗留来的垃圾镜像 这些镜像占据较大的存储空间&#xff0c;需要…

局部变量、全局变量、堆、堆栈、静态和全局

局部变量、全局变量、堆、堆栈、静态和全局--------------------------------------------------------------- 一般全局变量存放在数据区&#xff0c;局部变量存放在栈区&#xff0c; 动态变量存放在堆区&#xff0c;函数代码放在代码区。 ----------------------------------…

博客园的编辑器毛病真多.....

1.有时候首行插入代码后&#xff0c;想删除代码做不到了——代码可以删除&#xff0c;可是那个框死活删不掉。 2.有时候删除大段内容的时候会突然卡住&#xff0c;然后整个页面回退到初始状态——编辑的内容没了&#xff0c;自动保存中也没有。 3.有时候进入编辑页面能看到编辑…