ソフトウェア開発における依存とは?
「依存」という概念は、機能追加や自動テストのしやすいコードを書く上で非常に重要である。
しかし、その辺りを一切考えずにコーディングするプログラマーは非常に多い(前職&現職調べで8割程度)。
そこで、経験の浅いプログラマーでも「依存」を理解できるように、現実世界での例を挙げて考えてみる。
疑似コードは気が向いたら書く。
### 依存とは?
一言で表すと「君がいないと僕は生きていけない」という状況のことである。
この例であれば、"僕"は"君"に依存していることになる。
更にこの「〇〇が△△に依存している」「△△が〇〇に依存されている」という関係性のことを「依存関係」と呼んだりする。
### 具体例:PCと私の仕事
弊社では一人一台必ずノートPCを貸与され、それを使って仕事を行う。つまり"私の仕事"も"貸与された個人PC"を使って行う。
これをそのまま依存関係に当てはめると、"私の仕事"は"貸与された個人PC"に依存していることになる。
しかし実際には、PCの破損時に代替品を用いて仕事を行うこともあり、"貸与された個人PC"である必要は一切ない。
この事実を踏まえると、"私の仕事"は"PCとして動く物"に依存していることが分かる。
※もちろん仕事のパフォーマンスはPCスペック等にも影響されるが、成果物だけで見れば大差はない。
### 依存関係の見極め
"私の仕事"はPCメーカーに依存しているだろうか?もしくはPCの作り方に依存しているだろうか?
答えはどちらもNOである。全く依存していない。弊社がどこからか買ってきたPCを渡されるだけで、メーカーとのやり取りは全く行わないし、自分で組み立てることもしない。
前述した通り"私の仕事"は"PCとして動く物"に依存しているので、PCでさえあれば問題ないはずである。にもかかわらず、こういった間接的な物に依存するような実装を行う輩がとても多いのである。
そのようなコードは、再利用性が乏しく、依存先のスタブが作りづらかったり依存先の内容と重複するテストコードを書くことになるなどデメリットが多い。
その辺りを考慮して正しい設計やコーディングを行ってほしいものである。
### 具体例:DBとWebAPI
データ取得の際、DBにSELECT文発行するのもAPIリクエスト投げるのも、結果が同じなら依存してる側からしてみれば同じ処理だよねって話を詳しく書こうと思ったけど力尽きた……。