mike-neckのブログ

Java or Groovy or Swift or Golang

クリーンアーキテクチャーの読書メモ(5)

§6 関数型プログラミング

  • プログラミング以前から存在する(1930年代の Alonzo Church のラムダ計算)
  • 関数型言語の変数は変化しない
  • 並行処理の問題は可変変数がなければ発生しない
  • 変数が変更するコンポーネントと不変のコンポーネントを分離して、可変コンポーネントからできるだけ不変コンポーネントに処理を移動する
  • データの状態を保存するのではなく、変更内容を保存する(イベントソーシング)
    • 十分な容量のストレージと十分な処理能力があれば、アプリケーションを不変にできる

まとめ

クリーンアーキテクチャーの読書メモ(4)

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

  • オブジェクト指向設計とは何でないか
    • 関数とデータの組み合わせ
    • 現実の世界をモデル化 - 何を言っているんだお前は
  • カプセル化
    • 境界線の外からはデータが見えないアレ
    • C 言語でもうまくやれる
  • 継承
    • Animal クラスに派生した Cat クラスが Animal クラスになりすますアレ
    • OO 登場以前からやってる普通のプラクティス(ただし強引なキャスティングが必要な点に置いては、 OO の方がうまく扱えるようになった)
  • ポリモーフィズム
  • 依存関係逆転
    • 上位モジュールは下位のモジュールを呼び出すため、上位のモジュールは下位のモジュールに依存している (図1)
    • インターフェースを経由すると、依存関係の向きが逆向きになる = 依存関係逆転 (図2)
    • OO が安全なポリモーフィズムを提供する仕組み
    • UI/Model/Database はそれぞれ依存関係が逆転している -> 独立デプロイ可能性 (図3)
    • 独立デプロイ可能だと、別のチームが開発できる -> 独立開発可能性
  • まとめ
図1

f:id:mike_neck:20190316002333p:plain
High が Log に依存している

図2

f:id:mike_neck:20190316002824p:plain
インターフェースを間に挟むと矢印の向きが変わる

図3

f:id:mike_neck:20190316004558p:plain
UI/Model/Database

クリーンアーキテクチャーの読書メモ(3)

f:id:mike_neck:20190312230053p:plain

第二部 プログラミングパラダイム

§3 パラダイムの概要

§4 構造化プログラミング

  • Edsger Wybe Dijkstra
  • アルゴリズムの証明
    • プログラマーがプログラムを書けていない問題を、数学の証明を適用することでサポートすることを目指した
    • goto 文を濫用すると分割統治法が破綻することを発見(うまく使えば破綻しない)
    • プログラミングの最小単位である順次/選択/反復という最小セットと同じ構造になるようモジュールにわけることでプログラムが証明可能であると発見した
  • 有害宣言
  • 構造化プログラミング
    • モジュールを証明可能な単位に再帰的に分割する
    • 大きな問題は上位レベルの機能に分割、上位レベルの機能は下位レベルの機能へ無限に分割
  • 証明するという目標は達成できなかった
  • 科学の証明
  • テスト
    • ソフトウェア開発は科学の証明と同じ
      • 構造化プログラミングではプログラムを分割して、証明可能な小さな機能にする
      • 証明可能な小さなプログラムが正しくないことをテストで証明する
    • (制限)正しくないことの証明は証明可能なプログラムにしか適用できない/証明不可能なプログラムはいくらテストしても正しいとみなせない
  • ソフトウェアアーキテクトはビジネスをテスト可能なサービス/コンポーネント/モジュールに分割するため、構造化プログラミングのような制約を課している

swift-nio-ssl に出したサンプルコードのPRがマージされました

すごい時間かかりましたが、Apple の swift-nio-ssl に出したサンプルコードのPRがマージされました。

github.com

時間かかったのは、僕がどうやら指摘されてた修正をすっかり忘れていたからっぽいです…

現場からは以上です。