オブジェクト指向の新たな実装方法とは?

このQ&Aのポイント
  • オブジェクト指向の新たな実装方法について考えています。
  • オブジェクト指向プログラミングとは異なる考え方で、活用可能性を探求しています。
  • 他の言語やアスペクト指向との関連、システム構築の需要などを質問したいと思っています。
回答を見る
  • ベストアンサー

オブジェクト指向の新たな実装方法になるでしょうか?

トレーディングカードゲームの開発ツール(以降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の間なら"こんにちわ"を・・・と処理されます。 以上よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#208507
noname#208507
回答No.1

オブジェクト指向プログラミングと「●同じ点は以下の通りです」の部分ですが > ・継承関係を持ちません。 これは最も古いオブジェクト指向言語(ABCL1やSmalltalk72)か、一部の例外(GoogleのGo言語など)にしかあてはまりません。この言及は批判の的になってしまいますよ。 話としては言語仕様やプログラミングの方法論というより、開発ツールの設計思想の話になってしまっていて、とりあえず需要は少ない気がします。 それから、一つの投稿にいくつもの質問を詰め込むのは避けたほうがよいと思います。もう少し質問の的を絞ってはいかがでしょう。

fuku292929
質問者

お礼

ご回答ありがとうございます。 文章が多くなり間違ってしまうし、意図も伝わらないし、 申し訳ありませんでした。 指摘のおかげで質問するべき問題が切り分けられていなかったことがわかりました。 本当にありがとうございます。

fuku292929
質問者

補足

大変申し訳ありませんでした 継承関係を持たないのは異なる点でした。

関連するQ&A

  • 戻り値がクラスオブジェクト

    VB初心者でわからないので教えてください。 ある関数を呼び出して戻り値を取得するのですが、その戻り値がクラスオブジェクトとなっています。いろいろ調べてみましたが、いい結果にヒットしなかったので今回質問してみました。 言語はVB6.0です Function 関数A(A as String, B as String) dim C as Class1 set C = new Class1 Class1で宣言された変数に値を入れる処理     関数A = C end Function イメージはこんな感じです。 すみませんが解決策を教えてください。。。。

  • オブジェクト指向の間違いと改善案について

    オブジェクト指向というより オブジェクト指向プログラミングについての間違いと改善案をブログに書いてみました。 http://chaosblogchaos.blog.fc2.com/?no=2 この考え方に間違いがあるでしょうか? 説明不足の点はないでしょうか? よろしくお願いします。 以下ブログの内容 ---------- ■カオス指向(仮) カオス指向(仮)とは、オブジェクトに処理を追加・削除することでオブジェクトの振る舞いに無限性を持たせる試みです。 カオス指向(仮)ではデータが主体となり、木構造で保持します。 (ファイルフォルダで例えると、フォルダがオブジェクト、ファイルがプロパティに当たるイメージです) 処理を追加・削除が可能なことからプロトタイプベースがもっとも近いですが、 オブジェクトが親子関係を持つことと オブジェクトの親子関係から処理が影響を受ける事が異なります。 ●オブジェクトの内容  ・配列か連想配列で子オブジェクトを保持できます。    オブジェクトどうしの強い関係を意味し、親が削除される場合、子も削除される関係にあります。    オブジェクトはルートからの木構造の中に必ず存在する事になります。  ・別途、変数領域を確保する。    処理で使用する値を保持します。    オブジェクトどうしの弱い関係を保持できます。  ・処理を持つ。    オブジェクトに処理を持たせることができるます。    プロトタイプベースと異なる点は、    オブジェクトが処理を持っていても、オブジェクトがその処理をするわけでは無く、自身と子オブジェクトに対して適用され、”認識タイプ”を持つ場合に処理します。  ・”認識タイプ”を持つ。    処理の実行を制御します。認識タイプを含むかどうかで処理を行うかどうかを決定します。    オブジェクトのクラスは”認識タイプ”で実現可能と考えて問題ありません。 ●”認識タイプ” オブジェクト指向なら、 人は歩く、話す、・・・。Aさんは人。Aさんは話す。 カオス指向なら、 歩けるなら歩く、話せるなら話す、・・・。Aさんは歩ける、話せる、・・・。Aさんは話す。(歩ける・話せるを認識するようにした場合) 人は歩く、人は話す、・・・。Aさんは人。Aさんは話す。(人を認識するようにした場合) のどちらでも作成が可能で、 話せるなら話す、・・・。の場合、ウサギAの”認識タイプ”に話せるを追加することで、ウサギAは話せるようになります。 話せるウサギは実用的ではありませんが、 特定ユーザーのアクセスログだけ出力したい場合は、 処理を用意し、対象ユーザーに”認識タイプ”を追加することでログ出力処理を追加することが出来ます。 ●木構造と処理 ユーザー   日本     Aさん     Bさん   アメリカ     Cさん とある場合、 全ユーザーの処理をユーザーに保持 日本用の処理がある場合、日本に アメリカ用の処理がある場合、アメリカに処理を追加します。 そうすることでAさんは日本の処理、Cさんはアメリカの処理が行われます。 ●同一処理による関係 処理には優先順位が存在し、その順番で処理します。 処理A、処理Bとある場合、処理Aの中で元処理として実行します。 処理Aの中で元処理を行わない場合、処理Bは行われません。 ■カオス指向(仮)でどうなるか? ・幾つかのデザインパターンが不要になります。   デコレータ・コンポジット・ステートパターン等 ・多重継承らしきものが出来るようになります。   ※根本から違うので、多重継承らしきものとします。 ・循環問題が発生しませんない   ファイルフォルダのような木構造では循環は起こりえない。 ■オブジェクト指向プログラミングの問題点 オブジェクトにつき1クラスという決め付けが オブジェクト指向プログラミングにはあったのではないかと考えております。 オブジェクト指向では、 オブジェクト:クラス:継承クラスは1:1:1で、1:1:*は条件により可能ですが原則不可能。 カオス指向では、 オブジェクト:クラスは1:*と頭からクラスを複数持たせることで多重継承らしき形が実現可能ということです。 クラスの継承がなくなっていますが、クラスを複数持たせる事とクラスに順番を持たせることで継承が可能です。 オブジェクト指向プログラミングでは、オブジェクトにつき1クラスという決め付けが継承というシステムを作り 多重継承を難しくしたのではないかと考えております。

  • Flash ビルトインオブジェクトにメソッド追加?

    function abc(){ //処理 } という関数を_rootの1フレ目に定義します。 例えばこれを呼び出す時_root.abc();や_parent.abc();等という風に 呼び出す事が可能ですが、これをビルトインオブジェクト (例えばMathオブジェクト)に追加する事で、 どこからでも呼び出せると書いてあり、その場合は Math.abc=function(){ //処理 } と定義し、Math.abc();で呼び出す。とありました。 試してみたところ、上記スクリプトはAS1.0では動作しましたが AS2.0ではエラーが出ました。 上記同様の内容をAS2.0あるいはAS3.0で再現するには どうすればよいのでしょうか?(※2.0優先)

  • webクエリで

    少し判りにくいかもしれませんが webクエリで情報を取得するマクロを作ったのですが Sub テスト2() Const csCode As String = "URL;https://umanity.jp/racedata/race_7.php?code=XXXX" Dim strURL As String strURL = Get開催コード生成 strURL = Replace(csCode, "XXXX", strURL) Set出馬表取得 strURL Dim 処理前シート As Worksheet Dim 処理後シート As Worksheet Dim 元データ As Range Dim ws As Worksheet Set ws = ActiveSheet Set 処理前シート = ActiveSheet Set 処理後シート = Worksheets("テスト") Set 元データ = 処理前シート.UsedRange Function Get開催コード生成() As String Dim Y As String '年 Dim D As String '日付 Dim c As String '回 Dim A As String '場所 Dim T As String '日目 Dim r As String 'レース番号 With ThisWorkbook.ActiveSheet Y = Format(.Range("A2").Value, "0000") D = Format(.Range("B2").Value, "0000") A = Get場所コード(.Range("C2").Value) c = Format(.Range("D2").Value, "00") T = Format(.Range("E2").Value, "00") r = Format(.Range("F2").Value, "00") End With Get開催コード生成 = Y & D & A & c & T & r End Function 最後のRの部分の数字 例https://umanity.jp/racedata/race_7.php?code=2019042103010610の最後の10のところが指定した数値だけ増えていって取得できるようにしたいのですができますか 例えば指定した数値が3ならば https://umanity.jp/racedata/race_7.php?code=2019042103010610 https://umanity.jp/racedata/race_7.php?code=2019042103010611 https://umanity.jp/racedata/race_7.php?code=2019042103010612 みたいにできたらとおもっています なお数値の指定についてはG2でできたたらと思っています わかりにくくすいませんがよろしくおねがいします

  • ユーザー構造体

    以下のようなことはできないのでしょうか? Type TEST strData1 as String * 1 strData2 as String * 1 strData3 as String * 2 End Type Function BATCH() Dim Wk1 as String Dim Wk2 as TEST Wk1="TEST" Wk2=Wk1 * Wk2.strData1にT * Wk2.strData1にE * Wk2.strData1にSTが代入されるようなイメージ * 一般的はWk2.strData1=Mid(Wk1,1,1)とかですよね。 End Function どなたかわかる方ご教授してください。

  • オブジェクト名

    複数のWinsockを使用したいです。 オブジェクト名Winsock1~Winsock6があるとします。 例えば Dim i As Integer Dim strWinsock As String For i = 1 to 6 strWinsock = Winsock & i //処理 Next 上記のようなループで文字列strWinsockを、オブジェクト名として使用することはできないのでしょうか? また、もし他の方法があるようでしたら、教えて下さい。

  • 【VBA】入れ子のユーザー定義型

    閲覧ありがとうございます。 入れ子になってるユーザー定義型(構造体)に、値を代入する処理を抽象化したいのですが、上手くできません。 色々間違っているかもしれませんが、やりたいことのイメージは下のような感じです。 Private Type id kind As String memberId As String End Type Private Type items kind As String name As String id As id End Type sub main() (省略) Dim tmp As Variant tmp = jsonのレスポンスが1行ずつ配列で入ってる Dim items() As items items() = loading(tmp) (省略) End Sub Private Function loading(ByVal tmp As Variant) Dim pair() As Variant pair = Split(tmp, ":") Dim head As String Dim items() As items  If 末尾が"{"だったら、 If pair(0) = "{" then head = "items(0)" else if pair(1) = "{" then head = head & pair(1) Else head.pair(0) = pair(1) ←pair(0)は名前、pair(1)は値がそれぞれ入っている endif loading = items() End Function 説明が下手すぎてすみません。 実際は、もっとたくさん入れ子になっている為、抽象化できないと非常に困ります。 答えられそうだけど質問の意味をもう少しきちんと…ということであれば努力しますので、なんとか、よろしくお願いいたします。

  • class を使用した時の考え方について

    趣味として、プログラミングしているレベルです。職業としての開発経験はありません。 実際の開発業務においては、どちらが一般的なのか、教えて下さい。 例として、ファイル内の行数をを取り込む場合。(Excel VBA です。) Case 1 は、メイン処理の記述数が少ないのですが、クラス内での処理がネスト化しています。 Case 2 は、メイン処理で、一々関数を呼び出していますが、クラス内の関数は、独立しています。 ■ Case 1 -----メイン-------------------------------------------------- Dim argetFile As TargetFile Dim fileRowCount As Long Set targetFile = new TargetFile fileRowCount = targetFile.rowCount("c:\", "sample.txt") Set targetFile = Nothing -----TargetFile.cls-------------------------------------------------- private myFileName As String private myFileData As Variant ' ファイルを開く Private Function openFile() 'myFileName を開く処理 End Function ' ファイル内のデータを取り込む Private Function readFile() Call openFile() myFileData = ' myFileName 内データを取り込む処理 End Function ' ファイル内の行数を取得 Public Function rowCount(pPath As String, pFileName As String) As Long myFileName = pPath & pFileName Call readFile rowCount = 'myFileData から、行数を取得する処理 End Function ------------------------------------------------------- ■ Case 2 -----メイン-------------------------------------------------- Dim targetFile As TargetFile Dim fileRowCount As Long Set targetFile = new TargetFile Call targetFile.openFile("c:\", "sample.txt") Call targetFile.readFile fileRowCount = targetFile.rowCount Set targetFile = Nothing -----TargetFile.cls-------------------------------------------------- private myFileName As String private myFileData As Variant ' ファイルを開く Public Function openFile(pPath As String, pFileName As String) myFileName = pPath & pFileName 'myFileName を開く処理 End Function ' ファイル内のデータを取り込む Public Function readFile() myFileData = ' myFileName 内データを取り込む処理 End Function ' ファイル内の行数を取得 Public Function rowCount() As Long rowCount = 'myFileData から、行数を取得する処理 End Function -------------------------------------------------------

  • Functionでの戻り値のとり方

    こんばんわ。 以下のように、Functionで引数に配列を指定して、戻り値も配列で取得したいのですが、方法としては以下のようにしかできないのでしょうか? ------------------------- '配列を宣言 dim Ary() as string dim AryRet() as string '戻り値の配列 Call Get_Ary(Ary(),AryRet()) ------------------------- Function Get_Ary(Ary() as string , AryRet() as string) 'Ary()を参照して、AryRet()を取得する End Function という風に書いているのですが、Functionのところを以下のように 書くのは無理でしょうか? うまく取れないというのはやっぱ無理なのかな・・ ------------------------- '配列を宣言 dim Ary() as string dim AryRet() as string '戻り値の配列 AryRet() = Get_Ary(Ary()) Function Get_Ary(Ary() as string) As string 'Ary()を参照して、AryRet()を取得する 'それを関数の戻り値とする Get_Ary = AryRet(index) End Function このように書くと、配列の最後のインデックスの値だけ取れてしまう ようなんですが、、やっぱ配列で返すというのは上記のやり方でないと 無理なのでしょうか? 詳しい方ご教示願います。

  • オブジェクトの消滅と関数の戻り値オブジェクト

    public sub test1() { dim hoge as classX = tes2() test2.getHogehoge() } public Function test2() as classX { dim ret As New classX("初期化") return ret } 大変簡略化してますが上記2つの関数があった場合 関数test1でclassX型のアドレスhogeに、test2()が返す classX型オブジェクトの参照を代入しています。 でこの実体というかインスタンスretはtest2()の中の スコープで消滅する自動変数として生成されています。 んで実際関数test2を抜けるときretのインスタンスは 破棄されるのにtest1ではそれをhogeアドレスに代入して 使用していいのでしょうか?