共鸣
今近日一直在阅读《编程珠玑》这一本书,阅读后,非常惊艳作者在基于多年程序员工作上,而积累的对编程的真知灼见。同时对于作者的一些感触,自己也不禁产生共鸣。例如在第三章中的《数据决定程序结构》这一章节中共鸣异常强烈,故因写下此篇博文,与诸君共赏。
我在大一的第一个学期,就开始学习编程了,第一门语言是令人喜爱的 C 语言, 有人说C语言很难,我一开始也是这么觉得的,在学习的第一门语言的时候,的确是非常艰难的,因为自己的计算机知识还不足够(例如对于内存,地址、操作系统一些概念),所以在我第一个学期学完之后,C语言的基础知识是有了,但是还有些概念没有完全的弄清楚,面对一个问题,还不能够转换成程序的准确描述。所以要说怎么编写一个漂亮,能够让人入眼的程序,我是说不出的。
但是在第二学期的时候我学习了Java语言的同时,还学习了数据结构与算法(C语言实现),在学习数据结构与算法的时候,自己就知道了对于程序的如何写好有了慢慢的体会了————在后面的学习中,自己也越加强烈的体会到 数据决定程序的结构, 作者的真的观点真的是太对了,对这种看法我是深有共鸣。
案例
在大一暑假期间,在西安微易码计算机科技有限公司的项目实训中,我接到的任务是,完成公司管理信息信系统中,主界面菜单根据用户类型动态的显示菜单(不同用户具有不同的使用权限),在后期,可以灵活的增加和减少菜单,设置用户权限。
任务要求
所有的菜单项都从数据库中取得,取得的是一个字符串,成序分菜单,一级菜单,二级菜单和以下的菜单
菜单权限设置
1、如果需要对不同的用户采取权限设置,可以建立相关的数据库表,进行设置,程序可以提取数据,自动生成
设置有权限的菜单。(本例子中代码有从权限数据库表中取 得相关用户的菜单权限)。2、菜单可见和不可见。
3、菜单可用和不可用(灰色状态)。自动生成菜单
1、数据库表中所包含的字段有:菜单编号,菜单名字,菜单所对应类名字,父菜单编号,菜单类型。
2、若用户想增加或减少菜单,只需改变数据库表,而程序不需要更改。多级菜单的生成
1、生成多级菜单只需更改数据库表,在数据库表中填写清楚菜单类型,和子菜单编号,父菜单的编号。
2、多级菜单的寻找方案为递归寻找。
主要技术点
- 数据库
- Java反射技术
数据库数据
根据要求,数据库以Access为例,我对数据库表的设计是这样的,字段有:
Menu_Id(菜单编号 ,短文本)、Menu_Name(菜单名,短文本)、Class_Name(菜单项对应的类名,短文本)、Father_Id(父菜单的编号、短文本)、Menu_Type(菜单类型、数字)
对于主菜单项,没有父菜单的编号,那么对于后面的菜单来说,每一个菜单都记录着自己的父菜单编号,所以一遇到拥有子菜单的菜单项,就去后面寻找属于他的子菜单,所有等到所有主菜单遍历完了之后,所有菜单也就按部就班的”归位”了。所以根据这个思路设计数据库表,然后根据设计的表数据机构,编写实现的程序。
如下图:
注意:数据库表是怎么设计的,那么就在编写程序的时候,围绕数据进行编写,所以数据结构决定程序。
那么说道第到底是要实现什么样的效果来呢?直接放图吧。就是要实现下面的这个效果:
针对于这个项目的要求,我整体的实现是如下:
- 连接数据库类
|
|
- 生成菜单代码
|
|
最后实现的效果就是是如下的图:
点击一个菜单项的时候,调用相应的模块(本文章中没有列出相应的代码),显示的效果如下图:
再次重申
在我上面的项目案例中,使用数据库和我现在认为的比较合理的数据结构与算法,所实现的需求的要求,并且大大节省了冗杂重复的代码,而且灵活性也更加高,但是也是有局限性的,因为我这个程序的数据源是来自数据库,数据库中的表设计中的数据规范限制了数据(对数据进行要求),才能够完成,所以说数据结构决定了程序结构。
最后,再总结《编程珠玑》中的几点:
- 将大程序缩减为小程序。数据结构设计还有很多其他正面影响,包括节省时间和空间,提高可移植性和维护性。
- 程序员在节省空间方面无计可施的时候,将自己从代码中国解脱出来,退回起点并集中心力研究数据,常常能有奇效,(数据的)表示形式是程序设计的根本。(后面的几点是退回起点进行思考时的几条原则。)
- 使用数组重新编写重复的代码。冗长的相似代码常常可以使用最简单的数据结构———数组来更好地表述。
- 封装复杂结构。当需要非常复杂的数据结构时,使用抽象语进行定义,并将操作表示为类。
- 尽可能使用高级工具。超文本,名字–值对,电子表格,数据库,编程语言等都是特定问题领域中的强大工具。
- 从数据得出程序的结构。在动手编写代码之前,优秀的程序员会彻底的理解输入、输出和中间数据结构,并围绕这些结构创建程序。