永远保持饥饿的状态--学泛型算法程有感

来源:互联网 发布:释放端口占用 编辑:程序博客网 时间:2024/04/29 21:39
看到泛型编程这章的时候,已经慢了下来,
原因一个是前面的急于求成,还没有吃透。 第二个,自己计算机知识比较少,以前没认真学。
数据结构还有一些经典算法掌握得很少。以及没能认真掌握一门语言.
 实验室的人都在谈各种应用型的编程,具体到很细很细了。驱动,内核,芯片。windows还是Linux的多深的多广的都有。而我们底下的学校则是语言,还是语言。结果今天学一下,明天忘. 要加油了。

废话不说了:今天和明天早上,好好整理关于泛型算法的一些知识点。

学习泛型理解的几点:(参考owl的描述 )
 1.标准库的设计理念。 vector并不是像前几节中设计array那样提供一个大而全的方法集合,而是提供了最小的接口集合,把那些具有通用性的方法单独组成泛型算法。可以使用在各种数据结构上,这个思想正好反映了作者在本章开头提出的问题,设计一个类,是要尽量让他成为语言的一等公民,而不是设计一个面面俱到的东西。
2.
对于iterator的认识.
它几乎是泛型算法的基础,它与指针的用法几乎完全相同。因此事实上,你就可以把他当成指针的一种类模板。另外还有一些特殊的iterator,比如begin().end().

owl 原话:c++primer第2章作者设计了一个比较完整的array类,从设计的角度来说,(当然除了库的实现者外)我们没有必要花那么多时间在实现数据结构上,只要调用各种库,我们就可以把自己精力放在更重要的设计上了,在今天,对于库的使用,几乎成了程序设计能力的重要指标之一,作为初学者,首先要学的当然是已经和语言合为一体的标准库了,而在所有的数据结构中,用的最多的无疑是线性表了。本书的标准库描述当然也从这里开始。

朋友的解释:

scenario 19:44:40
泛型就是说你定义一个函数,可以应用于任何类型上嘛。但是,类的操作符都需要重载的,如果你不重载,那么此类操作就没有定义。此时你实现该类型的泛型,也就是min(),又调用了他的<操作,系统又找不到,所以就出错拉

scenario 19:46:43
泛型的强大在于,你定义了他,就可以应用于任何的类型上。但是,类型和类型所支持的操作都是不同

的。如果你泛型的操作一些类型不支持,那么你就不能将泛型应用在这些不支持的类型上。或者说,泛

型真要起作用,应该只采用那些所有类型都支持的操作。


java版上 关于   Generics和polymorphism的讨论(from  smth)

我们到底需不需要泛型呢?使用泛型到底能减少多少代码量,提高多少重用性呢?

java view

1.Java里面比较经典的Collection FrameWork,这里面的容器都没有提供泛型的支持,但是加大了程序员的工作量,或者说是强迫程序员养成一个良好的编程习惯 :)

2.JAVA本身对类型比较强调了,用多态是可以在某种或相当的程度上实现GP,不过对类型的要求似乎有点讨厌。虽然JAVA有个公共祖先OBJECT,不过其类型支持的操作太少了,因此,要丰富通用算法或容器的逻辑,无可避免要定义一些的TYPE(无论是通过INTERFACE还是ABSTRACT),通过在运行时刻对具体类型操作。这就对OOD设计产生了影响,因为新类型TYPE出现了。因为 一般来说,类型是在实体建摸产生的。

3.Java的现状是不支持泛型,任何设计层面的抽象机制,例如OO,继承,模板,如果语言本身不支持,使用起来是事倍功半,当然你总可以使用设计层的idea.但是,设计层的概念或机制是十分需要实现层的支撑的。再举个例子,refactoring是一个很好的概念,可是如果没有良好的工具支持,就成了error-prone的麻烦工作。

4.泛型的事情类似,Java的设计理念就是:
1. pure OO
2. KISS: keep it simple and stupid.
--------------------
结果造成
3. 单根,单继承。
4. prefer interface to abstract class, prefer combination to inheritance
--------------------
后两条就是Java程序员必须适应的“有Java特色的OO风格”。
C++的OO设计肯定和Java不同,实现机制不一样之故。

5.其实不用泛型也不是不能做,只不过有了之后很多事情做起来方便一些。另外,效率应该高一些。

6.仅仅是为了节省时间。但是我觉得Generics还是有很大好处的,需要维护的代码大大减少了。很多数值运算包为了实现类似于Generics的功能,不得不为int/long/float/double各写一个类,就像Java2D中存在float/double两类几何形体(当然,这还不是因为generics,而是因为这些primitive类型,这并不是Java的设计失误,我只是举个例子),这样需要维护的东西让人头疼。

c++ view
1.泛型未必就仅是C++ 模板。GP不就是指针对概念编程么,尽量使算法或容器对数据类型无关。无论用什么语言机制,TEMPLATE或多态,只要体现了你的概念编程设计,就可以说是GP呀。但是GP的说法好象是从C++领域提出的,谁考证一下?

2.C++,TEMPATE的机制应该是GP的基础(我很土的,近两年才听说这个词,本科修C++时,就知道宏进化到类属/模板,最大的作用就是:可以少写很多代码:p)因此,我一直理解C++ 模版是在源码级别上实现了代码重用。很多现有摸班库的发布,也是基于源码级别的,和普通的二进制发布不太一样,因此对编译器考验比较多。但对于基于TEMPLATE之上编程的开发这来说,对设计影响不大。同时,无须新的类型产生,
往往只需要TEMPLATE T参数有共有的方法或属性了。

3.关于适用各种类型的排序算法,泛型来作当然很棒.

4.我在想有这样一种情况,我需要在很多的ArrayList里面实现查找,但是每个ArrayList里面放的东西不一样,但是查找的原理或者说是方法是一样的,如果有泛型的话,我可能只要写一边实现的代码,如果改成Java的实现方法,我是不是还要动态的检测类型,然后对不同的类型写一边查找的代码呢?

5.这样行不行?声明一个接口HasIndex,提供方法getIndex();你的ArrayList中的不同类型全部实现此接口,
则查找方法接受HasIndex为参数,就可以只写一份查找代码。这是典型的用接口代替模板的例子

6.C++和JAVA做gp的一个显著差异:JAVA必须为了适应新的算法设计新的接口如本例中的HasIndex
就为对象系统增加了新的类型。而通常在OOD设计阶段不太能轻易idetify这些由算法衍生出来的type的

7.c++版的意见多半是由于MFC这个东西以及匈牙利命名法弄出来的吧

8.这个和Generics没关系吧?使用Generics最终生成的代码会比你想象的多(这也要看编译器优化的本事),但是效率倒是没什么下降的说

9.我看CPlusPlus版的意见好像正相反,有人抱怨某些"流行的编码风格"使得  程序代码膨胀,效率降低云云。

10.现在大家吹捧 generics 的结果是滥用. 使用 Generics 一定要十分小心.Generics 可以极端降低可理解性. 比如 STL 的实现.
原创粉丝点击