5

私は学習のプロセスを開始していC++ますobject oriented design。手続き型コードをオブジェクト指向コードに変換するための既知の/一般的な手法は何ですか?次のコードでは、どのような設計上の選択が意味がありますか?

typedef struct
{
    int sector;
    int sectorPos;
}EndPosition;

typedef struct
{
    int rotateAngles;
    double brakingFactor;
}WheelStop;

WheelStop stops[][6] =
{
     /* data removed for brevity */
};

typedef struct
{
    int numImages;      /* Number of images in win amount string */
    int pixWidth;
    int indexes[7];     /* indexes into NumberImages[] */
}WinAmountData;

typedef struct
{
    int xOffset;    /* pixel count offset before next digit */
    std::string fileName;
    //char fileName[20];
    cairo_surface_t *image; 
}ImageInfo;

ImageInfo NumberImages[] =
{
     /* data removed for brevity */
};

enum { DOLLAR = 10, EURO, POUND, YEN };

double DegreesToRadians( double degrees )
{
    return((double)((double)degrees * ( (double)M_PI/(double)180.0 )));
}

int InitImages( void )
{
     /* uses NumberImages */
}


void DestroyNumberImages( void )
{
      /* uses NumberImages */
}

int ParseWinAmountString( char *string, WinAmountData *amtData )
{
        /* uses WinAmountData and enum */
}

gboolean rotate_cb( void *StopPos )
{
      /* uses EndPosition and stops */
}

static gboolean on_expose_event(GtkWidget *widget, GdkEventExpose *event, gpointer data)
{
     /* uses CairoImage class */
}

static void destroy (GtkWidget *window, gpointer data)
{
     /* cleanup GTK stuff */
}

私はそれにいくつかの考えを与えました、そして私は多分2つのクラスを見ることができます:

  • CWinAmountこれには、「スピニングホイール」に配置される通貨額を処理するデータ構造と関数が含まれます。
  • CWheelこれは、ホイールアニメーションの仕組みを制御するホイールデータ構造と関数をカプセル化します。

しかし、これが良いデザインかどうかはわかりません。

4

3 に答える 3

2

あなたの場合、私はデータをクラス自体から除外し、データ値が渡された機能をさらに調べます。これにより、特定のデータセットに結び付けられず、データの配信者ではなくデータに対する機能として機能するという点で、設計がより拡張可能になります。

私は常に、OOPを、内部データに依存せずにデータを取り込み、さまざまなフィルターを介して変換する方法と考えてきました。このようにして、データをサブクラス化してさらにフィルタリングし、より具体的なフィルタリングを実行できます。フィルタにはデータは含まれていません。実際には、フィルタリングを実行する機能のみが含まれています。

したがって、説明したのと同じように2つのクラスがありますが、それらはデータをカプセル化する代わりに取り込みます。

于 2012-07-24T20:06:26.093 に答える
2

そのような変換を行う方法の正確な詳細を提供するつもりはありません(それは本当にあなた次第です)。しかし、あなたが説明したアプローチは、完全に合理的な設計のように聞こえます。一般に、コードをOOに変換するとき、共有状態を持つ関数と構造体の最も明白なグループを見つけて、それらをまとめます。次に、残っている関数を調べて、それらが既存のオブジェクトに属しているかどうか、グループ化を正当化できる関係があるかどうか、またはジェネリック関数として残すかどうかを判断します(オプションがある場合)。

一般に、OOスタイルに変換する秘訣はなく、ほとんどのアプローチは、共有状態/機能の一部またはすべてをブロック(オブジェクト)にグループ化しようとするだけです。

于 2012-07-24T20:11:46.217 に答える
1

あなたがしなければならない一番のことは、それらのグローバル変数をカットすることです。彼らはあなたのコードから保守性の類似性を破壊しています。たとえば、InitメソッドとDestroyメソッドは、簡単にコンストラクタとデストラクタになります。

于 2012-07-24T20:42:15.137 に答える