项目重构之路

这段时间在忙着给公司,一个WPF项目做一些功能,该项目的背景介绍

  1. 两年以上的运维和迭代历史
  2. 有一点点“三层”架构感觉,有View(WPF具体窗口,基本上所有逻辑多在这),Model(没有明确的定义ViewModel,还是数据Model),Bll(提供给View 的是DataSet,DataTable,只是一个提供数据给View封装的地方)
  3. 由于是C/S结构的项目,部署环境考虑,通过WebService 来实现程序和数据库沟通,提供的数据结构,是不易于操作的DataSet,DataTable。
  4. 对象实例化都是通过,单例模式,未加Lock考虑,业务类职责不单一。
  5. WPF窗口后台逻辑太多,各种私有方法,各种事件,堆积在里面,一个窗口后端代码行数 700~1000 之多。
  6. 功能开发前期,分析不够,没有考虑将来的发展设计开发,导致后期运维,在原来的功能上改来改去,是原来成熟功能模块出Bug风险增加。
  7. 没有经过测试流程匆匆发布上线

综上,就是现在这个项目技术背景,和一些现状。

我是因为在里面新增了几个功能模块,在过程中发现开发起来太痛苦,太吃力,才萌生了想重构这个项目想法,但是由于项目还在使用,而且一种特殊环境下,比较依赖一个系统,不能够一下全部重构了,只能一步一步来,在实践中进行重构(拿了一个用户不会使用,但是开发人员会用来配置的功能模块)。

一.已经重构的部分

  1. 新增DataSet,DataTable,DataRow 转换成实体集合和实体 扩展的公共的 Dll(为什么要单独Dll呢,以后所有的扩展方法多可以放在里面,不过我还是给大家推荐一个开源的,写的不错的组件,Z.ExtensionMethods 很牛逼哦,我这个DLL也是参照他的源码写的),之所有要单独加这么Dll,主要有几个用途

(1)  原来的转成实体这个工具,在应用层,就是具体WPF项目,就不能够给BLL 使用,会出现循环引用的问题。

(2)  我的想法是BLL 要回归它应尽责任上来,负责逻辑的事情,而不是单单去调用一下WebServices 把DataSet,DataTable 直接再转到应用层去,现阶段重构任务是想把调用WebService 返回DataSet,DataTable,转到 实体&实体集合,毕竟操作实体比DataSet,DataTable 用得多,首先更加接近于OOP思想,编写逻辑更加得心应手。

  1. 新增 ViewModel Dll,由于原来Model 没有准确定义到底是视图模型,还是数据模型,结构也是比较乱,也不想动到里面东西,而影响其他功能,所有单独新增了这么一个ViewModel 层,来负责视图与Bll 直接数据交互。
  2. 把原来Bll 层,责任担当给提起来,将WebService 返回DataSet,DataTable 转换成实体&实体集合,把应用层后端业务逻辑,移到BLL层。
  3. 建立开发版,测试版,发布版分支,严格走测试流程。

二.未重构的部分的一些想法

  1. 业务层,具体每个类,实例化都用单例模式,从直观来讲,业务类不应该自己负责实作实例化工作的代码,而应该交由使用方来实作。(其他什么高深理解我暂时没有。。),所有将来我的想法

(1)  新增 业务接口组件,与现在业务层呼应

(2)  在应用层,通过IOC 框架,依赖注入来实例化具体业务逻辑,计划使用Autofac 组件。

  1. WebService 换成WebApi,主要考虑WebService 太过笨重,对于这种C/S 架构的项目,我觉得用WebApi 提供json 数据结构,会比较轻量,易于操作,性能也好点,特别是现在JSON 比 XML 流行的时代
  2. WebApi 负责提供数据,但是不再是DataSet,DataTable 数据结构,而是Json。再编写一个HttpClient 帮助类库,来封装调用WebApi 方法,且利用方能的泛型,将Json序列化成具体 实体&实体集合。
  3. 利用MVP & MVVM 架构模型,来架构更加清爽点,比喻窗口中 控件事件,其他的一些控制逻辑,移到具体的一层里面,是窗口不至于太多代码。
  4. 功能实现时,把用到相关部分尽量设想未来是否在哪里也能够使用到,要封装成公用的组件,以供其他功能重用。
  5. 业务逻辑层,尽量做单元测试。减少Bug产生几率,提供项目品质。

以上最近项目中的总结和想法,由于能力有限,有些地方还只是想,没有实践过,希望大家多交流。

时间: 2024-10-22 03:29:29

项目重构之路的相关文章

Android 项目重构之路:实现篇

前两篇文章<Android项目重构之路:架构篇>和<Android项目重构之路:界面篇>已经讲了我的项目开始搭建时的架构设计和界面设计,这篇就讲讲具体怎么实现的,以实现最小化可用产品(MVP)的目标,用最简单的方式来搭建架构和实现代码. IDE采用Android Studio,Demo实现的功能为用户注册.登录和展示一个券列表,数据采用我们现有项目的测试数据,接口也是我们项目中的测试接口. 项目搭建 根据架构篇所讲的,将项目分为了四个层级:模型层.接口层.核心层.界面层.四个层级之

