Upgrade to Pro — share decks privately, control downloads, hide ads and more …

値オブジェクトでアプリケーションコードを改変しよう

 値オブジェクトでアプリケーションコードを改変しよう

車内のミートアップの発表資料

tkitsunai

May 21, 2020
Tweet

More Decks by tkitsunai

Other Decks in Technology

Transcript

  1. 値が同じであれば同一であることを保証する type PersonName struct { value string } func NewPersonName(value

    string) PersonName { return PersonName{ value: value, } } name1 := NewPersonName("tkitsunai") name2 := NewPersonName("tkitsunai") if name1 == name2 { // true } ポイント:同一インスタンスかではなく値が同じであるか
  2. 値の範囲を限定し、許容値をコントロールする type SecurityCode struct { value int } func NewSecurityCode(value

    int) (SecurityCode, error) { if value < 1300 || value > 9999 { return SecurityCode{}, errors.New("証券コードの値範囲外です ") } return SecurityCode{ value:value, }, nil } 例:東京証券取引所が扱う「証券コード」 ・1300番台〜9000番台から構成される
  3. 不変化により、インスタンス化後のバグ混入を防ぐ type SecurityCode struct { value int } func NewSecurityCode(value

    int) (SecurityCode, error) { if value < 1300 || value > 9999 { return SecurityCode{}, errors.New("証券コードの値範囲外です ") } return SecurityCode{ value:value, }, nil } uzabase := NewSecurityCode("3396") // このようなことはできないようにする uzabase.value = 3397 ファクトリー関数やコンストラクタで不変化する
  4. 値オブジェクト警察をしてみよう type Company struct { name string address1 string address2

    string listedFlag bool securityCode int phoneNumber string } こんなコードを見かけると、うずうずしてきませんか?
  5. 値オブジェクト警察への道 フェーズ1: プリミティブな値を探そう type Company struct { name string address1

    string address2 string listedFlag bool securityCode int phoneNumber string } type Company struct { name Name address1 Address address2 Address listedFlag ListedStatus securityCode SecurityCode phoneNumber PhoneNumber }
  6. 値オブジェクト警察への道 フェーズ2: 名前が適切かを考えてみよう type Company struct { name Name address1

    Address address2 Address listedFlag ListedStatus securityCode SecurityCode phoneNumber PhoneNumber } // 上場企業 type ListedCompany struct { } // 非上場企業 type UnlistedCompany struct { } // 企業の名前 type CompanyName struct { } // 人の名前 type PersonName struct { }
  7. まとめ ・値オブジェクトを知る - 「特徴・特性」を満たしてはじめて値オブジェクトと言える ・値オブジェクトが生み出す価値 - 表現力(説明力を含む)をあげる - 矛盾なきコードをつくる -

    許容値のコントロールをする ・値オブジェクト警察 - プリミティブな値を使わない - 適切な名前か(値オブジェクトの条件「説明」ができるか) - これは値オブジェクトか否かを見極める