我们先来看一小段程序:

const char *GetString(int key)
{if (key == 1)return "first";else if (key == 2)return "second";else if (key == 3)return "third";else if (key == 4)return "forth";//...return "none";
]

这是我们经常会看到的一段程序,设计模式中著名的工厂方法。它封装了将“材料”生产成“产品”的过程,使程序更加容易读懂,并方便后期修改(易读性与可维护性)。当然,在“产品”很少的时候,这样的程序又简明又易写,很是适合。但当我们的工厂逐渐变大,产品的种类越来越多的时候,你就不得不写上一堆又一堆的 else if 了,这可是非常麻烦和烦人的一件事。后期修改的时候,读程序的人也会不禁咒骂之前的作者——这样的意大利面条可不是谁都愿意吃的。

没错,当面对这种情况时,你马上会想到用 switch 来代替。你很聪明,switch 从形式上,确实要比 else if 明了得多了,但是它也有一个缺点:如果 key 变为了非整型或 char 型,又该怎么办?

这个时候,我们会想到,如果有一种方法,能将数据与程序分离开,每次出现新产品,只需要将产品的样式填到菜单里就可以,那多好。啊,数据库,它可以很方便地管理这些字段。这是个好的建议,当数据项和数据量多到一定程度时,使用数据库几乎成为必然手段。然而,我们面对的却是一种尴尬的情况:问题的规模不适合用 else if 和 switch 处理,如果使用数据库,且不说运行效率,仅从操作的麻烦程序上来说,还不如直接写 else if 了。。。所以在这里,我们需要的不是强大却麻烦的大型数据库,我们需要的,仅仅是编程上的一点小技巧。说到这里,也许您已经明白了,没错,就是在程序中实现一个数据表与查询方法。查询方法只按固定的方式去数据表中查询对应项的数据,然后返回。这样,既不必连接消耗资源的数据库,提高程序运行效率,又可以明了简便地完成我们想要的模式。查询方法很简单,只要给一个数据结构,遍历就是了,那么表呢?用什么来实现?对,在C中,数组是一个必然的选择。表是二维的,那么用二维数据吗?显然不行,二维数据只能维护一堆数据类型相同的数据,这显然不符合我们的需要。我们是要将int型数据对应为string型的。于是我们想到了一个利器:结构体数组。

那么让我们来改写一下之前的代码:

#define END 9999typedef struct {int key;char *str;
}ITEM;const ITEM table[] = {{1, "first"},{2, "second"},{3, "third"},{4, "forth"},//...
    {END, NULL}
};const char *GetString(int key)
{for (int i = 0; table[i].key != END; i++) {if (table[i].key == key)return table[i].str;}
}

table维护了数据的对应,而GetString只是遍历table去查找相应项。每当产品增加时,我们只需要在table中添加一个对应项即可。这样就解决了我们所面对的用 else if  和 switch 不足,用数据库又有余的数据对应问题。

同样的方法也适用于Java。Java中使用枚举来替代结构体数组。

转载于:https://www.cnblogs.com/qyit/archive/2012/05/30/2525801.html

