http://blog.chinaunix.net/uid-23629988-id-158156.html

在产品的开发过程中,无论是代码的重构,还是添加新的功能时,都不可避免的有对现有结构体的修改,比如结构体成员变量名字的修改,类型的变动,等等。如果只是修改名字,使用工具,就可以把所有的改动完成了。但是如果是成员变量的类型发生了变化,就不是不能简单的依靠工具完成了。而且作为人工的工作,每个开发人员的进展速度不一样,如果不能同时完成修改,那么每天的工程的自动build就无法完成。

那么有没有一种技巧,可以避免这种情况呢。
下面举个例子,比如有这样的一个structure
  1. typedef structure {
        char     name[MAX_NAME_LEN];
  2. unsigned short height;
  3. // ... ...
  4. } STUDENT_INFO_S;
用于表示学生的个人信息,那么代码中肯定会有很多地方引用name
  1. STUDENT_INFO_S student;
  2. char name[MAX_NAME_LEN]
  3. // ......
  4. strncpy(name, student.name, sizeof(name)-1);
但是现在有了新的需求。不能直接把学生的姓名直接存入一个字符数组了,而是需要一个结构体
  1. typedef {
  2. char name[MAX_NAME_LEN];
  3. char first_name[MAX_NAME_LEN];
  4. char last_name[MAX_NAME_LEN];
  5. } NAME_INFO_S;
如果我们直接使用这个结构体作为新的name类型,来取代原有的字符数组,
  1. typedef structure {
  2. NAME_INFO_S name;
  3. unsigned short height;
  4. // ... ...
  5. } STUDENT_INFO_S;
那么毫无疑问,在不修改代码的情况下,会有很多地方无法通过编译。如果这样的地方很多,我们为了不妨碍每天的自动build,可能会快速的修改以前的代码——这无疑有着一定的引入bug的风险。
 
那么遇到这种情况时,我们可以使用union来避免这个问题,既在新的代码中可以使用新的结构体,同时又不会影响build和以前代码的逻辑。
  1. typedef structure {
  2. union {
  3. char name[MAX_NAME_LEN];
  4. NAME_INFO_S name_info;
  5. };
  6. unsigned short height;
  7. // ... ...
  8. } STUDENT_INFO_S;
这里应用了gcc的一个扩展特性,当不对union或者struct命名时,外层可以直接引用union或者struct中的成员变量。比如STUDENT_INFO_S
student, 我们可以直接使用student.name_info或者student.name。
 
通过这样一个小技巧,我们可以在新的代码中,使用新的成员变量,同时不会影响到以前代码的编译。如果新的类型中,包含了以前老的类型且位于第一个时,甚至不会影响到以前老代码的逻辑。这样可以允许开发人员仔细的,慢慢修改以前的代码。

