敏捷开发松结对编程系列之十四:一些重构而不影响他人的编程诀窍

AI编程准确率提升指南:提示词、上下文与验证闭环 随着大语言模型技术的高速发展,AI编程助手已成为软件工程领域的热门工具,但生成代码“看似合理却跑不通”的问题时常困扰开发者。其底层原理在于模型通过概率生成文本,面对模糊指令时天然存在幻觉,而真正决定准确率的杠杆在于输入约束与反馈机制。从工程实践角度看,通过结构化提示词定义任务边界、注入项目技术栈和业务规则等富上下文信息,再辅以测试用例和编译检查形成验证闭环,能显著提升代码生成的可落地性。该能力在需求接口实现、Bug修复、单元测试生成等典型应用场景中,可有效降低返工成本,并推动团队从“个人效率”走向“组织资产 阅读详情

本文是“松结对编程”系列的第十三篇。(松结对编程栏目目录)

松结对编程包括L型代码结构的一个很大的问题,是在于由于人们复用了太多的代码,以至于所有代码牵一发而动全身。这很容易导致一个底层库改动后,很多地方编译不通过,或编译通过但运行不通过。

本人曾经担任过底层库的编写者,在修改和维护底层库的过程中遇到了很多问题,也发现了一些诀窍,下面是一些编码级别的处理诀窍。这些诀窍其实都写在教科书上,学习和使用起来也很简单,只是到用的时候,被很多人忽略了。

1. 缺省参数

如果要给一个函数增加一个新的变量,因这个变量的不同而产生新的行为方式,那么缺省参数是一个很好的避免之前的代码需要相应改动的方法。
比如:
        public static MvcHtmlString ImageLink(string text, string url, bool showInNewWindow = false, bool showText = true,
                                              bool showImage = true, string title = null, string outerLink = null,
                                              string imgUrl = null, string imgSuffix = "16.png",
                                              string imgCssClass = "icons", string updateTargetId = null,
                                              string display = null,
                                              string onSuccess = null, bool runOnSuccessWhileLeft = false,
                                              string id = null, string imgStyle = null, string cssClass = null,
                                              string textColor = null,
                                              bool displayAsText = false, string displayAsTextSuffix = null, string displayAsLinkSuffix = null,
                                              WebViewPage returnTo = null, string returnUrl = null)
这个被维护过无数次甚至有点过度设计的函数,能显示为文字链接,能自动搜索图标,能作为在Ajax连接使用,能根据当前值选择显示为文字还是链接……但最朴素的用法,始终保持为Text和Url两个参数,比如:
 @MFCUI.ImageLink(item.Title, "/MFC/Items/Edit?id=" + item.ID)
这样初期的、简单的调用就不用修改。

2. 重载或重写一个函数

如果变化太大,重载乃至重写一个新的函数会更好一些。
下面这一大堆,都是火星人中为了解决个人对产品的可访问性问题的,但具体应用场景有很小的变化。为了防止每次都多那么几行代码产生变化,干脆把差别封装在函数内部。
        public static IEnumerable<Product> ProductsAccessibleToUser(string user)
        {
            var productsAccessibleToUser = new List<Product>();
            foreach (var teamID in Department.TeamsContainUser(user).Select(i => i.ID).ToList())
            {
                productsAccessibleToUser.AddRange(ProductsAccessibleToTeam(teamID));
            }
            return productsAccessibleToUser.Distinct();
        }

        public static IEnumerable<int> ProductsAccessibleToUserIDs(string userName)
        {
            return ProductsAccessibleToUser(userName).Select(i => i.ID);
        }

        public static string ProductsAccessibleToUserIDsString(string userName)
        {
            return ProductsAccessibleToUserIDs(userName).Aggregate<int, string>(null, (current, id) => current + (id.ToString() + "_"));
        }

不过,重载和缺省参数之间要做一个平衡,比如上面那个ImageLink,很多参数都是交叉的,就不适合重载。当初曾经想把普通的LInk和AjaxLink分开,但发现分开或不分开,都需要textColor之类的参数,所以后来实际的做法是把里边的代码再行分别建立函数,以减少单个函数的长度。

3. 虚函数(多态,virtual,override)

