2010-03-17 68 views
3

我知道這個問題沒有人回答,但我想讓人們考慮他們將如何處理這種情況。Objective-C封裝API設計方法

我正在寫一個Objective-C包裝到C庫。我的目標是:

1)包裝使用Objective-C對象。例如,如果C API定義了諸如char * name之類的參數,則Objective-C API應該使用name:(NSString *)。

2)使用Objective-C包裝器的客戶端不必知道C庫的內部工作原理。

速度沒有任何問題。

使用簡單的參數很容易。接受NSString並將其轉換爲C字符串以將其傳遞給C庫肯定沒有問題。

當涉及複雜的結構時,我的優柔寡斷進來了。

比方說,你有:

struct flow 
{ 
    long direction; 
    long speed; 
    long disruption; 
    long start; 
    long stop; 
} flow_t; 

And then your C API call is: 

void setFlows(flow_t inFlows[4]); 

因此,一些選擇的是:
1)暴露flow_t結構到客戶端,並有Objective-C的API把這些結構的數組
2)構建一個包含屬性的NSArray的四個NSDray,並將其作爲參數傳遞給參數
3)創建一個包含結構屬性的四個「Flow」對象的NSArray,我對方法的分析:
方法1:最簡單。但是,它不符合設計目標。方法2:由於某種原因,這在我看來是最「目標C」的方式。但是,NSDictionary的每個元素都必須包裝在一個NSNumber中。現在看來我們只是爲了傳遞一個結構的等價物而做了很多事情。方法3:從面向對象的角度來看,似乎對我來說最清潔,而額外的封裝可能會在以後派上用場。然而,就像#2一樣,現在看起來我們正在做很多事情(創建一個數組,創建和初始化對象)只是爲了傳遞一個結構。

所以,問題是,你會如何處理這種情況?我還沒有考慮其他選擇嗎?我提出的方法有沒有其他的優點或缺點,我不考慮?

+0

框架本身包含結構。 NSRange等。我認爲在結構上沒有一個通用的決定。這取決於。 – 2010-03-17 17:23:39

回答

2

我認爲方法3是做事的首選方式。當你包裝一個庫時,你需要圍繞用戶需要處理的任何對象或結構創建包裝。

如果你包裝了所有東西,那麼你可以隨時改變你的類的內部工作,而不會影響你的用戶習慣的接口。例如,將來您可能會意識到您想添加某種類型的錯誤檢查或更正...如果stop小於start(我承認,這是一個非常糟糕的例子),也許設置stop早於start會導致一些計算錯誤,您可以更改流程包裝中的stop方法設置start等於stop

+0

我同意。畢竟,初始化4個對象並將它們放入一個數組中並沒有比初始化4個結構和將它們放入一個數組中更加不同,所以我認爲我太擔心了。 – wadesworld 2010-03-17 17:00:29

2

我會堅持做法3.您只是「傳遞結構」現在,但Flow對象可能在未來擴展更多。你說速度不是問題,所以我會想象內存消耗量不是,否則你會堅持使用C。

0

由於Objective-C使用結構,爲什麼不把它作爲像NSRect這樣的結構?

+0

因爲它通常會更好地將結構體作爲實際對象,因爲您不能將結構體置於集合中(比如NSArrays),而無法先將它們裝入「NSValue」對象中。 – 2010-03-17 17:00:31

1

我的回答不是你問的問題,但它仍然是我「如何處理這種情況」。

我會問的第一個問題是,「這個包裝器添加了什麼價值?」如果答案是「使用Objective-C語法」,那麼答案是「不要改變一件事,按原樣使用庫,因爲C是Objective-C語法。」

我不知道你打包哪個庫,所以我將使用SQLite作爲我頭部示例的頂部。採用分層的方法,我會做這樣的事情:

A)高級別對象(訂單,客戶,供應商......)

B)基類(錄音)

C)的SQLite

因此,基類是爲了直接調用SQLite而編寫的,其他類就像普通的Objective-C類一樣工作。

這被並列於:

1)高級對象(訂單,客戶,供應商...)

2)基類(記錄)

3)SQLite的包裝(Objective- C)

4)SQLite的

創建同一個應用程序,但有額外的工作創建,維護和調試3級很少以顯示它。

在第一個版本中,B層包裝SQLite,所以沒有超過它直接調用SQLite,它並沒有嘗試提供所有的SQLite功能。它只是提供A層需要的功能,並使用SQLite來實現所需的功能。它'包裝'SQLite,但以更具體應用的方式。相同的Record類可以稍後在另一個應用程序中重用並擴展以滿足當時這兩個應用程序的需求。