union在重构代码中的使用技巧的更多相关文章

  1. 代码重构 & 代码中的坏味道

    1.重构 1.1 为什么要重构 1.1.1 改进程序设计 程序员为了快速完成任务,在没有完全理解整体架构之前就开始写代码, 导致程序逐渐失去自己的结构.重构则帮助重新组织代码,重新清晰的体现 程序结构 ...

  2. Ioc在重构代码中的应用

    最近lz在写抓工商公式系统(http://www.gsxt.gov.cn/index.html)的爬虫,其中的难点就是在怎么过极验验证码,搞的我不要不要的!如下: 简直是各种坑,被搞的死去活来以后还是 ...

  3. 要心中有“数”——C语言初学者代码中的常见错误与瑕疵(8)

    在 C语言初学者代码中的常见错误与瑕疵(7) 中,我给出的重构代码中存在BUG.这个BUG是在飞鸟_Asuka网友指出“是不是时间复杂度比较大”,并说他“第一眼看到我就想把它当成一个数学问题来做”之后 ...

  4. C语言初学者代码中的常见错误与瑕疵(7)

    问题: 矩形的个数 在一个3*2的矩形中,可以找到6个1*1的矩形,4个2*1的矩形3个1*2的矩形,2个2*2的矩形,2个3*1的矩形和1个3*2的矩形,总共18个矩形.给出A,B,计算可以从中找到 ...

  5. angular源码分析:angular中各种常用函数,比较省代码的各种小技巧

    angular的工具函数 在angular的API文档中,在最前面就是讲的就是angular的工具函数,下面列出来 angular.bind //用户将函数和对象绑定在一起,返回一个新的函数 angu ...

  6. Eclipse中调试Android技巧

    Android eclipse中程序调试 一:断点调试 用eclipse开发android程序的时,跟VS一样是可以断点单步调试的. 步骤如下. 1 设置断点:在编码窗体的左边框上用鼠标双击,或者右键 ...

  7. 面试官:优化代码中大量的if/else,你有什么方案?

    一个快速迭代的项目,时间久了之后,代码中可能会充斥着大量的if/else,嵌套6.7层,一个函数几百行,简!直!看!死!人! 这个无限循环嵌套,只是总循环的一部分...我已经绕晕在黄桷湾立交 仔细数了 ...

  8. ios开发中的小技巧

    在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 //分组列表头部空白处理 UIView *view = [[UIViewal ...

  9. Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成

    前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 ORM 的功能.由于在 09 年最初设计时,ORM 部分的设计并不是最重要 ...

  10. 背水一战 Windows 10 (21) - 绑定: x:Bind 绑定, x:Bind 绑定之 x:Phase, 使用绑定过程中的一些技巧

    [源码下载] 背水一战 Windows 10 (21) - 绑定: x:Bind 绑定, x:Bind 绑定之 x:Phase, 使用绑定过程中的一些技巧 作者:webabcd 介绍背水一战 Wind ...

随机推荐

  1. Nginx 静态站点配置不对导致301跳转的坑

    背景 是这样的,我们前端服务器统一的入口是 kong网关 ,我们还有一个Nginx静态资源站点:static.mysite.com,根配置如下: location / { root /home/web ...

  2. STM32 CubeMX 学习:003-定时器

    背景 上一讲 STM32 CubeMX 学习:外部中断的使用 介绍了如何配置以及操作GPIO外部中断. 这一讲我们介绍定时器的有关概念,并对其中一种进行示范. HOST-OS : Windows-10 ...

  3. 手机护眼概论及OLED屏幕降低频闪原理介绍

    影响护眼的因素 蓝光 目前手机大多已经实现硬件低蓝光,而且蓝光也可以通过护眼模式轻易克服. 偏振光 偏振光指振动方向与传播方向不对称的光,主要分为圆偏振光与线偏振光两种. 线偏振光测试方法为:透过偏振 ...

  4. IIS部署错误HTTP Error 500.36 ASP.NET Core IIS hosting failure(out-of-process)

    错误提示 HTTP Error 500.36 - ASP.NET Core IIS hosting failure (out-of-process) The out of process reques ...

  5. LVGL一键打包图片工具,全部图片打包成一个bin文件,支持nor flash XIP模式下直接访问数据显示

    最近做工程项目,需要用到LVGL,但是搜了很长时间没有看到合适的图片打包工具,大多都是生成数组或者单个的bin文件,这样烧录到nor flash很麻烦 后来看到一篇博客,博主的想法与我类似,不过他后面 ...

  6. AJAX基础+Axios快速入门+JSON使用+综合案例

    目录 1. AJAX 1.1 概述 1.1.1 作用 1.1.2 同步和异步 1.2 快速入门 1.2.1 服务端实现 1.2.2 客户端实现 1.3 案例 1.3.1 需求 1.3.2 分析 1.3 ...

  7. Java socket 获取gps定位

    1.Java socket 获取gps定位的方法 在Java中使用Socket来直接获取GPS定位信息并不直接可行,因为GPS数据通常不是通过Socket通信来获取的.GPS数据通常由设备(如智能手机 ...

  8. EXPLAIN sql优化方法

    select A . id , A . title , B . title from jos_content   A left join jos_categories B on A . catid = ...

  9. 基于微信小程序的校园维修管理系统-开题报告参考

    \n文末获取源码联系 感兴趣的可以先收藏起来,大家在毕设选题,项目以及论文编写等相关问题都可以给我加好友咨询 一.课题研究的目的和意义** 本研究开发基于微信小程序的物品维修系统,它不仅能实现专业的维 ...

  10. [oeasy]python0144_try的完全体_否则_else_最终_finally

    try的完全体 回忆上次内容   上次细化了主控程序(main.py) 导入(get_fruits.py) 处理(process.py) 输出(output.py)   使用了 try 结构 try ...