簡體   English   中英

我是否真的需要為僅供內部使用的代碼創建iOS靜態庫?

[英]Do I really need to create an iOS static library for internal-use-only code?

在頭腦風暴會議上,有人建議我們在未來的項目中使用靜態庫。 我整天都在研究這個話題。

我找到了一些關於靜態庫是什么以及如何創建靜態庫的有用答案。

圖書館? 靜態的? 動態? 還是框架? 項目在另一個項目內

我還找到了關於如何使用庫的資源的答案:

帶有資源的iOS庫

我的問題是:

我真的需要創建一個靜態庫,還是應該只為內部使用代碼創建一個類?

條件:

  1. 我有三個需要特殊編碼和解碼引擎的項目。
  2. 引擎的功能涉及加密,IP包傳輸和硬件二進制編碼。
  3. 功能少於20個。
  4. 我們永遠不會將此引擎發布給第三方開發人員或開源。

另一種問方式:

在什么情況下我應該創建一個靜態庫?

即使您不想與其他開發人員共享代碼,您仍然可以通過創建靜態庫獲得巨大的好處。

正如Srikar Appal所提到的,創建靜態庫所獲得的好處包括: 1)代碼分發2)代碼重用 ,我還想補充一下, 3)版本控制4)可測試性 (對BergQuester下面的評論的贊譽)和5 )文件

讓我們更仔細地看看這些:

1)代碼分發

靜態庫很棒,因為它們可以很容易地分發代碼 - 您只需要編譯並共享生成的.a文件。

即使您從未計划與其他開發人員共享代碼,您仍然可以在自己的項目中使用它。

或者,您可以將靜態庫的項目作為子項目包含在各個主項目中,使其成為主項目的依賴項...請參閱https://github.com/jverkoey/iOS-Framework以了解如何設置。

2)代碼重用

即使在非常不同的應用程序中,您也經常會發現您正在執行與之前編寫代碼相同的任務。 如果你是一個高效的開發人員,你不會想再次編寫相同的代碼......相反,你只想包含你之前編寫的優秀代碼。

你可能會說, But I can just include the classes directly

但是,如果您的代碼不一定polished ,該怎么辦? 或者隨着時間的推移, 它使用的框架隨着時間而改變?

當您對代碼集進行更改和錯誤修復時,能夠輕松地在項目中包含最新版本(或者稍后可以輕松更新項目)會很不錯。 靜態庫使這更容易,因為所有相關代碼都包含在單個包中。

也不用擔心其他開發人員對其進行的其他項目特定攻擊 - 主項目不能(或者在作為子項目的靜態庫的情況下, 不應該 )更改靜態庫的代碼集。

這樣做的另一個好處是,如果有人確實需要更改靜態庫的代碼集,他必須進行更改,以便所有依賴它的項目仍然可以使用它(沒有項目特定的快捷方式)。

3)版本控制

如果您有一組可以移動的類並將項目包含在項目中,那么很難跟上版本控制。 最有可能的是,您所擁有的唯一版本是主項目的版本。

如果一個項目修復了一些錯誤而另一個項目修復了這個類集中的其他錯誤怎么辦? 您可能不知道合並這些更改(如果兩個團隊甚至分開工作會怎樣)? 或者,每個項目可能正在修復相同的錯誤!

通過創建靜態庫,您可以跟蹤版本控制(靜態庫的項目有自己的版本號),通過對靜態庫進行更改,您可以減少合並問題並消除修復相同錯誤的風險並結束。

4)可測試性

隨着iOS作為平台的不斷成熟,對代碼進行單元測試變得越來越普遍。 Apple甚至繼續構建和擴展測試框架(XCTest),以使iOS開發人員更容易更快地編寫單元測試。

雖然您可以 (以及恕我直言, 應該 )在應用程序級別為您的代碼編寫單元測試,但使用靜態庫創建和封裝代碼通常會使這些測試更好更易於維護

測試更好,因為精心設計的靜態庫封裝了有目的的功能(即設計良好的庫執行特定的任務,例如網絡任務),這使得更容易“單元化”測試代碼。

也就是說,設計良好的靜態庫開始實現預定義的“目的”,因此基本上,它自然地創建測試邊界(即,網絡呈現所獲取的數據可能至少是兩個單獨的庫)。

測試更容易維護,因為它們將與靜態庫代碼位於同一個存儲庫(例如Git repo)中(從而與此代碼一起進行版本化和更新)。 就像您不想將代碼從項目復制並粘貼到項目中一樣,您也同樣不希望復制和粘貼測試。

5)文檔

與單元測試一樣,在線文檔在iOS中繼續變得更加重要。

雖然你可以 (並且再次,恕我直言, 應該 )在應用程序級別記錄代碼,但如果它在靜態庫級別(與上面的單元測試相同的推理),它再次更好更容易維護


所以回答你的問題,

我真的需要創建一個靜態庫,還是應該只為內部使用代碼創建一個類?

你可能會問自己以下幾點:

  1. 這個代碼會在多個應用程序中使用嗎?
  2. 這段代碼會不會有多個課程?
  3. 多個開發人員是否會同時處理或使用此代碼(可能在不同的應用程序中)?
  4. 這個代碼會進行單元測試嗎?
  5. 這段代碼會被記錄下來嗎?

如果您對上述大部分內容回答YES ,則應該為此代碼創建一個靜態庫。 從長遠來看,它可能會為您省去麻煩。

如果對上述大部分內容回答“ NO ”,則可能無法從創建靜態庫中獲得太多好處(因為代碼集必須非常特定於此類實例中的項目)。

在我看來,創建一個靜態庫有以下好處 -

  1. 代碼分發 - 這是開發人員創建靜態庫的最大原因(也許是唯一的原因)。 它模糊了實際代碼並公開了API方法。 但是,由於您已明確提到此“庫包”永遠不會分發給第三方開發人員,因此這個原因可能不適用。
  2. 代碼重用 - 這是我能想到的另一個原因。 但是,通過簡單地使用( .m文件)中的類,在頭文件中使用方法定義並導入頭文件( .h文件),可以實現代碼重用。 因此,這不是創建靜態庫的理由。

由於靜態鏈接代碼,我不知道任何性能優勢。 創建靜態庫也有自己的維護開銷。 它不會像創建一個構建那么簡單。 你必須記住鏈接靜態庫,保持兼容性等。

因此,在您的情況下,創建靜態庫可能沒有多大意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM