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

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

续前文。

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

上一篇文章基本上把Controller中Action和与Action直接相关的复用讲到了,下面讲讲比较困难的部分。

几个关键问题

1. 如何实现整体结构相同,而局部不同的复用

比如我们的业务需求中,整体上都是一个横向的结构(请参考下图),每个单元上面都是标题,下面都是增删改查之类的按钮,唯独中间的部分不同。如果是团队,要显示成员,如果是产品,要显示最近的发布:




在纯C#/C++/Java代码中(不讨论html),虚函数是用来做这个的。Team和Product都从Item派生,相同的部分共用函数,然后重载Item.ShowBody()函数,显示不同的东西即可。
用到html的时候,则有两种方法实现。
第一种就是使用虚函数,不过是一个虚的Helper,用Helper生成要显示的东西。不过这个方法比较麻烦,还得编写函数,几乎从来没用过。
第二种是自动匹配不同的view。也就是说,根据Team和Product的不同(比如team.GetType()和product.GetType()的不同),自动找到一个View来显示。个人比较喜欢这个。
我们的每个Item都有两个字段,一个叫做What,做大的分类,比如部门Program和团队Team的What是DEPT(广义的部门);第二个叫做Type,做小的分类,比如与Team的What相同而Type不同的还有企业Corporation/分公司Branch/Program(这个是我们常说的“部门”)/团队Team/小组SubTeam等。用这两个字段,就能找到具体的View。
实际代码如下(在_SubItem.cshtml中):
    <div class = "item-hierarchy-title">
        @item.Link()
    </div>
    <div class = "item-hierarchy-body">
        @MFCUI.TryRenderPage(this, 
            "~/Areas/DLC/Views/MFC/Items/ItemHorizentalListViews/" + item.What + "/_" + item.Type + ".cshtml",
            "~/Areas/DLC/Views/MFC/Items/ItemHorizentalListViews/_" + item.What + ".cshtml",
            item)
        <div class="item-hierarchy-footer">
            @MFCUI.ImageLink("删除", "/MFC/Items/Hide?id=" + item.ID, cssClass: "hide hoverbodyof" + item.ID, showText: false, returnTo: this)
            @MFCUI.ImageLink("修改名称", "/MFC/Items/EditTitle?id=" + item.ID, cssClass: "hide right hoverbodyof" + item.ID, showText: false, returnTo: this)
            @item.ShowMoveLeftRight(this)
        </div>
    </div>
中间那个_TryRenderPage是我们封装的方法,可以理解为就是两次RenderPage,先找名为"/大类/_小类.cshtml“的View,找到不就找"_大类.cshtml"的文件;找到就传入item。
这样如果所有部门都这么显示,那么就只写_DEPT.cshtml,否则则为所有的分别写。这样设计是有原因的,实际上,Team和SubTeam多半会直接显示成员;但部门Program和分公司Branch这样显示就没意义了。
如果大家的类设计中没有What/Type这些字段,至少GetType是不同的,就可以这样使用。

2. 新建好team要转向成员分配(/TeamMembers/Index),新建好product要转向创建发布(/Products/ReleaseSchedule)

这种一般是传入一个returnUrl参数,比如(在Teams的Index.cshtml中):

    Html.RenderAction("ItemHorizentalList", "Items",
                      new
                      {
                          area = "MFC", rootID = programID, what = SystemItemWhat.Deaprtment, type = ItemWhattype.DepartmentTypeTeam,
                          returnUrl = HttpUtility.UrlEncode("/Site/TeamMembers/Index?programID=" + programID)
                      });

returnUrl完成了重新定向的工作。当然,需要Items/ItemHorizentalList配合(在ItemsController.ItemHorizentalList()中:):

        public ActionResult ItemHorizentalList(int rootID, string what, string type, string returnUrl)
        {
            var root = _repMFC.ReadAt<Item>(rootID);
            IEnumerable<Item> subItems = root.SubItems().Where(i => i.What == what && i.Type == type);
            return MFCDefaultView(root, subItems, what, type, returnUrl);
        }

returnUrl被传入ItemHorizentalList.cshtml中,显示新建按钮的时候会用到:

            @MFCUI.ImageLink("新建", "/MFC/Items/Create?fatherID=" + root.ID + "&what=" + what + "&type=" + type + "&returnUrl=" + returnUrl,
                           imgUrl: "/MFC/Items/Create48.png", showText: false)

然后是ItemsController/Create():

        [HttpPost, UrlLog]
        public ActionResult Create(int fatherID, string what, string type, FormCollection collection, string returnUrl)
        {
            ViewBag.Father = _repMFC.ReadAt<Item>(fatherID);
            try
            {
                Item item = ……;
                returnUrl = String.IsNullOrEmpty(returnUrl)
                                             ? "~/MFC/Items/Edit?id=" + item.ID + "&createNotice=off"
                                             : returnUrl.Replace("[id]", item.ID.ToString());
                Notice.CreateNotice(Notice.NoticeTypes.ItemCreated, User.Identity.Name, item, new[] {Notice.RecipientTypes.DeptTeam, Notice.RecipientTypes.UserCurrentOwner}, repMFC: _repMFC);
                return Redirect(returnUrl);
            }
            catch (Exception e)
            {
                ModelState.ReportException(e);
                return View(MFCWebViewPage.ViewFailed, e);
            }
        }

注意这里附带处理了没有指定returnUrl的情况(会转向到Edit);returnUrl有很多用处,除了返回某个页面/自动导向某个页面,还可以重复指向Create以便不断创建多个。

3. 哪些Action需要写View

哪些Action需要写View,然后在View里边RenderAction(比如这个Teams/Index);哪些不用写View,直接在Controller的Action里边RedirectToAction到ItemsController的操作?(这样简单,连View都不用谢,但有局限就是Url会跳转)?

前者的坏处是要额外写一个View。但好处是会保留Url,也就是看上去还在Teams/Index,但现实的内容却是Items/ItemHorizentalList的内容。这样如果要根据Url来安排主菜单或相关链接,则比较方便。

后者因为已经完全转向到别处了,正好相反。

这个事情困扰了我们一段时间,逐渐发现一个规律:如果一个页面是“长期页面”,比如Index,也就是说所有业务都围绕其开展,所有相关链接都在这个页面上,则写一个View保持不跳转;如果一个页面是“短期页面”,比如Create/Edit/Delete,也就是来看完后,几乎不会停留在这个页面上,则直接在Controller里边转向,加一个returnUrl办完事后回到长期页面就可以了。

4. 这些编码方法与松结对编程有何关系?

虽然看起来也不算是很复杂的技术,但常常因为几个原因造成推广困难。这就是为什么从2000年就开始谈论“复用”“面向对象”,但到现在有几个企业或团队有自己的可复用库呢?
原因包括:
1. 团队中的人员分工造成各自为战,没有意识到有可复用的部分。
比如如果把刚才提到的Team和Product分两个人独立做,基本上就永远也想不起来要复用了。
不复用损失的还不只是上面提到的几个函数和页面,还包括Item处理存储(都存储在一个表里边)、父子关系索引、创建、编辑、删除、隐藏、排序……,以及UDCable(这是Item的基类)的自定义字段……的所有功能。
如果能形成松结对编程,师傅级别的人能同时看到3~5个人的工作,就能找到相似的业务。如果师傅之上再有师傅,经常下来查看工作,就能看到整个团队的相似的业务,从而大大提升复用效率。
2. 如何让高手向新手传递知识
师傅制度其实也有分工,但主要是“师傅做复杂的事情,徒弟做简单的事情”,不过好处是师傅做复杂事情的时候,会拉着徒弟一起做,徒弟会目睹全过程。而生产出来的“复杂代码”,与徒弟的代码不是平行的而是交叉的(比如本文及上一篇文章中看到的这些代码),徒弟在不断交叉引用的过程中,一点点就理解了设计的原因和方法。
在平行分工中这就很难做到,因为大家不太有机会看到、用到别人的代码。偶然去“参考一下”,绝对没有新手和高手交叉引用代码的效果好:高手会看到新手不对的地方帮助改好(最好当面一起改,结对编程),新手可以看到高手的实现方法并学习。

【信息科学与工程学】【数据中心】 第十四篇 智算中心算法体系规划 每个节点独立计算本地对偶变量的次梯度,通过异步通信更新对偶变量,步长选择采用自适应策略(如ηt​=t​η0​​)。:采用L1(内存缓存)、L2(SSD缓存)、L3(磁盘缓存)三级缓存架构,结合LRU/LFU算法实现动态缓存管理。:靠近用户终端(如基站、小区),仅缓存高频访问内容,部署在用户最近的网络边缘,实现"最后一公里"加速。:存储完整内容库,负责内容注入与全局调度,部署在核心数据中心,具备高带宽和高可用性设计。:基于用户IP、运营商、节点负载等实时数据,动态选择最优边缘节点,实现全局负载均衡。 阅读详情

