关于源码,设计模式

2020-12-20  本文已影响0人  丑人林宗己

今天跟同学交流关于源码阅读,以及设计模式的一些内容,简单润色总结一下。

误区

新手阅读框架源码最大的误区在于,起点要求大而全,要阅其血肉,还要望其筋骨,结果往往苦其心志却不得其意,反而因为难有进展而放弃。依个人经验而言,非也,学习时要俯瞰全局,架构了然于胸,再寻找突破点,其次以点带面,循序渐进,最终做到知其然且知其所以然。

如何实践

新手如何阅读源码呢?依个人经验可以参考如下:

举个栗子

如何阅读RocketMQ的源码?


新手对于设计模式似乎情有独钟,但学习后最常见的感慨就是,用不到。我看过不少三五年开发者经验的同事,写出的代码略有粗糙,有句话说得好,用着面向对象语言写着面向过程的程序。(PS:我的水平也很差,只是就这么讨论)

误区

如何学会才能把设计模式根植到习惯中?依个人经验而言:

设计模式本身是一种工程实践,属于术的层面,而原则性的指导则属于道的层面。这里我想提一个关于底层思维的指导,称之为‘第一性原理’,新技术层出不穷,底层技术并没有多少变化,设计模式亦如是。

举个栗子

之前遇到一个需求,RocketMQ有时候不够稳定,比如出现过事故,导致MQ大概有10分钟的不可用问题,由于没有做好可靠性优化,很多消息发送失败后记录在日志中,此事要去日志中捞如此多的消息体,简直可怕。

解决的方案:将消息在投递前先落库,落库后在事务成功后投递消息。投递成功后,将库中的消息异步删除,投递失败,通过另外的消息补偿机制来重新投递。(暂不讨论该方案对性能的影响,因为这将会回到业务上来探讨)

论如何写出面向过程的代码?

DAO.save()
success = MQ.send(message)
if(success) {
    DAO.delete(message)
}

如此,这以后要写多少重复的代码?坏味道闻到的人,会想办法去解决。

如果在这个应用把这些重复的东西都抽取出来,是不是就更好了?那别的应用呢?所以放到组件是不是更好呢?

这个需求要怎么设计,我想不同的开发者依据不同的经验会有不同的设计思路,可能也会被时间,人力等等的因素所左右,这个需求是我一年前刚到公司时做的设计,因为当时刚好遇到,我简单说一下我的思路:

最终该功能集成在之前实现的好MQStarter上,类图大概如下(水平很差,欢迎斧正):

image.png

设计模式往往被讨论得很多,很多经验足的人其实相当慎重,因为深知过度设计的后果,但是对于新人还是要勇于实践,勤于思考。如果没有足够的实践经验,又怎么去谈是否过度设计呢?

上一篇 下一篇

猜你喜欢

热点阅读