如何优雅地修改同事的代码

前言

        互联网开发多以团队协同的方式为主,在实际的开发过程中,我们经常会面对在同事的代码的基础上重新开发的需求。然而由于人员的迭代、需求的变更、文档的缺失等原因,我们贸然修改同事的代码往往需要承担一些额外的开发风险,比如修改一个BUG,导致更多的BUG,层层顺延,最后从删库到跑路......

        这是一个大家都不愿提及又不得不面对的问题,修改同事代码很容易引发不可控的开发风险,从而降低开发效率,导致大家无法按时完成额定的开发任务,之后的一系列影响——开发延期、测试时间压缩、线上报BUG、交付质量不合格,则又是这个问题之外的恶性影响了。

        对于程序员而言,我们的职业定位是对于现实问题给出技术解决方案,从而给企业的工作效率带来一定程度的提升,面对这样的行业痛点我们必须要找到一种合适的方式去解决这样的问题,而不是回避、退缩,问题是绕不过去的,而能解决别人解决不了的问题就是我们与众不同的价值体现。

需求分析

        我总结了一下修改同事的代码的需求,主要有以下三类:

        1、非侵入式修改同事的代码。这类需求主要是需要对同事代码进行逻辑的增强,不需要改动原有逻辑。

        2、侵入式修改同事的代码。这类需求主要是需要对同事的原有逻辑进行整体或部分的改动,这是需求本身的改动,这种改动一定程度上可以归结为设计问题,当然如果程序开发需要对设计妥协,我们也往往不得不侵入式地改动同事的代码。

        3、 并行修改同事的代码。两种版本都是项目的需要,可能同时提供,也可能通过某种机制进行回退或切换。

        修改同事的代码无非就是这三类需求,在同事代码的基础上继续开发,需要注意的三是,我们要尽量少地修改原有代码逻辑,把修改原有逻辑转为新增扩展逻辑。

 简单案例

        假设有这样的一个需求:Boss高启强对手下唐小虎说,“告诉老默,我想吃鱼了...”

        唐小虎要如何设计需求呢?

        老板手下有N个杀手,不可能每一次都指定老默,可能今天叫老默,可能明天叫老冯。所以杀手的名字要作为参数传递过去,而不能写死。

        我唐小虎也是上过商学院的,我知道设计遵循依赖倒置原则,高层代码不能依赖底层代码,而是应该依赖其抽象,于是唐小虎是这样的设计代码的:

        抽象接口:

public interface EatService {// 吃的方法void eat(String killer);
}

        具体实现:

public class EatServiceImpl implements EatService {@Overridepublic void eat(String killer) {return "告诉" + killer + ",我想吃鱼了...";}
}

        相信大家也都是这样做的,Boss只要调用EatService的eat方法,传入杀手名字,就可以指定杀手去“吃鱼”。

        然而需求是动态的,当大嫂陈书婷知道这件事后,大嫂陈书婷提出了新的要求,“吃完饭要刷碗...”

        作为杀手,你要把事后的问题处理干净。

        那怎么在不修改原代码的基础上改设计呢?这就用到了代理模式。

public class EatProxyServiceImpl implements EatService {private EatService eatService = new EatServiceImpl();@Overridepublic void eat(String killer) {eatService.eat(killer);postEat();}private void postEat() {System.out.println("陈书婷说,吃完饭要洗碗...");}
}

          我们定义了一个EatProxyServiceImpl,和EatServiceImpl一样,我们需要实现EatService接口,并重写其中的eat()方法,并且把原对象EatServiceImpl注入到该类中,在原对象的前后进行增强逻辑。

        如果Boss高启强修改需求了,说我们不吃鱼了,我们去吃海鲜吧,这又要如何在不修改原代码的基础上改动呢?

public class EatProxyServiceImpl implements EatService {private EatService eatService = new EatServiceImpl();@Overridepublic void eat(String killer) {System.out.println("老默,我们去吃海鲜吧...");postEat();}private void postEat() {System.out.println("陈书婷说,吃完饭要洗碗...");}
}

        其实我们就不需要写eatService.eat(killer)了,我们只需要在代理实现类中加入新的逻辑即可。

        如果Boss说,老客户喜欢吃鱼,新客户喜欢吃海鲜,我们要允许二者同时调用怎么办?

public class EatProxyServiceImpl implements EatService {private EatService eatService = new EatServiceImpl();@Overridepublic void eat(String killer) {eatService.eat(killer);postEat();}private void postEat() {System.out.println("陈书婷说,吃完饭要洗碗...");}public EatService getEatService(){return eatService;}
}

        我们只需要在代理实现中,自定义一个方法,获取旧有实现即可,这样既可以调用老代码,也可以调用新代码。

        我们可以测试一下:

