Open3
Swiftでオブジェクト指向エクササイズ
オブジェクト指向エクササイズとは
- ThoughtWorksのエッセイ集である「ThoughtWorksアンソロジー」という本で紹介された
- 9つのルールがあり、座談会登壇者の方によると全てのルールを現場で守ることは現実的ではなが、オブジェクト指向のトレーニングにはとても良いとのこと
- 参考
- オブジェクト指向エクササイズをやってみる(Qiita)
1. 1メソッドにつき1インデントまで
- タイトルの通り
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
}
}
struct
とclass
の違い
-
大きな特徴
structは継承のできないclass
- 公式によるとデフォルトで使用するのは、
struct
であるべき
Structures and Classes - The Swift Programming Language (Swift 5.5)
Swiftの構造とクラスには多くの共通点があります
クラスには、構造にはない追加の機能があります。クラスがサポートする追加機能には、複雑さが増すという犠牲が伴います。一般的なガイドラインとして、構造は推論が容易であるため優先し、適切または必要な場合はクラスを使用します。実際には、これは、定義するカスタムデータ型のほとんどが構造と列挙であることを意味します。
・デフォルトで構造を使用します。
・Objective-Cの相互運用性が必要な場合は、クラスを使用してください。
・モデリングするデータのIDを制御する必要がある場合は、クラスを使用します。
・構造とプロトコルを使用して、実装を共有することで動作を採用します。 - 公式によるとデフォルトで使用するのは、
struct
で値の変更をしたい場合
-
structは値型であり、基本的に一度初期化(インスタンス化)されたら、値の変更はできない
-
mutating
を使用して値の変更する- ただし、バリューオブジェクトは不変であることが特徴なため、これは使わないようにすべき