number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz }
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz }
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz } パターンが増える
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz } パターンが増える → 実装が増える
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz } パターンが増える → 実装が増える → またパターンが増える
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz } パターンが増える → 実装が増える → またパターンが増える → 実装が肥大化していく
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz } パターンが増える → 実装が増える → またパターンが増える → 実装が肥大化していく → 内容の把握が大変になる
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz } パターンが増える → 実装が増える → またパターンが増える → 実装が肥大化していく → 内容の把握が大変になる → 変更が辛くなる
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D return hoge && fuga } function isXxx( A: boolean, B: boolean, C: number, D: number ): boolean { const spec = new HogeSpecification() .and(new FugaSpecification()) return spec.isSatisfiedBy({ A, B, C, D }) } // Before // After
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D return hoge && fuga } function isXxx( A: boolean, B: boolean, C: number, D: number ): boolean { const spec = new HogeSpecification() .and(new FugaSpecification()) return spec.isSatisfiedBy({ A, B, C, D }) } // Before // After
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D return hoge && fuga } function isXxx( A: boolean, B: boolean, C: number, D: number ): boolean { const spec = new HogeSpecification() .and(new FugaSpecification()) return spec.isSatisfiedBy({ A, B, C, D }) } // Before // After 条件オブジェクトは互いに独立している
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D return hoge && fuga } function isXxx( A: boolean, B: boolean, C: number, D: number ): boolean { const spec = new HogeSpecification() .and(new FugaSpecification()) return spec.isSatisfiedBy({ A, B, C, D }) } // Before // After 条件オブジェクトは互いに独立している 条件オブジェクト毎に個別にテストできる const spec = new HogeSpecification() expect(spec.isSatisfiedBy(param)).toBe(true)
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D return hoge && fuga } function isXxx( A: boolean, B: boolean, C: number, D: number ): boolean { const spec = new HogeSpecification() .and(new FugaSpecification()) return spec.isSatisfiedBy({ A, B, C, D }) } // Before // After 条件オブジェクトは互いに独立している 条件オブジェクト毎に個別にテストできる 一つのテストで考えることが減るので、 テストが簡単になる
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz } function isXxx( A: boolean, B: boolean, C: number, D: number ): boolean { const spec = new HogeSpecification() .and(new FugaSpecification()) .or(new PiyoSpecification()) .or(new FizzSpecification()) return spec.isSatisfiedBy({ A, B, C, D }) } // Before // After
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz } function isXxx( A: boolean, B: boolean, C: number, D: number ): boolean { const spec = new HogeSpecification() .and(new FugaSpecification()) .or(new PiyoSpecification()) .or(new FizzSpecification()) return spec.isSatisfiedBy({ A, B, C, D }) } // Before // After
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz } function isXxx( A: boolean, B: boolean, C: number, D: number ): boolean { const spec = new HogeSpecification() .and(new FugaSpecification()) .or(new PiyoSpecification()) .or(new FizzSpecification()) return spec.isSatisfiedBy({ A, B, C, D }) } // Before // After 実装の追加はオブジェクトの組み立てのみ 具体的な条件はオブジェクト内部に隠蔽
number ): boolean { const hoge = A && !B && C > 0 const fuga = (A || B) || C < D const piyo = B && C > 0 && D < 0 const fizz = (A && C > 0) || (!B && D >= C) return hoge && fuga || piyo || fizz } function isXxx( A: boolean, B: boolean, C: number, D: number ): boolean { const spec = new HogeSpecification() .and(new FugaSpecification()) .or(new PiyoSpecification()) .or(new FizzSpecification()) return spec.isSatisfiedBy({ A, B, C, D }) } // Before // After 実装の追加はオブジェクトの組み立てのみ 具体的な条件はオブジェクト内部に隠蔽 • 追加が最低限なので、肥大化しにくい • 簡単に変更できる