WEBアプリケーション開発【者】の基本
開発するに当たって常々当たり前の考え方と思いながらも中々他者に伝わらない事柄のうち、基本中の基本の本当に基本だと思う事柄のみを抜き出して記事にする事にしました。
適用範囲について
WEBアプリケーションに限ります。WEBでない環境に当て嵌めると一部腑に落ちない箇所が出てきます。
基本的なphp動作環境のように一度のリクエスト〜レスポンスで変数が消えてなくなってくれる言語が対象です。
基本
WEBアプリケーションの開発者が開発する上で知っていて欲しい事柄
1. 全ての処理においてI/Oのパターンは3つ
- インプット/None
- None/アウトプット
- インプット/アウトプット
処理=関数でイメージすると分かりやすいだろうか。
全ての処理は一本道のシーケンスである
- 処理は一本道のストリームであり、分岐は存在しない
- 但し、ストリームの中断(Exception)は存在する
- if分岐ではなく、処理の結果としてtrueかfalseがあるだけ
- Input → Interactor(シーケンス) → Output ※参考
全ての処理は参照透過性を持たせるつもりで
Inputが一定である限り、Outputは常に同じものが返されるようにする。処理には不変の箇所(処理のコア)と可変の箇所があるので、その境界を見極めて不変の箇所については参照透過性のある処理のみとなるようにする。
全ての処理は副作用が有るか無いかの二通り
そんなの当たり前だろう思われるかもしれないが、意識していれば処理のスコープをうまく切り分けられる。
例えば、副作用の範囲を意識せずにファイルへの文字列追記処理を文章にしたとするなら
ファイルが無ければ作成して文字列を書き込む、ファイルがあれば文字列を追記する
のような感じになり、これがひとつの処理となってしまう。
しかし副作用を意識した場合は
1. ファイルが存在するか判定する
2. (無ければ)ファイルを作成する
3. ファイルを開く
4. 文字列を追記する
5. ファイルを保存する
となり、1は副作用なし、2と5は副作用があるがあるという切り分けができるようになり、副作用の有る処理と副作用の無い処理に分けて作る事が出来る。
前者のような処理を作ってしまっている人は改めて意識してみるといいだろう。
全ての処理をシンプルにする
スコープを小さくすれば処理はシンプルになる。
スコープの大きい処理はシンプルな処理の組み合わせで出来る。
全ての処理は呼び出し側にとってブラックボックスで構わない
インプット及びアウトプットのみを知っていればよく、インプットからアウトプットまでの間の処理詳細は知らなくて良い。
呼び出す側のレイヤー・スコープによって、ブラックボックスの範囲が変わる。
ブラウザー(エンドポイントで受け取ったリクエスト)・・・ → WEBサーバー
WEBサーバー(アプリケーションサーバーへのproxy)・・・ → アプリケーションサーバー
アプリケーションサーバー(DBの参照や更新)・・・ → DBサーバー
コメントは書かない
コメントを書いてはいけないという意味ではなく、コメントが無いと読めないソースは書かないようにという意味。
Discussion