为何我发起你学会抄代码
抄代码,是一个国际习俗。https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604232954505-1055758793.png
学习 Java 8年了,我一直刚强不移地“抄”代码:
[*]“抄”同事
[*]“抄”框架
[*]“抄”GPT
有黑子会问,你天天自吹技能专家了,天天就知道抄?对此,我只想说,是的,咋滴?
初级步伐员和高级步伐员最大的区别在哪里?:
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604232955515-673873092.png
1 为啥就知道抄?
“抄”,听起来让人不舒服?技能人嘛,咋能叫抄呢,应该叫:造轮子。不外似乎也被诟病,大佬们肯定劝你:年轻人不要重复造轮子,你的统统发明不外是发现!
首先,造轮子是你眼前已经有一个轮子了。即你有现成可模仿对象,而且这个轮子一般出奇地圆,圆到你觉得它很美。这有助于提高你的代码咀嚼。
其次,造轮子并不简单,它每每会用到很多高级的知识点和技巧。以Java为例,如果你要造一个,你最少要懂:
[*]JDBC
[*]反射
[*]泛型
[*]注解
[*]动态代理
[*]函数式编程
[*]策略模式
[*]模板方法模式
[*]....
为了造这样一个轻微像样点的轮子,你必须强迫自己搞懂这些高级知识点,并且结合自己的需求灵活运用。
最后,轮子造完跑起来以后,一定会遇到各种问题,解决问题的过程中你又得到成长。
抄袭是有点儿可耻,但实在是鼓励刻意练习,学习良好的代码并模仿,找机会把它用到生产。提高编码本事,就是干到生产。
2 咋抄?
绝大部分步伐员的绝大部分时间都在抄别人的代码,只不外潜意识觉得自己在原创。咋“抄”才有用呢?结合现实需求,做好“本地化”。来看案例。
3 造轮子标准流程
3.1 发现问题
某日发现项目有接口不稳定,时不时就调用失败。排查发现调用一个云厂商的SDK,但接口不稳定,偶尔网络错误。简单,直接for循环多调用频频:
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604232957270-653239975.jpg
正当我准备改代码,职业习惯促使我全局搜下项目,发现已有好几处类似重试代码段。
是时间重构做个工具方法抽取了。
3.2 整理需求
但把好几处类似代码摆在一起对比:
[*]有些方法有返回值、有些方法没有返回值
[*]有些方法抛异常时重试
[*]有些方法内部捕获异常,通过判断Result.isSuccess()判断是否重试
唉算了,看有没有现成完善框架吧:
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233001968-39883548.png
果然,依旧是救世主 Spring!
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233003774-684543225.jpg
但一看,这么复杂,杀鸡焉用牛刀?还是再封装一个吧!
3.3 粗糙版
首先,确定要用函数式接口+[泛型]。使用泛型是看重其代码模板本事,如重试代码中都有for循环,就可抽取为模板。[函数式接口]可很方便地把代码中变革的部分和稳定的部分剥脱离,如需要重试的方法都是不同的,可以通过函数式接口剥离出去:
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233007020-1552539183.jpg
兼容下没有返回值的处置惩罚:
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233009030-2001201867.jpg
再继承不断完善。
3.4 +重试次数、时间间隔
一旦失败立即重试,很大概率还是失败,给卑鄙造成更大负担。看其它大佬咋处置惩罚的,如Guava:
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233012520-791709256.jpg
不错,一看就懂,抄之:
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233015694-307005422.jpg
3.5 +异常处置惩罚
最后一次重试仍旧失败时,还想捕获异常呢?由于目前工具直接写死,只能在外捕获:
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233016339-1357067894.jpg
优化下,使其优雅一点点,风格统一一点点:
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233019464-1684945067.jpg
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233021267-306314290.jpg
在里面顺便处置惩罚异常
3.6 +结果重试
最后一个问题,现在代码里很多重试的地方并不会[抛异常],而我们上面的重试都是依赖于抛异常,只有抛异常才会重试!如不抛异常,咋指定[重试规则]?
学Guava:
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233024500-1702020422.jpg
继承“抄”(结果重试只针对有返回值的,上面演示的都是无返回值的方法):
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233033441-1313435348.jpg
3.7 +Builder模式
简化使用。一个Util能做的,原则上不需要Builder额外创建对象浪费内存。但上面这方法参数太多!
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233035103-839621344.jpg
改造成Builder:
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233037590-747343659.jpg
4 总结
以上这些过程,你想清楚了,作为一个 SOP,以后就能指示 GPT 去写好一个轮子了,当然最快的还是用别人造好的现成轮子吧!虽然经历这么多,你个人简直对如何使用各种高级语法和造轮子有一些现实履历了。
再回首,一开始搜到的Spring Retry太复杂了,但Guava就蛮好用,生产还是直接用Guava吧。
究竟能直接拿来用在生产的,何乐而不抄呢?难道你不想六点下班?
https://img2024.cnblogs.com/other/1097393/202406/1097393-20240604233122971-330817081.png
关注我,紧跟本系列专栏文章,咱们下篇再续!
作者简介:魔都技能专家,多家大厂后端一线研发履历,在分布式体系、和大数据平台设计等方面有多年研究和实践履历,拥有从0到1的大数据平台和基础架构研发履历,对分布式存储、数据平台架构、数据堆栈等领域都有丰富实践履历。
各大技能社区头部专家博主。具有丰富的引领团队履历,深厚业务架构和解决方案的积累。
负责:
[*]中心/分销预订体系性能优化
[*]运动&优惠券等营销中台建设
[*]生意业务平台及数据中台等架构和开发设计
[*]车联网焦点平台-物联网连接平台、大数据平台架构设计及优化
目前主攻低落软件复杂性设计、构建高可用体系方向。
参考:
[*]编程严选网
本文由博客一文多发平台 OpenWrite 发布!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]