Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

仕様をコードに落としこむ際気をつけたいこと

2,903 views

Published on

市ヶ谷Geek Night

Published in: Software
  • Be the first to comment

仕様をコードに落としこむ際気をつけたいこと

  1. 1. copyright Fringe81 Co.,Ltd. 仕様をコードに落としこむ際 気をつけたいこと 市ヶ谷Geek★Night 2016/04/26 @mtoyoshi
  2. 2. copyright Fringe81 Co.,Ltd. 自己紹介 @mtoyoshi Fringe81で働くScalaエンジニア 気づけばScala歴2.5年ほどに 宣伝: シンクル(iOS/Android)リリース “この好きがやっと分かってもらえた”
  3. 3. copyright Fringe81 Co.,Ltd. 四月、 新しくScalaを始めた人も 多いかもしれない
  4. 4. copyright Fringe81 Co.,Ltd. 例えば DDD
  5. 5. copyright Fringe81 Co.,Ltd. ドメインの理解 モデルの抽出 コードで表現
  6. 6. copyright Fringe81 Co.,Ltd. val result: Boolean = executer.run(args) こんなコードがあったとする
  7. 7. copyright Fringe81 Co.,Ltd. val result: Boolean = executer.run(args) 人によっては 将来の拡張性を考えて(?) こんな風に設計するかもしれない val result: Result = executer.run(args) case class Result(isValid: Boolean)
  8. 8. copyright Fringe81 Co.,Ltd. “isValidがfalseの時は argsのうち原因となったArgも返すこと” となったとする val result: Result = executer.run(args) case class Result(isValid: Boolean) 仕様追加
  9. 9. copyright Fringe81 Co.,Ltd. “isValidがfalseの時は argsのうち原因となったArgも返すこと” isValidが trueならArgはなし falseならArgはある
  10. 10. copyright Fringe81 Co.,Ltd. “isValidがfalseの時は argsのうち原因となったArgも返すこと” isValidが trueならArgはなし falseならArgはある Option型!
  11. 11. copyright Fringe81 Co.,Ltd. “isValidがfalseの時は argsのうち原因となったArgも返すこと” isValidが trueならArgはなし falseならArgはある case class Result(isValid: Boolean, arg: Option[Arg])
  12. 12. copyright Fringe81 Co.,Ltd. ちょっとまって case class Result(isValid: Boolean, arg: Option[Arg])
  13. 13. copyright Fringe81 Co.,Ltd. Resultは以下の 4通りの組み合わせを取りうる true x Some true x None false x Some false x None case class Result(isValid: Boolean, arg: Option[Arg])
  14. 14. copyright Fringe81 Co.,Ltd. Resultは以下の 4通りの組み合わせを取りうる true x Some true x None false x Some false x None case class Result(isValid: Boolean, arg: Option[Arg]) この組み合わせは仕様と異なる
  15. 15. copyright Fringe81 Co.,Ltd. 仕様と異なる組み合わせが作れないよう validationする? 組み合わせ違反は実行時例外? ユニットテストで確認? case class Result(isValid: Boolean, arg: Option[Arg])
  16. 16. copyright Fringe81 Co.,Ltd. No! 原因は 仕様と型のズレ case class Result(isValid: Boolean, arg: Option[Arg])
  17. 17. copyright Fringe81 Co.,Ltd. isValidが falseならArgはある trueならArgはなし
  18. 18. copyright Fringe81 Co.,Ltd. isValidが falseならArgはある trueならArgはなし sealed trait Result case class Valid() extends Result case class Invalid(arg: Arg) extends Result
  19. 19. copyright Fringe81 Co.,Ltd. まとめ ■型は仕様を表現できているのか? ■実行時検査による例外送出ではなく コンパイルエラーで防げないか? ■UT書かない方向にもっていけないか? 型で仕様を表現 = コードがドキュメント
  20. 20. copyright Fringe81 Co.,Ltd. コンパイルおっせーなー コンパイラかわいいよコンパイラ
  21. 21. copyright Fringe81 Co.,Ltd. おわり

×