2015-05-21 16 views
17

Gần đây, tôi đã học được Swift và những điều cơ bản để phát triển một ứng dụng iOS. Bây giờ, tôi muốn phát triển một ứng dụng thực sự của riêng mình, nhưng tôi rất quan tâm đến việc viết mã tốt, vì vậy tôi đã tìm kiếm "các phương pháp hay nhất", "các mẫu thiết kế" và "đúng cách" để đạt được nó.Phát triển ứng dụng Swift iOS "The Right Way"

Khi tìm kiếm, tôi đã tìm thấy trang này great tutorial về tất cả các mẫu thiết kế thường được sử dụng trong ứng dụng Swift iOS và ví dụ về nơi chúng được sử dụng.

Nhưng tuy nhiên tôi xem hướng dẫn này là một hướng dẫn tuyệt vời và giúp tôi rất nhiều, tôi có cảm giác rằng đó chỉ là sự khởi đầu, bởi vì tôi thấy nhiều S.O.L.I.D. vi phạm nguyên tắc. Ví dụ:

Xem mẫu Façade thực hiện trong LibraryAPI:

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 
    } 
} 

Việc đầu tiên mà nói đến cái tâm của tôi nhìn thấy đây là: Có phải điều này vi phạm các Depedency Inversion Nguyên tắc? Không nên là httpClientpersistencyManager được khai báo là giao thức và sau đó các lớp học HttpClientPersistencyManager triển khai giao thức đó?

Nếu đúng như vậy, tại một thời điểm nào đó, tôi sẽ phải xác định những lớp nào sẽ triển khai các giao thức đó, tôi sẽ sử dụng. Tôi nên nói cho ứng dụng ở đâu?

Một câu hỏi khác mà tôi có là: Ví dụ này chỉ thực hiện một Mô hình (Album), nhưng điều gì sẽ xảy ra nếu nó thực hiện nhiều mô hình khác? (Album, Author, Genre ...). Sẽ không phải là LibraryAPI quá lớn đến nỗi vi phạm Nguyên tắc về Trách nhiệm duy nhất?

Và cuối cùng nhưng không kém ... Vấn đề tương tự với DIP tồn tại trong PersistencyManager. Không nên nó thực hiện mô hình DAO, vì vậy `PersistencyManager không phụ thuộc vào các lớp khác?

Cảm ơn bạn trước và tôi hy vọng tôi đã giải thích cho bản thân mình đủ tốt!

+6

Câu hỏi này có thể tốt hơn để hỏi về [Mã đánh giá trao đổi ngăn xếp] (http://codereview.stackexchange.com/) –

+3

@DanielStorm Xin lỗi, tôi thậm chí không biết sự tồn tại của trang web này. – barbarity

Trả lời

17

Một vài gợi ý

  1. mẫu thiết kế là một hướng dẫn để giúp bạn tiết kiệm công sức từ việc giải quyết các vấn đề đã được giải quyết, họ không quy định nghiêm ngặt
  2. Trong khi trang web bạn liên kết đến (raywenderlich.com) là một khởi đầu tốt cho hướng dẫn, để có cái nhìn chi tiết hơn về các mẫu thiết kế nhanh chóng, tôi đề xuất Design Patterns In Swift
  3. Nếu HttpClient và PersistencyManager là các lớp cơ sở cung cấp giao diện hơn một giao thức thì không cần thiết. Tôi đồng ý rằng các giao thức là cách tổng quát hơn để truy cập vào đây
  4. Nếu bạn sử dụng giao thức, tôi sẽ chỉ định trình quản lý khách hàng và quản lý lưu giữ lâu dài trong trình khởi tạo vì chúng là cần thiết
  5. Mô hình bền vững có vai trò đủ cụ thể được xử lý bởi một lớp duy nhất, hãy xem realm.io để biết ví dụ: db
+1

Cảm ơn bạn đã liên kết. Rất rất rất hữu ích! – barbarity

7

Vì dòng đầu tiên của câu hỏi khẳng định rằng bạn muốn "tự phát triển một ứng dụng thực" nên tôi chỉ muốn chỉ cho bạn đi đúng hướng.

Thực tế là không có cách "tốt nhất" cấu trúc mã của bạn.Có nhiều cách mà bạn có thể viết mã để hoàn thành nhiệm vụ tương tự. Và trừ khi bạn đang làm việc trong một nhóm và xây dựng một ứng dụng rất phức tạp, nó không thực sự quan trọng theo cách tiếp cận bạn làm theo.

Khi bạn nói rằng bạn đã học nhanh, tôi khuyên bạn nên tập trung vào việc học các tính năng nâng cao nhanh chóng như đóng cửa và giao thức. Một khi bạn đã quen thuộc với những điều này thì bạn sẽ cần phải làm quen với iOS SDK có tải các khung công tác dựng sẵn mà bạn sẽ cần phải sử dụng trong ứng dụng của mình.

Cuối cùng, chỉ cần bắt đầu với ứng dụng của bạn càng sớm càng tốt. Bạn có thể không viết được mã được cấu trúc rõ ràng và được cấu trúc tốt trong ứng dụng đầu tiên của mình nhưng nó là thứ mà bạn sẽ học theo thời gian bằng cách sửa lỗi và sửa chúng sau này. Chỉ để khuyến khích bạn, tôi muốn nói với bạn rằng việc tạo ra một ứng dụng đơn giản không phải là rất khó khăn, tôi đã học mục tiêu c và tạo ra trò chơi đầu tiên của tôi trong 20 ngày và bạn cũng có thể làm điều đó. Nếu bạn cần bất kỳ hướng dẫn/tài nguyên nào, chỉ cần để lại nhận xét, tôi sẽ cập nhật câu trả lời.

Tập trung xây dựng ứng dụng. Cải thiện sau này khi bạn đã xây dựng nó.

+0

Một trong những lỗi liên tục của tôi. Luôn luôn muốn làm điều đó một cách hoàn hảo ngay từ đầu. Nhưng tôi sẽ làm theo lời khuyên của bạn. Cảm ơn bạn! – barbarity

+1

Nếu bạn muốn bắt đầu ứng dụng của riêng mình cho đến khi bạn nắm vững thiết kế và mẫu mã hóa tốt nhất, v.v ... bạn sẽ không bao giờ khởi động ứng dụng của mình. Đó là vấn đề của tôi bằng cách này. Tôi đã suy nghĩ về mọi chi tiết của ứng dụng, trong khi ứng dụng không tồn tại chút nào. Chỉ cần bắt đầu và học hỏi từ những sai lầm của bạn. Tôi có thể nói với con trai của tôi để xem ra cho tất cả những điều nguy hiểm trong cuộc sống, nhưng anh ta sẽ thực sự tìm hiểu nó nếu anh ta rơi, gây ra hơn là anh ta có thể học cách đứng lên. Chỉ cần làm điều đó, chúng tôi sẽ giải quyết vấn đề sau :) – AndaluZ

Các vấn đề liên quan