混沌 IN C++::Generic Programming

原创 2008年10月03日 14:29:00
难度:
 

现代程序开发最关注的一件事之一就是如何提高代码的可复用性和可维护性。

OOP
提供了抽象概念来构建一个统一的世界模型,具像的物理对象被实现在这个简单的抽象模型体系中,最终形成庞大的树型结构来覆盖由该抽象涉及到的方方面面,可复用性由此诞生。

GP
提供了另类的复用方法,让算法与类型无关。

在大多数的开发中,GP的运用几乎为空白,其实这并不是坏现象,除了让部分代码变得稍微优雅,剩下的可以说在大部分情况下,GP都是画蛇添足。在开发中, 我们努力用OO的知识和经验来创建类,让这些类对象相互协同工作来达到目的,一般情况下,我们是处在一个很小的问题域中着手解决具体的问题,不需要更多的 思考,所以template关键字几乎可以不用出现在我们编写的代码当中。

在以往的观点中,GPOOP就像两条平行线,一边是静态多态,一边是动态多态,这样的观点让很多人误解了GP,加上在实际工作中,几乎不写template关键字,从而加深了这种误解。

到底GP存在的意义在哪里?相信大多数C++程序员都会用到STL,正是GP造就了STL的应用如此广泛。GP是一种用来开发高效,高复用程序库的编程范式,所以在实际工作的大多数项目中,GP对我们来说可有可无。用GP来分析问题的三个步骤:
1
,将抽象问题域分类成Concepts.
STL中,迭代器按行为被分类成5类。Input/Output/Forward/Bidirectional/Random Access Iterator

2
,基于这些Concepts,设计泛型算法。
例如std::generate要求Forward Iterator,而std::next_perutation要求Bidirectional Iterator.

3,
创建Concepts的具体模型。
例如,std::vectorIteratorstd::mapIterator

其实GP的分析方式与OOP极其类似,都是由具体的事物寻找抽象,然后按抽象来设计,最后基于抽象实现具象。

GP编写的泛型程序库到底好在哪里?
可复用性:
我们尝试用OO来实现vector

  1. class oo_vector
  2. {
  3. public:
  4.     void push_back(vec_elem_t& r)
  5.     {
  6.         vec_elem_t * n = r.clone(*this);
  7.         //hold n ...
  8.     }
  9. };

如果我们要使用oo_vector,那么存储的元素类型必须由vec_elem_t派生并实现clone方法。如果用C++ Templates来实现,复杂度自然降低。至少我们的元素类型不会出现派生自vec_elem_t, map_elem_t, list_elem_t等等这种庞大的多重继承的情况。

粘和性:
用上面的oo_vector来思考。如果有一个现成的类,要让oo_vector来操作,该怎么办?C++ Templates应用到这种情况下大大提高了粘和性和可复用性。

Templates
C++变得太了?
C++
是强类型语言,继承确定了两个类的关系,这种关系可以某些方法作用于子类对象上,他们之间存在着一种限制。而对于一个泛型算法,它能接纳的模板参数 T,从形式上,看不到任何限制,但这也许会使你的代码编译失败。例如把std::listiterator传递到std::find中,得到的编译错误是 iterator缺少某某东西,在这种情况下,如果编译错误能提示listiterator不能用在find里,这样就会友好很多。其实这不仅仅只是提示得友好,因为我们在设计这种泛型算法的时候就是依据上面提到的Concepts,这种 Concepts在目前的C++语言中,只是一个潜在限制,作为泛型库的使用者,很容易忽略掉这种限制。或许有人会认为,如果C++引入Concepts 的限制来做类型的检查,那么它还会是GP吗?它仍然是GP,显而易见的,泛型库的设计是从Concepts出发,这好比一个子类是从基类出发一样。

Concepts
会是画蛇添足吗?
就算语言引入了Concepts,那么listiterator仍然不能用到find中去,这和没有Concepts的情况完全一样。Concepts 描述了一组抽象的行为,我们可以提供一个算法函数来处理具有这种行为的类型,它的引入会把人们的关注目光从围绕T上转移到Concept上,这能更好地表达每个抽象的核心思想。按Concepts来特化算法,比按类型来特化算法是更好GP,因为GP原本就与类型无关。在解决list::iterator应用到find的问题上,只需要特化一个符合list::iterator Conceptfind即可。

现在看来GPOOP似乎很相似了,从分析的角度来说,他们的方向是一样,只是方法不同。这两个范式的区别不像OOP和面向过程那样,立竿见影。或许说,GPOOP都应该是一种泛型GP是基于行为概念的抽象,OOP则是基于事物概念的抽象。在OO的设计中,我们仍然会考虑到行为这一问题,只不过从OO的角度来说,这太隐晦,而GP在这方面则表达得更好,更抽象。

《Generic Programming and the STL》读书笔记

Generic Programming and the STL   最后还需要把没搞懂的地方一一记下列出搞懂,争取一次把STL吃透,并在工作中学以致用!!别囫囵吞枣! 译序 作为一个广为人知的...
  • backard
  • backard
  • 2013年01月23日 20:07
  • 662

Java中的泛型编程(generic programming)和泛型类(generic class)

泛型编程(generic programming)和泛型类(generic class)泛型编程(generic programming)意味着代码可以被不同类型的对象所复用。泛型类(generic ...
  • lichengyu
  • lichengyu
  • 2015年12月06日 10:49
  • 1677

Generic Programming in C++

2.1 Introduction In generic programming, we take the notion of an ADT a step further. Instead of wr...
  • seamanj
  • seamanj
  • 2016年02月15日 23:48
  • 635

Hadoop系列之ToolRunner与GenericOptionsParser用法

首先给一个ToolRunner类的实例 package hadoop.study; /** * Created by denglinjie on 2017/3/7. */ import jav...
  • u011734144
  • u011734144
  • 2017年03月07日 17:37
  • 177

Generics in the Java Programming Language Java

Generics in the Java Programming LanguageJava编程语言中的泛型Gilad BrachaJuly 5, 2004Contents内容1 Introductio...
  • dracularking
  • dracularking
  • 2008年03月17日 22:12
  • 2307

GP与OOP

GP   :generic programming 类属编程 另一术语 泛型编程 (多么大气的一个词汇) OOP:Object Oriented Programming 面向对象编程 类属编程是构成...
  • sakawa_x
  • sakawa_x
  • 2014年12月28日 01:10
  • 664

C++ generic algorithm

 本文主要讨论C++标准库中的泛型算法(generic algorithm)。泛型算法是使用容器的强有力的辅助工具。     如果文中有错误或遗漏之处,敬请指出,谢谢! ---------------...
  • zhongjiekangping
  • zhongjiekangping
  • 2009年12月06日 19:15
  • 1314

混沌方法的数字图像加密

Abstract:目前混沌系统与加密技术相结合是现如今最热门的一个课题,虽然有大量的加密算法面世,但是这些加密算法并不成熟,仍然需要进一步的研究。本文采用像素位置置乱变换和像素值替代变换相结合的加密思...
  • hlx371240
  • hlx371240
  • 2015年05月09日 20:01
  • 5073

Design Patterns for Generic Programming in C++

This document is an electronic version of a paper published in the Proceedings of the 6th USENIX Con...
  • wenbin0301
  • wenbin0301
  • 2012年08月10日 13:42
  • 626

Generic Programming

Hello all. Its nice to meet you all here. I got a lot of knowledge from csdn. now, I try to feed bac...
  • bu3bu4
  • bu3bu4
  • 2002年01月18日 09:32
  • 532
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:混沌 IN C++::Generic Programming
举报原因:
原因补充:

(最多只允许输入30个字)