オブジェクト指向の新たな実装方法になるでしょうか?
トレーディングカードゲームの開発ツール(以降TCGE)というものを作成していたのですが、
オブジェクト指向プログラミングとは考え方が違うと思えるものが出来ました。
考え方を纏めていたところもっと多くの活用が可能かと思い皆様の知恵をお借りしたく思っております。
※過去にカオス指向(仮)として纏めてみようかと思ったのですが、
他言語等を把握しておらず違いをうまく表現できませんでした。
●違うと思っている点は以下の通りです。
・オブジェクトを「物体」と「処理」とに分かれている。
・「物体」には、「物体」を追加・削除でき、木構造になっている。
・「物体」には、「処理」を追加・削除でき、「物体」に追加された「処理」は「物体」以降を適用範囲とする。
・「処理」には、”認識タイプ”が設定され、「物体」に追加された「処理」は”認識タイプ”を持つ「物体」のメソッドとして使用される。
・「処理」には、優先順位が設定され、「物体」のメソッドを処理する際に、同メソッドの継承関係を構築します。
●同じ点は以下の通りです。
・オブジェクトどうしの処理のやり取りを行う。
・継承関係を持ちません。
●注意点
・コーディング例は後ろに載せてあります。
・TCGEの設定方法をそのままvb風のコーディングにしてあります。
・まだまだ改善の余地があり、改善案はありますが質問を優先させたいので不備のあるままにしてあります。
例としては、関数を処理オブジェクトとして生成してありますがクラスにしたほうが隠蔽化等が出来て便利など。
●質問内容としては以下の通りです。
・言語等で同様の考え方の言語はありますでしょうか?
・「アスペクト指向」等でいう「横断」は実現できるでしょうか?
・コーディング例として必要なものが他にありますでしょうか?
・「物体」の木構造と「処理」の配置を考えるだけでシステムの構築が可能になると考えているのですが需要はあるでしょうか?
●コーディング例
<コーディング例1>
function 自己紹介() as string:人(人,1)()
'人(人,1)()の説明
'・括弧外の人は、この処理自体を表し、処理生成の1番目で指定します。
'・最初の括弧内の人は”認識タイプ”といわれるもので、処理を適用するかを操作します。この場合、人ならこの処理を行うことになります。
'・最初の括弧内の1は処理の優先順位になります。
'・最後の括弧内は1は処理を生成する際のパラメータになります。
return "人"
End Function
function 自己紹介() as string:歌える(歌える,1)()
return "歌える" & MyBase.自己紹介() '継承関係がないのにMyBaseがあります。
End Function
function 自己紹介() as string:踊れる(踊れる,1)()
return "踊れる" & MyBase.自己紹介()
End Function
function 自己紹介() as string:アイドル(アイドル,1)()
return "アイドル"
End Function
Sub main()
’オブジェクトを生成します
dim 歌って踊れるアイドル=ルート.物体生成(人) 'newでの生成はなく実体オブジェクトに生成追加します
'処理を追加します
dim 人処理=ルート.処理生成(人)
dim アイドル処理=ルート.処理生成(アイドル)
dim 踊れる処理=ルート.処理生成(踊れる)
dim 歌える処理=ルート.処理生成(歌える)
’アイドルの成長をご覧ください
msgbox(歌って踊れるアイドル.自己紹介()) '「人」と返します。認識タイプは”人”だけです。
歌って踊れるアイドル.認識タイプ追加(アイドル)
msgbox(歌って踊れるアイドル.自己紹介()) '「アイドル」と返します。認識タイプは”人”と”アイドル”です。
歌って踊れるアイドル.認識タイプ追加(歌える)
msgbox(歌って踊れるアイドル.自己紹介()) '「歌えるアイドル」と返します。認識タイプは”人”と”アイドル”と”歌える”です。
歌って踊れるアイドル.認識タイプ追加(踊れる)
msgbox(歌って踊れるアイドル.自己紹介()) '「歌える踊れるアイドル」と返します。認識タイプは”人”と”アイドル”と”歌える”と”踊れる”です。
'おまけでアイドルを辞めさせてみます
歌って踊れるアイドル.認識タイプ削除(アイドル)
msgbox(歌って踊れるアイドル.自己紹介()) '「歌える踊れる人」と返します。認識タイプは”人”と”歌える”と”踊れる”です。
End Sub
・歌って踊れるアイドル.自己紹介()時の処理の流れ
認識タイプに”人”、”アイドル”、”歌える”、”踊れる”がある場合、
処理の順番は追加の逆順(”認識タイプ”の追加順ではありません)なので
”歌える”、”踊れる”、”アイドル”、”人”の順番になります。
<コーディング例2>
function 国名() as string:国(国,1)(国名 as string)
return 内容
End Function
function 挨拶() as string:挨拶A(人,1)(時間from as string,時間to as string,内容 as string)
if 時間from<= 現在時間 and 現在時間<=時間to then
return 内容
else
return MyBase.挨拶()
endif
End Function
function 挨拶() as string:挨拶B(人,2)(内容 as string)
'語尾追加
return MyBase.挨拶() & 内容
End Function
Sub main()
’オブジェクトを生成します
dim 日本=ルート.物体生成(国)
dim アメリカ=ルート.物体生成(国)
dim Aさん=日本.物体生成(人)
dim Bさん=日本.物体生成(人)
dim Cさん=日本.物体生成(人)
dim Dさん=アメリカ.物体生成(人)
'処理を追加します
dim 日本処理=日本.処理生成(国,日本)
dim アメリカ処理=アメリカ.処理生成(国名,アメリカ)
dim 挨拶処理1=ルート.処理生成(挨拶A,"0:00","6:00","good evening")
dim 挨拶処理2=ルート.処理生成(挨拶A,"6:00","10:00","good morning")
dim 挨拶処理3=ルート.処理生成(挨拶A,"10:00","19:00","good day")
dim 挨拶処理4=ルート.処理生成(挨拶A,"18:00","24:00","good evening")
dim 挨拶処理5=日本.処理生成(挨拶A,"0:00","6:00","こんばんわ")
dim 挨拶処理6=日本.処理生成(挨拶A,"6:00","10:00","おはよう")
dim 挨拶処理7=日本.処理生成(挨拶A,"10:00","19:00","こんにちわ")
dim 挨拶処理8=日本.処理生成(挨拶A,"18:00","24:00","こんばんわ")
dim 挨拶処理9=Bさん.処理生成(挨拶B,"ニャン")
msgbox(Aさん.挨拶()) '0~6時は「こんばんわ」、6~10時は「おはよう」、10~18時は「こんにちわ」、18~24時は「こんばんわ」
msgbox(Bさん.挨拶()) '0~6時は「こんばんわニャン」、6~10時は「おはようニャン」、10~18時は「こんにちわニャン」、18~24時は「こんばんわニャン」
msgbox(Cさん.挨拶()) '0~6時は「good evening」、6~10時は「good morning」、10~18時は「good day」、18~24時は「good evening」
End Sub
・オブジェクトと処理の木構造
ルート(挨拶処理1~4)
日本(挨拶処理5~8)
Aさん
Bさん(挨拶処理9)
アメリカ
Cさん
・Aさん.挨拶()時の処理の流れ
処理対象のメソッドは、木構造から挨拶処理1~挨拶処理8になります。
(日本処理は”認識タイプ”が異なるので対象になりません)
挨拶処理1~挨拶処理8の処理の優先順位で並べ替えると
挨拶処理8、挨拶処理7、・・・、挨拶処理1
の順番になります。
並び替えた順番で所謂「継承」を構成して処理しますので、
挨拶処理8を処理し、18:00~24:00の間なら"こんばんわ"を返し、
そうでない場合、挨拶処理7を処理し、10:00~19:00の間なら"こんにちわ"を・・・と処理されます。
以上よろしくお願いします。