Android 项目重构之路:界面篇

在前一篇文章<Android项目重构之路:架构篇>中已经简单说明了项目的架构,将项目分为了四个层级:模型层.接口层.核心层.界面层.其中,最上层的界面,是变化最频繁的一个层面,也是最复杂最容易出问题的一个层面,如果规划不好,很容易做着做着,又乱成一团了. 要规划好界面层,至少应该遵循几条基本的原则: 保持规范性:定义好开发规范,包括书写规范.命名规范.注释规范等,并按照规范严格执行: 保持单一性:布局就只做布局,内容就只做内容,各自分离好:每个方法.每个类,也只做一件事情: 保持简洁性:保持代

(转)Android项目重构之路:实现篇

前两篇文章Android项目重构之路:架构篇和Android项目重构之路:界面篇已经讲了我的项目开始搭建时的架构设计和界面设计,这篇就讲讲具体怎么实现的,以实现最小化可用产品(MVP)的目标,用最简单的方式来搭建架构和实现代码. IDE采用Android Studio,Demo实现的功能为用户注册.登录和展示一个券列表,数据采用我们现有项目的测试数据,接口也是我们项目中的测试接口. 项目搭建 根据架构篇所讲的,将项目分为了四个层级:模型层.接口层.核心层.界面层.四个层级之间的关系如下图所示:

(转)Android项目重构之路:界面篇

在前一篇文章<Android项目重构之路:架构篇>中已经简单说明了项目的架构,将项目分为了四个层级:模型层.接口层.核心层.界面层.其中,最上层的界面,是变化最频繁的一个层面,也是最复杂最容易出问题的一个层面,如果规划不好,很容易做着做着,又乱成一团了. 要规划好界面层,至少应该遵循几条基本的原则: 保持规范性:定义好开发规范,包括书写规范.命名规范.注释规范等,并按照规范严格执行: 保持单一性:布局就只做布局,内容就只做内容,各自分离好:每个方法.每个类,也只做一件事情: 保持简洁性:保持代

Android 项目重构之路:架构篇

去年10月底换到了新公司,做移动研发组的负责人,刚开始接手android项目时,发现该项目真的是一团糟. 首先是其架构,是按功能模块进行划分的,本来按模块划分也挺好的,可是他却分得太细,总共分为了17个模块,而好几个模块也就只有两三个类而已.但应用本身其实比较简单,要按功能模块来分的话,最多五个模块就够了. 另外,有好多模块划分也很模糊,也有很多类按其功能其实可以属于多个模块的,也有些类定义不明确,做了不该做的事.有时候,我要找一个界面的Activity,按照其功能应该属于A模块的,可是在A模块

Android项目重构之路:实现篇

项目搭建 根据架构篇所讲的,将项目分为了四个层级:模型层.接口层.核心层.界面层.四个层级之间的关系如下图所示: 实现上,在Android Studio分为了相应的四个模块(Module):model.api.core.app. model为模型层,api为接口层,core为核心层,app为界面层. model.api.core这三个模块的类型为library,app模块的类型为application. 四个模块之间的依赖设置为:model没有任何依赖,接口层依赖了模型层,核心层依赖了模型层和接

Hybird框架UI重构之路:四、分而治之

上文回顾:Hybird框架UI重构之路:三.工欲善其事,必先利其器 上一篇文章有说到less.grunt这两个工具,是为了css.js分模块使用的.UI框架提供给使用者的时候,是一个大的xxx.js.xxx.css,但在开发时候,必须划分模块. CSS模块划分 1.variables.less 这里面是一些样式的变量.函数 例: 字体: @baseFontSize: 20px; 圆角: .rounded-corners (@radius: 5px) { border-radius: @radiu

Hybird框架UI重构之路:五、前端那点事儿(HTML、CSS)

上文回顾 :Hybird框架UI重构之路:四.分而治之 这里讲述在开发的过程中,一些HTML.CSS的关键点. 单页模式的页面结构 在单页模式中,弱化HTML的概念,把HTML当成一个容器,BODY中显示的主体内容才是页面,一个HTML容器中可以存放1个或者多个页面,每个页面放置于section中.而一个页面(section)中必有主体内容(content),也有可能包含头部内容.底部内容,甚至一些侧滑菜单等. 所以,以我们通常看到的一个移动应用的界面中包含了顶部Title和主体内容的页面代码如

Hybird框架UI重构之路:三、工欲善其事,必先利其器

上篇回顾:Hybird框架UI重构之路:二.事出有因 工欲善其事,必先利其器,事是重构的目标,器是开发环境. 这篇文章将讲述重构时的UI框架的目录结构,且需要使用的开发工具. 目录结构 demo : 开发框架的模板(单页模式) demo-muti : 开发框架的模板(多页模式) demo-scene : 示例模板.一个完整的示例,目的是给使用者稍作修改就可以使用在项目上. demo-template : 给使用者使用的开发模板. demo-whole : 可在PC上演示的示例模板 dist :