程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 無奈的C++的復雜性問題介紹說明

無奈的C++的復雜性問題介紹說明

編輯:C++入門知識

C++更多地靠第三方的庫來實現這些功能,因為C++是一個國際標准,C++的復雜要在C++中加入這些語言之外的、面向應用的特性還需要很長一段路要走。而C#、Java的擁有者是商業化公司,各種動作自然要敏捷得多。

然而這其實只不過是一個結果,而不是原因。正是因為語言太復雜,才無法在有效期內開發出高質量的大一統的類庫。 C++的復雜,並非是其體積龐大之必然結果。復雜是對結構混亂無序程度的描述,規模大,結構不見得必然復雜。

C++的復雜,也並不是如很多人所認為,是若干種編程范式paradigms)的並存而至。事實上,現代實用編程語言至少有2-3種范式才能登大雅之堂。以范式數量論,Python和Ruby等新型動態語言的范式甚至多於C++,然而它們卻以簡單和開發效率高著稱。

  • 有關C++優化代碼問題詳細說明
  • 圖示說明C++應用程序存在的幾大重要元素
  • 深度剖析C++編譯器怎樣實現異常處理
  • 大概講述C++編譯模式說明介紹
  • 更好的設計面向對象的C++語言

C++復雜的根源在於三大約束:與C的完全兼容、靜態類型檢查、最高性能。在三大約束下,C++未能完善對於面向對象思想的支持,未能建立強大的動態能力,從而使得C++在OO這個單項上存在本質缺陷。

事實上,C++的過程、OB模型相當成熟和穩定,而泛型模型,就單項來說,除了語法丑陋之外也沒有大的問題。缺陷集中體現在OO模型的實現,並因此干擾了其他幾個范式的完整程度。

然而,OO的缺陷絕非設計者的偏執,其原因在於三大約束。如果堅持三大約束,則即使再重新設計一次,結果也與今日相差不遠。Stroustrup在多種場合表示,對C++的設計沒有大的後悔之處,意思就是這個。

侯捷先生早在2001年初即對我說,C++在OO上不及Java,當時體會不深,認為沒有大一統的單根類庫會使設計更加靈活,後來又認為憑借GP可以抵消OO的不足甚至超越之,現在看來即使不是不可能,這條道路也必然是艱辛異常,成敗難以預料。

又因為上述所有因素的綜合作用,C++基礎類庫的建設只能進行到很低的高度上就停下來,因為再往上走就面臨重重困境和無窮無盡的爭論。C++標准庫實際上是一個距離應用相當遙遠的非常基礎的程序庫。

其主體部分只相當於Java中System和Util兩個package。而C++寧可停在這樣的低層次,也不願意放棄三大約束中的任何一個。這種執著使得高層標准庫設施的建立異常困難,使用也不容易。Boost庫中相當部分組件的易用性不佳。

模板的復雜語法與三大約束也有直接的關系。另一個原因是Bjarne在發明模板時目標單純。C#和Java加入泛型機制的時候,沒有繼承C++最好的經驗,卻不約而同地繼承了C++模板機制中最壞的部分——語法,短期來看,喪失了一次改革的良機。長遠來看,必成累贅。

不完善的異常機制則是在木已成舟的情況下迫不得已的設計。C++中的多種范式並行,是一些最復雜問題的表面原因。以至於Doug Lea建議在一個項目裡只堅持一個范式。但是這仍然只是表象。歸根結底還是因為C++的復雜的缺陷,使得與其它范式合作時困難成倍放大。故自接受Doug Lea思想以來,我的C++乃至其他現代語言,尤其是Python等多范式語言)的開發設計思路是:

1. 首先選定一種思維方式即范式),盡可能只用這一種思維方式解決問題;

2. 如果在局部遇到其他思維方式更得力的問題,則經慎重考慮後,可以將另一種風格包裝在局部,解決局部問題。但整個系統在某一層次之上看來,應當是統一一致的。一般C++的開發,應以OB為基本風格。除非有類似MFC那樣龐大而成熟的OO庫支持,不應貿然在整體上使用OO風格。

3. 多種風格混用,除非有已被充分討論並驗證的方案即成熟模式),可提供單一風格不能提供的較大優勢,否則應極力避免。當然鼓勵在研究中探索,但實踐是另一回事。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved