[iOS] DesignPattern - MVC Pattern


Design Pattern - MVC


Design Patternとは?


  • 設計時によく使用されるテンプレート

  • 先輩たちのタックル記録

  • コード外観
  • Design Patterns(1994) by Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides
    設計モデルには以下の利点があるため、開発者の先輩たちは設計モデルを使用し始めた.
  • 各種問題状況に対する予防
  • プログラマー間のコラボレーション効率の向上
  • プログラマー間のコミュニケーションを増進する
  • 安定化および最適化
  • コード
  • コードの再利用性を向上させる
  • 단, 적절히 잘 사용하자設計パターンを手段として、目的地があれば主客転倒する場合があります.
    *指定されたパターンについては、状況に応じて変更する必要がありますが、パターンの設計にこだわると、パターンを柔軟に適用したり変更したりすることはできません.そのため、100%守る必要はありませんが、明確に知れば、やるべきことはたくさんあります.

    Design Patterns vs Architectures


  • アーキテクチャ:大図、ソフトウェア全図
    ex)洋風建築、MVC建築

  • Design Pattern:このアーキテクチャの詳細なソリューション
    ex)現在の状況に適応するために、西洋の建物内の不便な設計部分を修正する.
  • MVCとは?



    Model(M)


    モデルはアプリケーションのデータを担当します.データの論理を担当し、さらにデータの値の変更と管理を担当します.

  • Network Code:モデルには、ネットワーク要求、httpヘッダ、応答、エラーを処理するためのコードが含まれる場合があります.
    Ex:
    class Network {
      static func loadJSONFile<T: Decodable>(named filename: String,
                                             type: T.Type,
                                             queue: DispatchQueue? = DispatchQueue.main,
                                             simulateLoadDelay: Bool? = true,
                                             delaySeconds: TimeInterval = 0.2,
                                             completionHandler: @escaping (T?, NetworkError?) -> Void) {
        
        // urlSession
        // request
        // jsonData parsing, date formatter
        
      
    }

  • Persistence code:データベース、コアデータ、またはデバイスデータを格納するコード
    Ex:
    class Event {
      //
      // MARK: - Variables And Properties
      //
      var attendees: [Attendee] = []
      var sessions: [Session] = []
      
      //
      // MARK: - Instance Methods
      //
      func attendees(for session: Session) -> [Attendee] {
        return attendees.filter { (attendee) -> Bool in
          session.attendeesBadges.contains(attendee.badgeNumber)
        }
      }
      
      func sessions(for attendee: Attendee) -> [Session] {
        return sessions.filter { (session) -> Bool in
          session.attendeesBadges.contains(attendee.badgeNumber)
        }
      }
    }

  • Parsing code:ネットワークから受信したjsonデータをiOSで使用できるデータに変換するコードも必要です.
    Ex:
    class Attendee: CustomStringConvertible, Decodable {
      //
      // MARK: - Variables And Properties
      //
      var age: UInt8
      var badgeNumber: UInt8
      var isFirstTimeAttending: Bool
      var name: String
      var nationality: String
      
      var description: String {
        return """
        Name: \(name)
        Nationality: \(nationality)
        Age: \(age)
        Badge Number: \(badgeNumber)
        Attending For The First Time: \(isFirstTimeAttending ? "Yes" : "No")
        """
      }
      
      //
      // MARK: - Initialization
      //
      init(age: UInt8, badgeNumber: UInt8, isFirstTimeAttending: Bool, name: String, nationality: String) {
        self.age = age
        self.badgeNumber = badgeNumber
        self.isFirstTimeAttending = isFirstTimeAttending
        self.name = name
        self.nationality = nationality
      }
    }

  • Managers and abstraction layer/class:
  • View


    ユーザに表示する画面(UI)を担当する.

    Controller


    モデルとビューの接続を担当します.
    [注意]:
    Model-View-Controller(MVC) in iOS - A Modern Approach
    Model-View-Controller | Concepts in Objective-C Programming