以下の例1のようなことと、
同じ親クラスを継承することなく(例2のような形で)、実現するのは、
何というデザインパターンでしょうか?
//------------------------
◆例1:普通の実装
//データ操作の抽象クラス
Class DataManagementInterface
virtual get_data(std::string) = 0
//データ操作(データベース) ※戻り値はデータテーブルクラス
Class DBManagement : DataManagementInterface
virtual data_table_class get_data(std::string)
//データ操作(ファイル) ※戻り値はファイルクラス
Class FileManagement : DataManagementInterface
virtual file_class get_data(std::string)
//------------------------
◆例2:インタフェースを統合するようなイメージの実装
//データ操作(データベース)
Class DBManagement
virtual void* get_data(std::string)
//データ操作(ファイル)
Class FileManagement
virtual get_data(std::string)
Class DataManagementInterface
virtual get_data(std::string, int 操作区分)
get_dataの実装
if 操作区分が1なら、
DBManagementのget_data
else if
操作区分が2なら、FileManagementのget_data
//------------------------
また、ちなみにですが、
後者の方法で、戻り値が不定(データテーブルクラスか、ファイルクラスを返す)
ことは不可能という認識ですが、「できない」で合ってますか?
.
No.2ベストアンサー
- 回答日時:
後者は条件付きディスパッチャでしょうか。
戻り値についてはvoid*等で任意型を返したりはできるのではないでしょうか。
ありがとうございます。
void*まではせず、親クラスのポインタでやろうと思います。
(条件付きディスパッチャを、コマンドパターンに移行しようと思います)
以下のようにしようと思います。
・準備
ファイルアクセスクラスや、データベースアクセスクラスの親となる、「データ操作クラス型のポインタ」をメンバ変数に持っておく。
・実装
(1)で用意した抽象的なハンドラで、
executeなり、runなり、getほにゃららなり、setほにゃららを実行
No.1
- 回答日時:
残念ながらこれはデザインパターンではなくアンチパターンに分類されるものでしょう。
なぜならば、後者のようなコードを極力なくすためのオブジェクト指向的な解法が前者のコードだからです。
後者の場合、一連のデータ操作処理が終わるまで使う側が操作区分の値を覚えておく必要がありますが、前者の場合はどちらの処理を行うかを意識するのはデータ操作クラスのインスタンスを生成する際にだけです。
また、新たなデータ操作方法が増えた場合に、新しい方法でのデータ操作クラスの追加に加えて手を入れる必要があるのは、前者ならばクラスの生成部分だけで済みますが、後者ならば DataManagementInterface の各メソッドに広がります。
後者のケースはアンチパターンです。
普通は、
「◆例1:普通の実装」にあるように、
抽象的な共通のインタフェースを親クラスとして設計し、
派生クラスで多様化しますよね。
そのような質問ではないのです。
//--------------------------------
「◆例1:普通の実装」ではないような、
後者のパターンを、一般的なデザインパターンに落とし込む方法は、私はうろ覚えになってしまったのですが、何個かあります。
そのパターンを思い出させて欲しいのです。
また、その実装方法(デザイン)の名前や資料を知りたいのです。
.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JTextFieldの入力制限
-
c++でのヘッダーファイルの循環...
-
マッピングとは?
-
フレームワークによくあるイン...
-
インタフェースのstatic変数(Java)
-
抽象クラスをJUNITでテストする...
-
private継承はどう使う?
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
C#でフォームのオブジェクト名...
-
VBA 同じ名前のオブジェクトを...
-
変数名の付け方
-
C# でメソッドに送られてきたOb...
-
河合塾のクラス分けについて
-
C# インスタンスの破棄
-
tryの終了
-
Javaの問題なんですが、(this==...
-
Javaでブラウザ判定
-
同じクラスにならない確率を教...
-
DataGridViewでセルクリックイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ラッパークラス」の存在意義...
-
C# 「データが失なわれる可能性...
-
VB DLLプロジェクトについて
-
抽象クラスをJUNITでテストする...
-
「継承されたメソッドの可視性...
-
インターフェースとトレイトっ...
-
c++でのヘッダーファイルの循環...
-
JavaでのAPIの覚え方ってみさな...
-
(vba)他のアプリケーションの右...
-
ASP.NETでの共通コードの書き方...
-
なぜForm型にキャストするので...
-
vb.net 自作プロパティの削除に...
-
【C#】クラスのコンストラクタ...
-
委譲って何ですか?
-
interface,extend,implementの...
-
Javaのインスタンス化の構文の...
-
オーバーライドとラッパーの違い
-
Commons-Discovery.jarとは?
-
JTextFieldの入力制限
-
C#からDLLを呼びたいのですが・...
おすすめ情報