最近项目重构的一些感想

1. 缘起

最近,因为多个因素综合作用的情况下,我有幸得以负责一个项目的重构事项,并且时间/空间上都是相当宽松。而且由于系统较为复杂,需要对接多个业务开发部门,导致各种大需求小需求特别多,因此如果我代码设计得烂,那么我就要面临加班擦屁股的尴尬局面。这也导致了我不敢随意写烂代码,尽量避免各种『破窗效应』。因此想记录一些比较杂碎的感想,基本上是想到哪写到哪,不会注重文章的结构布局。

2. 面向对象仍然是主流的设计风格

这里要理解什么是面向对象,而不是去背教材中的『封装,继承,多态』。软件开发本来就是讲究实践的东西,背教材是最没用的。『封装,继承,多态』可能恰恰是最不重要的,重要的是这些:

  1. 什么是『控制反转』,什么是『依赖注入』,除了在Spring/Angular这样的框架中见到之外,对我们实际设计代码有什么实际的启示。

  2. 什么是『SOLID』原则,有什么实际启示,哪些很容易做到,哪些看似容易实际上很难做到。

3. 世界是有状态的,导致我们的代码也是充满了各种各样的状态

这其实是第一点的原因,大概也是面向对象风格流行的原因?各种各样的,肮脏的状态,可以让其隐藏在一个又一个的class后面,从而限制其影响范围。

4. 什么是『组合』,什么是『组合优于继承』

『组合优于继承』,至今不知道是什么意思,也没有见到比较有说服力的答案。我感觉这句话很像『高内聚低耦合』这样很正确但是没有什么实际作用的废话。比如『装饰器模式』是组合一个很经典的例子,OK,讲完『装饰器模式』之后,我大概懂了这个模式,但是我还是没懂『组合优于继承』这句话的具体意思。大概只能靠意会了吧?

5. 『继承』没有那么不堪,『多继承』可能要避免

承接上一段。貌似总有人将『组合』与『继承』对立起来,然后有选择地举几个例子,说『继承』哪哪不好,『组合』哪哪好,然后得出上面那句话的结论。这种文章一般犯了『幸存者偏差』的错误,一般也夹带了很多私货,没有啥营养。

其实我倒觉得,没有孰优孰劣,因为两者只不过是两种不同的手段而已,比如吃饭可以用刀叉,也可以用筷子,解决问题还是要看场景。继承没有大V们吹的那么恶心,毕竟也是根据实际问题而发明的手段,总不能一点用处也没有吧?简单用用其实挺好的,也能重用很多代码。

但是Java有种特别不好的风气,就是搞巨多class,然后设计很复杂的继承(接口)关系,层层封装,真实意图往往隐藏在层层代码之后。更有甚者,几乎每一个class都搞一个interface,美名其曰为拓展设计,其实是『过度工程』。这种风气下来,让人写Java缺少快乐的感觉,我猜大V批判Java主要是指的这个吧。

反正我写Java是挺快乐的,想到哪写到哪,也不刻意搞很多interface,大不了到后期再提取interface就行了,反正现在的IDE工具都是这样强大。

6. 『设计模式』很有用

这个东西真是强求不得,如果是强行搞『设计模式』,基本死得很惨,还不如不搞。在项目重构的过程中,我主要使用了『工厂方法、模板方法』这几个模式,搞出来的代码确实让人感到赏心悦目。特别是『模板方法』模式,我们的业务过程中有太多场景适合这个模式了,我几乎全部都使用了它,改起Bug来嗖嗖的。

7. OOP 与 FP

OOP懂一点,FP基本不懂,不懂得领域,就不随意评论了。对于FP,我发现一点,就是总有人拿它和OOP进行类比,列举出个OOP的几个缺点和FP的几个优点,然后将OOP批判一番,然后得出『FP更优』的结论。讲真,计算机世界的很多概念和事物,是不适合用类比来理解的,就像人的食指和中指,在实际生活中,各自完成不同的功能,各司其职,从而使我们能完成各种各样的动作。如果你硬是将其对立起来,有其一就不能有其二,这不扯淡吗?OOP和FP同理,本来就是两种不同场景下的手段,如果硬是将它们对立起来,得出个孰优孰劣的结论,反而没有什么意义。各司其职,融合着使用,才是解决之道。

8. 分层思路

任何软件都是分层的,分层可以显著降低人脑思考的难度,从而设计更加大型的软件。在这种语境下面,『模块化』『分层』等概念,基本上是某种概念的不同侧重点,基本上是同一个意思。

但是分层也不能太细太碎太多,这样基本走向了反面,带来了累赘。『中庸之道』才是硬道理,得靠大量积累的实际经验。

9. 《重构》、《Clean Code》

两本好书,很影响人。看了好几遍了,每次看都有新的收获,看得次数越多,逐渐地会吸收作者『只可意会不可言传』的某些内容,:)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
项⽬重构⽅案设计 最近接⼿到⼀个已经成型的项⽬,然后我们的任务就是对它进⾏重构,这个项⽬是⼀个功能很齐全的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. 针对缺陷1的"架构问题"。做法是采⽤MVP或者MVVM模式,⽬前正在对⽐和考虑。 2. 针对缺陷2的"WPF特性"。做法是充分利⽤Binding,command等特性。 3. 针对缺陷3的"代码和⽂件没有组织"。做法是建⽴⼀些单独的⼯程或者⽂件来分类和组织这些代码,并且充分隔离 耦合。 4. 针对缺陷4的"没有建⽴公⽤代码库"。做法是把⼀些公⽤的代码和常⽤的代码做成单独的Dll,并且有完整的单元测 试,这样才能提⾼效率。 5. 针对缺陷5的"逻辑处理不应暴露在Client端"。做法是⽤WCF做为中间层,把业务逻辑全部进⾏封装,通过WCF提 供统⼀的接⼝供项⽬调⽤。 6. 针对缺陷6的"没有单元测试"。做法是不管⽤MVP还是MVVM,我们起码保证对逻辑组件的代码有充分的单元测试 覆盖,同时对⼀些公⽤的组件也要有单独的单元测试代码。 7. 针对缺陷7的"性能不够优化"。这个我会单独做⼀个性能优化列表出来,针对耗资源的操作和其他有损害性能的操 作,我们应该避免。 8. 那么我们就可以结合实际情况搭建如下的结构 9. 10. 因为使⽤了MVVM模式,所以UI结构图就做如下调整 11. 12. 由于整个项⽬客户部希望我们引⽤第三⽅的组件或者⼯具,所以很多功能都只能通过企业库实现,⽐如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: 该层次的各个模块是整个系统框架中最底层的,只会在运⾏时被更⾼层次的模块依赖和调⽤,同时该层次内部各个模块之间也 存在依赖和运⾏时调⽤关系.  

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值