相关推荐

【信息科学与工程学】【数据中心】 第十五篇 智算中心DaaS数据消费场景02

智算中心DaaS数据共享场景的分级分类是一个复杂的系统工程,需要从技术、安全、合规、治理、运营等多个维度进行综合考虑。本分级分类体系为不同场景下的数据共享提供了详细的指导,包括安全分级、共享模式、技术架构、合规治理等方面。在实施数据共享平台时,应结合自身业务需求、技术能力和资源情况,选择适合的共享模式和实施路径。同时,要高度重视数据安全和隐私保护,采用先进的技术和管理手段,确保数据共享的安全可控。

weixin_49199313的博客 1万+

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

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

优快云1332531529的博客 232

【信息科学与工程学】计算机科学与自动化——第十六篇 GPU 05 工艺(3)

序号工艺工序名称工艺步骤核心参数其他参数关键部件及原材料控制指标加工设备类型加工工艺/技巧1衬底准备​1.1 硅晶圆清洗 1.2 热氧化生长薄SiO₂层(1-5nm) 1.3 衬底温度稳定温度: 600-800°C 厚度: 1-5nm 表面粗糙度: <0.2nm晶向: (100) 晶圆尺寸: 300mm 掺杂浓度: 1-10 Ω·cm p型Si晶圆、O₂气体、清洗液(SC1/SC2)氧化层厚度均匀性(±0.1nm) 界面态密度(Dit)<1e10 cm⁻²eV⁻¹清

weixin_49199313的博客 1330

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

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

优快云1332531529的博客 220

【信息科学与工程学】【解决方案体系】企业知识库知识内容涵盖系列

