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

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

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

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

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

Avatar for tkitsunai

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. まとめ ・値オブジェクトを知る - 「特徴・特性」を満たしてはじめて値オブジェクトと言える ・値オブジェクトが生み出す価値 - 表現力(説明力を含む)をあげる - 矛盾なきコードをつくる -

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