昨今におけるプログラミングの本質

一般的な範囲において、理系的な素養(数学の知識とか)以上に、いわゆる当然の論理をしっかりと組み立てられること、すなわちある種文系的な能力の方がプログラミングには役にたつ。

つまり、最も重要なことは「そのソースコードはどういう構造をしていて、どういう風に振る舞うのか」がしっかりと整理されており、説明可能ということだ。

その際に毎度のように考えることは、実際のところ2つしかない。「登場人物」と「ふるまい」の定義である。

最初に登場人物の方であるが、もちろん人物とは限らない。オブジェクト指向における「オブジェクト」と言っていい。あるいはドメイン駆動設計におけるドメインモデル、またある時は一つのUIコンポーネントかもしれない。

肝心なのは、一つの(仮想的な)形のある物体としてのオブジェクト。これをプログラミングにおける「登場人物」と俺は考えている。

登場人物を定義する際に必要とされるのは、彼らがどう言った性質を持っているかをしっかりと洗いだすことである。

「ブログ投稿」という登場人物がいたとしよう。彼は「タイトル」「文章」「公開時刻」という3つの情報を持っているとすれば、それが彼の特徴である。

次に、「ふるまい」の定義だ。

当然ながら、先に述べた登場人物は特定のふるまいをすることが期待されている。それは、単に全ての情報を表示することかもしれないし、何かをきっかけとして他の登場人物に影響を及ぼすことかもしれない。

先に例で言えば、「ブログ投稿」は「編集」「保存」というふるまいを実行することが可能だ。それにより、「ブログ投稿」は自分自身を変えていくことができる。
あるいは、「ユーザー」という登場人物がいたとして、彼らが「他のユーザーをフォローする」というふるまいを実行すると、フォローされたユーザーは「フォローされているユーザーが増える」という影響を受ける。また、それによって「ユーザー」のタイムライン自体も影響を受ける。

プログラミングではこのように、誰がどう振る舞ったら他の誰かの状態がどう変わるのか、それをしっかり明確に定義する必要がある。
その上で、実際に検証する際には期待通りになっているかを明らかにすることができる。

ここまでがこのエントリにおける主旨だ。以降は補足。

実際にプログラミングをする際、以上の2つ(登場人物とふるまい)を実現する方法は割とたくさんあるし、様々なレイヤーで様々な登場人物(とふるまい)が存在するだろう。

例えばMVCという一般的なアーキテクチャでは、モデル層に定義された各クラスが登場人物であり、それらで定義されたメソッドがふるまいである一方、コントローラを中心に考えると、モデルが登場人物であるのは変わらずとも、ふるまいとしての単位はコントローラごとになる。

また、最近のReact – Reduxというフレームワークの場合、各コンポーネントが登場人物となって、アクションが定義されるが、コンポーネントの状態はコンポーネントそれ自体には保存されない。あくまでもreducerという関数が働いて、アプリケーション全体の構造を間接的に変えていく。

とはいえ、仮想的に区分される登場人物がいるのはどの場合でも変わらないと思うので、そこをしっかり考えておくと作業に取り掛かりやすいと思う。