2013-12-15 78 views
2

當用Java編程時,我顯然會將相關代碼保存在類中,組織類結構,層次結構等以最大限度地重用代碼。從Java過渡到C代碼組織

現在我開始使用C了,對於以模塊化方式組織C代碼的最佳方法有點困惑。很明顯,我知道頭文件和源文件,但是在C中最大程度地重用代碼時有點不知所措。

那麼,人們如何用C這樣的語言來組織他們的代碼,這顯然不支持OOP。

+0

我沒有看到上面的文章,但認爲這個問題是正當的,因爲我要求的代碼組織技術一種用於諸如Java的語言。過渡技巧,就像它一樣。 –

回答

0

這兩種語言的不同之處在於Java是更現代,設計用於OOP

C是年齡大了,是,是一個proceedural語言。由於語言不同,我們編程的方式通常不同,佈局也不同。

C程序在.h文件中包含頭文件(和函數原型),在.c文件中包含函數代碼。

就模塊性而言,您仍然可以按照與代碼類似的方式來遵循類似的模式。一般的經驗法則是一個文件應該做一件事,即string_parser.c應該只處理字符串解析。 list_sorter.c應該處理列表排序等。

在代碼重用方面 - 像「實用程序」文件這樣的東西很好,所以可重用的有用代碼可以放在一個C文件中幷包含在需要的地方。你不應該在C中複製代碼,所以如果你發現自己的複製/粘貼功能把它放在一個集中的文件中,並將它包含在多個地方。

寫通用函數!保持你的功能簡單並開放,使它們不那麼具體,這樣你可以重用你的功能。

我的建議是記住你的Java代碼佈局知識,但也要檢查一個好的C指南。 http://www.doc.ic.ac.uk/lab/cplus/cstyle.html

一般好的項目設計將幫助您計算項目的文件佈局/結構。

+0

對不起,過了漫漫長夜。 – FaddishWorm

+0

@FaddishWorm我認爲這就是你的意思。漫長的夜晚吧?我知道一個。 –

+0

@VisionIncision yea大周,令人心寒的試圖擺脫咖啡因高的堆棧:P – FaddishWorm

0

說到JavaC之間的主要風格差異我想說這不是OOP的缺席。

一般認爲C只是關於'just older'語言。它是完全不同的語言,其性質完全不同。假設Java在處理低級別方面並不是很完美,並且總是這樣,因爲Java旨在爲應用程序開發人員提供安全性。 C沒有這樣的可用性,但授予你更多的權力控制權。

關於Java的C的主要優勢是接口和實現之間的距離。只是說明:當你有頭時,實際上你有接口的概念,它確實是接口。您可以根據標頭鏈接完全不同的模塊實現相同的接口。那麼,你不會有語言控制這些事情:-),他們真的不安全。感受與Java的不同之處。

在C中,您可以基於具有指向函數類型指針的結構實現OOP方法。更多,這樣你就會收到'運行時靈活的OOP'之類的東西,因爲這個綁定是初始化或運行時更改的主體。它近乎反思......但更快更危險。

如果您尋找良好的C最佳實踐,請檢查Linux內核源代碼。此代碼按照現代C最佳實踐進行演變,可能是高質量的大型C項目的最佳例證。

希望這會有所幫助。

0

我傾向於認爲是這樣的:

  • 一個Java類的C-等價應該是一對.C/.h文件。它的數據(不管是私有的還是公共的)都包含在一個結構中(最好只在.c文件中聲明)。在.h文件中聲明的每個函數都有一個指向其結構的指針作爲參數。 .h文件只需要包含結構的聲明。
  • java包的C等價物不可能通過任何東西來實現,只是將文件定位在不同的目錄中。但是,由於是單個全局名稱空間,因此對於XXXNAME_YYYNAME_ZZZNAME_FunctionName(),其中XXXNAME是公司的名稱,YYYNAME是產品或庫的名稱,必須爲每個非靜態函數和類型添加唯一的前綴,而ZZZNAME是產品/庫中的子包的名稱。我已經注意到,在現實生活中,公司名稱根本不是很常見,如果產品/庫是「小型」的,那也不是。
  • (單個)繼承可以通過將「基類」的結構作爲「子類」結構的第一個元素輕鬆實現。然而,在不暴露整個結構的情況下,繼承結構不容易暴露給客戶端。

示例頭文件:

struct CARLIB_Car_s; 

void CARLIB_Car_Drive(struct CARLIB_Car_s *pCar, uint16_t KiloMeters); 

示例源文件:

struct CARLIB_Car_s { 
    uint16_t FuelLeft; 
}; 

void CARLIB_Car_Drive(struct CARLIB_Car_s *pCar) 
{ 
    // ... 
}