最近接手到一个已经成型的项目,然后我们的任务就是对它进行重构,这个项目是一个功能很齐全的WPF视频播放器(附带很多其他功能),在仔细研究了项目的背景和架构以后,初步做出了一下的重构方案:
目前现状:
虽然整个系统做得很漂亮,代码也写得不错,但仍有以下不足:
- 1, 架构有待改善。虽然看似MVC架构,却没有遵循MVC的模式,里面逻辑和UI耦合很高,没有清晰的规律。
- 2, 没有充分用到WPF的特性。WPF除了给我们很多炫丽的效果外,还给我们提供了诸如Binding,command等特性,这些特性可以帮我们隔开耦合,同时减少代码量。
- 3, 代码和文件没有组织。代码、dll、样式文件和资源文件等没有统一的组织,到处都有,这样看起来就会很混乱。
- 4, 没有建立公用代码库。没有把公用的代码库独立出来,很多地方都是另外在写,这样既增加了代码量,同时维护和重构也带来了麻烦。
- 5, 逻辑处理不应暴露在Client端。项目是一个C/S架构的系统,没有必要把所有的逻辑都暴露在Client端,应该用分布式把Logic放在服务器端,这样可以更安全同时使客户端变小。
- 6, 没有单元测试。这样一个庞大的程序,没有单元测试是非常危险的,我们不可能做到100%的覆盖率,但是我们可以对主要的逻辑和Function做单元测试,这样既减少了测试人员的工作量同时整个系统的安全、稳定和可维护性得到了大大的提高。
- 7, 性能不够优化。启动项目,通过WPF性能工具Perforator和Visual Profiler分析得出,程序启动和界面操作都导致CPU很高,内存也消耗比较多。
解决方案
- 1, 针对缺陷1的“架构问题”。做法是采用MVP或者MVVM模式,目前正在对比和考虑。
- 2, 针对缺陷2的“WPF特性”。做法是充分利用Binding,command等特性。
- 3, 针对缺陷3的“代码和文件没有组织”。做法是建立一些单独的工程或者文件来分类和组织这些代码,并且充分隔离耦合。
- 4, 针对缺陷4的“没有建立公用代码库”。做法是把一些公用的代码和常用的代码做成单独的Dll,并且有完整的单元测试,这样才能提高效率。
- 5, 针对缺陷5的“逻辑处理不应暴露在Client端”。做法是用WCF做为中间层,把业务逻辑全部进行封装,通过WCF提供统一的接口供项目调用。
- 6, 针对缺陷6的“没有单元测试”。做法是不管用MVP还是MVVM,我们起码保证对逻辑组件的代码有充分的单元测试覆盖,同时对一些公用的组件也要有单独的单元测试代码。
- 7, 针对缺陷7的“性能不够优化”。这个我会单独做一个性能优化列表出来,针对耗资源的操作和其他有损害性能的操作,我们应该避免。
- 那么我们就可以结合实际情况搭建如下的结构
-
- 因为使用了MVVM模式,所以UI结构图就做如下调整
-
- 由于整个项目客户部希望我们引用第三方的组件或者工具,所以很多功能都只能通过企业库实现,比如AOP和IOC,log和exception对项目特征做了定制化,数据访问通过企业库重写实现局部ORM,对性能要求比较高的应用仍然实现存储过程。对所有事务操作都转移到数据库,邮件使用JOB进行发送。大型数据和客户要求较高的实时操作,用MSMQ和SSB相结合的方式。层次依赖关系
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: 该层次的各个模块是整个系统框架中最底层的,只会在运行时被更高层次的模块依赖和调用,同时该层次内部各个模块之间也存在依赖和运行时调用关系.
整个架构采用迭代的方式进行开发,这样方便客户进行实时反馈,由于现在还没有开始,所以有很多时间进行准备,如果园子里有这方面经验的朋友,也可以畅所欲言,谢谢!
分享到:
相关推荐
【项目重构方案设计】 在对一个成熟的WPF视频播放器项目进行重构时,发现了一些关键问题,主要包括架构问题、未充分利用WPF特性、代码和文件组织混乱、缺乏公用代码库、逻辑处理过于集中于客户端、缺乏单元测试以及...
【项目重构方案设计】 在接手一个成熟的WPF视频播放器项目后,为了提高其质量和可维护性,重构工作显得尤为重要。当前项目存在多个不足之处,包括架构问题、未充分利用WPF特性、代码和文件组织混乱、缺乏公共代码库...
良好的设计是重构的目标,而重构则能弥补设计中的不足,使设计方案更加简洁。通过重构,设计人员可以避免过度设计,只需先找到合理解决方案,后续实践中再根据实际情况优化。 识别代码的“坏味道”是重构的重要步骤...
设计模式则为解决常见问题提供了标准的解决方案,可以用于指导重构的方向。 《重构-改善既有代码的设计》不仅仅是一本技术书籍,更是一本关于软件工程思想的书。它提倡的不仅是技术上的技巧,更是对软件开发过程的...
7. **头脑风暴**:在重构之前进行充分的讨论和规划,确保方案的可行性和有效性。 #### 六、总结 重构是一项既需要技巧又需要耐心的工作。通过遵循温昱老师的五步技能链,以及相应的原则和指南,开发者可以有效地...
项目重构关注的是项目管理层面,当项目遇到危机或者在进行中发现之前的计划和实施方式存在根本性错误时,就需要进行项目重构。项目重构可能包括: - 重排项目的优先级和任务列表 - 重新定义项目目标和范围 - 优化...
企业智慧CRM平台重构设计与建设项目实施技术方案 本文档旨在对企业智慧CRM平台的重构设计与建设项目实施技术方案进行详细的描述。该方案旨在解决当前企业CRM平台存在的种种问题,提高业务效率,提高客户 ...
Martin Fowler 在《重构:改善既有代码的设计》一书中提出了重构的概念,并指出了重构的三个主要目标:改善软件设计、提高代码质量以及增强代码的可维护性。这些目标直接关联到软件项目的长期发展和成功。 而关于...
针对这些问题,重构方案应着重于以下几个方面: 1. **分离职责**:将GameUI类的用户界面与业务逻辑分离,创建独立的控制层(如Controller)来协调两者间的交互,以符合单一职责原则。 2. **降低耦合**:减少GameUI...
源码部分可能包含了一些常见设计模式的实现,以及在实际项目中进行重构的示例。通过学习和分析这些源码,读者可以更好地理解和掌握如何在实际开发中应用设计模式和进行重构。 总之,设计模式和重构是提升软件质量的...
在《企业智慧CRM平台重构设计与建设项目实施技术方案》中,我们详细探讨了如何对企业现有的CRM系统进行升级和优化,以适应不断变化的商业环境和提升客户体验。本方案旨在提供一个全面的技术路线,确保重构设计的顺利...
【重构方案集_2013101】是一份针对C#代码的重构计划,旨在提高代码质量、可读性和可维护性。这个计划分为多个阶段,涉及到多个类的调整和封装,主要包括Material类、FreeGas类、ParticleState类以及Geometry类的操作...
《代码重构设计高清版》这一图书资源集合了两本对开发者有着极大助益的书籍,它们分别是《深入理解Spring Cloud与微服务构建》和《重构-改善既有代码的设计》,集中探讨了微服务架构构建和代码重构的深入知识,为...
4. **遵循设计模式**:在重构的过程中,应该参考并遵循一些已知的设计模式,这些模式已经被证明是有效的解决方案,可以帮助开发者更好地组织代码。 #### 四、重构技巧 本书中提供了大量的重构技巧,包括但不限于...
本项目为基于Java语言的动物园管理系统设计源码重构方案,总计包含26个文件,其中包含10个Java类文件、10个Java源代码文件、4个XML配置文件、1个Git忽略文件以及1个IML项目文件。该方案旨在优化动物园管理系统的架构...
读者可以通过分析书中的案例,学习如何在真实项目中应用这些重构与模式的理论知识,从而提高软件设计的质量和效率。 总结而言,《重构与模式》一书提供了系统性的理论框架和实用的实践指南,旨在帮助开发者通过重构...