[编程好习惯] 复用代码以提高可维护性
来源:李云 责任编辑:栏目编辑 发表时间:2013-07-01 23:27 点击:次
代码复用在软件开发中存在两个层次。第一个层次是,在设计一个新的软件功能或是开发一个新的项目时,复用已存在的软件模块,这种复用或许称之为设计复用更好。另一个层次是,程序员在开发一个软件模块时,模块的内部应尽可能地复用。从编程习惯的角度来看,这里指的是后者。
现在假设存在一个双向链表(Double-Linked List, DLL)的一个模块,如果这个模块在开发的过程中,已经存在了两个函数,分别是dll_push_tail()和dll_pop_head(),这两个函数的作用分别是将一个新的节点加入到链表的尾部以及从链表中删除并返回头节点。其代码实现如图1所示。
现在假设存在一个双向链表(Double-Linked List, DLL)的一个模块,如果这个模块在开发的过程中,已经存在了两个函数,分别是dll_push_tail()和dll_pop_head(),这两个函数的作用分别是将一个新的节点加入到链表的尾部以及从链表中删除并返回头节点。其代码实现如图1所示。
dll.c
00088: void dll_push_tail (dll_t *_p_dll, dll_node_t *_p_node)
00089: {
00090: if (0 ==_p_dll->tail_) {
00091: _p_dll->head_ = _p_dll->tail_ = _p_node;
00092: _p_node->next_ = _p_node->prev_ = 0;
00093: }
00094: else {
00095: dll_node_t *p_tail = _p_dll->tail_;
00096:
00097: p_tail->next_ = _p_node;
00098: _p_node->prev_ = p_tail;
00099: _p_node->next_ = 0;
00100: _p_dll->tail_ = _p_node;
00101: }
00102:
00103: _p_dll->count_ ++;
00104: }
00105:
00106: dll_node_t *dll_pop_head (dll_t *_p_dll)
00107: {
00108: dll_node_t *p_node = _p_dll->head_;
00109:
00110: if (p_node != 0) {
00111: _p_dll->count_--;
00112: _p_dll->head_ = p_node->next_;
00113: if (0 ==_p_dll->head_) {
00114: _p_dll->tail_ = 0;
00115: }
00116: else {
00117: p_node->next_->prev_ = 0;
00118: }
00119: }
00120:
00121: return p_node;
00122: }
00088: void dll_push_tail (dll_t *_p_dll, dll_node_t *_p_node)
00089: {
00090: if (0 ==_p_dll->tail_) {
00091: _p_dll->head_ = _p_dll->tail_ = _p_node;
00092: _p_node->next_ = _p_node->prev_ = 0;
00093: }
00094: else {
00095: dll_node_t *p_tail = _p_dll->tail_;
00096:
00097: p_tail->next_ = _p_node;
00098: _p_node->prev_ = p_tail;
00099: _p_node->next_ = 0;
00100: _p_dll->tail_ = _p_node;
00101: }
00102:
00103: _p_dll->count_ ++;
00104: }
00105:
00106: dll_node_t *dll_pop_head (dll_t *_p_dll)
00107: {
00108: dll_node_t *p_node = _p_dll->head_;
00109:
00110: if (p_node != 0) {
00111: _p_dll->count_--;
00112: _p_dll->head_ = p_node->next_;
00113: if (0 ==_p_dll->head_) {
00114: _p_dll->tail_ = 0;
00115: }
00116: else {
00117: p_node->next_->prev_ = 0;
00118: }
00119: }
00120:
00121: return p_node;
00122: }
图1
如果此时需要增加一个新的链表操作函数dll_merge(),用于合并两个链表。则这个函数的实现可能如图2所示。其思路也很简单,就是从_p_src链表中将一个个的节点取出并放到_p_dest链表的尾部。dll.c
00165: void dll_merge (dll_t *_p_dest, dll_t *_p_src)
00166: {
00167: dll_node_t *p_node = _p_src->head_;
00168:
00169: while (0 != p_node) {
00170: if (0 ==_p_dest->tail_) {
00171: _p_dest->head_ = _p_dest->tail_ = p_node;
00172: _p_dest->next_ = _p_dest->prev_ = 0;
00173: }
00174: else {
00175: &n
00165: void dll_merge (dll_t *_p_dest, dll_t *_p_src)
00166: {
00167: dll_node_t *p_node = _p_src->head_;
00168:
00169: while (0 != p_node) {
00170: if (0 ==_p_dest->tail_) {
00171: _p_dest->head_ = _p_dest->tail_ = p_node;
00172: _p_dest->next_ = _p_dest->prev_ = 0;
00173: }
00174: else {
00175: &n
相关新闻>>
- 发表评论
-
- 最新评论 更多>>