项目的要求是:
需要接受create,insert,select, update,delete等语句,在内存中建立一个数据库表。并对这个表进行相应的操作。
?
动手之前有一些提示。
?
我先解释一下这两点:
?
首先,你的程序是运行在内存中,程序所要处理的内容当然需要预先保存在内存中,这样你才可以进行内容操作。
保存在内存中,换句话说你可以申明变量,把文件中所表述的内容赋值到变量中。
?
那么这个或这些变量应该是什么类型的呢。
你第一个想到的,既然是文本形式读到的内容,就保存在一大块char[]中了。这当然是可以的。
只是整块的保存不利于我们今后对相应数据的处理。比如每次取某一条数据,我们都会需要对整个文本进行解析。这样做效率太低。
?
因此我们要做的是,先把整块文本解析好,然后把它保存在比较利于今后处理的类型中。
这就是我说的要做的2件事
?
遇到一些问题很难马上想明白,正常人都是这样的。这种时候把问题分解开来就方便解决了。
比如实现SELECT的时候,我们会觉得非常复杂,无从下手。SELECT要选择某些字段,要符合某个或某些条件,还要符合一定的顺序。SELECT函数我是这样写的
TableRow * selectTable(SelectInfo *info) { TableRow * rows = NULL; //如果有排序要求先排序 if (strlen(info->order->columnName)>0) rows = Order(info->order); //拍完序再过滤 Filter(&rows, info); return rows; }
?
排序具体怎么排,则交给Order函数了。过滤具体怎么过滤,就交给Filter函数了。其实Order函数和Filter函数中也有很多小的函数组成的。
我们写一组功能实现时,一旦觉得过于复杂没有办法实现,可以用一个子函数来代表某个子功能已经实现了。这样就可以专注到所有功能完成。而子功能的实现可以在实现子函数的时候再来考虑。
?
再比如说。我要设计一个放表头的结构,一个表头有表名和很多列。列有列名,有列的长度,列是否允许为空等等。
想来很复杂,但是这个结构我会这样设计
struct Table { char name[50]; Column * columns; };
?这样设计并没有解决所有的问题。但是这样的设计就是为了把问题分解开来。
?
?
这些个内容需要同学一边开发一边自己体会。