数据与程序分离——程序中那些表的事儿相关推荐

  1. Mysql查询表中每行数据大小_计算数据库中各个表的数据量和每行记录所占用空间的脚本-转载来自(博客园 桦仔)...

    本文出处: 感谢桦仔 的分享精神! 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tablespaceinfo ( nameinfo  ...

  2. JAVA程序禁用Hbase中的表_HBase禁用表

    要删除表或改变其设置,首先需要使用 disable 命令关闭表.使用 enable 命令,可以重新启用它. 下面给出的语法是用来禁用一个表: disable 'emp' 下面给出的是一个例子,说明如何 ...

  3. php向数据库添加数据失败,无法从PHP中的表单向数据库添加数据

    我已经编写了这个代码来将数据从表单添加到数据库,但没有任何反应.我不知道什么是错,请帮我检查一下.一直试图找到过去两天的解决方案,我需要尽快提交! include("connectDB.ph ...

  4. Spring Boot JPA中关联表的使用

    文章目录 添加依赖 构建Entity 构建Repository 构建初始数据 测试 Spring Boot JPA中关联表的使用 本文中,我们会将会通过一个Book和Category的关联关系,来讲解 ...

  5. 大数据_MapperReduce_从CSV文件中读取数据到Hbase_自己动手实现Mapper和Reducer---Hbase工作笔记0021

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 然后我们先来复习一下,上一节说的,这个数据迁移,我们把 hbase中一个表的数据,迁移到另一个表中 ...

  6. Hadoop大数据存算分离方案:计算层无缝对接存储系统

    Hadoop的诞生改变了企业对数据的存储.处理和分析的过程,加速了大数据的发展.随着大数据系统建设的深入,企业的数据基础设施易出现计算资源浪费.存储性能低.管理成本过高等挑战.相比存算一体架构,存算分 ...

  7. 单片机C语言数据存储原理,介绍单片机中C语言的数据存储与程序编写

    一.五大内存分区: 内存分成5个区,它们分别是堆.栈.自由存储区.全局/静态存储区和常量存储区. 1.栈区(stack):FIFO就是那些由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区 ...

  8. 小程序 | 小程序中常用的事件 + 事件对象的属性列表 +小程序事件传参 + 小程序全局配置 + 小程序页面配置 + 小程序发起网络数据请求

    文章目录 一.WXML 模板语法 数据绑定 事件绑定 ⭐小程序中常用的事件 ⭐事件对象的属性列表 target 和 currentTarget 的区别 bindtap 的语法格式 在事件处理函数中为 ...

  9. 与符号表分离程序或动态库, 如何用GDB调试

    1       Debugging Information in Separate Files GDB支持用户将程序调试信息放在一个独立的文件里,而不是和可执行程序在一个文件中,GDB可以某种方式来查 ...

最新文章

  1. 【 Notes 】Best linear unbiased estimator(BLUE) approach for time-of-arrival based localisation
  2. apache使用.htaccess删除.html扩展名_Web前端入门:html元素解析
  3. 在应用程序中加入.net脚本
  4. ipynb和py文件一样吗_文件描述符了解一下
  5. Linux 查看数据库MySQL安装文件和安装目录的命令
  6. 计算机组成原理上机实验报告.doc,计算机组成原理第二次上机实验报告.doc
  7. linux系统管理Linux系统实验,操作系统原理与Linux系统实验
  8. c++数组、结构体数组和对象数组的初始化方式
  9. python urlencode函数_Python urlencode和unquote函数使用实例解析
  10. 模拟退火(SA)算法实例介绍(JAVA)
  11. consonant combination
  12. uniapp开发微信小程序腾讯地图功能,生成地点云的sig签名
  13. ProcessingJoy —— 粒子流逝特效【JAVA】
  14. 超好用的视频编辑工具:Movavi Video Editor 15 for Mac
  15. 英语2017年6月听力
  16. DR007利率报价查询_图表加数据DR007存款类机构质押式回购利率
  17. 【TensorFlow】使用AlexNet网络对图片进行识别分类
  18. 竞赛打卡:糖尿病遗传风险检测挑战赛
  19. STM32F103移植STEMWIN并驱动0.96寸OLED实现弹球界面效果
  20. java毕业生设计装修网站计算机源码+系统+mysql+调试部署+lw

热门文章

  1. html 地址坐标图标,浏览器地址栏中显示自定义小图标
  2. 什么地方容易刷出ak_男人会用什么理由拒绝表白?
  3. LeetCode 213 House Robber II Python
  4. reduce_sum()中的reduction_indices
  5. java学习类的笔记
  6. vs程序生成后找不到exe文件
  7. Java数据结构和算法(四)——栈
  8. 【C#学习】delegate(委托) 和 event(事件)
  9. Vue.js 从 Vue Router 0.7.x 迁移
  10. Vue.js 自定义指令