#はじめに
どうも、こんにちは。
最近、投稿をはじめさせていただいた者です。
わたしは、実装や開発の経験は非常に乏しく、
技術的な話となると、その大枠や概要についてしかお話できないのが実情です。
今回お話する内容についても、やはり、大枠や概要だけで実装や開発の伴わないものになってしまいます。
ですが、個人的に、「このアイデアはよいのでは?」と思ったので書かせていだだくことにしました。
今回のテーマ・内容は、「エージェント指向+サブジェクト指向+オブジェクト指向」についてです。
オブジェクト指向については、すでにご存じの方は多いのでないでしょうか?
Javaからプログラミングをスタートしたという方にとっては、
プログラミングを始めた初期からもうすでにオブジェクト指向について知り、なじみ深いものとなっているのではないでしょうか?
ご存じのとおり、オブジェクト指向では「モノ」を主体・中心として考えて、プログラムを作っていくことになります。
具体的には、プログラムに落としまれる(シミュレーションされる)”この世界はモノを中心としてできている”という考え方で、
プログラムあるいはシステム全体は、不特定多数のオブジェクト(モノ)によって構成され、オブジェクト相互の関連によって表されるということです。
サブジェクト指向については、DWH(データウェアハウス)あたりでつかわれる用語で、
情報を分野ごとに整理・分類するのではなく、ある主題に基づいて収集・蓄積しようというものです。
ですが、わたしの考えるものは、これとは違います。
具体的なお話は後でさせていただきます。(非常に前置きが長くなってしまうので・・・)
エージェント指向については、これはプログラミングあたりでつかわれる用語で、
能動的・自律的に動作するプログラムによってシステム全体を構成していこうという考え方で、
次世代の(オブジェクト指向に続く)新しいプログラミングパラダイムとされていますが、
現状、いまだ実現されていないようです。(どこかでされていたらゴメンなさい・・・)
以上が、「エージェント指向」「サブジェクト指向」「オブジェクト指向」についてのおさらいですが、
ここからは、わたしの考える新たなプログラミングパラダイムについて紹介させていただこうと思います。
#本文
わたしの考える新たなプログラミングパラダイムとは、
その概要を言えば、「エージェント」「サブジェクト」「オブジェクト」の3者によってシステムを構成しようというものです。
では、早速、この3者について言及していきたいと思います。お付き合いのほど、お願いいたします。
(わたしの考える)「オブジェクト」とは、これは、単なる”モノ”であり、自身に係る固有の処理(通常のメソッド)を持たないもので、
内部状態としていくつかのフィールドを持ち、外部に対しては、これを読み取り&書き込みするためのインターフェイスを公開しているクラスです。
このクラス自身はなにもしない、”ただのモノ”です。したがって、外部からアクセスしてもらい、内部の状態を読み取られたり、
書き換えられるだけの存在で、いうなれば”物体”です。
オブジェクトは、現実世界のものに例えるなら、”モノや(単純な)物体”です。
これは常に周囲の状況に対して受動的で、外部からのアクセス・働きかけによって、その存在意義が見いだされるというものです。
C言語の「構造体」に近いものといえばお分かりになりますでしょうか?(ただし、カプセル化されているし、インターフェイスを持っているので厳密には違いますが・・・)
(わたしの考える)「エージェント」とは、やはり、前述したとおり、ある程度、能動的・自律的に動くクラスで、
自身を取り巻く状況を観察し、自身の目的・存在意義に合致するような行動をとる(その前に意思決定をする)プログラムです。
具体的には、自身の状態と周囲の状況(、加えて、自身の目的・存在意義)から、自身の取るべき行動を自ら決定するというロジックを実装されたクラスです。
昨今話題のAIと考えていただいてよろしいかと思います。(ただし、どこまで仕様を詰め込むのかによりますが・・・)、
常にどのような状況においても受動的であるオブジェクトとは反対に、常に能動的に動き、オブジェクトや同じエージェントに対してアクセス・働きかけをします。
エージェントは、現実世界のものに例えるなら、”ヒト”にあたります。
(わたしの考える)「サブジェクト」とは、エージェントに一定の権利・権限を付与することで、エージェントの行動を促進したり、行動を監視したり、時にはその行動に介入するクラスです。
オブジェクトとエージェントに対して、常に一定のアクセス・働きかけをしています。(これは「ルール」です)。サブジェクトは、インターフェイスを介してオブジェクトとエージェントの持つフィールドを書き換えたりします。
とくにエージェントに対しては、そのエージェント自身がシステム内でなにができるのかという権利・権限についての通知をします。(これは「ポリシー通知」です)。
サブジェクトは、なにかの”主題”であって、その文脈の中にオブジェクトやエージェントを含みます。
つまり、サブジェクトは、つねにオブジェクトやエージェントに一定のアクセス・働きかけをした上で=一定の状況を与えた上で、
「いまのあなたには こうすることができますよ」という権利・権限について知らせます。
これによってエージェントは、システム内で自身になにができるのかという行動の選択肢を得ることができます。
まとめると、サブジェクトは、常にオブジェクトやエージェントに対して、”状況”と、その状況における”行動の選択肢”を同時に与えるのです。
また、サブジェクトは、エージェントがシステム内でどのように振舞っているのかという記録を持ちます。(これは「アクティヴィティログ」です)。
サブジェクトは、このアクティヴィティログを一定間隔で精査して、次回からのエージェントに対する権利・権限の付与に反映させます。
こうすることで、エージェントの暴走や、エージェントによるシステムの破壊を防ぎます。
ちなみに、サブジェクトは、各エージェントがシステム内でなにができるのかという権利・権限の一覧を持っています。(これは「ポリシー」です)。
また、サブジェクトは、各エージェントが行動を取るとき、これをイベントとして、一定の処理や手続きを実行することもできます。(これは「トリガー」です)。
これにより、各エージェントの行動を助長することもあれば、その逆に、エージェントの行動を抑制することもあります。
サブジェクトは、現実世界のものに例えるなら、”なにかの主題”であって、同時に、”世界を支配・統率する法則”でもあります。
#まとめ
システム全体の動作をまとめると、サブジェクトが、各オブジェクトと各エージェントに対して一定のアクセス・働きかけをします。
つぎに、サブジェクトは、各エージェントに対して、ポリシーの通知をします。
それを受け取った各エージェントは、自己の判断に基づいて、(ポリシーの許す限りで)なんらかの行動を決定します。
各エージェントは、行動の結果として、各オブジェクトや、自身と同じエージェントに対して、一定のアクセス・働きかけをしたことになります。(サブジェクトが、エージェントの行動に介入することもありえます)。
そして、システムは全体としてこの動きを繰り返します。
以上が今回のお話です。
この話が、将来のプログラミングパラダイムを変えるものかはさて置き、(アイデアとしては)いかがでしたでしょうか?
次回も、この「エージェント指向+サブジェクト指向+オブジェクト指向」についての研究と考察の結果を発表していきたいと思います。
次回もお付き合いくださると、うれしいです。筆者の励みになります。
どうか、よろしくお願いいたします。