gp編程思想
『壹』 小弟初學C++,想請教一個問題,請各位大俠指點,謝謝。
提供C++資料下載地址: http://jian.blog.itchina8.com/blog.php?uid-148-dirid-2.html
http://tanjieyi.91i.net/C++teaching.htm
上面有下載課件
一個學習STL的地方
參考資料:http://www.stlchina.org/
http://club.cnfan.net/forums/2020/ShowPost.aspx
可以下
最經典的c++書: c++ primer.無論在哪裡都會被稱為聖經!
清華大學出版社的錢能編的C++的書
http://www.7351.cn/Soft/shipxiazai/200507/392.html
http://wstatic.xunlei.com/index2.htm?search=C++視頻教程
http://www.521n.com/Software/Catalog53/471.html
自己下載吧試試看
<<essential C++>>是本好書, 作者Stan Lippman, 現任Microsoft Visual C++ 開發組的系統架構師, 此書簡短, 非常適合入門,中文版侯捷翻譯的如何,由於我沒看過, 不好亂說, 不過其他侯捷譯的書還是不錯的.
另外,可以配合<<primer C++>>看, 同一作者, 中文版好像是潘愛民譯(他譯的書都很好)的吧, 很厚, 很全面, 可以作參考
另外, <<Thingking in C++>> 也很好, 可惜中文版譯的不怎麼樣, 我看的是原版, 很不錯.
<<the C++ programming language>>C++聖經, C++之父寫,中文版裘宗燕譯的, 我認為譯的很好,此書較深, 不適合入門, 用來精通
另外<<C++沉思錄>>也不錯, 經典, 不是入門的, 以後學習.
學C++, 看這些書足以!~~~~~~~~都是大家寫的, 十分優秀.
推薦: <<C++ primer>> + <<the C++ programming language>>+課外讀物<<C++沉思錄>> = C++牛人
呵呵!~~ 看自己需要了~~~
有人認為後期的C++趨向學院派風格,走進了一味追求技術和難度的誤區,
逐漸脫離主流的Programmers.
有人認為C++由於復雜度導致在現代軟體工程中的地盤不斷縮水.
也有人認為,C++無任對特定領域應用還是研究來說,都足夠的優秀.
一、面對Object-Pascal、java、C#等語言,還需要C++ ?
首先,就方法學來說,不可否認,OO方法學本身具有構造的系統隨著工程的進行復雜
度膨脹速度驚人.而且,對於上點規模的工程,為了構建OO系統,在OOA、OOD階段,設計
者需要極高的水準.而以OOP為一典範亦作為OOP代表的C++在語法語義的設計上明顯採用為了功能而不惜增加設計復雜度的策略.然而這一切的復雜,自然帶來了好處,包括系統的可擴展性、可重用性等.這里好象存在一層很微妙的關系,上規模的系統為了可擴展性、可重用性等優點選擇OO方法學,然而在OOA、OOD階段就需要極大的投入(也許在00方法學中,A和D在軟體工程中的地位體現的更明顯吧~).
這個世界關於語言之間的討論可能時刻進行著,個人一直認為:
1.首先每種語言有自己的適用領域,就應用而言,沒有必要將語言勉強的拿到一起比較.
構建企業信息系統,自然會選擇Java、dotNET或其它的方案(事實上,這種系統一般應
該多種語言協同開發,以獲得部件性能最佳).可能多種語言同適合某個項目,那麼具體就自己裁決了.譬如做一個信息管理系統,選擇C++環境的絕對很少,PB或Delphi、VB都是不錯的選擇.在初學習階段"因愛而選(更多的具有偶然性或者與身處環境有關)"、對於開發者基本是"因用而選".在成熟後,"因用而學"我感覺是根本也是最實際的指導原則.
2.關於語言復雜度的問題:語言是工具,是不需要也不能太復雜的.我一直支持語言應該朝專業化(這里指針對義務和特定應用場合)和簡單化方向發展.這才是語言的本質之所在.業務是軟體實施的根本.對於軟體開發著來說很多情況下,業務是最難搞定的,或者說,用軟體來真實細致安全的模擬業務是很困難的.前幾天,學籍管理科的老師還跟我說,他們的一個學籍管理軟體讓兩個研究生不斷的完善,三年才算[完全符合他的業務要求].如果你只是耳聞某某語言何等的復雜、難學而學之,那麼可能你錯了~就個人而言,為了技術而技術是不可取的:)
3.然而這個世界是現實的,不如你想像的那樣.並不是所有領域都有簡單、強大、貼近業務 的語言.在這個層次上說,對於獻身企業級信息應用系統開發者,Java、C#、Object-Pascal等的確是福音~~然而在系統軟體和其它對性能、控製程度要求較高的如
工控系統、高性能計算,實時系統,軍用軟體等領域可就缺不了C++(C)(不過這些領域 明顯的專業知識占絕對部分的重量).可見,緊從語言上說,C++(C)依然占據著一片天地. 嚴格來講,C是作為C++的一競爭對手出現的(不管這些了:)).
二、C++是否真的走進了追求技術的誤區
自從,GP思想在C++上的第一個作品STL正式納入標准庫,關於C++走進技術誤區的流言便沒有停止過,Boost、作為GP領軍人物之一的Andrei Alexandrescu提倡並實踐著(Loki)的編譯時編程、將設計模式思想引入庫設計,使得流言快被提上日程討論了:).
然而,GP真的只是技術嗎?我一直認為,就OO來說,本人曾經作過這樣的思考:
-----------------------------------------------------------------------------
真正的對象應該至少能夠具有:自主的適應環境(維護足夠的"意識")
1.自發行為的意識更強
2.反應能力更強
3.對外有足夠的獨立性
現在的OO,更像是建立在PO上的,不過是對象代替了函數.
但事實上,無論對象能力多高,過程表現絕對少不了.
Agent :我想是表達和反應能力最強的.
COM : 比Object-Based手法構造出的對象表達、反應、適應能力高很多.
不過There is no magic.還不過是一般的技巧構造出來的,看透了什麼都沒有了:)
GP :不能將它看作無謂的技術追求,[從我們談論的這個節點看來,它的實質我認為[至
少]是]:提高了構造的對象的適應能力(不是自發行為能力)的一種手段.
Andrei Alexandrescu的《Generic Programming :類型的else-if-then機制》
這篇文章可作為一精彩的證明.
-----------------------------------------------------------------------------
三、C++怎麼學?
首先聲明:本人對之也只能說略之一二(C++太博大了:))
孟岩先生曾經提過"C++需要自由的心",我要說"C++需要自由的心和手",我敢肯定我想的自由和孟岩先生的自由是不同的.
因為我的自由就個人詮釋是 :"用自己的思路來自由的寫驗證性的usecase"
就個人的學習心得而言 :
1.在你學習C++的過程中,你首先需要扎實的實踐一本C++基礎教程,這個教程不在深而在全.使你能夠全覽之.最好結合基本數據結構來練習.不要整天Hello World~~Hello MM的.
2.再下來你需要《(More)Effective C++》,它使你可以對C++也多了份思考,也了解到一些技巧和誤區,不過,你需要同步實踐,不然可能一時你並不能真正掌握這些技巧、避開誤區.
3.提高,你需要:(下面的書可能已經講爛了:))
《Design Pattern》 :個人感覺,設計模式雖說是一種思維方式,具體實現上,只是
對OOP語言的發掘和巧妙組合而已.而且這里組合是主要的,
特性是有限的,這本書中有幾個模式沒用虛特性的?
C++ Standard Document: 在你用它來做專項研究的時候,就會體會到什麼才叫真正的
全而深 (自然指在語法和語義的闡述上).
《STL源碼剖析》 :沒有深厚的功底,想來個閉門造車獨挑STL源碼是不可能的.
不過,這本說也重在關鍵技術的講解和引導罷了~~
這里關於GP和STL的名著不少,本人沒看過。不做品評。
《 Inside The C++ Object Model》:最具價值的一本書,沒了它,C++永遠是個迷,哪怕
你浸淫之N載~~
《Moden In C++ Design》 :這里的很多思路是你自己的思維很難接觸到的~~:)
我不得不佩服Andrei Alexandrescu.
市面上其它的C++書籍可牛車載,我感覺除了《The Design And Evolution Of C++》是異品,值得一讀.其它的不建議花太多的時間,哪怕是Bjarne Stroustrup、Stanley B.Lippman等的作品.自然,你有時間讀更好,反正我現在有點後悔,當初只顧多,不顧深讀,反復讀.經典的書不在本數多,在於每本讀的遍數多.一經驗之談,BBS上經常有人,在介紹COM技術書籍時,想也不想的指出,入門級<<Inside The COM>>.是這樣的嗎?我想,正如Dale Rogerson所說,將這本書完全看懂,你就是COM專家了~~書中,作者很多話可能你沒有注意到,因為你還不懂之,對之沒感覺,一遍翻下來,感覺 哦~~簡單~全看了 :) 這些書,跟國內的很多書籍最大的不同就是
國內書籍的作者寫的出,可能自己還不懂:)Copy什麼資料上的:)??
4.浸淫一門語言本身的語法語義再久,你不一定能夠深入它的精妙之處.
你需要學習應用這門語言的實作品(技術),你可以研究一些FrameWork或是一些具體的技術 如CORBA、COM等.就個人而已,有心接觸C++十個月左右,對於Virtual的認識有過幾次較大的的改變.在《 Inside The C++ Object Model》中算第一次,在《COM本質論》中關於COM對二進制兼容布局需求而用虛機制來解決是第二次,到目前為止,使我對virtual流下最深刻印象的是在Automation技術中組件由於環境是否有能力分析virtual結構而導致是否需要分發介面的問題.如果,整天抱著《C++語法語義深入》這樣的書,我不知你何時才能真正了解C++很多的特性.
即使你可以對別人說上一大套,這行啊~那不行啊~~雲雲~~:)
在這整個的過程中,我喜歡這樣對學弟說,你需要經常將C++的各種特性在腦中反復混合醞踉,這也是我強調學基礎時,要求教材知識點全的原因.經常的,為了研究某些特性而自由的寫、修改、增加UseCase,是我自認為很好的一個習慣.整天記他人的經驗之言,不知幾個月後還記得幾層:)?
也許上面的敘述是概括了些:)?
總之,我認為學習C++,需要多思考(譬如你想想為什麼模板類繼承不支持virtual、模板
類繼承,基類實例和繼承類實例產生的關系是什麼樣的)、
多寫usecase、
多將一堆特性混合醞晾(譬如模板類
成員簽名、多種嵌套模板類成員簽名、嵌套類與包裹類生命期
控制等等)
要盡早選擇應用方向(這點很重要,附加個人觀點:大多數人認為理論很
難,可是我要說:應用一樣是有難度的:)).
將00工程學中的理論適時的來對照自己的行為.
後話:
上面提到,就應用而已,比較語言的是沒有什麼意義的.然而我想說的是,不敢想像
沒有經過C++錘煉的人,可以深入的研究C#(事實上,我一直也不人為C#比C++好學,只是他們的深入點是不同的,冒昧說一句,C++中很多難度是人為製造出來的),就目前的情況來說,還有就是由於C++歷史、
社團、資源等因素.
共勉 :
因用而擇、因愛而擇
學究其深
勿以善小而不為 :)
『貳』 gp是什麼的縮寫
類屬編程(generic programming) generic是構成庫的另一種方式, 這與傳統的oop是不同的.這類程序庫一般由類屬組件和類屬演算法組成,組件和演算法通過迭代器組裝起來,組件則對迭代器提供一定的封裝.這種程序庫的優點在於能夠提供比傳統程序庫更靈活的組裝方式,而不損失效率.
編輯本段其他解釋:
GUARDIAN PENGUIN
GP是GUARDIAN PENGUIN(企鵝衛隊)的簡稱,是具歷史底蘊、皇室風范的英國國名品牌。英國「企鵝衛隊」「GP」品牌彰顯皇室高貴氣度,是公認的英國「尊貴無比的流行元素」。英國GP休閑內衣系列產品均選用與歐洲同步的進口上等原料,如義大利超細美麗諾羊毛、高支精梳棉、萊卡、天絲、莫代爾、等天然纖維精心編織而成,質感柔軟、輕盈,加上運用了精細獨特的立體裁剪,使產品與人體完美結合,穿著更加舒適。
GRAND PRIX
GP 是GRAND PRIX的縮寫,即「格蘭披治」。意思是「大獎賽」、「錦標賽」,在廠家出一款新車後,推出的相應的GP系列中,就是指該車是公路跑車版。一般的車型推出GP版,是指增強發動機性能或配置大功率發動機的高性能公路跑車版。
general purpose
在集裝箱標准裡面,GP就是平櫃/普通箱的意思,即general purpose。例如40'GP就是40'普櫃。
Green Partner
GP也是指綠色環境管理體系,是Green Partner的縮寫,SONY公司提出來的一技術標准認證 ,即您的產品如要交付給SONY的話,公司必須得符合SS-00259技術標准,SONY公司會按照標准中的要求來對公司進行一個稽核的動作. 就如ISO 9001認證一樣,只是對象不一樣,ISO屬於第三方認證,而GP屬於第二方(客戶)認證.
GeneticProgrammni
Koza在1989年提出利用層次化的計算機程序來表達和解決問題,而解決問題的最佳方法(程序)可以藉助遺傳演算法思想尋得,這也就是遺傳程序設計(GneeticProgrammni,GP)的基本思想。
普通合夥人
私募股權投資基金的主要組織形式是有限合夥制(Limited Partnership),其中私人股權投資公司作為普通合夥人(GP),基金整體作為有限合夥存在.
GUNDAM-Development Project
GUNDAM-Development Project之簡寫, 即「高達開發計劃」。出自機動戰士高達0083星塵的回憶(日文名:機動戦士ガンダム0083 STARDUST MEMORY?,英文名:Mobile Suit GUNDAM0083 STARDUST MEMORY?)是高達系列作品當中的一部OVA動畫。一共13集,1991年5月份最先於日本發行,其最後一集在1992年9月份發行完畢。「高達開發計劃」是OVA動畫《機動戰士高達0083 STARDUST MEMORY》當中所提及的一個空想的計劃,從這個計劃中所開發出來的概念機體都被冠上GP字眼(GUNDAM-Development Project之簡寫),並且各自有以花朵為名的昵稱。這些昵稱在地球聯邦軍正式文件中並沒有出現,而是開發者之間的慣用計劃代號。在一年戰爭結束之後,聯邦軍開始推動重建計劃。而本計劃為其中之一部分。宇宙世紀0081年10月20日以約翰?高恩中將為總負責人,與阿納海姆電子(Anaheim Electronics)開始共同進行。高達開發計劃的主要目的是為了發展並且驗證次世代主力量產MS的各種先進技術,所以本計劃產生的概念機可說是集地球聯邦與吉恩公國MS技術之大成。阿納海姆電子公司內的「先進開發事業部」負責1號機與3號機,具有舊吉恩軍技術背景的第二研究事業部負責2號機與4號機。但是4號機因為種種原因而沒有變成所謂的高達系列機體,而是以另一種姿態出現,並且名字也跟高達不相干。所以狹義的高達GP系列實際上只有三台(含0號機的話共4架)。
GENERAL PAPER
GENERAL PAPER的縮寫。為CAMBRIDGE GCE A-LEVEL 的英文考試,新加坡進入大學的必須考試之一。分為comprehension和essay兩部分。主要考查英文語言的運用能力
Gross Profit
在財務上GP=Gross Profit(毛利)
Gallup Poll
縮寫詞,=Gallup Poll(美國)蓋洛普民意測驗
Gold Point
金幣(既Gold Point的縮寫,實際意思應該是「黃金點數」),在網路游戲《穿越火線》《戰地之王》中。GP指在游戲中可得到的虛擬金錢,金幣,叫做GP,通過玩家在游戲中通過游戲在結束時獲得。可以購買游戲中的部分道具武器等等。
Gold Peak
GP(Gold Peak)超霸電池 全球十大電池生產商 金山工業(集團)有限公司控股49.8%
『叄』 我學了C和C++,把<<Java編程思想>>看了一邊,我對網路編程比較感興趣,我下一步該學什麼
先看C++ Primer,之後看
B.S 的The C++ Program language,接再看看關於GP的書,還有侯Sir翻譯的 The C++ Object Model,當然其中還看了C++標准庫這本書哈,在學習
STL的過程,接下來的獵物是STL源代碼解析哈。
『肆』 一個程序問題,廣大大牛們可不可以用動態代理模式實現(調用method方法後不結束main方法)
當然代理模式中,用的最廣泛的,用的最多的是 動態代理模式。
動態代理:就是實現階段不用關系代理是哪個,而在運行階段指定具體哪個代理。
抽象介面的類圖如下:
--圖來自設計模式之禪
所以動態代理模式要有一個InvocationHandler介面 和 GamePlayerIH實現類。其中 InvocationHandler是JD提供的動態代理介面,對被代理類的方法進行代理。
代碼實現如下
抽象主題類或者介面:
復制代碼
1 package com.yemaozi.proxy.dynamic;
2
3 /*
4 * 動態代理:就是實現階段不用關系代理是哪個,而在運行階段指定具體哪個代理。
5 */
6 public interface IGamePlayer {
7 //登錄游戲
8 public void login(String username, String password);
9
10 //擊殺Boss
11 public void killBoss();
12
13 //升級
14 public void upGrade();
15 }
復制代碼
需要被代理類:
復制代碼
1 package com.yemaozi.proxy.dynamic;
2
3 public class GamePlayer implements IGamePlayer {
4
5 private String name = "";
6
7 public GamePlayer(String name){
8 this.name = name;
9 }
10
11 public void login(String username, String password) {
12 System.out.println("登錄名為 "+username+" 進入游戲," + name + " 登錄成功!");
13 }
14
15 public void killBoss() {
16 System.out.println(this.name + " 擊殺了Boss!");
17 }
18
19 public void upGrade() {
20 System.out.println(this.name + "升級了!");
21 }
22
23 }
復制代碼
動態代理處理器類:
復制代碼
1 package com.yemaozi.proxy.dynamic;
2
3 import java.lang.reflect.InvocationHandler;
4 import java.lang.reflect.Method;
5
6 public class GamePlayerInvocationHandler implements InvocationHandler{
7
8 //被代理的對象
9 private Object obj;
10
11 //將需要代理的實例通過處理器類的構造方法傳遞給代理。
12 public GamePlayerInvocationHandler(Object obj){
13 this.obj = obj;
14 }
15
16 public Object invoke(Object proxy, Method method, Object[] args)
17 throws Throwable {
18 Object result = null;
19 if("login".equalsIgnoreCase(method.getName())){
20 //這個在主題方法不受任何影響的情況下,在主題方法前後添加新的功能,或者增強主題方法,
21 //從側面切入從而達到擴展的效果的編程,就是面向切面編程(AOP Aspect Oriented Programming)。
22 //AOP並不是新技術,而是相對於面向對象編程的一種新的編程思想。在日誌,事務,許可權等方面使用較多。
23 System.out.println("代理登錄游戲!");
24 result = method.invoke(this.obj, args);
25 return result;
26 }
27 result = method.invoke(this.obj, args);
28 return result;
29 }
30
31 }
復制代碼
由於代理是動態產生的,所以不需要再聲明代理類。
動態代理場景類:
復制代碼
package com.yemaozi.proxy.dynamic;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
IGamePlayer gp = new GamePlayer("張三");
InvocationHandler gpHandler = new GamePlayerInvocationHandler(gp);
//獲取真實主題類的ClassLoader
ClassLoader classLoader = gp.getClass().getClassLoader();
//動態產生一個代理者。
Class<?>[] cls = new Class[]{IGamePlayer.class};
IGamePlayer proxyGp = (IGamePlayer) Proxy.newProxyInstance(classLoader, cls, gpHandler);
proxyGp.login("zhangsan", "123456");
proxyGp.killBoss();
proxyGp.upGrade();
}
}
執行結果:
代理登錄游戲!
登錄名為 zhangsan 進入游戲,張三 登錄成功!
張三 擊殺了Boss!
張三升級了!
//在此,我們沒有創建代理類,但是確實有代理類幫我們完成事情。
復制代碼
其中,在此代理模式中,不僅代理是動態產生的(即在運行的時候生成),而且還在代理的時候,也增加了一些處理。在此處增加的處理,其實就是另一種編程思想-----面向切面編程思想(AOP Aspect Oriented Programming)。
帶有AOP的動態代理模式類圖:
--圖來自設計模式之禪
從上圖中,可以看出有兩個相對獨立的模塊(Subject和InvocationHandler)。動態代理實現代理的職責,業務邏輯Subject實現相關的邏輯功能,兩者之間沒有必然的相互耦合的關系。然而,通知Advice從另一個切面切入,最終在上層模塊就是Client耦合,完成邏輯的封裝。
代碼清單如下
抽象主題或者介面:
復制代碼
1 package com.yemaozi.proxy.dynamic_aop;
2
3 public interface Subject {
4 public void doSomething(String str);
5 //...可以多個邏輯處理方法。。。
6 }
復制代碼
真實主題:
復制代碼
1 package com.yemaozi.proxy.dynamic_aop;
2
3 public class RealSubject implements Subject{
4
5 public void doSomething(String str) {
6 //do something...
7 System.out.println("do something..." + str);
8 }
9
10 }
復制代碼
通知介面:
復制代碼
1 package com.yemaozi.proxy.dynamic_aop;
2
3 //通知介面及定義、
4 public interface IAdvice {
5 public void exec();
6 }
復制代碼
前置通知:
復制代碼
1 package com.yemaozi.proxy.dynamic_aop;
2
3 public class BeforeAdvice implements IAdvice {
4 //在被代理的方法前來執行,從而達到擴展功能。
5 public void exec() {
6 System.out.println("前置通知被執行!");
7 }
8 }
復制代碼
後置通知:
復制代碼
1 package com.yemaozi.proxy.dynamic_aop;
2
3 public class AfterAdvice implements IAdvice {
4
5 //在被代理的方法後來執行,從而達到擴展功能。
6 public void exec() {
7 System.out.println("後置通知被執行!");
8 }
9 }
復制代碼
動態代理的處理器類:
所有的方法通過invoke方法類實現。
復制代碼
1 package com.yemaozi.proxy.dynamic_aop;
2
3 import java.lang.reflect.InvocationHandler;
4 import java.lang.reflect.Method;
5
6 public class MyInvocationHandler implements InvocationHandler {
7
8 //被代理的對象
9 private Subject realSubject;
10 //通過MyInvocationHandler的構造方法將被代理對象傳遞過來。
11 public MyInvocationHandler(Subject realSubject){
12 this.realSubject = realSubject;
13 }
14 //執行被代理類的方法。
15 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
16 //在執行方法前,執行前置通知。
17 IAdvice beforeAdvice = new BeforeAdvice();
18 beforeAdvice.exec();
19 Object result = method.invoke(this.realSubject, args);
20 //在執行方法後,執行後置通知。
21 IAdvice afterAdvice = new AfterAdvice();
22 afterAdvice.exec();
23 //前置通知,和後置通知,都是要看具體實際的業務需求來進行添加。
24 return result;
25 }
26
27 }
復制代碼
動態代理類:
復制代碼
1 package com.yemaozi.proxy.dynamic_aop;
2
3 import java.lang.reflect.InvocationHandler;
4 import java.lang.reflect.Proxy;
5
6 public class DynamicProxy {
7
8 /**
9 * public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler handler)
10 * loader:
11 * 一個ClassLoader對象,定義了由哪個ClassLoader對象,來對生產的代理進行載入。
12 * interfaces:
13 * 一個Interfaces數組,表示我將要給我所代理的對象提供一組什麼樣的介面,
14 * 如果提供一組介面給它,那麼該代理對象就宣稱實現了該介面,從而可以調用介面中的方法。
15 * 即,查找出真是主題類的所實現的所有的介面。
16 * handler:
17 * 一個InvocationHandler對象,表示當我這個動態代理對象在調用方法時,會關聯到該InvocationHandler對象。
18 * 該InvocationHandler與主題類有著關聯。
19 */
20 public static <T> T newProxyInstance(ClassLoader classLoader, Class<?>[] interfaces, InvocationHandler handler){
21 @SuppressWarnings("unchecked")
22 T t = (T) Proxy.newProxyInstance(classLoader, interfaces, handler);
23 return t;
24 }
25 }
復制代碼
從動態的產生動態代理類。
動態代理場景類:
復制代碼
1 package com.yemaozi.proxy.dynamic_aop;
2
3 import java.lang.reflect.InvocationHandler;
4
5 public class AOPClient {
6
7 public static void main(String[] args) {
8 Subject realSubject = new RealSubject();
9 InvocationHandler handler = new MyInvocationHandler(realSubject);
10 ClassLoader classLoader = realSubject.getClass().getClassLoader();
11 Class<?>[] interfaces = realSubject.getClass().getInterfaces();
12 Subject proxySubect = DynamicProxy.newProxyInstance(classLoader, interfaces, handler);
13 proxySubect.doSomething("這是一個Dynamic AOP示例!!!");
14 }
15 }
16
17 執行結果:
18 前置通知被執行!
19 do something...這是一個Dynamic AOP示例!!!
20 後置通知被執行!
復制代碼
動態代理中invoke的動態調用:
動態代理類DynamicProxy是個純粹的動態創建代理類通用類。
所以在具體業務中,可以在進一步封裝具體的具有業務邏輯意義的DynamicProxy類。
代碼如下
具體業務的動態代理:
復制代碼
1 package com.yemaozi.proxy.dynamic_aop;
2
3 import java.lang.reflect.InvocationHandler;
4 //具體業務的動態代理。
5 public class SubjectDynamicProxy extends DynamicProxy {
6 public static <T> T newProxyInstance(Subject subject){
7 ClassLoader classLoader = subject.getClass().getClassLoader();
8 Class<?>[] interfaces = subject.getClass().getInterfaces();
9 InvocationHandler handler = new MyInvocationHandler(subject);
10 T t = newProxyInstance(classLoader, interfaces, handler);
11 return t;
12 }
13 }
『伍』 C++中,什麼是GP
泛型編程也就是GP(Generic Programming),推崇與類型無關的編程思想。簡單來說,就是將針對不同數據類型的相同演算法從數據結構<類>中剝離出來,
這與傳統的C++的繼承和多態截然不同。
可以說泛型思想中沒有多少繼承和多態的成分。甚至有背道而馳的味道。
在C++實現上,泛型嚴重依賴於模板機制,事實上如果沒有模板的引入,泛型絕對不會在C++語言中獲得如此巨大的成功!
泛型代碼由C++編譯器在編譯期解釋成二進制代碼。也就是說,泛型的代碼編譯起來可能會使程序的二進制代碼變大,但這一點也保證了程序在運行的時候不會損失效率...
當然泛型不是萬能的,濫用泛型也許一樣會使你的代碼緩慢...
工具畢竟還是工具,思想和方法總有其局限性的。
如果沒接觸過,學習泛型編程,對你是一個全新的體驗 。
『陸』 學C++的准備工作!
經過十分漫長的C++學習過程,我總算完成了我自己的C++心願,看完了我想看的所有C++書籍,回
顧我C++的整個學習過程,頗有一些心得和經驗,希望與各位分享,也希望給正處在摸索學習階段的
XDJM一點學習參考。
首先看看我第一次接觸編程語言,唔,那可能要追述上到世紀,在我小學4年紀的時候第一次接觸到
BASIC,那個時候學習這個東西完全是為了要爸爸給我買一台386,沒想到的是,BASIC開啟了我對於計算
機的一切興趣與追求。5年紀的時候參加少年的計算機奧賽,我用BASIC寫的一個彩色立體可旋轉移動的正
方體拿了一個銅牌,從此計算機編程成為了最大的愛好,現在我還保留著源代碼,是保存在一盤普通單放
機的磁帶上的,我估計很少有人用過錄音機和串口的轉換器吧,呵。我用BASIC寫的第二個大程序是給我
媽媽用的財務程序,初中二年紀的時候,我媽媽在單位做出納,我總看到媽媽每天晚上拿個計算機算一堆
表,所以我寫了這個程序幫助媽媽快速完成她的工作,其實我的根本目的是為了一台列印機,因為這個程
序,生成了簡單的報表,她可以直接列印,當然為了這個便利,她必須花錢給我買一台當時還算價值不低
的列印機。不過現在回顧起來,BASIC雖然是我編程的第一位啟蒙老師,但是在我開始C++的學習之後,他
確實使我我思想上產生了很大的困繞,主要是OOP思想,我花費了將近1年多的時間才真正體會到什麼是OO!
到了大學,我才真正開始系統的學習編程。在此之間走過一些歪路,比如高中的時候研究HACKING,
之所以說學習hacking是條歪路,原因很簡單,因為研究到一定的程度,沒有十分穩固的編程基礎,根本
的無法繼續深入學習。中國**聯盟解體前,位列第三的kender給了我這方面很大的打擊,從此我就退出了
,從此對於hacking我就不聞不問,從此看到那些下三爛的貨色也要學hacking,我就感到可笑。第一次接
觸的是C,沒什麼好說的,我C學的不好,因為我大二的時候經商去了,而且我覺得C能做的,我用BASIC都
能做到,為什麼要學C?當然那個時候我成績真是北大的BBS...然後接觸到的就是C++,教材的錢能的
《C++程序設計》,這本書其實還是很不錯的,不過很多看了兩本名著的朋友都對這本書嗤之以鼻,也許是
我天生很笨,在我看完了《C++PRIMER》後還經常番看《C++程序設計》。《C++程序設計》雖然出書的時
候ANSI C++還沒有確定下來,不過它還是含蓋了C++所有語法,建議對C++感興趣卻又沒有任何基礎的人先
從這本書開始,簡單而高效,不要認為人家一上來就看《C++ PRIMER》或是《the c++ programming
language》就覺得自己的檔次很低,你要確信,你肯定能超過他!這本書課後習題在我看來是典型的結構
化編程,即使到了CLASS,也全部可以用STRUCT代替。不過在這個階段做習題十分必要,用處我不想敲了
,推薦使用的編譯器就是書中所說到的編譯器(我忘記叫什麼了:P)看完之後,如果你想說C++很簡單的話
,建議你在看完了《C++ PRIMER》或是《the c++ programming language》之後再說。這兩本書都是基於
標准C++的,十分苛求的說,後者對標準的兼容性稍差:)。對這兩本書,我的看法是,如果你確實想仔細
的學習,建議你看《C++ PRIMER》,如果你想跳過我將要寫到的下面兩本書的話,建議你看
《the c++ programming language》。對這兩本書,前者最高到中文第三版,因為第四版,後者到特別版
。對於前者,我看後的感覺是它的優點在於解析,特別是函數,類,模板的解析,但是它並沒有含蓋C++
的方方面面,後者就不是這樣。實際上我並沒有仔細看過後者,只是同學總是拿這本書上的問題來與我商
量,所以有機會偷窺了幾眼。暫定你選擇的是前者繼續學習,在看完後,也許你用C++編制普通的程序已
經能夠運用自如,但是你仍然應該會有很多問題和遺憾,比如,類繼承,虛擬繼承,類訪問控制,類繼承
下的訪問控制,還有雖然我已經對如何解析十分清楚,但是我仍然感覺我對語法掌握得不系統,遺憾的是
,書中出現了很多的庫函數,我為什麼都不知道?這個時候建議你看看《標准C++寶典》,這本書對於語
法正所謂事無巨細,一一道來啊,再就是回顧一下《C++ 程序設計》(錢能),對類的部分講解的還是十
分精闢的。在掌握了一切牢固的語法基礎之後,我選擇的下一步不是STL,而是IOSTREAM,原因之一是因
為《C++ PRIMER》並沒有把這一部分講述的很好,對了,《C++ PRIMER》也沒有把STL講述的很好,所以
我看《C++ PRIMER》的時候這些章節都跳過了,我的目標是不求知道,只求精通。對於IOSTREAM,我選的
書是《Standard C++ IOStream and Locales》,我當時還是看的E文原版,事實證明,我錯了,這本對於
當時的我,難度突然拔的太高,所以在看完了第一章之後我就放棄了,只是暫時的擱置下來了。對了,忘
記說,對於《C++ PRIMER》或是《the c++ programming language》的學習,你應該十分認真的選擇編譯
器了,我推薦3個首選dev-cpp最高4.9.9.2,然後是vc.net(千萬看清楚,不是vc6.0!),最後就是
borland c++ builder-X,具體我就不介紹了,相信你學習到這一步,自己應該已經掌握很多的信息了.繼
續,下一步,我的選擇是〈深入探索C++對象模型〉,我是在圖書館借閱的,現在也有電子版了,不過我
看了以下,效果一般,但是可以和E文原版的電子版一起看。這本書看完。如果你是跟我一樣,把
《C++ PRIMER》翻爛掉,能把《深入探索C++對象模型》的知識要點全部背出來的話,我恭喜你,你的
C++水平已經到中級了:)接下來,我的選擇是對C++這門語言為我提供的所有服務設施通透的學習一邊。
說穿了,就是庫函數,C++庫函數分兩部分,一部分來自C語言,一部分就是STL,對於C語言部分,我建議
你可以買一本C++函數庫的書,最近好象剛出了一本,不過我還沒有機會看,我看的是〈C和C++代碼精
粹〉,裡面把C語言部分的庫函數分為3類,這本書我也就看了這3個章節,其他的東西我知道,看他做
甚?而對於STL,你如果真想成為C++出類拔萃的高手,你應該看3本<<C++標准程序庫>> <<泛型編程與
STL>> <<STL源碼剖析>>,第一本主要講的是如何使用STL,第二本將STL的一些設計理念,並指導你進
行泛型設計,所謂泛型說穿了就是指模板。看完這些書,如果你跟我一樣,可以把STL全部重寫一邊的
話,那麼恭喜你,你已經成為C++准高手,這個時候我的選擇是回過頭去看《Standard C++ IOStream
and Locales》,呵,現在才發現原來這本書這么簡單!簡直是naive!其實,我現在最想做的事情就是能
夠把IO全部重寫一邊,不過還沒有找到合適的編譯器下手,感覺應該用GCC比較好,還沒開始研究,我也
不清楚。好了,既然這么多本講述C++技術的書籍你都搞完了,也不在乎多兩本吧,呵呵。知道你應該看
什麼嗎?你應該看看<exceotional c++>還有<effective c++>,這兩本書都有more版,不算太難,最後可
以看《高質量C++編程》,最後有一套練習題,做做,小菜一樣。接下來我的選擇是<C++編程思想> 〈設
計模式〉 〈大規模C++程序設計〉(最後一本我最近才看完:P)這3本書可不講什麼語法,第一本實在沒
有必要介紹,似乎每一種語言的編程思想的的書籍都是說的如何用這門語言編程,第二本其實並不能說是
針對C++,所有語言通用的一本書,關鍵是程序設計的方式,第三本被稱為〈設計模式〉的C++實踐篇,其
意義毋庸多說。看完了嗎?好吧,你應該選一個項目鍛煉一下。如果你能在一個月內看完這所有的書,歡
迎你加入ISS_SQL開發團隊,這個就是我近期想做的事情,我就是想寫一個自己的資料庫。不過如果你不
是外星人的話,我估計你不可能在一個月的時間內,看完我看了2年的書。對於我剛才說的SQL,我還在選
人,說實在的,現在我的同學里,真的是沒有幾個人的技術能讓我看的上的,哎,得一知己難啊!還是繼
續說編程,這個時候,你已經有了頂級的C++基礎,想學什麼不容易?JAVA,你學了一個月??開玩笑,
我看了一個星期的書就開始做項目了!其實我覺得到了這個時候是一個面臨選擇的時候,一個是做UNIX下
的開發,一個是做WINDOWS下的,不過我選擇了第三條路,也就是我正在學的,演算法,因為我的導師正在
做973計劃中的數據挖掘項目,所以我也沾光,因為是基與weka,所以我用java,這個B語言真弱智,我已
經開始討厭JAVA了,所以我才想用C++重寫一個WEKA類的開源軟體,不過我感覺用java寫演算法,的確不
錯。前段時間,我一個同學為了一個C#問題苦惱,問題粗略說來是GIS設備返回串,要進行處理,提取數
據,因為串本身的復雜性,具體是怎麼樣的我也不知道,因為他的這個是商業項目。這個問題在C#下十分
困難,連正則表達式都無能為力,所以我給他的建議是寫一個自動機,也不知道他最後的處理方式,不過
在java下,呵,大概不超過五十行代碼吧。說遠了。
最後說說人的問題。有一點點浮躁的人建議你千萬別想學C++,直接學VB或者C#算了,希望在浩方有
個排名的人,我直接告訴你,你不應該學C++。
關於C++的學習,我就說這么多,其實也感覺沒有說什麼,只是把我學習C++看的每一門書都羅列出來
,雖有顯擺之嫌,但也確實希望給那些如曾經的我一樣迷茫的摸索者,那些希望學習C++且追求完美技術
的人指一條明路。
下面的是學C++時要注意的。
1.把C++當成一門新的語言學習(和C沒啥關系!真的。);
2.看《Thinking In C++》,不要看《C++變成死相》;
3.看《The C++ Programming Language》和《Inside The C++ Object
Model》,不要因為他們很難而我們自己是初學者所以就不看;
4.不要被VC、BCB、BC、MC、TC等詞彙所迷惑——他們都是集成開發環境,而我們要學的是一門語言;
5.不要放過任何一個看上去很簡單的小編程問題——他們往往並不那麼簡單,或者可以引伸出很多知識點;
6.會用Visual C++,並不說明你會C++;
7.學class並不難,template、STL、generic
programming也不過如此——難的是長期堅持實踐和不遺餘力的博覽群書;
8.如果不是天才的話,想學編程就不要想玩游戲——你以為你做到了,其實你的C++水平並沒有和你通關的能力一起變高——其實可以時刻記住:學C++是為了編游戲的;
9.看Visual C++的書,是學不了C++語言的;
10.浮躁的人容易說:XX語言不行了,應該學YY;——是你自己不行了吧!?
11.浮躁的人容易問:我到底該學什麼;——別問,學就對了;
12.浮躁的人容易問:XX有錢途嗎;——建議你去搶銀行;
13.浮躁的人容易說:我要中文版!我英文不行!——不行?學呀!
14.浮躁的人容易問:XX和YY哪個好;——告訴你吧,都好——只要你學就行;
15.浮躁的人分兩種:a)只觀望而不學的人;b)只學而不堅持的人;
16.把時髦的技術掛在嘴邊,還不如把過時的技術記在心裡;
17.C++不僅僅是支持面向對象的程序設計語言;
18.學習編程最好的方法之一就是閱讀源代碼;
19.在任何時刻都不要認為自己手中的書已經足夠了;
20.請閱讀《The Standard C++ Bible》(中文版:標准C++寶典),掌握C++標准;
21.看得懂的書,請仔細看;看不懂的書,請硬著頭皮看;
22.別指望看第一遍書就能記住和掌握什麼——請看第二遍、第三遍;
23.請看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
24.不要停留在集成開發環境的搖籃上,要學會控制集成開發環境,還要學會用命令行方式處理程序;
25.和別人一起討論有意義的C++知識點,而不是爭吵XX行不行或者YY與ZZ哪個好;
26.請看《程序設計實踐》,並嚴格的按照其要求去做;
27.不要因為C和C++中有一些語法和關鍵字看上去相同,就認為它們的意義和作用完全一樣;
28.C++絕不是所謂的C的「擴充」——如果C++一開始就起名叫Z語言,你一定不會把C和Z語言聯系得那麼緊密;
29.請不要認為學過XX語言再改學C++會有什麼問題——你只不過又在學一門全新的語言而已;
30.讀完了《Inside The C++ Object Model》以後再來認定自己是不是已經學會了C++;
31.學習編程的秘訣是:編程,編程,再編程;
32.請留意下列書籍:《C++面向對象高效編程(C++ Effective Object-Oriented Software Construction)》《面向對象軟體構造(Object-Oriented Software Construction)》《設計模式(Design Patterns)》《The Art of Computer Programming》;
33.記住:面向對象技術不只是C++專有的;
34.請把書上的程序例子親手輸入到電腦上實踐,即使配套光碟中有源代碼;
35.把在書中看到的有意義的例子擴充;
36.請重視C++中的異常處理技術,並將其切實的運用到自己的程序中;
37.經常回顧自己以前寫過的程序,並嘗試重寫,把自己學到的新知識運用進去;
38.不要漏掉書中任何一個練習題——請全部做完並記錄下解題思路;
39.C++語言和C++的集成開發環境要同時學習和掌握;
40.既然決定了學C++,就請堅持學下去,因為學習程序設計語言的目的是掌握程序設計技術,而程序設計技術是跨語言的;
41.就讓C++語言的各種平台和開發環境去激烈的競爭吧,我們要以學習C++語言本身為主;
42.當你寫C++程序寫到一半卻發現自己用的方法很拙劣時,請不要馬上停手;請盡快將餘下的部分粗略的完成以保證這個設計的完整性,然後分析自己的錯誤並重新設計和編寫(參見43);
43.別心急,設計C++的class確實不容易;自己程序中的class和自己的class設計水平是在不斷的編程實踐中完善和發展的;
44.決不要因為程序「很小」就不遵循某些你不熟練的規則——好習慣是培養出來的,而不是一次記住的;
45.每學到一個C++難點的時候,嘗試著對別人講解這個知識點並讓他理解——你能講清楚才說明你真的理解了;
46.記錄下在和別人交流時發現的自己忽視或不理解的知識點;
47.請不斷地對自己寫的程序提出更高的要求,哪怕你的程序版本號會變成Version 100.XX;
48.保存好你寫過的所有的程序——那是你最好的積累之一;
49.請不要做浮躁的人;
50.請熱愛C++!
補充:
對c++學習的一點感想,希望對初學者能有些幫助
1.如果你以前從來沒有接觸過c++,那麼選擇的第一本c++教程就顯得尤為重要,我認為你可以參照以下的標准進行選擇:
a.對標准c++進行講解,畢竟c++比從前發生了很大的變化。
b.要求全面,但不要很深,這要有助於你對於c++有一個全面的認識,打好基礎,並且易懂的教材還能加快學習的進度,讓自己保持一種成就感。
c.要有完整的範例來講解每一個知識點如何運用,請注意這里所說的完整,並不是一個個代碼片斷。因為由於你以前從未接觸過用c++進行編程,完整的代碼可以使你有一個整體的概念,並且能夠很快去進行大量的實踐,因為變編程是從模仿開始,完整的代碼恰恰告訴你了一個完整的步驟。不必自己去揣測。
d.推薦:《c++ primer plus》
2.當你有了一定的基礎以後,就要選擇一些書來迅速提高自己。這類書的特點是不僅僅教你如何去運用,而且要叫你如何去思考,並且你讀起來也不是那麼輕松。它意味深遠,並不是你讀一遍就能掌握的。
推薦:《thinking in c++》《effective c++》《more effective c++》
《c++ programming language》...《c++ 沉思錄》
3.接下來就是對第二步所介紹的書籍進行反復的閱讀,並且進行實踐。由於這些書一位深遠,每個人基於自己的基礎都會有不同的收獲,例如如果你的基礎還沒有達到某一高度,那麼你就對一些精深的技術視而不見,不信?你可以試試,看看當自己有了一定提高之後再來讀從前的一本書,你會發現許多新的東西。
『柒』 什麼叫oo編程,oo是哪兩個英語單詞縮寫,rss標志是什麼意思
OO(Object-Oriented)
什麼是OO?
就是面向介面編程。無論你是用vtable, 或gp的function object, 或就是C的函數指針,正交分解也好,各種pattern也罷,都是面向介面編程思想的一種實現。
為什麼要面向介面編程?
為了解耦。
什麼是解耦?
就是把程序中互相不相關或有限相關的模塊分割開來。就象收拾屋子,你希望把不同的東西放到不同的地方。把醬油和醋倒進不同的瓶子里去。
這里,對完全不相關的功能,可以簡單地分開實現。
但事實上,很多情況下,不同模塊之間是有互相之間的關系的。這時,就需要介面。用介面准確定義模塊之間的關系。解耦前,兩個模塊之間共享所有信息(這個信息包括數據,也包括各自的實現細節)。解耦後,需要共享的信息被准確地定義在介面中。同時,信息的流向也被確定。
解耦的好處是什麼呢?
首先,程序變得清晰了。
其次,不該暴露的實現細節被隱藏了。代碼的修改變容易了。
再次,結構靈活了,通過靜態多態(function object)或動態多態(vtable), 一個模塊可以和任意實現介面的模塊協作。原來類A只能與類B協作,解耦後可以和所有實現介面IB的類如B1, B2, ... 協作了。擴展性大大增強。自然而然就代碼重用了。
編譯依賴也沒有了。你可以專心寫和編譯一個模塊,不用等待其它模塊的完成。
調試容易了。只要模塊對一個介面調試成功,其它的介面也沒有問題。於是,甚至可以用一個simple naive的實現該介面的mmy類來調試。(這點,使用template的gp不適用)
那麼解耦的壞處是什麼呢?
介面的定義變得很關鍵。解耦就是隱藏一些信息,定義一些需要共享的信息。如果介面定義的不好,隱藏了不該隱藏的信息,那麼對某些需要這些信息的復雜情況來說,這個解耦就失敗了。
而如果沒有隱藏一些應該隱藏的信息,那麼不該有的耦合仍然存在。
那麼怎樣解耦,又怎樣定義介面呢?
這是一個純粹業務邏輯的思考過程。這里,對編程語言的知識變得無關緊要。事實上,只要精確掌握需求,嚴密地分析需求和模塊內部子模塊之間的需求,任何一個會邏輯思考的人都可勝任這個工作。就象歌星鄭智化一樣,雖然不識譜,但一樣寫歌,只不過最後要懂譜的人把歌紀錄下來。
解耦的原則很簡單:精確定義需求,仔細分析需求。不要隱藏任何「需求」也許會需要的信息。不要放過任何「需求」明顯不需要的信息。
而對需求不清楚的情況,寧可錯放一千,不能錯殺一個。總而言之,決不能隱藏可能需要的信息。
不考慮重用,重用是解耦後的自然結果。不能倒因為果!
http://www.5ivb.net/Info/55/Info15237/
RSS是2004年最熱門的互聯網詞彙之一,不過,相對於博客(BLOG)來說,RSS的知名度相應會低很多,而且至今還沒有一個非常貼切的中文詞彙,也許以後無需中文名,大家都習慣於直接叫RSS了。RSS之所以同BLOG一樣會被認為是熱門詞彙的一個原因,個人推測,應該是許多分析人士認識到RSS將要對互聯網內容的瀏覽方法所產生的巨大影響。
什麼是RSS呢?RSS(Really Simple Syndication)是一種描述和同步網站內容的格式,是目前使用最廣泛的XML應用。RSS搭建了信息迅速傳播的一個技術平台,使得每個人都成為潛在的信息提供者。發布一個RSS文件後,這個RSS Feed中包含的信息就能直接被其他站點調用,而且由於這些數據都是標準的XML格式,所以也能在其他的終端和服務中使用。
如果從RSS閱讀者的角度來看,完全不必考慮它到底是什麼意思,只要簡單地理解為一種方便的信息獲取工具就可以了。RSS獲取信息的模式與加入郵件列表(如電子雜志和新聞郵件)獲取信息有一定的相似之處,也就是可以不必登錄各個提供信息的網站而通過客戶端瀏覽方式(稱為「RSS閱讀器」)或者在線RSS閱讀方式這些內容。例如,通過一個RSS閱讀器,可以同時瀏覽新浪新聞,也可以瀏覽搜狐或者網路的新聞(如果你採用了RSS訂閱的話)。
在許多新聞信息服務類網站,會看到這樣的按鈕 ,有的網站使用一個圖標,有的同時使用兩個,這就是典型的提供RSS訂閱的標志,這個圖標一般鏈接到訂閱RSS信息源的URL。當然,即使不用這樣的圖標也是可以的,只要提供訂閱RSS信息源的URL即可,如網上營銷新觀察提供的RSS訂閱URL是:http://www.marketingman.net/rss.xml
使用RSS獲取信息的前提是,先安裝一個RSS閱讀器,然後將提供RSS服務的網站加入到RSS閱讀器的頻道即可。大部分RSS閱讀器本身也預設了部分RSS頻道,如新浪新聞、網路新聞等。
RSS基礎知識:
如何利用RSS閱讀器訂閱RSS新聞內容?如何免費下載RSS閱讀器?
常用的RSS閱讀器:周博通RSS閱讀器 看天下網路資訊瀏覽器
【RSS實用知識】:關於RSS訂閱與RSS閱讀的常見問題解答(網上營銷新觀察 馮英健)
為了進一步了解RSS及其發展歷程的有關背景知識,下面摘錄了2003年10月平文勝為時代營銷撰寫的有關RSS的介紹文章。僅供參考。網上此類介紹文章也不少,有興趣的請到網上檢索更多信息。例如維基網路對於RSS的定義、RSS規范、RSS專用閱讀器和RSS在線閱讀器、中文RSS搜索引擎等等(http://zh.wikipedia.org/wiki/RSS)
RSS及其發展歷程簡介 (時代營銷 平文勝 2003-10-10)
RSS是一種描述和同步網站內容的格式,是目前使用最廣泛的XML應用。RSS應用在國外已經非常普遍,從個人博客(Blog)欄目、企業站點到世界級的門戶都提供基於RSS的服務,如IBM公司站點的中文新聞RSS http://www.ibm.com/news/cn/zh/index.rss ,YAHOO站點的http://news.yahoo.com/rss ,微軟MSDN站點的http://msdn.microsoft.com/aboutmsdn/rss.asp 等等。
1、 RSS的歷史
那麼RSS究竟代表什麼呢?比較普遍的有兩種說法,一種是「Rich Site Summary」或「RDF Site Summary」,另一種是「Really Simple Syndication」,之所以有這些分歧,需要從RSS發展的歷史說起。
最初的0.90版本RSS是由Netscape公司設計的,目的是用來建立一個整合了各主要新聞站點內容的門戶,但是0.90版本的RSS規范過於復雜,而一個簡化的RSS 0.91版本也隨著Netscape公司對該項目的放棄而於2000年暫停。
不久,一家專門從事博客寫作軟體開發的公司UserLand接手了RSS 0.91版本的發展,並把它作為其博客寫作軟體的基礎功能之一繼續開發,逐步推出了0.92、0.93和0.94版本。隨著網路博客的流行,RSS作為一種基本的功能也被越來越多的網站和博客軟體支持。
在UserLand公司接手並不斷開發RSS的同時,很多的專業人士認識到需要通過一個第三方、非商業的組織,把RSS發展成為一個通用的規范,並進一步標准化。於是2001年一個聯合小組在0.90版本RSS的開發原則下,以W3C新一代的語義網技術RDF(Resource Description Framework)為基礎,對RSS進行了重新定義,發布RSS1.0,並將RSS定義為「RDF Site Summary」。但是這項工作沒有與UserLand公司進行有效的溝通,UserLand公司也不承認RSS 1.0的有效性,並堅持按照自己的設想進一步開發出RSS的後續版本,到2002年9月發布了最新版本RSS 2.0,UserLand公司將RSS定義為「Really Simple Syndication」。
目前RSS已經分化為RSS 0.9x/2.0和RSS 1.0兩個陣營,由於分歧的存在和RSS 0.9x/2.0的廣泛應用現狀,RSS 1.0還沒有成為標准化組織的真正標准。
2、 RSS目前的版本和推薦
到目前為止,RSS共有七種版本,推薦使用的是RSS 1.0和RSS 2.0,對於一些基本的站點同步,也可以選用RSS 0.91。
3、 RSS的語法介紹
一個RSS文件就是一段規范的XML數據,該文件一般以rss,xml或者rdf作為後綴。下面我們選擇http://msdn.microsoft.com/visualc/rss.xml中的一部分作為例子簡單說(略)
4、 RSS的聯合(Syndication)和聚合(Aggregation)
發布一個RSS文件(一般稱為RSS Feed)後,這個RSS Feed中包含的信息就能直接被其他站點調用,而且由於這些數據都是標準的XML格式,所以也能在其他的終端和服務中使用,如PDA、手機、郵件列表等。而且一個網站聯盟(比如專門討論旅遊的網站系列)也能通過互相調用彼此的RSS Feed,自動的顯示網站聯盟中其他站點上的最新信息,這就叫著RSS的聯合。這種聯合就導致一個站點的內容更新越及時、RSS Feed被調用的越多,該站點的知名度就會越高,從而形成一種良性循環。
而所謂RSS聚合,就是通過軟體工具的方法從網路上搜集各種RSS Feed並在一個界面中提供給讀者進行閱讀。這些軟體可以是在線的WEB工具,如http://my.netscape.com ,http://my.userland.com , http://www.xmltree.com ,http://www.moreover.com ,http://www.oreillynet.com/meerkat 等,也可以是下載到客戶端安裝的工具
5、 RSS的未來發展
隨著越來越多的站點對RSS的支持,RSS已經成為目前最成功的XML應用。RSS搭建了信息迅速傳播的一個技術平台,使得每個人都成為潛在的信息提供者。相信很快我們就會看到大量基於RSS的專業門戶、聚合站點和更精確的搜索引擎。
參考資料:http://wm23.com/resource/R01/Internet_1005.htm
『捌』 數據結構
何謂數據結構
?
數據結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由那些成分數據構成,以什麼方式構成,呈什麼結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,而物理上的數據結構反映成分數據在計算機內部的存儲安排。數據結構是數據存在的形式。 數據結構是信息的一種組織方式,其目的是為了提高演算法的效率,它通常與一組演算法的集合相對應,通過這組演算法集合可以對數據結構中的數據進行某種操作。
?
數據結構主要研究什麼?
?
數據結構作為一門學科主要研究數據的各種邏輯結構和存儲結構,以及對數據的各種操作。因此,主要有三個方面的內容:數據的邏輯結構;數據的物理存儲結構;對數據的操作(或演算法)。通常,演算法的
?
設計取決於數據的邏輯結構,演算法的實現取決於數據的物理存儲結構。
?
什麼是數據結構?什麼是邏輯結構和物理結構?
?
數據是指由有限的符號(比如,"0"和"1",具有其自己的結構、操作、和相應的語義)組成的元素的集合。結構是元素之間的關系的集合。通常來說,一個數據結構DS 可以表示為一個二元組:
?
DS=(D,S), //i.e., data-structure=(data-part,logic-structure-part) 這里D是數據元素的集合(或者是「結點」,可能還含有「數據項」或「數據域」),S是定義在D(或其他集合)上的關系的集合,S = { R | R : D×D×...},稱之為元素的邏輯結構。 邏輯結構有四種基本類型:集合結構、線性結構、樹狀結構和網路結構。表和樹是最常用的兩種高效數據結構,許多高效的演算法可以用這兩種數據結構來設計實現。表是線性結構的(全序關系),樹(偏序或層次關系)和圖(局部有序(weak/local orders))是非線性結構。
?
數據結構的物理結構是指邏輯結構的存儲鏡像(image)。數據結構 DS 的物理結構 P對應於從 DS 的數據元素到存儲區M(維護著邏輯結構S)的一個映射:
?
(PD,S) -- > M 存儲器模型:一個存儲器 M 是一系列固定大小的存儲單元,每個單元 U 有一個唯一的地址 A(U),該地址被連續地編碼。每個單元 U 有一個唯一的後繼單元 U'=succ(U)。 P 的四種基本映射模型:順序(sequential)、鏈接(linked)、索引(indexed)和散列(hashing)映射。
?
因此,我們至少可以得到4×4種可能的物理數據結構:
?
sequential (sets)
linked lists
indexed trees
hash graphs
?
(並不是所有的可能組合都合理)
?
??? 數據結構DS上的操作:所有的定義在DS上的操作在改變數據元素(節點)或節點的域時必須保持DS的邏輯和物理結構。
?
DS上的基本操作:任何其他對DS的高級操作都可以用這些基本操作來實現。最好將DS和他的所有基本操作看作一個整體——稱之為模塊。我們可以進一步將該模塊抽象為數據類型(其中DS的存儲結構被表示為私有成員,基本操作被表示為公共方法),稱之為ADT。作為ADT,堆棧和隊列都是一種特殊的表,他們擁有表的操作的子集。 對於DATs的高級操作可以被設計為(不封裝的)演算法,利用基本操作對DS進行處理。
?
好的和壞的DS:如果一個DS可以通過某種「線性規則」被轉化為線性的DS(例如線性表),則稱它為好的DS。好的DS通常對應於好的(高效的)演算法。這是由計算機的計算能力決定的,因為計算機本質上只能存取邏輯連續的內存單元,因此如何沒有線性化的結構邏輯上是不可計算的。比如對一個圖進行操作,要訪問圖的所有結點,則必須按照某種順序來依次訪問所有節點(要形成一個偏序),必須通過某種方式將圖固有的非線性結構轉化為線性結構才能對圖進行操作。
?
樹是好的DS——它有非常簡單而高效的線性化規則,因此可以利用樹設計出許多非常高效的演算法。樹的實現和使用都很簡單,但可以解決大量特殊的復雜問題,因此樹是實際編程中最重要和最有用的一種數據結構。樹的結構本質上有遞歸的性質——每一個葉節點可以被一棵子樹所替代,反之亦然。實際上,每一種遞歸的結構都可以被轉化為(或等價於)樹形結構。
?
從機器語言到高級語言的抽象
?
我們知道,演算法被定義為一個運算序列。這個運算序列中的所有運算定義在一類特定的數據模型上,並以解決一類特定問題為目標。這個運算序列應該具備下列四個特徵。 有限性,即序列的項數有限,且每一運算項都可在有限的時間內完成;確定性,即序列的每一項運算都有明確的定義,無二義性;可以沒有輸入運算項,但一定要有輸出運算項;可行性,即對於任意給定的合法的輸入都能得到相應的正確的輸出。這些特徵可以用來判別一個確定的運算序列是否稱得上是一個演算法。 但是,我們現在的問題不是要判別一個確定的運算序列是否稱得上是一個演算法,而是要對一個己經稱得上是演算法的運算序列,回顧我們曾經如何用程序設計語言去表達它。
?
演算法的程序表達,歸根到底是演算法要素的程序表達,因為一旦演算法的每一項要素都用程序清楚地表達,整個演算法的程序表達也就不成問題。
?
作為運算序列的演算法,有三個要素。 作為運算序列中各種運算的運算對象和運算結果的數據;運算序列中的各種運算;運算序列中的控制轉移。這三種要素依序分別簡稱為數據、運算和控制。 由於演算法層出不窮,變化萬千,其中的運算所作用的對象數據和所得到的結果數據名目繁多,不勝枚舉。最簡單最基本的有布爾值數據、字元數據、整數和實數數據等;稍復雜的有向量、矩陣、記錄等數據;更復雜的有集合、樹和圖,還有聲音、圖形、圖像等數據。 同樣由於演算法層出不窮,變化萬千,其中運算的種類五花八門、多姿多彩。最基本最初等的有賦值運算、算術運算、邏輯運算和關系運算等;稍復雜的有算術表達式和邏輯表達式等;更復雜的有函數值計算、向量運算、矩陣運算、集合運算,以及表、棧、隊列、樹和圖上的運算等:此外,還可能有以上列舉的運算的復合和嵌套。 關於控制轉移,相對單純。在串列計算中,它只有順序、分支、循環、遞歸和無條件轉移等幾種。
?
我們來回顧一下,自從計算機問世以來,演算法的上述三要素的程序表達,經歷過一個怎樣的過程。
?
最早的程序設計語言是機器語言,即具體的計算機上的一個指令集。當時,要在計算機上運行的所有演算法都必須直接用機器語言來表達,計算機才能接受。演算法的運算序列包括運算對象和運算結果都必須轉換為指令序列。其中的每一條指令都以編碼(指令碼和地址碼)的形式出現。與演算法語言表達的演算法,相差十萬八千里。對於沒受過程序設計專門訓練的人來說,一份程序恰似一份"天書",讓人看了不知所雲,可讀性
?
極差。
?
用機器語言表達演算法的運算、數據和控制十分繁雜瑣碎,因為機器語言所提供的指令太初等、原始。機器語言只接受算術運算、按位邏輯運算和數的大小比較運算等。對於稍復雜的運算,都必須一一分解,直到到達最初等的運算才能用相應的指令替代之。機器語言能直接表達的數據只有最原始的位、位元組、和字三種。演算法中即使是最簡單的數據如布爾值、字元、整數、和實數,也必須一一地映射到位、位元組和字
中,還得一一分配它們的存儲單元。對於演算法中有結構的數據的表達則要麻煩得多。機器語言所提供的控制轉移指令也只有無條件轉移、條件轉移、進入子程序和從子程序返回等最基本的幾種。用它們來構造循環、形成分支、調用函數和過程得事先做許多的准備,還得靠許多的技巧。 直接用機器語言表達演算法有許多缺點。
?
大量繁雜瑣碎的細節牽制著程序員,使他們不可能有更多的時間和精力去從事創造性的勞動,執行對他們來說更為重要的任務。如確保程序的正確性、高效性。程序員既要駕馭程序設計的全局又要深入每一個局部直到實現的細節,即使智力超群的程序員也常常會顧此失彼,屢出差錯,因而所編出的程序可靠性差,且開發周期長。 由於用機器語言進行程序設計的思維和表達方式與人們的習慣大相徑庭,只有經過
較長時間職業訓練的程序員才能勝任,使得程序設計曲高和寡。因為它的書面形式全是"密"碼,所以可讀性差,不便於交流與合作。因為它嚴重地依賴於具體的計算機,所以可移植性差,重用性差。這些弊端造成當時的計算機應用未能迅速得到推廣。
?
克服上述缺點的出路在於程序設計語言的抽象,讓它盡可能地接近於演算法語言。 為此,人們首先注意到的是可讀性和可移植性,因為它們相對地容易通過抽象而得到改善。於是,很快就出現匯編語言。這種語言對機器語言的抽象,首先表現在將機器語言的每一條指令符號化:指令碼代之以記憶符號,地址碼代之以符號地址,使得其含義顯現在符號上而不再隱藏在編碼中,可讓人望"文"生義。其次表現在這種語言擺脫了具體計算機的限制,可在不同指令集的計算機上運行,只要該計算機配上匯編語言的一個匯編程序。這無疑是機器語言朝演算法語言靠攏邁出的一步。但是,它離演算法語言還太遠,以致程序員還不能從分解演算法的數據、運算和控制到匯編才能直接表達的指令等繁雜瑣碎的事務中解脫出來。 到了50年代中期,出現程序設計的高級語言如Fortran,Algol60,以及後來的PL/l, Pascal等,演算法的程序表達才產生一次大的飛躍。
?
誠然,演算法最終要表達為具體計算機上的機器語言才能在該計算機上運行,得到所需要的結果。但匯編語言的實踐啟發人們,表達成機器語言不必一步到位,可以分兩步走或者可以築橋過河。即先表達成一種中介語言,然後轉成機器語言。匯編語言作為一種中介語言,並沒有獲得很大成功,原因是它離演算法語
?
言還太遠。這便指引人們去設計一種盡量接近演算法語言的規范語言,即所謂的高級語言,讓程序員可以用它方便地表達演算法,然後藉助於規范的高級語言到規范的機器語言的"翻譯",最終將演算法表達為機器語言。而且,由於高級語言和機器語言都具有規范性,這里的"翻譯"完全可以機械化地由計算機來完成,就像匯編語言被翻譯成機器語言一樣,只要計算機配上一個編譯程序。 上述兩步,前一步由程序員去完成,後一步可以由編譯程序去完成。在規定清楚它們各自該做什麼之後,這兩步是完全獨立的。它們各自該如何做互不相干。前一步要做的只是用高級語言正確地表達給定的演算法,產生一個高級語言程序;後一步要做的只是將第一步得到的高級語言程序翻譯成機器語言程序。至於程序員如何用高級語言表達演算法和編譯程序如何將高級語言表達的演算法翻譯成機器語言表達的演算法,顯然毫不相干。
?
處理從演算法語言最終表達成機器語言這一復雜過程的上述思想方法就是一種抽象。匯編語言和高級語言的出現都是這種抽象的範例。 與匯編語言相比,高級語言的巨大成功在於它在數據、運算和控制三方
?
面的表達中引入許多接近演算法語言的概念和工具,大大地提高抽象地表達演算法的能力。 在運算方面,高級語言如Pascal,除允許原封不動地運用演算法語言的四則運算、邏輯運算、關系運算、算術表達式、邏輯表達式外,還引入強有力的函數與過程的工具,並讓用戶自定義。這一工具的重要性不僅在於它精簡了重復的程序文本段,而且在於它反映出程序的兩級抽象。
?
在函數與過程調用級,人們只關心它能做什麼,不必關心它如何做。只是到函數與過程的定義時,人們才給出如何做的細節。用過高級語言的讀者都知道,一旦函數與過程的名稱、參數和功能被規定清楚,那麼,在程序中調用它們便與在程序的頭部說明它們完全分開。你可以修改甚至更換函數體與過程體,而不影響它們的被調用。如果把函數與過程名看成是運算名,把參數看成是運算的對象或運算的結果,那麼
?
,函數與過程的調用和初等運算的引用沒有兩樣。利用函數和過程以及它們的復合或嵌套可以很自然地表達演算法語言中任何復雜的運算。
?
在數據方面,高級語言如Pascal引人了數據類型的概念,即把所有的數據加以分類。每一個數據(包括表達式)或每一個數據變數都屬於其中確定的一類。稱這一類數據為一個數據類型。 因此,數據類型是數據或數據變數類屬的說明,它指示該數據或數據變數可能取的值的全體。對於無結構的數據,高級語言如Pascal,除提供標準的基本數據類型--布爾型、字元型、整型和實型外,還提供用戶可自定義的枚舉類、子界類型和指針類型。這些類型(除指針外),其使用方式都順應人們在演算法語言中使用的習慣。對於有結構的數據,高級語言如Pascal,提供了數組、記錄、有限制的集合和文件等四種標準的結構數據類型。其中,數組是科學計算中的向量、矩陣的抽象;記錄是商業和管理中的記錄的抽象;有限制的集合是數學中足夠小的集合的勢集的抽象;文件是諸如磁碟等外存儲數據的抽象。
?
人們可以利用所提供的基本數據類型(包括標準的和自定義的),按數組、記錄、有限制的集合和文件的構造規則構造有結構的數據。 此外,還允許用戶利用標準的結構數據類型,通過復合或嵌套構造更復雜更高層的結構數據。這使得高級語言中的數據類型呈明顯的分層。 高級語言中數據類型的分層是沒有窮盡的,因而用它們可以表達演算法語言中任何復雜層次的數據。 在控制方面,高級語言如Pascal,提供了表達演算法控制轉移的六種方式。
?
(1)預設的順序控制";"。
?
(2)條件(分支)控制:"if表達式(為真)then S1 else S2;" 。
?
(3)選擇(情況)控制:
?
"Case 表達式 of
?
值1: S1
值2: S2
...
值n: Sn
end"
?
(4)循環控制:
?
"while 表達式(為真) do S;" 或
"repeat S until 表達式(為真);" 或
"for變數名:=初值 to/downto 終值do S;"
?
(5)函數和過程的調用,包括遞歸函數和遞歸過程的調用。
?
(6)無條件轉移goto。
這六種表達方式不僅覆蓋了演算法語言中所有控製表達的要求,而且不再像機器語言或匯編語言那樣原始、那樣繁瑣、那樣隱晦,而是如上面所看到的,與自然語言的表達相差無幾。 程序設計語言從機器語言到高級語言的抽象,帶來的主要好處是: 高級語言接近演算法語言,易學、易掌握,一般工程技術人員只要幾周時間的培訓就可以勝任程序員的工作;高級語言為程序員提供了結構化程序設計的環境和工具,使得設計出來的程序可讀性好,可維護性強,可靠性高;高級語言遠離機器語言,與具體的計算機硬體關系不大,因而所寫出來的程序可移植性好,重用率高; 由於把繁雜瑣碎的事務交給了編譯程序去做,所以自動化程度高,開發周期短,且程、序員得到解脫,可以集中時間和精力去從事對於他們來說更為重要的創造性勞動,以提高、程序的質量。
?
數據結構、數據類型和抽象數據類型
?
數據結構、數據類型和抽象數據類型,這三個術語在字面上既不同又相近,反映出它們在含義上既有區別又有聯系。
?
數據結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由哪些成分數據構成,以什麼方式構成,呈什麼結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,物理上的數據結構反映成分數據在計算機內的存儲安排。數據結構是數據存在的形式。
?
數據是按照數據結構分類的,具有相同數據結構的數據屬同一類。同一類數據的全體稱為一個數據類型。在程序設計高級語言中,數據類型用來說明一個數據在數據分類中的歸屬。它是數據的一種屬性。這個屬性限定了該數據的變化范圍。為了解題的需要,根據數據結構的種類,高級語言定義了一系列的數據類型。不同的高級語言所定義的數據類型不盡相同。Pascal語言所定義的數據類型的種類。
?
其中,簡單數據類型對應於簡單的數據結構;構造數據類型對應於復雜的數據結構;在復雜的數據結構里,允許成分數據本身具有復雜的數據結構,因而,構造數據類型允許復合嵌套;指針類型對應於數據結構中成分數據之間的關系,表面上屬簡單數據類型,實際上都指向復雜的成分數據即構造數據類型中的數據,因此這里沒有把它劃入簡單數據類型,也沒有劃入構造數據類型,而單獨劃出一類。
?
數據結構反映數據內部的構成方式,它常常用一個結構圖來描述:數據中的每一項成分數據被看作一個結點,並用方框或圓圈表示,成分數據之間的關系用相應的結點之間帶箭號的連線表示。如果成分數據本身又有它自身的結構,則結構出現嵌套。這里嵌套還允許是遞歸的嵌套。
?
由於指針數據的引入,使構造各種復雜的數據結構成為可能。按數據結構中的成分數據之間的關系,數據結構有線性與非線性之分。在非線性數據結構中又有層次與網狀之分。 由於數據類型是按照數據結構劃分的,因此,一類數據結構對應著一種數據類型。數據類型按照該類型中的數據所呈現的結構也有線性與非線性之分,層次與網狀之分。一個數據變數,在高級語言中的類型說明必須是讀變數所具有的數據結構所對應的數據類型。最常用的數據結構是數組結構和記錄結構。數組結構的特點是:
?
成分數據的個數固定,它們之間的邏輯關系由成分數據的序號(或叫數組的下標)來體現。這些成分數據按照序號的先後順序一個挨一個地排列起來。每一個成分數據具有相同的結構(可以是簡單結構,也可以是復雜結構),因而屬於同一個數據類型(相應地是簡單數據類型或構造數據類型)。這種同一的數據類型稱為基類型。所有的成分數據被依序安排在一片連續的存儲單元中。 概括起來,數組結構是一個線性的、均勻的、其成分數據可隨機訪問的結構。
?
由於這、種結構有這些良好的特性,所以最常被人們所採用。在高級語言中,與數組結構相對應的、數據類型是數組類型,即數組結構的數據變數必須說明為array [i] of T0 ,其中i是數組、結構的下標類型,而T0是數組結構的基類型。 記錄結構是另一種常用的數據結構。它的特點是:與數組結構一樣,成分數據的個數固定。但成分數據之間沒有自然序,它們處於平等地位。每一個成分數據被稱為一個域並賦予域名。不同的域有不同的域名。不同的域允許有不同的結構,因而允許屬於不同的數據類型。與數組結構一樣,它們可以隨機訪問,但訪問的途徑靠的是域名。在高級語言中記錄結構對應的數據類型是記錄類型。記錄結構的數據的變數必須說明為記錄類型。
?
抽象數據類型的含義在上一段已作了專門敘述。它可理解為數據類型的進一步抽象。即把數據類型和數據類型上的運算捆在一起,進行封裝。引入抽象數據類型的目的是把數據類型的表示和數據類型上運算的實現與這些數據類型和運算在程序中的引用隔開,使它們相互獨立。對於抽象數據類型的描述,除了必須描述它的數據結構外,還必須描述定義在它上面的運算(過程或函數)。抽象數據類型上定義的過程和函
數以該抽象數據類型的數據所應具有的數據結構為基礎。
?
泛型設計和數據結構與演算法
?
下面我想再說說關於泛型程序設計模型對於數據結構和演算法方面的最新推動,泛型思想已經把數據結
?
構和演算法方面的基本思想抽象到了一個前所未有的高度,現在有多種程序設計語言支持泛型設計,比如
ADA,C++,而且據說在JAVA的下一版本和C#中也將對泛型設計進行全面的支持。
?
先說說泛型設計的基本思想:泛型編程(generic programming,以下直接以GP稱呼)是一種全新的程序設計思想,和OO,OB,PO這些為人所熟知的程序設計想法不同的是GP抽象度更高,基於GP設計的組件之間偶合度底,沒有繼承關系,所以其組件間的互交性和擴展性都非常高。我們都知道,任何演算法都是作用在一種特定的數據結構上的,最簡單的例子就是快速排序演算法最根本的實現條件就是所排序的對象是存
貯在數組裡面,因為快速排序就是因為要用到數組的隨機存儲特性,即可以在單位時間內交換遠距離的對象,而不只是相臨的兩個對象,而如果用聯表去存儲對象,由於在聯表中取得對象的時間是線性的既O[n],這樣將使快速排序失去其快速的特點。也就是說,我們在設計一種演算法的時候,我們總是先要考慮其應用的數據結構,比如數組查找,聯表查找,樹查找,圖查找其核心都是查找,但因為作用的數據結構不同
?
將有多種不同的表現形式。數據結構和演算法之間這樣密切的關系一直是我們以前的認識。泛型設計的根本思想就是想把演算法和其作用的數據結構分離,也就是說,我們設計演算法的時候並不去考慮我們設計的演算法將作用於何種數據結構之上。泛型設計的理想狀態是一個查找演算法將可以作用於數組,聯表,樹,圖等各種數據結構之上,變成一個通用的,泛型的演算法。這樣的理想是不是很誘惑人?
?
泛型編程帶來的是前所未有的彈性以及不會損失效率的抽象性,GP和OO不同,它不要求你通過額外的間接層來調用函數:它讓你撰寫完全一般化並可重復使用的演算法,其效率與針對特定數據結構而設計的演算法旗鼓相當。我們大家都知道數據結構在C++中可以用用戶定義類型來表示,而C++中的模板技術就是以類型作為參數,那麼我可以想像利用模板技術可以實現我們開始的GP思想,即一個模板函數可以對於各種傳遞進來的類型起作用,而這些類型就可以是我們定義的各種數據結構。
?
泛型演算法抽離於特定類型和特定數據結構之外,使得其適應與盡可能的一般化類型,演算法本身只是為了實現演算法其需要表達的邏輯本質而不去被為各種數據結構的實現細節所干擾。這意味著一個泛型演算法實際具有兩部分。1,用來描敘演算法本質邏輯的實際指令;2,正確指定其參數類型必須滿足的性質的一組需求條件。到此,相信有不少人已經開始糊塗了,呵呵,不要緊。畢竟GP是一種抽象度非常高的程序設計思想,裡面的核心就是抽象條件成為成為程序設計過程中的核心,從而取代了類型這在OO裡面的核心地位,正是因為類型不在是我們考慮的重點,類型成為了抽象條件的外衣,所以我們稱這樣的程序思想為泛型思想------把類型泛化。
這樣可以么?
『玖』 c++ 怎麼學,我只要過程就行了,
軟體:Visual C++6.0
書籍如果要國內的就是清華大學潭浩強教授的<<C++程序設計>>,這本書說得很容易懂,潭浩強可是一代大師呀,你到網上搜一下就知道了,而且這本書也是很多大學使用的教材,是很多學生的入門教材,我想也會適合你的.
如果要國外的,就用<<C++ primer>>吧,都已經出到第四版了,而且也有中文翻譯的.如果嫌太貴了,也可以到圖書館借一本方便初學者入門的書.
入門的時候會碰到很多問題的,要多編程,課後的習題最好都做一片.這對熟悉它的語法使用很重要.就算是書本的例子,你覺得怪怪的,都可以打進電腦運行一片,這都會有助於理解.
把第一本教材弄懂了,以後就好辦了.過了這個階段,你對基礎知識已經有了一定的理解,特別對一些難點,如指針,IO操作要真的很熟悉.就可以往高級點的學了.
下一步,可以學一下C++標准庫,裡面最重要的就是STL了,這有很多模板,使用它對提高效率有很大的幫助.
同時,可以編一二個比較綜合的課程設計,如學生管理系統,我想你也看到,接近學期末的時候,在網路知道有很多人叫別人做課程設計的,其實最好就是自己動手了,才能嘗到的,這個過程可以得到很多經驗,很重要哦.
兩次,你可以對C++更深入的了解,有一本書實在太出名了,就是<<C++編程思想>>,看完這本書,可以得到一個升華,(不是隨便看一片,至少看懂大部分吧).
如果你還想更深入,可以考慮侯傑的<<STL源碼剖析>>,這本書實在太高深了,我也有很多弄不懂的,現在.
不過,你可以學習Windows編程了,確實一點說,就是要會用MFC類庫,這樣可以編出一些界面很好的程序,Visual C++更是不能缺少的.
到了這個階段,這想你也可以知道要學什麼了,有向網路編程了,有多媒體了,有圖形學了.
最後說一下,演算法,就是你後期的最需要部分了.這里推薦一本<<演算法導論>>.
說了這么多,都是我的親身體會,希望對你有用.誰還能在別處看到或搜索到我這的內容就算是我復制的了.我相信沒有別處比這更早有這內容了.確是我的確體會.