Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

単体テストを書かない技術 #phpcon_odawara

単体テストを書かない技術 #phpcon_odawara

PHPカンファレンス小田原2024での発表資料です
https://fortee.jp/phpconodawara-2024/proposal/4d39c7ef-058c-4648-b1d7-5510497e0d81

hideki kinjyo

April 13, 2024
Tweet

Resources

参考資料: 制約の力 - 状態を限定する -

https://speakerdeck.com/shin1x1/restricting-states

PHP カンファレンス福岡 2023でのshin1x1さんによる発表資料です

参考資料: 予防に勝る防御なし - 堅牢なコードを導く様々な設計のヒント

https://speakerdeck.com/twada/growing-reliable-code-phperkaigi-2022

PHPerKaigi 2022でのTakuto Wadaさんによる発表資料です

More Decks by hideki kinjyo

Other Decks in Programming

Transcript

  1. 自己紹介 • 金城秀樹 / きんじょうひでき • GitHub:@o0h / Twitter:@o0h_ •

    好きなFWはCakePHP • アイコンは 美味しい鮭親子丼の写真です
  2. 日常会話で例えるなら 曖昧なプリンの例 • 「冷蔵庫にプリンあるよ〜」 • 「えっ!食べていいの?」 // 権限チェック • 「そのプリンは賞味期限まだ過ぎてない?」

    // バリデーション • 「夕食の直前にも食べて良いプリン?」 // バリデーション • 「最近、カロリー気にしてるんだけど食事制限内?」 // バリデーション • いただきま〜す!
  3. • $uuidがstringである • $uuidが16進数表記とハ イフンしか含まないこと • $uuidが規定された文字 数の規定されたグループ からなること •

    $uuidが大文字でも小文 字でも同じとみなせるこ と • 渡された時点で有効な データであることが保 証されている
  4. コード自体の「セルフ制約」を高めるデザイン • 足し算の発想 • 関連する要素を集めて、1つの「概念」に固める • ゼロカロリーで、食べてもお腹に溜まらない、新鮮なプリン => アンチ・ギルティ・プリン(と呼べるかもしれない) •

    引き算の発想 • 既に実在し、形を持っている(ように見える)ものに引っ張られすぎず、 本質を削り出す • 「いつも親切で差し入れとかをくれる田中先輩」が好きなのではなく、 「お菓子をくれる人」ロールを必要としているだけかもしれない
  5. コード自体の「セルフ制約」を高めるデザイン • 足し算の発想 => 豊富な表現力を持つ型 • 値オブジェクト • DTO •

    引き算の発想 => 本質的な(=無駄を削ぎ落とした)型 • 具象クラスよりInterface • 「コードの流れ的に、実際に渡ってくるデータ」より「用のある振る舞い」 • ex) `UserEntityCollection` ではなく `Countable` なだけかもしれない
  6. 本質の追求を怠らない • 「埋もれている概念」の探求 • 会話の中で「意味を確認」した内容を「仕様」として • 「仕様」の集合に名前をつけて「概念」に持っていく • 静的なバリデーションは「型」化を検討 •

    バリデーションしている内容 ≒ 仕様 • 「AでありBでありCであるX」は、「Y」という概念が埋もれていないか? • 動的なチェック(=「DB内に重複がある」などの状態)は、概念化が難しそう