理论篇|如何避免写出面条代码?_资讯推荐
点击链接阅读原文,获取更多技术内容:
(相关资料图)
本文是“面条代码系列”文章的第一篇,在这个系列里,我将从理论开始,再通过实践和大家一起来探讨如何才能写好代码。
作者 | 陆争辉(剡溪)
来源 | 阿里开发者公众号
面条代码系列文章目的
一直以来有一个问题困扰着我,大家好像都在不断的批判面条代码,但不知不觉中,每个人又不停的在写着面条代码,为什么?随着与越来越多的人沟通,我慢慢了解到,这其实是一个非常底层的问题,是一个对什么是好代码的认知的问题,所以要解决面条代码的问题,还是要从什么是好代码着手。
我期望通过本文,能颠覆你对好代码的认知,让你能从认知上有一个转变,“哥白尼式的转变”,什么意思呢?
你试想一下,当你现在回过头去看“地心说”时,你会有什么想法?而在之前一段很久很久的时间里,人们一直是坚信着地球才是宇宙的中心啊!当你理解了“日心说”以后,就再也回不去了,你已经没有办法再回到“地心说”了,并不是以前的人傻,而是你的认知发生了改变,一种不可逆的改变。因此,今天我试图从“什么是好代码”的认知讲起,期望能刷新你对好代码的认识,从而解决“面条代码’的问题。
什么是好代码
什么是好代码?我相信每个人心中都会有自己的答案,比如抽象层度、可扩展、可读性、是否符合设计模式等等,好代码的维度有很多,这些都没有错,今天我想从另一个维度来聊聊什么是好代码。
先说一个东西“星盘”,星盘是古代天文学家用来进行天文测量的仪器,通过转动星盘,可以模拟各天体的运动,从而预测太阳、月亮、金星、火星等天体在宇宙中的位置。星盘是天空模型的机械实现。通过星盘这个模型完整的呈现了星空中各星体的运行。在这个星盘中,沉淀了大量对于星体运行轨迹的知识,这些知识都融合进了星盘这个模型中。
而我们的代码是把我们运行在线下的日常业务,通过软件模型呈现到了我们的系统中,同样线下的业务中含有大量的业务知识,这些业务知识有时候是一个行业几十年的沉淀。如果我们的代码只是实现了功能,但没有与业务知识相匹配的模型,虽然功能实现了,但无法承载海量的业务知识,随着业务不断的衍进,必然会让线下业务与线上的系统脱节,从业务到系统的翻译成本越来越大,系统对业务的表达力越来越弱,就算一个小需求,从业务到产品,再到技术和测试,整个沟通成本也会很大。这时,我们就会说这个系统的代码太烂了,已经无法维护了。
因此,一个小小的星盘,完整的阐释了“什么是好代码”,好代码一定是能够完整的表达业务,能够把现实中的业务反映在我们的系统中。
到这里,我相信我们已经有目标了,如何才能写出像星盘一样的代码?我们先从一段面条代码开始。
面条代码的由来
面条代码(spaghetti code)是指非结构化和难以维护的源代码,要了解面条代码,我们先从下面的一个需求开始。
人员签到的需求:* 当签到时间>班次开始时间N分钟后,签到状态为迟到* N根据不同的业务可以灵活配置,比如:门店为5,配送为0
根据上面的需求,再来看一下我们的实现代码:
public void 人员签到(班次ID,人员ID) { 班次 = 班次Repo.获取班次(班次ID) 迟到可容忍时间 = 配置服务.获取可容忍时间(业务域); 签到状态 = null; if( 签到时间 >(班次.开始时间 +迟到可容忍时间)) { 签到状态 = 迟到; } else { 签到状态 = 正常; } //更新数据库状态 }
看完上面的实现代码,大家想一下,如果让你来写,你会怎么写呢?如果大家没有看出问题来,那很抱歉,我可以说大家平时就是在写面条代码。
上面的代码有两个问题:
迟到可容忍时间 = 配置服务.获取可容忍时间(业务域);
问题一:在签到方法内需要去查询配置服务,我相信这样的场景会出现在我们大量的方法中,有时候一个操作需要查询大量的其它服务来准备数据,慢慢的我们的方法会越来越长,即便我们可以把这些查询封装在一个方法中,但其实不解决实质性的问题。
if( 签到时间 >(班次.开始时间 +迟到可容忍时间)) { 签到状态 = 迟到; } else { 签到状态 = 正常; }
问题二:签到的业务逻辑揉合在签到方法中,形成了面向过程式的代码片段,随着业务的不断变化,签到方法有可能会越来越复杂。
这两个问题是所有面条代码中最典型的例子,问题一和问题二在复杂的现实业务中,可以演变成庞然大物,有时为了做某个操作,我们可能需要写上百行的代码来准备数据,有时一个复杂的业务逻辑,我们也可能会写上上百行代码。如果能解决上面的两个问题,我们就能在很大层度上解决面条代码的问题,接下来,我们来看看怎么来解决?
如何解决面条代码的问题
其实你并不孤单,关于上面的面条代码代码早在2004年就已经被人提出来了,要解决这个问题,我们需要引入三个模式: 值对象(Value Object) 无副作用方法(Side-Effect-Free Function) 语义化接口(Intention-Revealing Interface)
模式一:值对象(Value Object)
我们从一个灵魂拷问开始,在问题一中,“迟到可容忍时间”是可以按不同的业务配置的,那在处理迟到时,当然要从一个配置服务中去获取啊,感觉没毛病。真的是这样吗?
在上面代码中,我们有一个“班次”模型,除了入参“签到时间”外,为什么我们还需要模型之外的数据?大家有没有想过,是不是我们的模型有问题?既然系统要反应真实的业务,那我们回到现实的业务中,当班次安排下去以后,“迟到可容忍时间”还会有变化吗?今天“迟到可容忍时间”是5分钟,明天是10分钟,会这样吗?当然不是,当一个班次安排下去后,“迟到可容忍时间”必然是已经确定了的,如果真的要发生变化,业务也会在班次安排之前,提前通知到大家。因此,当班次被创建出来时,“迟到可容忍时间”就已经确定了,而不是当发生签到时,再去获取“迟到可容忍时间”。
阿里云开发者社区,千万开发者的选择。百万精品技术内容、千节免费系统课程、丰富的体验场景、活跃的社群活动、行业专家分享交流,尽在:
标签:
- 理论篇|如何避免写出面条代码?_资讯推荐
- 世界热资讯!丰台王佐镇:党建引领织细治理网格 助力银发居民幸福无忧
- 合肥市第三十六中学召开九年级二模成绩分析会
- 新一代载人火箭首项机构类地面试验完成
- 世界球精选!人工智能方向再度走强,欧比特大涨近8%
- 今日精选:中东欧国家与中国贸易7.2亿
- 全球头条:“挖呀挖呀挖”太上头!奥运冠军之城七台河出列!
- 让梦想触手可及 全新一代中高端北京数智重卡耀世登场_看点
- 一级造价师考试真题答案_一级造价师考试真题
- 张若昀和唐艺昕牵手下班 真夫妻浪漫好似偶像剧 世界微动态
- 消息称三星将于7月26日发布Galaxy Z Flip5/Z Fold5折叠屏手机
- 水泥能防水堵漏吗 全球观焦点
- 天天速看:安徽省宁国市高铁南站站前广场主体结构封顶
- fastboot模式刷机教程 fastboot模式刷机
- 百度Q1利润指标大幅改善,李彦宏:AI将成下一代互联网入口
- 讯息:猪鹿蝶强吗_猪鹿蝶分别是谁
- 大西洋海战_关于大西洋海战的介绍
- 全球快资讯:宁夏鸿辉建筑工程有限公司
- 环球热点评!险资一季度净买入债券现券5510亿元 利率债、“二永债”是大头
- 环球今热点:“真人AI”前景火爆 奥斯卡影帝:如今演艺生涯能持续到时间尽头
- 消息!过期卫生巾没有开封能用吗(用了过期的卫生巾下面很痒怎么办)
- 天天快看:关于召开周例会工作制度的通知
- 桌面任务栏跑到左边了怎么还原_任务栏怎么还原成蓝色
- 李四儿没有被扶正_李四儿
- 每日精选:中华广场修手机_中华广场倒数
- 优环境,促发展!岳阳市资规局多措并举出实招 环球时快讯
- 四川网文霸榜“起点十大网文名场面”
- 崔康熙出任山东泰山足球俱乐部一线队主教练 今日要闻
- 协定存款和通知存款利率调降 两种存款分别是什么?一文解读 世界速讯
- 焦点简讯:兔宝宝:5月12日召开业绩说明会,投资者参与
- 国家气象中心:北方高温天气不会对冬小麦产量产生明显不利影响_世界热文
- 大股东下场增持破除质疑泛海重整或有重要进展 世界信息
- 最初的圆原唱完整版_最初的圆_全球播报
- 世界视点!央行报告谈硅谷银行启示 强调货币政策应避免大放大收
- 隐形正畸龙头正雅齿科启动IPO,中金资本、泰康投资“保驾护航”-今日热议
- 博人传135话,以浦式的实力,为何被鸣人的螺旋丸给干掉了? 天天新消息
- 推动全球开放创新、合作共享的科技盛会——2023中关村论坛看点前瞻-每日信息
- 天天即时:大连湾海底隧道积水原因查明并处置 上午10时恢复通车
- 全国文明家庭游文晃、陈新红夫妇:28年捐出上千万元
- 今日热讯:草桥到大兴机场地铁运营时间_草桥到大兴机场
- 环球讯息:第八届全国残疾人岗位精英职业技能竞赛
- 上海地铁回应男子车厢内持刀与人冲突:管制刀具不能进入地铁,将反馈调查
- 2023年全国职业院校技能大赛开赛 近3万名选手参赛
- 浙江名小吃十佳榜单出炉 杭州片儿川等美食上榜
- 2023山西中北大学开展高等学校教师资格认定工作的通知
- 环球今头条!数字化作战有多强?一个视频你就懂了
- “时间银行”催生志愿互助养老服务新模式
- 没想到吧?拜仁本赛季已5次单场至少进6球,创德甲历史纪录 天天热头条
- 【天天播资讯】贝莱德Q1继续加仓科技股 持有苹果市值1700亿美元
- 燃气板块5月15日涨1.5%,新天然气领涨,主力资金净流出3581.37万元|环球速看料
- (体育)全国轻型飞机锦标赛落幕|天天观焦点
- 脱口秀演员演出中不恰当比喻被调查,剧院:非主办方,正常营业-世界简讯
- 江西省通信管理局投诉平台-江西省通信管理局投诉
- 药易购人才工程“般若堂”第四期研修班举办
- 产品评测|高龄老人的首选?太平洋的孝心安3号老年人意外险值得买吗?
- 1.2子线能钓多大的鱼?影响钓重的因素有哪些_世界最资讯
- 数尔安防被认定为2023年度第一批浙江省专精特新中小企业 头条焦点
- 太平人寿报送“寿险转长护险”试点方案 世界快看点
- 全球实时:上交所将召开沪市金融业专题座谈会 讨论促进金融业估值提升
- [路演]富春股份:将积极拥抱AI和产业的融合机会
- 奥思集团(01161.HK)将于5月29日举行董事会会议以审批中期业绩
- 世界视讯!“北向互换通”今日先行开通 开市半小时成交金额超18亿元
- 记者:波帅喜欢在办公室放柠檬吸收负能量 将安排魔鬼训练-今日视点
- 不屈之星,三星彰显无畏|快播报
- 中国人民银行副行长潘功胜在“互换通”上线仪式上的讲话
- 世界观点:iphone13自定义铃声_iphone如何设置自定义铃声
- 认清这些“碘”,甲状腺病患者无需“谈碘色变”|精彩看点
- 多家银行调整两类存款利率_环球实时
- 宿州市政府考察团赴天津石家庄招商考察
- 北部湾航空起飞前4天退票收9成手续费,1220元的票只退回110元
- 俄超3300亿美元顺差,与中国贸易贡献关键作用,普京下令促新合作|全球观焦点
- 保定市多措并举推动稳增长政策落实落细 14个项目已获贷款18.73亿元-聚看点
- 【天天报资讯】新乡学院评价如何级别
- 5月15日内蒙地区萤石市场行情暂稳|快看
- 广州影豹足球俱乐部官方消息前广州城门将周煜辰正式加盟
- 江山壮丽 我说长城丨“特种兵旅游”友好地:一次打卡长城+黄河
- 全球聚焦:金普天气早知道|热“红”了?气温涨!涨!涨!
- 全球观察:武磊梅开二度 海港和申花重回同一起跑线
- 四五万的新车应该买什么样的车?5万元左右的高性价比车选哪个比较好?-当前资讯
- 四川美丰:高分子材料产业园项目国产流延膜生产线已试产成功_世界实时
- 重磅!正式公布:北上广深,集体负增长!什么原因?_当前播报
- 天天热讯:世体:盘点巴萨队史的11次联赛客场夺冠
- 新疆乌苏市举办“与法同行·和谐万家”法治文艺大赛 当前通讯
- 科大讯飞AI学习机T20 Pro亲身使用一个月内幕曝光,容易忽视的五点
- 严浩翔|陪我遗失在地平线
- 第七十九章 空条 承太郎_当前关注
- 民间借贷能公证吗 新视野
- 裂变的效果有多大
- 今日要闻!仲夏五月,伦茨与您相约2023第十五届中国国际电池展
- 天天关注:2023工业元宇宙白皮书及建议
- vietnam产的耐克鞋子 vietnam耐克好不好
- 环球观速讯丨福建省内九个城市车牌号顺序,竟然是顺时针环绕一圈,全国唯一
- 长相思古诗白居易_长相思古诗
- 环球新资讯:科技赋能文化遗产|鲁班智能建造发起人协议签约仪式在贵阳举行
- 我的世界1.17.1mod怎么装_我的世界1 12 2mod怎么安装-当前动态
- 家长与班主任沟通技巧ppt_家长与班主任沟通技巧
- “喀秋莎”号主题专列首发 龙粤旅游合作加油提速
- 新的弗里斯科购物中心正在开发商的资助下推进 天天亮点
- 摩擦力怎么算_摩擦力-简讯
- 有什么好听的音乐_有什么好听的歌啊-环球今亮点
广告
广告
- 长治襄垣县增收11517万元 提前15天实现首季“开门红”
- 黑龙江讷河新增1例确诊4例无症状 病例详情公布
- 浙江宁波余姚奉化宁海三地开展核酸检测 结果均为阴性
- 浙江湖州南浔三处棋牌室经营者被行拘
- 那年今日 | 一张漫画涨知识之12月13日
- 在宁波乘火车跨省出行须持48小时内核酸阴性证明
- 浙江温州一地发现核酸弱阳性?复采复检结果均为阴性
- 浙江三门发现一名密接者:二次核酸检测结果均为阴性
- 贱卖的发电机 新买的制茶机——安徽水电供区改革两周年回访见闻
- 浙江杭州新增1例新冠肺炎确诊病例 为集中隔离人员
- 2022年研考在即,学硕缩招,专硕时代真的来了?
- 探访杭州核酸检测点:排队高峰多在夜间 医院24小时运转
- 浙江发挥零售药店“哨点”作用 织就疫情防控监测网
- 哈尔滨市本轮疫情首批1名确诊患者出院
- 宁波镇海第三轮全员核酸检测574181人 结果均为阴性
- 陕西新增本土确诊病例1例、境外输入无症状感染者2例
- 齐齐哈尔讷河一地调整为中风险地区
- 浙江新增新冠肺炎确诊病例75例 其中本土74例
- 内蒙古新增本土确诊病例5例 均在呼伦贝尔满洲里市
- 黑龙江无新增确诊病例 新增本土核酸检测初筛阳性人员5例