Open3

Swiftでオブジェクト指向エクササイズ

kamimikamimi

オブジェクト指向エクササイズとは

  • ThoughtWorksのエッセイ集である「ThoughtWorksアンソロジー」という本で紹介された
  • 9つのルールがあり、座談会登壇者の方によると全てのルールを現場で守ることは現実的ではなが、オブジェクト指向のトレーニングにはとても良いとのこと
  • 参考
kamimikamimi

1. 1メソッドにつき1インデントまで

  • タイトルの通り
kamimikamimi

2. プリミティブ型と文字列はラップする

プリミティブ型とは

そのプログラミング言語に最初から用意されている変数の型のうち、基本的な型っぽいやつ

  • Swiftでいうと、以下がよく使われる(他にもある)
    • String

      let stringSample = "テスト"
      
    • Int

      let intSample = 10
      
    • Float

      let floatSample = 4.98
      
    • Bool

      let boolSample = true
      

Swiftでのバリューオブジェクト

Improving your Swift code using value objects

Equatableプロトコルを使用することで、バリューオブジェクトの等価性の比較を行うことができる

Swift の Equatable プロトコルを基礎から - Qiita

struct UserName: Equatable {
    let value: String
    
    // 失敗イニシャライザ
    init?(string: String) {
        // 0文字以上でなければ、インスタンス化できないようにする
        guard string.count > 0 else {
            return nil
        }
        
        self.value = string
    }
}

structclassの違い

  • 大きな特徴

    structは継承のできないclass

    • 公式によるとデフォルトで使用するのは、structであるべき

    Structures and Classes - The Swift Programming Language (Swift 5.5)

    Swiftの構造とクラスには多くの共通点があります
    クラスには、構造にはない追加の機能があります。

    クラスがサポートする追加機能には、複雑さが増すという犠牲が伴います。一般的なガイドラインとして、構造は推論が容易であるため優先し、適切または必要な場合はクラスを使用します。実際には、これは、定義するカスタムデータ型のほとんどが構造と列挙であることを意味します。

    Apple Developer Documentation

    デフォルトで構造を使用します。
    Objective-Cの相互運用性が必要な場合は、クラスを使用してください。
    モデリングするデータのIDを制御する必要がある場合は、クラスを使用します。
    構造とプロトコルを使用して、実装を共有することで動作を採用します。

structで値の変更をしたい場合

  • structは値型であり、基本的に一度初期化(インスタンス化)されたら、値の変更はできない

  • mutatingを使用して値の変更する

    • ただし、バリューオブジェクトは不変であることが特徴なため、これは使わないようにすべき

    Mutating methods