[iOSDC Japan 2019 リポート]「Swiftクリーンコードアドベンチャー ~日々の苦悩を乗り越え、確かな選択をするために~ 」というセッションを聞いてきました

iOSDC の 1 日目の[「Swift クリーンコードアドベンチャー ~日々の苦悩を乗り越え、確かな選択をするために~ 」というセッションのレポートです。
2019.09.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

iOSDC の 1 日目にshiz(しず)(@stzn3)さんによる「Swift クリーンコードアドベンチャー ~日々の苦悩を乗り越え、確かな選択をするために~ 」というセッションを聞きました。

今回は 私が日々苦悩する中で出会ってきたコードを題材に

どのような状況で、どのような書き方がされ、なぜそう書かれたのか

を見ていき

「クリーンコード」とはどういうものなのか? なぜ「クリーンコード」は必要なのか? 「クリーンコード」を書くためにはどうすればよいのか?

などについて みなさまと一緒に コードの世界を探検する中で発見していきたいと思います。

Swiftクリーンコードアドベンチャー ~日々の苦悩を乗り越え、確かな選択をするために~ by shiz | トーク | iOSDC Japan 2019 #iosdc - fortee.jpより引用

印象に残ったところ & 感想

Swift には protocol や generics といった、コードをよりジェネリックにするための言語機能が提供されています。このセッションでは"クリーンコード"を実現するための道筋をご自身の経験を踏まえて、実際のコードをリファクタリングしていきながら紹介するという内容でした。

私も一人で開発することが多いので、protocol や generics などの言語機能を使ってよりジェネリックな実装にできることを覚えた時は、具体的な問題の解決より覚えたてのパターンに当てはめることを優先して実装を歪めてしまった経験がありました。

また、protocol-oriented-programming を念頭に置いて開発をしていると protocol を優先するあまり protocol に比べて generics を使わずに実装しようとしてしまう自覚もありました。このセッションでは具体的なコードをリファクタリングしながら protocol と generics のどちらを選択してどのような実装にするのか例示されていたので、実際の実装のときの判断のものさしを見直すことができました。

最初からジェネリックな抽象的な実装を目指したり、使えるパターンに当てはめられないか考えるのではなく、具体的な問題の解決を優先するべき、そしてその後実装を俯瞰してジェネリックな実装を実現できないか考えて、適切な言語機能を選択しながらリファクタリングしていこう、という理解をしました。

メモ

クリーンコードとは

Uncle Bob 曰く読みやすいコード

  • 書く時間より読む時間の方が圧倒的に多いので読みやすいコードを書くことは大事
  • 正しい一つの答えはない

ここでのクリーンコード

  • わかりやすい
  • 安全である
  • 変更に強い

クリーンコードを書くには?

  • ジェネリックな実装
    • Generics
    • 重複をまとめるためにつかう
    • protocol
    • protocol を活用することでより型安全に、ジェネリクスでは実現できない機能を実現できる

POP(Protocol Oritented Programming)

  • 必要なときに使う
  • 値型を使おう
  • ポリモーフィズムが必要になったら protocol を使う
  • 目の前の個々の具体的な問題を解決してそこからジェネリックな解決策を抽出する。(最初からジェネリックな書き方をするべきではない)
    • 本来の問題から離れてしまう可能性

スライド内のサンプルコードについて

  • 具体的なコードで重複を探す
  • Decodable に準拠していれば同じコードを利用するようにする
  • 抽象的なコードを実現するために protocol を使って共通化図っていく
  • extension を用いる理由
    • Retroactive Modeling
    • 元のソースにアクセスことができない型でも機能を拡張することができる能力
  • URLSession のシングルトンを使っているが、protocol を使って Mock を作成する方法でテスタブルにできる。
  • Mock に使うだけで十分なのか?(Mock はオブジェクトの模倣に過ぎない))
  • protocol を適切に使って Mock を差し替えるのと同時に Mock 以上の昨日を手に入れる
  • PAT (Protoocol With AssociatedType)
  • PAT を使う場合この protocol は配列として使うか?という問いを行う
  • 可能な限りジェネリックにする必要はあるか今一度考えてみる
  • パターンをいくつか覚えているとパターンの型にはめようとしてしまう
  • 目の前の問題に向き合うことが必要

クリーンコードを書き続けるには

  • ボーイスカウトの規則(コードを継続的に改善していくプロ意識)
  • 価値体系(思考・行動する際のある特定の領域における価値観・判断基準)が一番重要(Clean code で最も言いたかったこと)
  • 経験を積重ねながら価値体系を構築していくこと

また、発表の補足をされている記事を公開されていますので参照されてください。

最後に

発表をしていただいたshiz(しず)(@stzn3)さん、本当にありがとうございました。