まさこは技術メモ

Unityエンジニアのつぶやき

クリーンアーキテクチャ 3章~6章

第3章 パラダイムの概要

3つのプログラミングパラダイム

  • 構造化プログラミング
    • 直接的な制御に規律を加える
  • オブジェクト指向プログラミング
    • 間接的な制御に規律を加える
      • ただしオブジェクト指向はカオスを生み出す要因にもなっている感も否めない
      • 継承の継承の継承とかされるともはや意味不明
        • 継承の多重構造にならないように、C# であれば sealed を使って継承を防ぐ役目もになっていかないと
      • ただし、設計やコードレビューによってカオスを抑制することもできる
        • 運用でカバーはまぁ・・・良くはないけど
  • 関数型プログラミング

私は Unity エンジニアである以上、C#(オブジェクト指向プログラミング) から離れることのできない体になっている。

これら3つのパラダイムは1960年代から見つかっているが、それ以降は新しいパラダイムは追加されていないとのこと。

ただし、マルチスレッドプログラミングはパラダイムに含まれそうな気はしている。

第4章 構造化プログラミング

  • goto 文を使ってしまうと、モジュールを小さな単位に分割できなくなることを発見
    • 適切に使えば正しい構造にできるけど、みんながみんな悪さをしないことはない
      • 近年はプロジェクトの規模が多くなり、プログラムを複数人で書くことから、正しい構造にできるかどうかといえば完璧には無理である。 
    • プチコンで他人のソースコードを見たとき、goto の羅列で「うわっ・・・読めない・・・」ってなった記憶を思い出した
  • 1968年に「goto文は有害と考えられる」という論文でプログラミング世界が炎上したらしい
    • 今もいろんなことで炎上しているけど、こんな時代から炎上しているってやはり歴史は繰り返す・・・
  • モジュールを証明可能な単位に分割することを可能にする
    • これは Unity+C# でも同じことが言える
      • Update 4000行とか書かれた瞬間もう・・・ってなるよね・・・(たくさん経験してきた)
  • 構造化プログラミングの価値を高めるのは、反証可能なプログラミングの単位を作成する能力。構造化プログラミングの歴史上から、機能分割をしていくことがベストプラクティスになる。

第5章 オブジェクト指向プログラミング

  • オブジェクト指向が結構曖昧な表現されることが多い
    • まぁ入門書にありがちな話でもある

オブジェクト指向の3つの概念、カプセル化継承ポリモーフィズム

  • カプセル化
    • クラスの内部からしか見れない変数と関数、外側から閲覧できる変数と関数を分けることにより、正しい線引ができるようになる。
      • 全部 public にして大変になっていた事例を思い出した。せっかくクラス別に分かれているのに、全部 public のおかげでカプセルの中身が外部の影響でぐちゃぐちゃになることとかざらにある・・・
    • C言語でも擬似的なオブジェクト指向プログラミングをすることができる。このときのプログラマーはいつも擬似オブジェクト指向プログラミングをしていたらしい。
      • 大学と大学院の研究でこんなことやったなぁとしみじみ
  • 継承
    • 継承とは、スコープ内の変数と関数を再度宣言したもの
    • C言語プログラマーが手動でやってきていたこと
  • ポリモーフィズム
    • 関数へのポインターの応用
      • C#的には Interface 経由の関数呼び出しというところか
      • Interface 経由でアクセスすれば内部実装を分けることができ、様々なコンソールに対応することが容易に分割させることができる
        • Unity でよくあるのは、iOSAndroid でのネイティブ通知実装を interface だけ一緒にして OS ごとに分割するところか
        • なお、なんでみんな1つの関数内だけ #ifdef Androiid #elif iOS って書くの・・・(しかも関数がある分だけ #ifdef の山)
    • ソースコードの依存関係を自由に定義できる
      • まぁこれがメリットでありデメリットだよね・・・自由にやらせると逆に流派ができてしまってソースコードのコントロールもやりづらいし(そこは運用でカバー(?))

第6章 関数型プログラミング

私自身一番馴染みのないプログラミングパラダイム

  • 代表例の Lisp
    • いつ見ても()地獄で、もうちょっとどうにかならなかったの感がすごいある
  • 関数型言語の変数は変化しない
    • 変数とは?
    • 並列処理中に同じ変数にアクセスしても競合状態にならないメリットがある

感想

構造体プログラミングとオブジェクト指向型プログラミングに関しては慣れているので、概念として理解しやすい。(むしろ構造体プログラミングの延長線がオブジェクト指向型プログラミングなのかなと思ったり)

関数型プログラミングに関して、ネイティブアプリで使用する場面ってあるのかな・・・サーバが利用しているイメージだけど、クライアント側で使用することがあるのか若干気になった。(少なくともゲーム業界は C# or C++ だし)