エンジニア的なネタを毎週書くブログ

東京でWebサービスの開発をしています 【英語版やってみました】http://taichiw-e.hatenablog.com/

あらゆる「システム」の挙動は入力と出力だけで説明できる

どんな粒度、どんな用途の「システム」も、挙動は入力と出力だけで説明できます。
f:id:taichiw:20190118235359p:plain

プログラムのサブルーチン(function, method, ...)

「引数」と「返り値」で挙動が説明できます。

public String greet (String name){
    return "Hello " + name + "!";
}

Microserviceアーキテクチャの、各Service

APIのリクエストとレスポンスで挙動が説明できます。
f:id:taichiw:20190119000332p:plain

Microserviceアーキテクチャ全体

内部すべてをブラックボックスと見て、一番外側のAPIのリクエストとレスポンスで挙動が説明できます。
f:id:taichiw:20190119000823p:plain
f:id:taichiw:20190119000848p:plain

Webページ

リクエストであるURL(+POSTで送られるテキストや画像などのリクエストボディ)と、返却されるHTMLやその他コンテンツで挙動が説明できます。
f:id:taichiw:20190119001413p:plain

でも、データ更新したりするでしょ? 入力と出力だけじゃ説明できないじゃない!

このようにシステムを見ると、「状態が更新される」ことも挙動の説明としてする必要があります。
f:id:taichiw:20190119002052p:plain

ですが、ここだけをシステムとして見ると… DBへの更新は「出力」の一種と見ることができます。
f:id:taichiw:20190119002118p:plain
このシステムは、APIのクライアントと、DB という2種類の外部システムに、出力をするシステムです。

プログラムのサブルーチンの場合も同様です。

class Person {
  String name;
  public setName(String name) {
    this.name = name;
  }
}

このコードは、このようにも捉えられますが
f:id:taichiw:20190119002532p:plain

nameはPersonから依存があるだけの別インスタンスなので、このようにも捉えられます。
f:id:taichiw:20190119002715p:plain

逆にDBからデータを読むようなシステムは、「入力が2つある」と捉えることができます。
f:id:taichiw:20190119002824p:plain