public class GaoQQTest {public static void main(String[] args) {System.out.println("高启强开始调用......");EatService eatService = new EatServiceImpl();eatService.eat("老默");System.out.println("陈书婷进行增强......");EatProxyServiceImpl eatProxyService = new EatProxyServiceImpl();eatProxyService.eat("老默");// 陈泰比较念旧,喜欢调用老的方法System.out.println("泰叔开始调用......");eatProxyService.getInstance().eat("老默");}
}

        测试结果如下:

 

 总结

        代理模式可以很好的解决修改同事代码的问题,我们通过一个简单代理,即可实现侵入式、非侵入式修改以及双版本代码切换,甚至于我们只需要在代理的eat中,根据配置文件的value指定二者之一的任何一个实现,还可以实现线上代码动态切换。

        这个案例是很简单的,但是其背后的设计思路是指的思考的,需求是活的,思路不能是一成不变的,总有一种方式可以优雅地解决当下的需求。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/58409.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java8 map.getOrDefault()你真的了解吗

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。 map.getOrDefault()方法 在Java编程中,Map是一种非常常用的数据结构。Map通常用于存储键值对,其中每个键映射到一个值。当我们尝试访问一个不…

同是打工人,学Python搞副业的朋友跟高启强一样实现逆袭了?

年过完了,现在已经回归工作岗位,接着拧自己的螺丝钉,不过,假期也不算寂寞,追了大热的电视剧《狂飙》。卖鱼小贩高启强的逆袭让我这种打工人太羡慕了,当他坐在白金瀚的办公室里美滋滋的喝着红酒的时候&#…

张杰清唱高启强专属BGM简直就是天作之合,千万别点进来看

张杰清唱高启强专属BGM简直就是天作之合,千万别点进来看,#张杰#BGM#音乐 张杰演唱的《听》狂飙高启强自从出现在抖音上更是火得不可思议,它成为了不少年轻人喜爱的BGM,尤其是用它作为专属BGM的抖音视频更是受到网友的一致好评。 …

老默我想吃鱼了(抽象艺术)

目录 指针地位 代码示例 人物关系 代码分析 总结 指针地位 在C语言中 指针的地位可以说是王中王 代码示例 如下 #define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int main() {int a 15;printf("老默出手前鱼的值:%d\n", a);int* pa &a;*pa 30;p…

冯雷老师:为什么大嫂陈书婷让高启强终生难忘?

高启强对大嫂陈书婷的感情非常深&#xff0c;大嫂死后高启强终生未娶&#xff0c;那为什么大嫂陈书婷让高启强终生难忘呢&#xff1f; 第一、既能助力男人&#xff0c;又识大体懂分寸。在帮助高启强拜泰叔当干爹后&#xff0c;就回归家庭当一个贤妻良母。从不插手老公的生意。…

学术汇报(academic presentation)/PPT应该怎么做?

已经上了研究生两年了&#xff0c;但是一直没有规范过PPT应该怎么做&#xff1f;都是瞎做的&#xff0c;也没有注意过排版什么的&#xff0c;前一段时间被老师批评后&#xff0c;才开始想怎么做好学术汇报&#xff0c;下面将我整理的一些规范和步骤记录下来 一些琐碎的事情&…

阿里、腾讯御用PPT设计师:让你在年终汇报中做最靓的仔!

你知道现在年轻人靠什么赚钱吗&#xff1f; 前几天&#xff0c;知乎上一篇关于“副业”的回答吓我一跳&#xff0c;一个大三学生&#xff0c;只靠副业赚够14W。 14万什么概念&#xff0c;是一个普通白领不吃不喝至少2年的工资。 干什么能一下赚这么多&#xff1f; 他一没抢钱二…

ChatGPT中的提示工程(Prompt Engineering)怎么做?50页最新PPT下载

整理自&#xff1a;专知 在公众号后台回复 Prompt Engineering 即可获取PPT。 ChatGPT爆火之后&#xff0c;也逐渐衍生出一大堆新的概念和机会。提示工程&#xff08;Prompt Engineering&#xff09;便是其中之一。据笔者所知&#xff0c;国内外目前已有提示工程相关的工程师岗…

用 ChatGPT 将 Excel 工作效率提高 10 倍!离做PPT还远吗

源&#xff5c;机器之心 在未来&#xff0c;精通 Excel 或许不再是简历亮点了。 ChatGPT 自去年 11 月 30 日 OpenAI 重磅推出以来&#xff0c;这款 AI 聊天机器人迅速成为 AI 界的「当红炸子鸡」。一经发布&#xff0c;不少网友更是痴迷到通宵熬夜和它对话聊天&#xff0c;就为…

招银网络科技 笔试、面试

1. 笔试 1.1 题目 有16种状态码分别是1-16&#xff0c;本来应该记为{1, 1, 1, 3}&#xff0c;但是由于粗心记为{1113}&#xff0c;题目&#xff1a;求出给定的输入如{1113}能够构成不同状态码的个数。{1113}可以构成{1, 1, 1, 3}, {11, 1, 3}, {1, 11, 3}, {1, 1, 13}, {11, …

招商银行网点管理系统

目录 功能一&#xff1a;查询所有展示 1.根据城市来进行条件查询 2.当进入首页后显示所有网点信息 3.根据城市进行条件查询 功能二&#xff1a;新增网点 功能三&#xff1a;修改网点 功能四&#xff1a;删除功能 功能一&#xff1a;查询所有展示 1.根据城市来进行条件查…

独家 | 招商银行:玩转校园招聘新方式 挖掘金融科技新人才

数字经济时代&#xff0c;金融科技人才队伍的引进与培养是招商银行人才体系建设的关键任务。 01.金融科技校招2大核心课题 招商银行数字化转型过程中&#xff0c;线上化、生态化、平台化、智能化、数据化全面加速发展&#xff0c;对人才队伍能力提出新要求。 2大核心课题&am…

【招商银行数据方向笔试题】—— 信用卡推荐客户列表

题目&#xff1a; 现在信用卡开展营销活动&#xff0c;持有我行信用卡客户推荐新户办卡&#xff0c;开卡成功后可获得积分奖励。规定每个客户最多可推荐两个新户且一个新户只能被推荐一次。但允许链接效应&#xff0c;即若客户A推荐了新户B&#xff0c;新户B推荐新户C&#xff…

金融银行测试面试题分享

1、网上银行转账是怎么测的&#xff0c;设计一下测试用例。 回答思路&#xff1a; 宏观上可以从质量模型&#xff08;万能公式&#xff09;来考虑&#xff0c;重点需要测试转账的功能、性能与安全性。设计测试用例可以使用场景法为主&#xff0c;先列出转账的基本流和备选流。…

CNAPS Code 查询(招商银行)

招商银行的妹子实在太傻了&#xff0c;根本不知道什么是CNAPS Code、联行号&#xff0c;完全答非所问。 最后还是自己搞定了&#xff0c;如图: 最后再看看招行人员的英语水平&#xff0c;真是不知道什么是东西&#xff1a; 我的群&#xff1a;1、Cocos2D&Unity&Java程序…

性能超越GPU、FPGA,华人学者提出软件算法架构加速AI实时化

作者 | 王言治&#xff0c;美国东北大学电子与计算机工程系助理教授 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 近年来&#xff0c;机器学习(Machine Learning)领域的研究和发展可谓是与日俱新&#xff0c;各式各样与机器学习相关的研究成果与应用层出不穷&…

OpenAI到底做对了什么?

OpenAI通过一系列在AI技术和产品上的突破&#xff0c;引爆了通用人工智能&#xff08;AGI&#xff09;的发展&#xff0c;被微软CEO 萨提亚 纳德拉称为“堪比工业革命的技术浪潮”。OpenAI趟出来的以大语言模型为主的AGI技术路线&#xff0c;也基本上宣告了其他AI技术路线的终…

OpenAI到底做对了什么?李建忠研思

OpenAI通过一系列在AI技术和产品上的突破&#xff0c;引爆了通用人工智能&#xff08;AGI&#xff09;的发展&#xff0c;被微软CEO 萨提亚 纳德拉称为“堪比工业革命的技术浪潮”。OpenAI趟出来的以大语言模型为主的AGI技术路线&#xff0c;也基本上宣告了其他AI技术路线的终…

使用chatGPT完成股票价格预测模型

序言 笔者对国内股票的程序API不甚了解&#xff0c;所以使用国外的股票平台Finazon&#xff0c;请读者自行参考。 在本文中&#xff0c;我使用Finazon获取我们想预测的股票的价格时间序列数据&#xff0c;然后&#xff0c;我们将这些数据输入到 ChatGPT 生成的程序中。包括数…

HM-GNN:基于分子-基序异构图神经网络的分子表示学习模型

今天给大家介绍一篇由爱荷华州立大学的Zhaoning Yu 与Hongyang Gao发表在ICML&#xff08;International Conference on Machine Learning&#xff09;上的文章。作者在该论文中考虑学习分子的基序级特征表示以改善分子整体的特征学习&#xff0c;基于此搭建了分子-基序异构图神…