返回首页  设为首页  加入收藏  今天是:
网站首页电脑主板电脑cpu电脑内存电脑硬盘电脑显卡电脑电源显示器电脑配件电脑维修
相关文章
 【RT-Thread】show-me-bad-c…
 V神:不同类型 ZK-EVM 的未来
 slub分配内存原理 slub数据结…
 千元投影仪快乐星球O3怎么样…
 视频版Stable Diffusion:英…
 满功耗RTX4060显卡+H55i7处理…
 如何去选择一个好的台式电脑…
 显卡天梯图2020年12月完整版…
 2023台北电脑展5月底开幕英伟…
 查看显卡型号 电脑怎么查看显…
 电脑主板待机电压?
 主板cmos电路待机电压
 主板B760和B660区别是什么?…
 电脑电源待机5V坏了(电脑主板…
 笔记本电脑桥待机电压怎么看…
 电脑硬盘分区合并怎么操作?…
 Omdia:苹果计划2027年推出3…
 卖不动了!全球PC出货量暴跌…
 钛度首款4K MiniLED显示器M3…
 苹果头显最新爆料:适配大部…
 消息称苹果计划在2027年推出…
 如何升级您的笔记本电脑:逐…
 笔记本换cpu手把手教你笔记本…
 酷睿I7 12700H是几核处理器 …
 笔记本这样升级让你的电脑翻…
 2023年哪一款笔记本电脑值得…
 电脑如何查看配置参数
 电脑主机配置大佬麻烦给看看
 教你怎么查看电脑配置
 电脑配置怎么看?这3种方法就…
 如何查看电脑硬件配置 查看电…
 5000多块的轻薄本能不能做照…
 用了这么多年 Rust 终于搞明…
 为什么Android开发使用Java而…
 最新资讯_存储_DIY电脑硬件频…
 2304分区4K高刷HDMI21 全能电…
 群创首发无限拼接AMminiLED公…
 新技术突破!芝加哥大学开发…
 长信科技2023年第一季度营收…
 新技术突破!芝加哥大学开发…
 PC过冬厂商难熬CPU、GPU、SS…
 根号二笔记本电脑新款发布 性…
 碧蓝档案国际服电脑版哪个模…
 CPU为什么很少会坏?答案揭晓
 她走了一辈子“匍匐在地擦干…
 电脑配置-数码-PC区-虎扑社区
 公司电脑老哥们能帮忙看看这…
 华硕首款接口背插主板 B760M…
 老哥们请教一下这台电脑配置…
 黑苹果注入EDID让Intel 500系…
专题栏目
网络
您现在的位置: 电脑评测网 >> 电脑内存 >> 正文
高级搜索
【RT-Thread】show-me-bad-code
作者:佚名 文章来源:本站原创 点击数: 更新时间:2023/4/26 21:35:44 | 【字体:

  余佳文在本活动开始之前,非常荣幸地收到RRT小师弟的邀请, 看能否帮忙想想1024活动好点子,在此非常感谢对我的信任。 想起早年在浏览一些博文的时候,对国外代码社区举办的烂代码比赛印象深刻, 看到那些牛人提交的眼花缭乱的的代码,简直是佩服得五体投地。 自然我们大部分的程序员还很难提供出这么的代码, 所以基于这个原则,结合我们的实际情况, 修改了下比赛规则,重在娱乐参与,旨在代码提升。

  这段代码的原型来自于早几年在一家POS行业内头部企业供职时的真实案例代码,基于这套代码也是过了各种POS机的行业认证, 经过10多年的沉淀,基于该模板代码移植/改造而来的应用程序,罐装的POS机累计装机量应该在KW级别,可谓就是传说中妥妥的【祖传代码】。

  早期代码的运行环境是嵌入式Linux系统,总内存高达128MB,还是非常富余的;后面才慢慢切为RTOS系统,内存也锐减到64MB,但即便这样,给到应用程序的内存也是非常充足的。

  这段代码的主要功能就是在POS机触发交易时的界面(带LCD显示)下,能够自动识别出当前要使用的各种交易方式,其中包括:

  除这些功能外,因为POS机交易是需要保存最近N笔交易记录的,所以这个处理交易的流程中,还得维护交易记录的保存。而代码中用于保存交易记录的结构体也是非常非常非常的庞大,大到一个结构体就占用接近2KB,这是非常恐怖的。

  为了仅说明情况,而不透露具体的技术细节,这里我仅提供伪代码,注意代码里的注释,是我为了辅助介绍而自己添加的,原来的代码中,注释比这少得可怜。

  这里说上面的代码烂并不是说它工作得不行,相反,它的确工作得可以,从装机量和各种行业认证就可以看得出来,还是扛得住市场对它的考验。这里提出它烂的原因,主要考虑是从代码设计和代码维护的角度来看。

  大家都戏称祖传代码,请勿随意改动,但我觉得真正优秀的代码,是慢慢被迭代,被重构而来的,否则的代码就会被一步步地堆砌起来,直到有一天,没人能够再修改维护了,那一刻就如同一栋大厦轰然倒塌,这是非常糟糕的。

  正是基于这些的考虑,当时我也是很大胆地向主管提出,我们应该从小面积开始做代码重构,逐渐改善一些有缺陷的代码设计。

  比较遗憾的是,主管是相对保守的,没有接受后面大面积重构的实施,主要还是担心期间的风险,影响外面的程序升级。从商业的角度上,我是支持他的;但是,从代码的角度,我还是坚持我的观点;当然这并不影响我们的共事。

  针对这一点,我重新整理了部分的C代码规划,明确要求非十分必要的设计,不允许全局变量在多个C文件中修改传递,尽量控制在一个C文件,同时关键的数据都封装成get/set接口,减少通篇修改数据的可能性。

  在code review环境,着重对此类代码做重点审查,一经发现,务必打回重新修改提交。

  【代码设计上:数据结构没有规划设计,导致结构体定义太复杂,太过庞然大物,冗余空间浪费大】

  针对这一点,我的方法就是重新梳理,我们需要用到的必备数据,把所有非必须的数据全部删除,同时一些数据buffer的长度,再严格评估其真正的内存需求空间,而不是一上来就定义32字节/64字节/128字节。

  还有一个方面,就是尽量考虑字节对齐的问题,定义结构体的时候,多考虑考虑。

  代码设计上:所有交易流程的判断处理,太过于死板,一个if-else判断到底,耦合严重,可扩展性非常差

  代码设计上:LCD显示与核心业务流程跳转参杂在一起,没有解耦,往往改了业务功能的同时还要改UI实现

  代码性能上:流程处理中,大量使用带超时时间的阻塞式函数,导致整个流程响应的时效性不是很理想

  这三点,我认为都应该通过改善整体的代码架构来提升,下面简单说说的重构思路。

  为了解决此类有业务处理流程,又有UI输入和UI显示的处理场景了,有一个比较成熟的软件模型,叫MVC模型。

  Controller:控制器,对应在这里就是,各式各样的事件,把各种用户可能输入的方式抽象成一个个事件,而每个事件都有对应的,当识别到了对应事件的发生,立马触发事件给到模型层。

  Model: 模型,这应该整个设计中代码最重的部分,主要是各个处理事件的处理,独立抽象成一个个模型,这些模型层互不干扰,也易于扩展,有新的事件需要处理就重新定义个模型即可。

  View:视图,就是最简单的UI界面,它负责对Model提供的数据最UI界面的更新,比如刷新时间,比如显示倒计时,比如提示用卡信息等等。

  应用MVC框架的最大好处就是把M和V分离开来,数据和视图解耦,使得数据易于处理并存储,同时也易于扩展,这里的扩展包括视图扩展和模型扩展,从一变N变得更加容易。

  另外很重要的一点,在性能上,处理的实时性大大提升了,而不是简单的阻塞、延时这种粗暴的方法,取之而来的各种异步监听,快速响应,这一点我觉得在涉及到UI的应用场景下,都是应该要着重考虑的部分。

  很多奇奇怪怪的BUG,在代码设计和代码编写阶段其实已经埋下了隐患,只不过短时间没有暴露出来而已。

  这也就要求我们这些代码工作者,在敲代码之前,多想想设计思路,尽量把你的思路,你的流程通过图表的形式表达出来,

  再不济,也应该要形成文档,以便于随时可以复盘你的代码实现是否偏离了你原本的设计。

  毫不夸张地说,一个在设计阶段就有缺陷的代码架构,再怎么修饰也将于事无补。

  代码性能上:流程处理中,大量使用带超时时间的阻塞式函数,导致整个流程响应的时效性不是很理想

  代码设计上:LCD显示与核心业务流程跳转参杂在一起,没有解耦,往往改了业务功能的同时还要改UI实现

  代码设计上:所有交易流程的判断处理,太过于死板,一个if-else判断到底,耦合严重,可扩展性非常差

  代码设计上:数据结构没有规划设计,导致结构体定义太复杂,太过庞然大物,冗余空间浪费大

  是否扫描到了微信/支付宝这类的支付条码?(条码支付与标准银行卡交易是完全不一样的流程)

  是否使用了IC卡做非接触交易(俗称:挥卡)?(挥卡交易,走银联的IC卡快速交易,行内称qPBOC流程)

  是否插入了IC卡?(插入IC卡,走银联的IC卡交易流程,行内称PBOC流程)

电脑内存录入:admin    责任编辑:admin 
  • 上一个电脑内存:

  • 下一个电脑内存: 没有了
  •  
     栏目文章
    普通电脑内存 【RT-Thread】show-me-bad-code (04-26)
    普通电脑内存 V神:不同类型 ZK-EVM 的未来 (04-26)
    普通电脑内存 slub分配内存原理 slub数据结构之间关系 (04-26)
    普通电脑内存 千元投影仪快乐星球O3怎么样值得购买吗? (04-26)
    普通电脑内存 视频版Stable Diffusion:英伟达做到最高1280… (04-26)
    普通电脑内存 5000多块的轻薄本能不能做照片堆栈?实测给你… (04-26)
    普通电脑内存 用了这么多年 Rust 终于搞明白了内存分布! (04-26)
    普通电脑内存 为什么Android开发使用Java而不是C++? (04-26)
    普通电脑内存 最新资讯_存储_DIY电脑硬件频道-YESKY天极网 (04-26)
    普通电脑内存 在计算机存储器中存储英文字母“J”时的是它的… (04-25)
    普通电脑内存 boss内存条有几种英文表达?比如system memor… (04-25)
    普通电脑内存 人们通常购买或升级内存条来提高计算机性能内… (04-25)
    普通电脑内存 在计算机存储器中存储英文字母A时的是它的()… (04-25)
    普通电脑内存 内存英文缩写(手机文件夹全是英文占内存不敢删… (04-25)
    普通电脑内存 内存written什么意思 其实内存出现问题的可能… (04-25)
    普通电脑内存 高带宽内存需求强劲海内外大厂加速布局算力产… (04-25)
    普通电脑内存 微星上架创造者Z17HX studio笔记本电脑 仅供3… (04-25)
    普通电脑内存 【视频】3699 一加Ace2原神定制礼盒发布 18GB… (04-25)
    普通电脑内存 广州海关发布知识产权保护案例涉侵权内存卡、… (04-25)
    普通电脑内存 如何彻底清理华为手机垃圾释放大量内存 华为手… (04-24)