【问题标题】:Object Oriented Design - Convert C Application to C++面向对象设计 - 将 C 应用程序转换为 C++
【发布时间】:2012-07-24 20:03:29
【问题描述】:

我正在开始学习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 */
}

我已经考虑过了,我可能会看到两个类:

  • CWinAmount 将包含处理要放置在“纺车”上的货币金额的数据结构和函数。
  • CWheel 将封装车轮数据结构和控制车轮动画机制的函数。

但我只是不确定这是否是一个好的设计。

【问题讨论】:

  • 所以这是一个“相当小”的应用程序:)
  • 我想知道为什么 SO 用户认为适合对任何需要计划而不是编写代码的东西投反对票。似乎违反直觉。
  • @Desolator 我想是的。不到 400 行代码。我应该删掉一些示例代码吗?
  • 是的。这是一个 GiantWallOCode。我们通常不接受这一点。此外,无需为您的类添加前缀。
  • @JimNorton 是的,你应该 :)。大多数用户更喜欢阅读您遇到问题的代码片段。如果您真的想阅读所有代码,请将其放在 stackexchange.codereview 中。

标签: c++ c oop design-patterns


【解决方案1】:

我不会提供有关如何进行此类转换的确切细节(这完全取决于您)。但是,您描述的方法听起来像是一个完全合理的设计。通常,在将代码转换为 OO 时,我会发现最明显的具有共享状态的函数和结构分组并将它们包装在一起。然后我会查看剩下的函数,并尝试确定它们是否属于现有对象,是否有某种关系可以证明对它们进行分组,或者将它们保留为通用函数(如果我有选择的话)。

一般来说,转换为 OO 风格并没有什么秘密,大多数方法只是尝试将任何/所有共享状态/功能分组到块(对象)中。

【讨论】:

  • 感谢您的帮助。我很感激。
【解决方案2】:

在您的情况下,我会将数据保留在类本身之外,并更多地关注传递给它的数据值的功能。这使您的设计更具可扩展性,因为它不会将自己绑定到特定的数据集,并且更多地充当数据的函数而不是数据的传递者。

我一直认为 OOP 是一种在不依赖内部数据的情况下接收数据并通过各种过滤器对其进行转换的方式。这样,您可以对数据进行子类化和进一步过滤,并执行更具体的过滤。过滤器不包含数据,它实际上只包含执行过滤的功能。

因此,就像您描述的那样,您将拥有两个类,但它们会接收数据而不是封装数据。

【讨论】:

    【解决方案3】:

    您必须做的第一件事就是删除那些全局变量。他们正在破坏您的代码的任何可维护性。例如,Init 和 Destroy 方法可以很容易地成为构造函数和析构函数。

    【讨论】:

    • 感谢 DeadMG。我很感激。我对全局变量很懒惰。该应用程序最初只是用作概念证明的一段丢弃代码。这已不再是这种情况。完全转换为 C++ 时不会存在全局变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多