1.2 知识领域分层 (D: 01-20) 1.3 尺度层次分类 (S: 01-10) 二、物理科学知识体系 (01-XX-XXX-XXXXX) 2.1 基础理论层次 编码名称理论描述数学表达式特征/定理关联编码01-01-001-00001​量子力学基础微观粒子行为理论薛定谔方程: iħ∂ψ/∂t = Ĥψ波粒二象性, 不确定性原理01-02-101-0000101-01-001-00002​量子电动力学电磁相互作用理论拉氏量: L = ψ̄(iγᵐ∂ₘ -

weixin_49199313的博客 1033

【信息科学与工程学】【管理科学】第七十二篇 管理层相对基层员工的信息差/资源差/权力差/认知差03 总裁/副总裁

定义系统状态(如:全正常、1个单元故障、降级运行、完全故障),状态间转移率 λ(故障率)和 μ(修复率)构成转移强度矩阵 Q。其中 γ_k = (2π/λ) n_k d_k cosθ_k 为相位厚度,η_k = n_k / cosθ_k (TE波) 或 η_k = n_k cosθ_k (TM波) 为光学导纳,θ_k为层内入射角。用于在光刻机设计阶段评估各子系统(光源、光学、工件台、真空等)的可靠性,识别薄弱环节,计算系统整体可用性(Availability),指导冗余设计和维护策略制定。

weixin_49199313的博客 986

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

本文是“松结对编程”系列的第十三篇。(松结对编程栏目目录)松结对编程包括L型代码结构的一个很大的问题,是在于由于人们复用了太多的代码,以至于所有代码牵一发而动全身。这很容易导致一个底层库改动后,很多地方编译不通过,或编译通过但运行不通过。本人曾经担任过底层库的编写者,在修改和维护底层库的过程中遇到了很多问题,也发现了一些诀窍,下面是一些编码级别的处理诀窍。这些诀窍其实都写在教科书上,学习和使用起来

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

【信息科学与工程学】【管理科学】第三十篇 公司治理及公司工作内容08 信息安全与IT类

确定功能单位、系统边界、影响类型。2.

weixin_49199313的博客 476

敏捷开发一千零一问系列之三十七:进度与质量的冲突

众所周知敏捷实施中,每个task的时间是团队自己定的,才能保证团队有效的高质量完成,这是不是和客户要求的deadline冲突了呢,团队自己定的时间如果过多就会影响准时的交付,而如果不影响交付,必然会产生加班以至于质量问题。在实际中怎么去协调这个呢?

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

【信息科学与工程学】信息科学领域——第一百五十五篇 IT/CT领域架构范式演进的代表性产品/技术体系01

​。

weixin_49199313的博客 101

自组织团队与松结对编程 陈勇 2011-09-18

2011-10-12在微软tech ed大会上的讲稿

进度与质量的冲突

来源:敏捷开发一千零一问系列之三十七:进度与质量的冲突 问题: 我有一个问题,众所周知敏捷实施中,每个task的时间是团队自己定的,才能保证团队有效的高质量完成,这是不是和客户要求的deadline冲突了呢,团队自己定的时间如果过多就会影响准时的交付,而如果不影响交付,必然会产生加班以至于质量问题。在实际中怎么去协调这个呢? 回答: 总则上讲,就是牢记一句话:进

老谭的专栏 4539

Android Studio打包全攻略---从入门到精通

初出茅庐 手动打包怎么手动打包项目写完了,现在需要把应用上传到市场,问题出现—怎么把代码变成.apk(Android的可安装文件)。 1. 创建签名文件 2. 填写好签名参数 3. 生成APK 注意:签名的密码和密匙的密码注意保管,不要忘了,签名文件别泄漏了,也别搞丢了为什么要打包我最开始就有这个疑问,我们的代码不是点了下运行按钮就直接安装到手机上了吗,我们在在项目Project

我早就想,要这样载着你,翻山越岭 2万+

20155232 2016-2017-2《Java程序设计》课程总结

20155232 2016-2017-2《Java程序设计》课程总结 作业汇总 (按顺序)每周作业链接汇总 预备作业1:你期望的师生关系是什么? 预备作业2:技能与经验之谈 预备作业3:初体验--虚拟机VirtualBox 第一周作业:学习教材第一章、第二章进行总结,了解Java基础知识 第二周作业:学习教材第三章,编辑、编译、运行教材上代码,认识Java的类型与变量。 第三周作业:学...

aoqian2533的博客 182

智能车竞赛卡丁快跑组:自动驾驶与人车交互技术实战解析

本文深入解析了智能车竞赛卡丁快跑组的技术核心,重点探讨了自动驾驶与人车交互两大模块的实战方案。文章详细拆解了从环境感知、路径规划到语音识别、命令执行的完整流程,并分享了基于单片机平台的调试心法与赛场经验,为参赛者提供了一套从零开始、分步攻坚的系统性备赛指南。

f0g1h2的博客 1177

手把手教你用yt-dlp批量下载YouTube视频数据集(附TikTok/Kaggle资源)

本文提供了一份构建视频数据集的实战指南,重点介绍了使用yt-dlp工具批量下载YouTube视频的高级技巧,包括环境配置、批量参数设置与自动化脚本。同时,文章还整合了TikTok、Kaggle及学术开源数据集等多源高质量视频资源,并分享了数据清洗、格式统一与管理的完整流程,帮助研究者和开发者高效获取与处理训练数据。

weixin_29057237的博客 291

2020年最新 C# .net 面试题,月薪20K+中高级/架构师必看(三)

五十一、字典Dictionary的内部机制是如何实现的? 五十二、数据库锁有哪几种? 五十三、什么是代码锁?应用场景? 五十四、常见的算法和数据结构? 五十五、请写一个简单的冒泡排序程序出来? 五十六、压力测试用的是什么工具,单台服务器最大的QPS是多少? 五十七、自动化测试工具有用过吗,请举例? 五十八、如何检测数据库中某条执行很慢的查询语句? 五十九、什么是T4模板,用它来做什么? 六十、你是如何理解敏捷开发模式的?敏捷开发中应该存在哪些角色? 六十一、Cors是如何避免跨域的,还有

ananlele_的专栏 990

Android TV远程调试全攻略:从开发者模式开启到ADB连接(附常见问题排查)

本文提供了一份详尽的Android TV远程调试实战指南,涵盖从开启开发者模式、配置网络ADB连接到高效调试与深度排错的完整流程。文章重点解析了通过Wi-Fi进行远程调试的核心步骤,并针对常见的连接失败、授权问题等提供了系统性的解决方案,旨在帮助开发者为Android TV应用开发构建稳定高效的调试环境。

1341

计算机专业推荐书籍

吾不能有名师指导,但求能精选出最好的书籍,从最好的书中学到东西,可有些许补偿。当然,最好能主动寻找良师益友和专业人士的指导。经典的书都有一个特点: 详尽得当,通俗又不失理论化,信息量非常大。 一、 思想类读物: 《通灵芯片:计算机运作的简单原理》: (美) 丹尼尔·希利斯著。 以通俗易懂的方式阐述计算机的构造与原理。 《逻辑的引擎》:(美)马丁·戴维斯著。 从十七世纪的莱布尼茨之梦起始,...

益久科技-IT外包服务 7209

部署OpenClaw时设置环境变量提示export: not valid in this context的完整解决方案

OpenClaw环境变量设置错误解决方案 问题概述 在部署OpenClaw时设置环境变量出现"export: not valid in this context"错误,通常由以下原因导致: 在非交互式shell中使用export命令 在命令替换或管道中使用export 脚本文件包含Windows换行符(CRLF) 解决方案 修正脚本执行方式:确保export命令在正确的shell上下文中使用 使用source命令:通过. setup_openclaw.sh或source setup_op

博客 458

基于YOLOv8深度学习的火焰与烟雾检测系统详解:UI界面 + YOLOv8 + 数据集的实现

通过自动化检测火焰和烟雾,可以提高响应速度,减少潜在的火灾损失,保障人身和财产安全。此外,应用还会显示标记了检测框的视频画面,方便用户直观了解检测效果。同时,前端界面将使用Streamlit来实现,因其可以快速搭建交互式应用,适合我们的需求。要训练一个有效的火焰和烟雾检测模型,我们需要一个包含火焰和烟雾图片的数据集。为了保证模型的准确性和泛化能力,建议收集至少500张火焰和烟雾的图片,保证数据的多样性和代表性。训练过程中,模型会输出每个Epoch的训练损失和验证准确率,便于我们监控模型的学习情况。

YOLO 1321

20155333 2016-2017-2《Java程序设计》课程总结

20155333 2016-2017-2《Java程序设计》课程总结 (按顺序)每周作业链接汇总 预备作业1:你期望的师生关系是什么? 预备作业2:体会做中学(Learing By Doing) 预备作业3:Linux课程基础 第一周作业:学习教材第一章、第二章 第二周作业:学习教材第三章 第三周作业:学习教材第四章、第五章 第四周作业:学习教材第六章、第七章...

aodieshao2474的博客 149

30天入门 SAP BTP 开发系列之三:了解 SAP BTP Global Account 的概念

90天之后 Trial 账号会被删除,该账号在 SAP BTP 上创建的内容会被清空,不过我们可以再创建一个新的 Tria 账号。本文简单介绍了 SAP BTP 里 Global Account 的概念,下一篇文章我会介绍 SAP BTP 控制台里和 Global Account 相关的一些操作。,创建 SAP BTP 的 Trial,在可选 Region 列表里,在两个可选项中二选一,选择了。或订阅合同时,SAP BTP 会在后台为其生成一个对应的。在企业拥抱云原生架构的过程中,SAP BTP 的。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 999

5G从头开始-课程总目录

这是5G技术学习系列文章的总目录。整个文章将介绍移动通信特别是5G网络技术的发展演进,目前的现状,行业方向以及多行业结合的行业形态。目录中的所有标题将以链接的方式逐步添加,包括章节文章叙述,图片,表格以及视频等。同时目录也将做动态的不定期的内容更新。

Gnail3的博客 401

【软件定义汽车】-【架构篇】-全面讲解整车电子电气架构演进

前言: 前段时间,陆陆续续写了一些电子电气架构相关的文章。这里打算再写最后一篇作为收尾,为整个系列画上句号,把坑填上,这个话题就算过去了。后续一段时间,尽量把之前文章中挖的“坑”填一下。行文逻辑将借鉴5W2H进行。 另外,本文作为一篇整合性的文章,为保证逻辑的完整性,主要是将大量过去自己文章中的内容进行梳理整合,也存在很多行业内专家的公开文章的内容,请见谅。 WHAT1:什么是汽车电子电气架构? 电子电气架构:EEA,Electrical/Electronic Architecture.

零点壹客的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 敏捷开发“松结对编程”系列之十六:L型代码结构(编程篇之二)(上)
下一篇: IT职场人生系列之二十五:如何向高手学习
火星人陈勇
博客等级 码龄18年 4899粉丝 381原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值