• 締切済み

オブジェクト指向による座標変換とクラス構造

オブジェクト指向的プログラミングをすると以下はどうなるのか、結構悩んでおります。 流れ: 或る物体が有る  ・位置情報算出のためのパラメータを変数にセット  ・時刻情報を入れ、上記パラメータより、或る時刻における位置が求まる   (計算に必要なパラメータを代入したら時刻情報がたぶん唯一の引数になります)  ・原点はそのままでXYZ軸に対して回転座標変換を施す  ・結果が求まる。 悩み: 初めに与えたパラメータを保持しておきたい。 座標変換を行った前と変換後の座標も保持しておきたい。 こういった場合、どういうアプローチが良いのでしょうか? 従来型のプログラミングですと構造体を引き回すことになりますが、パラメータと変換後の座標を独立して保持することになり、スマートな気がしません。 折角オブジェクト指向を使うので出来れば全て1パックにしておくのが望ましいと思うのですが、メンバ、メソッド…どうすれば良いのか分からず、こちらで質問させていただきます。 よろしくお願いします

みんなの回答

回答No.3

ある決まった一連の処理をするだけという場合には、オブジェクト指向は特に有効というわけではありません。 オブジェクト指向は、オブジェクト同士がメッセージをやりとりするというパラダイムで、情報のカプセル化というのは、あまり本質的ではありません。 さて、この場合、 物体 というクラスの一例(=インスタンス)が、「ある物体」になります。 物体にやって欲しいことは、 ・位置情報算出のためのパラメータを与えたい ・特定の時刻における位置を知りたい ・座標変換をしたい ・座標変換の前後の座標値を教えて欲しい と言うことになるかと思います。 これらの要求がある程度独立して行われるのであれば、オブジェクト指向は有効です。 逆に、必ず、この順序で処理をするのであれば、構造体を使い回した方が自然だと思います。 構造体だとしても、パラメータや変換後の座標をさらにメンバーとするような構造体を定義すれば、ひとまとめに処理することはできます。 さて、オブジェクト指向でいくのであれば、上記の「やって欲しいこと」がすなわち、メソッドになります。 そして、C++では普通メソッドをメンバ関数で表します。 上記のようなそれぞれのメソッドを実行するためには、ある程度の情報を自分で持つ必要があります。それが、インスタンス変数と呼ばれるもので、C++では、これをデータメンバで表します。 おおざっぱにはこんな感じになりますか。

_cosmic_
質問者

お礼

> 情報のカプセル化というのは、あまり本質的ではありません。 そうでしたか、なるほどです。 出来る限りワンパックにとずっと考えていました。 処理の順序は、回答いただいたとおりです。 丁寧な回答有り難う御座いました。 特に構造体の部分は、自分が考えすぎていて見落としていた部分もあり非常に参考になりました。

回答No.2

自分の場合は「こうする」というのを勝手に書きます。参考になりますように。 1.まず、「システムの名称」を決める。ただし、一言で言えること。  例えば、「移動物体の座標変換システム」など。 2.上記の名称の構成要素を説明していく。  例えば  2.1「移動物体」とは「移動」する「物体」である。  2.2「座標変換」とは「直交座標」から「回転座標」に変換することを言う 3.上記をさらに細かく説明する。  3.1「移動」とは「等速直線運動」である。  3.2「物体」とは「点」である。  3.3「直交座標」とは互いに「直行」する「xyz軸」を持つ「座標系」である  3.4「回転座標」とは角度「θΦ」と「原点」からの「距離」「R」であらわされる「座標系」である。 4.さらに細かくどんどん続ける・・・。 と、いいかげんやめたくなります(笑)。 そこまでで、説明した全ての文言がクラス、説明した動作がクラス又はメソッドになります。つまり、  A.アプリケーションは「移動物体の座標変換システム」クラス  B.これには「移動物体」クラスと「座標変換」クラスがあり。  C.「移動物体」クラスには「等速直線運動」クラスと「点」クラス。  D.「座標変換」クラスには「直行」と「回転」「座標系」クラスがあり  E.また「変換」クラスまたはメソッドが存在する。 ・・・・らしいと。たぶん「速度」クラスがあるはずなので「時刻」と「時間」クラスもあるだろう。 てな感じ。

_cosmic_
質問者

お礼

ありがとうございます。 3・・・くらいで止めたくなっちゃいますね、結構な要素に分解できるようですね。これはゆっくり考えないと自分にはいきなり難問なのでじっくり考えさせてくださいませ。 回答有り難う御座いました

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

> パラメータと変換後の座標を独立して保持することになり 独立して保持するのが嫌なら、コンストラクタなりで入力するように して、必ずメンバに持たせればいいんじゃないでしょうか? ・位置情報を決めるには、パラメータ+時間が必要 ・変換された座標値は、オリジナルの位置情報を持つ class Parameter { private:  hoge1;  hoge2;  hoge3; public:  Parameter(hoge1, hoge2, hoge3); }; class Coord{ private:  x;  y;  z; public:  Coord(x, y, z); } class PositioningInfo {   Parameter parm;   Time   time;   Coord   pos; public:   PositioningInfo(Parameter, Time);   Coord GetPos(); }; class CalculatedCoord : Coord { public:   PositioningInfo baseData;   CalculatedCoord(Positioning_info); }; ざくっと読みながら書いただけなので、型とかテキトーだし、 スマートじゃないかもしれないけど元データが何だったかってのは、 PositioningInfoを辿っていけばわかるけど。

_cosmic_
質問者

お礼

>独立して保持するのが嫌なら、コンストラクタなりで入力するように >して、必ずメンバに持たせればいいんじゃないでしょうか? はい、この辺も悩みだったりします。 書いていただいた骨組みだと、自分が思っていたのよりスッキリしている気がします。 ちょっと自分には早すぎたかなぁ・・・ ご回答有り難う御座いました。

関連するQ&A

専門家に質問してみよう