2016年03月31日
北村 拓也(@chipstar_light)
Swiftにおけるclassとstructの使い分けを
DDD(ドメイン駆動設計)から考える
関西モバイルアプリ研究会 #12
Copyright ©2016, NC Design & Consulting Co., Ltd. All rights reserved.
自己紹介
北村 拓也
 @chipstar_light
 NCデザイン&コンサルティング株式会社
• 東京4名、関西3名の全員が在宅勤務
• 滋賀でリモートワークやってます!
• 企業向けアプリ開発・UXデザイン
 コミュニティ活動
• 京都でドメイン駆動設計やエッセンシャルスク
ラムの読書会などを開催してました
• 京都アジャイル勉強会(#京アジャ)のお手伝
いしてます
2
Copyright ©2016, NC Design & Consulting Co., Ltd. All rights reserved. 3
Swiftではclassとstructって
どう使い分けるのがいいの?
何かstructがいいみたいな話も聞くけど…
Copyright ©2016, NC Design & Consulting Co., Ltd. All rights reserved.
Swiftのclass
 参照型(reference type)
 可変(mutable)
 1箇所での変更を、全ての同一参照オブジェクトに反映
させる事ができる
 状態が変化しても同じものだと認識したいものには便
利
4
Copyright ©2016, NC Design & Consulting Co., Ltd. All rights reserved.
Swiftのstruct
 値型(value type)
 不変(immutable)
 一度生成すると値は基本的に変えられない
 値を変更する場合は、コピーして別のオブジェクトを
作る
 参照を共有しても値を勝手に変えらる心配が無いため
副作用の心配が減る
5
Copyright ©2016, NC Design & Consulting Co., Ltd. All rights reserved.
ドメイン駆動設計(DDD)とは
 話すと長くなるので割愛
 参考程度にこちらを見てください。
• ドメイン駆動設計入門
http://www.slideshare.net/TakuyaKitamura1/ddd-29003356
 または懇親会で聞いてください。
6
Copyright ©2016, NC Design & Consulting Co., Ltd. All rights reserved.
DDDにおけるモデルを表現する要素
 Entity
 Value Object
 Service
7
今日の話題から
は外す
Copyright ©2016, NC Design & Consulting Co., Ltd. All rights reserved.
Entity
 抽象的な連続性と同一性
• 固有のIDを持ち、実装をまたいだとしても追跡されるような連続性を持
つオブジェクト
• 分散環境下でも、永続化前後でも追跡できないといけない
 属性(状態)に左右されない同一性
• 連続性を保証するIDは、オブジェクトの属性値に左右されない
• 属性値が全て同じでもIDが異なれば別もの
属性値が異なっていてもIDが同じであれば同じもの
• 同一性の判断とライフサイクルは、モデル毎に個別に設計する
 具体例
• 顧客、口座、注文、在庫、etc...
8
Copyright ©2016, NC Design & Consulting Co., Ltd. All rights reserved.
Value Object
 連続性と同一性が不要なオブジェクト
• 属性がどんな値であるかに焦点が置かれるもの
• 一過性のことも多く、操作のために生成されては破棄される
• 状態を変更できないもの(immutable)として扱う
 他の何かの状態を記述する属性となる
• 「何」であるかだけが問題となり、「誰」であるか、あるいは「どれ」
であるかは問われないような設計の要素
• エンティティの属性としても使用される
 具体例
• 色、量、地域、経路、etc...
9
Copyright ©2016, NC Design & Consulting Co., Ltd. All rights reserved. 10
Entityはclass
Value Objectはstruct
で実装するのが自然じゃない?
Copyright ©2016, NC Design & Consulting Co., Ltd. All rights reserved. 11
実装の段階でclassかstructか
を判断するのではなく、
設計(モデリング)の段階で意
図して識別できるのでは?
Copyright ©2016, NC Design & Consulting Co., Ltd. All rights reserved.
まとめ
 OOP vs FP、class vs struct といろいろあるけど…
 コンテキストを絞って目的に応じた使い分けが良さそう
 特にDDDというコンテキストではうまく使い分けられそう
 Swiftだからではなく、設計時に意識するのが良さそう
 DDDをちょっとだけ入門してみたい人は
• ドメイン駆動設計入門
http://www.slideshare.net/TakuyaKitamura1/ddd-29003356
12
リモートで働きたい
デザイナとエンジニアを
募集しています。
http://ncdc.co.jp/recruit/

Swiftにおけるclassとstructの使い分けをDDDから考える

  • 1.
  • 2.
    Copyright ©2016, NCDesign & Consulting Co., Ltd. All rights reserved. 自己紹介 北村 拓也  @chipstar_light  NCデザイン&コンサルティング株式会社 • 東京4名、関西3名の全員が在宅勤務 • 滋賀でリモートワークやってます! • 企業向けアプリ開発・UXデザイン  コミュニティ活動 • 京都でドメイン駆動設計やエッセンシャルスク ラムの読書会などを開催してました • 京都アジャイル勉強会(#京アジャ)のお手伝 いしてます 2
  • 3.
    Copyright ©2016, NCDesign & Consulting Co., Ltd. All rights reserved. 3 Swiftではclassとstructって どう使い分けるのがいいの? 何かstructがいいみたいな話も聞くけど…
  • 4.
    Copyright ©2016, NCDesign & Consulting Co., Ltd. All rights reserved. Swiftのclass  参照型(reference type)  可変(mutable)  1箇所での変更を、全ての同一参照オブジェクトに反映 させる事ができる  状態が変化しても同じものだと認識したいものには便 利 4
  • 5.
    Copyright ©2016, NCDesign & Consulting Co., Ltd. All rights reserved. Swiftのstruct  値型(value type)  不変(immutable)  一度生成すると値は基本的に変えられない  値を変更する場合は、コピーして別のオブジェクトを 作る  参照を共有しても値を勝手に変えらる心配が無いため 副作用の心配が減る 5
  • 6.
    Copyright ©2016, NCDesign & Consulting Co., Ltd. All rights reserved. ドメイン駆動設計(DDD)とは  話すと長くなるので割愛  参考程度にこちらを見てください。 • ドメイン駆動設計入門 http://www.slideshare.net/TakuyaKitamura1/ddd-29003356  または懇親会で聞いてください。 6
  • 7.
    Copyright ©2016, NCDesign & Consulting Co., Ltd. All rights reserved. DDDにおけるモデルを表現する要素  Entity  Value Object  Service 7 今日の話題から は外す
  • 8.
    Copyright ©2016, NCDesign & Consulting Co., Ltd. All rights reserved. Entity  抽象的な連続性と同一性 • 固有のIDを持ち、実装をまたいだとしても追跡されるような連続性を持 つオブジェクト • 分散環境下でも、永続化前後でも追跡できないといけない  属性(状態)に左右されない同一性 • 連続性を保証するIDは、オブジェクトの属性値に左右されない • 属性値が全て同じでもIDが異なれば別もの 属性値が異なっていてもIDが同じであれば同じもの • 同一性の判断とライフサイクルは、モデル毎に個別に設計する  具体例 • 顧客、口座、注文、在庫、etc... 8
  • 9.
    Copyright ©2016, NCDesign & Consulting Co., Ltd. All rights reserved. Value Object  連続性と同一性が不要なオブジェクト • 属性がどんな値であるかに焦点が置かれるもの • 一過性のことも多く、操作のために生成されては破棄される • 状態を変更できないもの(immutable)として扱う  他の何かの状態を記述する属性となる • 「何」であるかだけが問題となり、「誰」であるか、あるいは「どれ」 であるかは問われないような設計の要素 • エンティティの属性としても使用される  具体例 • 色、量、地域、経路、etc... 9
  • 10.
    Copyright ©2016, NCDesign & Consulting Co., Ltd. All rights reserved. 10 Entityはclass Value Objectはstruct で実装するのが自然じゃない?
  • 11.
    Copyright ©2016, NCDesign & Consulting Co., Ltd. All rights reserved. 11 実装の段階でclassかstructか を判断するのではなく、 設計(モデリング)の段階で意 図して識別できるのでは?
  • 12.
    Copyright ©2016, NCDesign & Consulting Co., Ltd. All rights reserved. まとめ  OOP vs FP、class vs struct といろいろあるけど…  コンテキストを絞って目的に応じた使い分けが良さそう  特にDDDというコンテキストではうまく使い分けられそう  Swiftだからではなく、設計時に意識するのが良さそう  DDDをちょっとだけ入門してみたい人は • ドメイン駆動設計入門 http://www.slideshare.net/TakuyaKitamura1/ddd-29003356 12
  • 13.