2015-05-21 57 views
17

最近,我學習了Swift和開發iOS應用程序的基礎知識。現在,我想自己開發一個真正的應用程序,但是我非常關心編寫好的代碼,所以我一直在尋找「最佳實踐」,「設計模式」和「正確的方式」來實現它。開發Swift iOS應用程序「正確的方式」

在我的搜索,我發現這個great tutorial約通常在斯威夫特iOS應用中使用的所有設計模式和使用它們其中的一個例子。

但無論如何,我認爲這個教程一個偉大的之一,對我幫助很大,我有它僅是一個開始的感覺,因爲我看到很多S.O.L.I.D.原則違規。例如:

見LibraryAPI實現Facade模式:

class LibraryAPI: NSObject { 

    private let persistencyManager: PersistencyManager 
    private let httpClient: HTTPClient 
    private let isOnline: Bool 

    class var sharedInstance: LibraryAPI { 

     struct Singleton { 
      static let instance = LibraryAPI() 
     } 

     return Singleton.instance 
    } 

    override init() { 
     persistencyManager = PersistencyManager() 
     httpClient = HTTPClient() 
     isOnline = false 

     super.init() 
     NSNotificationCenter.defaultCenter().addObserver(self, selector:"downloadImage:", name: "BLDownloadImageNotification", object: nil) 
    } 

    deinit { 
     NSNotificationCenter.defaultCenter().removeObserver(self) 
    } 

    func getAlbums() -> [Album] { 
     // ... Not relevant 
    } 

    func addAlbum(album: Album, index: Int) { 
     // ... Not relevant 
    } 

    func deleteAlbum(index: Int) { 
     // ... Not relevant 
    } 

    func downloadImage(notification: NSNotification) { 
     // ... Not relevant 
    } 
} 

是在我腦海中看到的,這是第一件事:這是否違反Depedency倒置原則?不應該將httpClientpersistencyManager聲明爲協議,然後類HttpClientPersistencyManager實現該協議?

如果是這樣的話,在某些時候,我必須確定一下班,負責執行這些協議,我將使用。我應該在哪裏告訴應用程序?

另一個問題我已經是:這個例子只實現了一個模型(Album),但如果它會實現很多其他什麼? (Album,AuthorGenre ...)。不會是LibraryAPI這麼大,它會違反單一責任原則?

最後但並非最不重要......與DIP同樣的問題PersistencyManager存在。它不應該實現DAO模式,所以`PersistencyManager不依賴於其他類?

謝謝你在前進,我希望我解釋自己不夠好!

+6

在[Code Review Stack Exchange](http://codereview.stackexchange.com/)上可能會問這個問題更好 –

+3

@DanielStorm對不起,我甚至不知道這個網站的存在。 – barbarity

回答

17

一些建議

  1. 設計模式是一個指南,以幫助從解決已經解決了問題,節省您的精力,他們沒有嚴格的規定
  2. 當你鏈接到(該網站raywenderlich.com )是一個良好的開端的教程,在設計模式的更多詳細信息在迅疾我建議Design Patterns In Swift
  3. 如果HttpClient的和PersistencyManager是其提供的接口比的協議是不是嚴格必要的基類。我同意協議是更通用的方式去這裏
  4. 如果你使用協議,我會在初始化程序中指定客戶端和持久性管理器,因爲它們是必需的
  5. 持久模型具有足夠的特定作用由單一類處理,請參閱realm.io爲例分貝
+1

謝謝你的鏈接。非常非常非常有用! – barbarity

7

既然要「開發你自己的真正的應用程序」問題國家的第一線,因此我只是想你指出正確的方向。

事實是沒有「最好的」方式結構化您的代碼。有很多方法可以編寫完成相同任務的代碼。除非你在一個團隊中工作並構建一個非常複雜的應用程序,否則你關注的方法並不重要。

正如你所說,你已經學會了迅速,我建議你現在集中精力學習類似閉包和協議的快速特性。一旦你熟悉了這些,那麼你就需要熟悉iOS SDK,它有大量的內置框架,你需要在你的應用程序中使用它。

最後,儘快開始使用您的應用程序。您可能無法在第一個應用程序中編寫乾淨且結構良好的代碼,但它會隨着時間的推移學習錯誤並在稍後進行更正,從而學習它。爲了鼓勵你,我想告訴你,製作一個簡單的應用程序並不是非常困難,我學會了客觀的C,並在20天內完成了我的第一場比賽,你也可以做到這一點。如果您需要任何教程/資源,請留下評論,我會更新答案。

專注於構建應用程序。當你建造它時稍後改進它。

+0

我的一個頑固的錯誤。始終想從一開始就做得完美。但我會聽從你的建議。謝謝! – barbarity

+1

如果你想開始自己的應用程序,直到你掌握了最好的編碼設計和模式等......你永遠不會啓動你的應用程序。順便說一下,這是我的問題。我正在考慮應用程序的每個細節,而應用程序根本不存在。剛開始,從錯誤中學習。我可以告訴我的兒子在現場注意所有危險的事情,但是如果他跌倒了,他會實際學到它,因爲他可以學會站起來。只要做到這一點,我們會在稍後處理這個問題:) – AndaluZ

相關問題