虚函数的目的,是为了“让今天的代码,调用明天的功能”。
当年刚刚听说虚函数有这么大本事,大吃一惊。如果你正在担心明天增加了新的功能,还得修改今天的代码,那么肯定就需要求助虚函数了。
比如下面这个场景:程序员A正在写一个显示各种Notice的界面,而设计“各种Notice”的是B,而且他经常增加新的类型。这时候虚函数就可以派上用场。
    public class NoticeItemAssigned : Notice
    {
        public override MvcHtmlString Information(string user)
        {
            var result = base.Information(user).ToString();
            result = result.Replace("[P1]", UDCValue.ShowAsUsersLink(P1).ToString());
            result = result.Replace("[P2]", UDCValue.ShowAsUsersLink(P2).ToString());
            return new MvcHtmlString(result);
        }
    }
比如上面的NoticeItemAssigned及其他类型的Notice,要显示它们的Information,都只需要调用@notice.Information(user);但至于显示出来的结果是什么,则由其override后的函数来决定。

"为什么我很少用虚函数?"很可能是用了太多的switch-case所致。
如果用switch-case来处理各种notice的显示结果,那么就需要通过增加新的分支,来处理新的显示方法。这个最大的坏处是:刚才说的A和B两个程序员就要经常交叉工作。而一旦A离职了,B每次增加新的类型,都要去到A的代码里边去改动,极其危险。
火星人的11000行代码中,只有6个switch-case,其中两个似乎也可以用虚函数避免。

其他的还有很多手段来防止维护代码影响之前的代码调用,但这三个是最常用的,可以说在团队代码有交叉的时候,每个人都必备上述技能才可能和谐工作。
刚开始一般只有师傅具备完全使用上述功能的能力,但随着徒弟们的能力提升,可以逐步尝试让徒弟也掌握这些技能,从而可以帮助师傅维护底层库。
自组织团队与松结对编程 陈勇 2011-09-18 2011-10-12在微软tech ed大会上的讲稿 立即下载

相关推荐

PairProgramming(结对编程)

我的第一次Pair(PairProgramming的简称,即结对编程。后面都是用Pair代替)是在ThoughtWorks公司面试进行的。那次,他们来自英国的项目经理Andy面试我,和我一起进行Pair。Andy问我以前是否Pair过,我说:“没有,这是我第一次Pair”。随即他就告诉我:“It’sveryfun.(它非常有趣)。”就这样,开始了我的第一次Pair,也是加入TW最重要的一轮面试。其实,刚开始很不习惯,我那可怜的英语口语,陌生的测试优先开发(TDDTestDrivenDevelopment一种软件开发方式,先写单元测试代码,再写业务代码。我以前也写过很多单元测试,但从没有测试优先

敏捷开发“松结对编程”

【转载按】非常棒的关于敏捷开发执行模式的系列文章。共5章。【原文】敏捷开发“松结对编程”实践之一:人员结构篇(大型研发团队,学习型团队,139团队,师徒制度)http://blog.youkuaiyun.com/cheny_com/article/details/6581517敏捷开发“松结

技术拾遗 501

VSCode+ESP-IDF开发环境搭建:从零开始创建你的第一个物联网项目(2024最新版)

本文详细介绍了如何在2024年使用VSCode和ESP-IDF搭建物联网开发环境,从零开始创建第一个物联网项目。内容包括环境准备、ESP-IDF配置、项目创建与结构解析、构建烧录步骤以及高级技巧和常见问题解决方案,帮助开发者快速上手ESP32开发。

weixin_29165725的博客 330

敏捷开发“松结对编程”实践--日常工作篇

团队中常见的一种情况计划、估算、设计的时候大家还在一起,但编程的时候就会分开。分开看似是安全的,但是却充满隐患。   2001年,一位招聘考试前三名(一共120员工)的程序员的两个月的成果被彻底放弃重写,原因是里边包含3000多个常数,而且很难修改(码 流参数),重写的人座位距离他只有4米,重写也只花费了2周;2002年,一位月薪7000(那时候北京房价才3000多)的程序员编写了一个...

优快云1332531529的博客 232

ROS2实战:打造智能巡检机器人的关键技术与实现

本文详细介绍了基于ROS2和Navigation2构建智能巡检机器人的完整实战流程。通过设计主从协作的事件驱动架构,实现了机器人在已知地图中的自动导航、定点语音播报和环境图像采集功能。文章涵盖了从环境搭建、仿真配置到核心控制节点、语音服务与图像记录模块的代码实现,为开发者打造实用的自动巡检机器人提供了清晰的技术指南。

weixin_29031057的博客 223

基于RTL8370N的8口千兆无管理交换机硬件设计

无管理交换机是局域网边缘接入的核心基础设备,其本质是通过硬件状态机实现MAC地址学习、线速转发与自动协商,无需软件配置即可完成即插即用组网。原理上依赖高度集成的PHY+交换矩阵单芯片(如RTL8370N),结合确定性硬件逻辑替代MCU固件,保障低延迟、高可靠与零运维。技术价值体现在成本压缩、体积精简与部署极简化,广泛应用于家庭网络扩展、工业现场设备联网及嵌入式系统桥接等场景。本文详解一款基于RTL8370N的紧凑型8端口千兆无管理交换机,覆盖芯片选型依据、PHY接口设计、电源与散热优化等关键工程实践。

weixin_42327217的博客 401

敏捷开发松结对编程系列之十四 一些重构而不影响他人的编程诀窍

敏捷开发松结对编程系列之十四 一些重构而不影响他人的编程诀窍

hdfyhf的博客 205

产品竞争策略方法论:构建“差异化 + 结构化 + 系统化”的竞争优势

本文系统探讨了IoT产品竞争策略,指出当前企业普遍存在硬件能力强但商业竞争能力不足的问题。文章构建了五层竞争模型(产品层、体验层、服务层、数据层、生态层),提出五大核心竞争策略(成本领先、差异化竞争、聚焦竞争、生态竞争、数据驱动竞争),并详细阐述了差异化设计方法。通过行业案例分析(小米、苹果、特斯拉)和五步落地方法,强调从硬件竞争向系统优势转变的重要性。文章指出IoT竞争胜负关键在后半场的数据运营和服务延伸,建议企业通过构建差异化能力、完善服务体系、建立数据体系、逐步构建生态来避免价格战陷阱,实现从跟随到领

专注智能硬件软硬件产品经理成长与实战,分享从需求定义到量产落地的真实日记。涵盖IoT趋势洞察、研发协作经验、产品方法论与工具箱,用轻松有趣的“汪式”视角,陪伴产品经理成长、避坑与升级。 359

优雅编程之这样注重实效,你就“正常”了(十二)

开心一笑【有一个人和一只老虎被分别绑在两颗大树上, 绑老虎的绳子下面有一棵蜡烛 ,就快把绳子烧断了, 如果绳子被烧断,老虎就会把人吃掉,结果人说了一句话, 就没被老虎吃掉 他说“happy birthday!!”老虎就把蜡烛吹灭了...】提出问题项目开发过程中,注重实效的途径???解决问题下面是来自《程序员修炼之道》中,自己的一些总结:重复的危害系统中的每一项知识都必须具有单一,无歧视,权威

IT技术分享 1135

Win11 WSL2 Ubuntu 18.04 ROS Gazebo 图形渲染性能调优:从LLVM到NVIDIA GPU的完整指南

本文详细解决了在Win11 WSL2 Ubuntu 18.04环境中运行ROS Gazebo时图形渲染卡顿的问题。通过诊断默认LLVM软件渲染的瓶颈,指导用户更新Mesa驱动PPA源,并关键性地设置环境变量以强制启用NVIDIA GPU硬件加速,最终显著提升仿真性能与流畅度。

weixin_29204749的博客 282

SAP_MM模块通过CC11 创建物料版本

通过本文,我们了解了 SAP 的[SAP_MM模块通过CC11 创建物料版本]的基本概念和应用方法。当物料主数据、BOM(物料清单)、工艺路线等对象需要进行变更控制时,通过创建“版本”或“更改单”来记录、控制和追溯变更。创建完变更主记录(Change Number)后,可在物料主数据维护时引用它,从而创建物料版本化信息。,在其中可以定义物料、BOM、工艺路线等对象的变更版本信息,从而在系统中实现版本化的物料管理。

我小时候很黑的博客 816

敏捷开发“松结对编程”系列之七:问题集之一

本文是“松结对编程”系列的第七篇。 刚刚参加完MPD 2011深圳站,在演讲中间及后来媒体采访,被问到了一些问题,也给出了答案,这里做一总结。 我自问自答到一半,才发现这里边的很多问题的答案,都用到了火星人谚语系列之一:有问题的地方无答案、火星人谚语系列之三:正确的答案一定简单。如果您觉得答案和自己的情况不完全相符,请用火星人谚语系列之二:问问题的人负责找答案...

weixin_34234823的博客 189

解锁机器人动态平衡算法:从原理到实践

机器人的动态平衡,是指机器人在运动过程中,面对各种复杂的动态变化和外界干扰,依然能够维持稳定状态,不发生倾倒或失去控制的能力。它就像是一位技艺精湛的舞者,在舞台上翩翩起舞时,无论做出多么复杂的动作,都能巧妙地调整身体姿态,始终保持平衡,展现出优美的舞姿。在实际应用中,机器人的动态平衡对于其稳定运行起着至关重要的作用。以双足机器人为例,当它行走在不平整的地面上时,地面的起伏会使机器人的重心不断发生变化。如果没有良好的动态平衡能力,机器人就很容易因为重心偏移而摔倒,无法完成行走任务。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 3838

敏捷开发“松结对编程”实践--计划与设计篇

新人其实很少偷懒,因为一方面正处于入门学习的高峰期,另一方面工作时间不长,需要得到企业和团队的认可。可为何他们工作总是不得力呢?   新人的真正问题在于无心办错事和好心办错事。   无心办错事包括没学过某种好的方法、不知道企业已经有某些可用代码或库、不懂业务等种种问题。   好心办错事包括想做一个比领导想想的更好的功能、过度思考了可复用性可维护性等。   这两个问题笔者都经历过(...

优快云1332531529的博客 220

2026年OPPO嵌入式岗位面试题带详细答案

本文总结了OPPO嵌入式岗位面试的核心考点,涵盖硬件驱动、系统启动、Linux内核开发等7大模块共34道典型题目。重点解析了SPI通信协议、中断处理、U-Boot启动流程、Linux驱动开发等关键技术,突出硬件调试与工程实践能力考核。题目设置贴合实际岗位需求,适合校招与社招驱动开发岗位应聘者系统复习,帮助掌握嵌入式开发的核心知识与面试要点。

Open 489

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

雷观(十三):功能优先,开发与重构并举,性能殿后

根据自己2年多的实际开发经验,我认为:在项目开发过程中,功能是最优先的,开发与重构同样重要,性能放后面考虑。 我们工作的最基本目标是,保证工作单位的项目能够如期交付,至少要保证自己的进度。一份薪水,一份责任。此外,作为技术工作者,我们也有自己的技术追求,提高写程序的能力,写有含金量的代码,保证自己的能力能够与时俱进。功能优先,进度就是最直接的要求。对于有可视化界面的项目来说...

weixin_30781433的博客 164

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

第二十一章 授予身份及切换身份——《跟我学Shiro》

  目录贴: 跟我学Shiro目录贴   在一些场景中,比如某个领导因为一些原因不能进行登录网站进行一些操作,他想把他网站上的工作委托给他的秘书,但是他不想把帐号/密码告诉他秘书,只是想把工作委托给他;此时和我们可以使用Shiro的RunAs功能,即允许一个用户假装为另一个用户(如果他们允许)的身份进行访问。   本章代码基于《第十六章 综合实例》,请先了解相关数据模型及基本流程后再学...

jinnianshilongnian的专栏 471

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

复用个人项目实现结对编程项目

项目需求 注册功能:用户提供手机号码获取验证码,验证码正确后可以设置登录密码。 修改密码:输入正确原密码,两次输入相同新密码,即可成功修改密码。 显示分数:最后一题提交后,显示得分和答对题数百分比。 退出系统:在获取得分后可以选择退出系统或者继续做题。 项目实现问题回顾 结对编程的项目实现了用户友好的UI界面,基本上实现了项目需求,但这过程中也遇到了一些相对棘手的问题,...

baiqiong9622的博客 228

敏捷开发“松结对编程”系列之十七:L型代码结构(编程篇之二)(中)

续前文。本文是“松结对编程”系列的第十七篇。(松结对编程栏目目录)上一篇文章基本上把Controller中Action和与Action直接相关的复用讲到了,下面讲讲比较困难的部分。几个关键问题1. 如何实现整体结构相同,而局部不同的复用比如我们的业务需求中,整体上都是一个横向的结构(请参考下图),每个单元上面都是标题,下面都是增删改查之类的按钮,唯独中间的部分不同。如果是团队,要显示成员,如果是产

陈勇的博客 - Scrum 敏捷开发培训咨询,绩效管理,团队管理,《火星人敏捷开发手册》 4719

敏捷开发免费管理工具——火星人预览之一:需求与故事树

这是火星人预览系列的第一篇(之一,之二,之三,之四,之五问答,之六,之七)。之一:需求与故事结构之二:编辑故事,产品管理,组织结构之三:迭代,计划会,分配任务之四:故事板,燃尽图,我的工作项之五:常见问题问答之六:我的空间,我的通知之七:自定义字段   本人除了做培训、写博客、编手册之外,两年来用半业余半全职的时间一点一点开发了一个敏捷开发管理工具,最近接近发布内测版本,发一些预览资料,欢迎大家关

陈勇的博客 - Scrum 敏捷开发培训咨询,绩效管理,团队管理,《火星人敏捷开发手册》 1万+

火星人敏捷开发博客APP上线了

这段时间用做了一个移动APP,逐步收录本人在优快云所写的博客,方便大家在路上阅读、查看。以后的博客会在优快云首先发表,然后转移到APP上。注意里边有一个对话功能,可以与本人进行互动。以后会有一个更简短的“敏捷开发1001问”栏目,会以类似QQ聊天那种方式迅速回答一些问题,欢迎参与。整体上分了四个栏目:IT职场人生敏捷需求:这个收录了用户故事、产品管理等相关的博客。敏捷团队:这个收录了松结对编程

陈勇的博客 - Scrum 敏捷开发培训咨询,绩效管理,团队管理,《火星人敏捷开发手册》 1万+

《QUML系列图书》写作计划

QUML作为UML、功能点分析FPA、敏捷开发三种管理方法的集大成者,可以被应用于不同的场景。以下的图书各自侧重于一个方面,供不同领域的读者选择。《QUML:量化需求分析与建模》本书从需求分析与建模的角度,介绍QUML的结构、规则、使用方法,是QUML的基本图书。全书通过对一个电商网站的实例分析,分层次地介绍了QUML的结构、用途、规则和最佳实践;书中还概要地对如何将UML应用于早期估算、产品版本

陈勇的博客 - Scrum 敏捷开发培训咨询,绩效管理,团队管理,《火星人敏捷开发手册》 1万+

敏捷开发用户故事系列之九:用户故事早期估算

这是敏捷开发用户故事系列的第九篇。(栏目目录)本文适合听过MPD上《敏捷开发需求管理:用户故事分类、颗粒度及组织结构》,或参加过《火星人敏捷开发培训》听过第一天下午课程的读者。若您阅读过程中感觉缺少铺垫的信息,请先阅读:敏捷开发绩效管理之六:敏捷开发生产率(中)(功能点分析,FPA,简化的功能点)敏捷开发绩效管理之七:敏捷开发生产率(下)(简化功能点分析,NESMA,两级简化)若需要更详细情况,请

陈勇的博客 - Scrum 敏捷开发培训咨询,绩效管理,团队管理,《火星人敏捷开发手册》 1万+

敏捷开发用户故事系列之八:剖析用户故事描述语法(兼谈不同种类故事的语法)

这是敏捷开发用户故事系列的第八篇。(栏目目录) 本文内容来自火星人团队对火星人产品中300个用户故事编写后总结的经验和成果,欢迎致力于敏捷开发而又对用户故事感到困惑的开发者参与讨论。本篇文章尤其适合参加MPD专场“用户故事颗粒度、分类及组织结构”的学员,及参加火星人敏捷开发产品培训的学员。 用户故事中,最有名的就是三段式语法了:“作为一个……(角色),可以……(功能),以便……(客户价值)。”然而

陈勇的博客 - Scrum 敏捷开发培训咨询,绩效管理,团队管理,《火星人敏捷开发手册》 1万+
上一篇: IT职场人生系列之二十四:程序员如何增加收入
下一篇: 简单干净的C#方法设计案例:MFCUI.CheckBoxLink(一)
火星人陈勇
博客等级 码龄18年 4899粉丝 381原创
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值