目的
書籍「リーダブルコード」など、構文・関数レベルでの具体的な方法論はあるものの、ソフトウェアのアーキテクチャ・実装方針レベルで、「運用しやすい(=複数人で理解しやすい)」ソフトウェアってなんなのと思い、整理してみました。
ツッコミ・参考資料の共有など、コメント大歓迎です。
要約
- 「オブジェクト指向」「関数型プログラミング」の思想をまとめ、各文脈(サーバー,フロントエンド,アプリ)における現時点での動向までまとめた。
- いずれにしても重要な要素を知ることが大切で、1つの言語に絞ってその思想を体現することが大切だと感じた。アーキテクチャ設計思想についてももっと知りたい。
オブジェクト指向
キーワード
-
カプセル化
- オブジェクトのフィールドにはアクセスせず、メソッドだけを通してオブジェクトを操作する手法
-
継承
- 似たクラス間の共通機能を、スーパークラスとして実装できる機能
-
ポリモーフィズム
- スーパークラスには汎用的な名前をつけておき、実際にはそのオブジェクトの型に応じたメソッドが実行される
メリット
-
変更に対して柔軟に対応できる
- オブジェクト指向では、変更されない箇所を軸に、頻繁に変更されるであろう箇所をクラスに抽出する
- サンプルプログラム: 勇者に学ぶ, オブジェクト指向プログラミング実践
-
直観的で、なじみやすい=チームに浸透させやすい
- ここは、人によって感覚が分かれそうなところですが
デメリット
-
「変更されない箇所」を見分けるのは人間
-
上記(モデル設計)が根本的に変更されるとつらい
-
参照透過性が低い
- 「手続き型」で、オブジェクトに状態を保持させるため、関数の入力が同じでも、状態によって異なる結果が得られる場合がある
関数型プログラミング
キーワード
-
暗黙的状態
- 明示的状態:プログラム中で動的に変化する状態をオブジェクトや構造体、変数の粒度で管理される状態
- 暗黙的状態:プログラム中で変数間の関係性が宣言的に記述され、イミュータブル性(変更できない状態)が維持される状態。(または「宣言的状態」とも)
-
参照透過性の担保
- Curry化
- 関数合成
-
「関数型」言語はあるが、「関数型」の思想はどの言語でも使える
- 例:javascriptにおける実践例
- lambdajs: compose などのライブラリ集
- immutable.js: Data structure (参照透過性をたもつため)
- おすすめ本:関数型プログラミングの基礎 JavaScriptを使って学ぶ
- おすすめweb本: Mostly adequate Guide to FP
- 例:javascriptにおける実践例
メリット
- 関数型プログラミングの良さ
* コードのモジュール性
* 読みやすくなって、運用が楽になる - 参照透過性の担保
- バグが減る。理論的にはUnitTestだけでバグがつぶせる
デメリット
- 学習コスト。慣れるまで書くのが大変
- 特に、暗黙的状態の扱い方は、慣れていないと理解が難しい印象
- ゆえに、チームとしての導入は、現時点でハードルが高かったり
各文脈において
-
フロントエンド(Javascriptなど)や、アプリ(iOS)界隈では、関数型プログラミングへの移行が高まっているようにみえる
-
一方、サーバーサイドでは、Haskell推奨な方は多々見受けられますが、最近だと
「go言語」の利用が高まっている(docker、merucari・・)- 「go言語」は手続き型で、関数型プログラミングの思想とは別のところを目指していそう
- 具体的には、「go言語」は静的型付け言語であったり、インターフェースの考え方、不要な変数が残っていたら実行時にエラーにするなど
-
「go言語」のインターフェースの考え方は、Go言語における埋め込みによるインタフェースの部分実装パターンが分かりやすい
まとめ
いずれにしても重要な要素を知ることが大切で、1つの言語に絞ってその思想を体現することが大切だと感じた。アーキテクチャ設計思想の文脈でも考察を深めたい。