我正在开始学习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
它将封装控制轮动画机制的轮数据结构和函数。但我不确定这是不是一个好的设计。
答案 0 :(得分:2)
在你的情况下,我会将数据保留在类本身之外,并且在传递给它的数据值的功能上更加如此。这使得您的设计更具可扩展性,因为它不会将自身绑定到特定的数据集,而更多地作为数据的函数而不是数据的传递者。
我一直认为OOP是一种在不依赖内部数据的情况下接收数据并通过各种过滤器转换数据的方法。这样,您可以子类化并进一步过滤数据并执行更具体的过滤。过滤器不包含数据,它实际上只包含执行过滤的功能。
因此,您将拥有两个类,就像您所描述的那样,但它们会接受数据而不是封装它。
答案 1 :(得分:2)
我不打算提供有关如何进行此类转换的确切详细信息(这完全取决于您)。但是,您描述的方法听起来像是一个非常合理的设计。通常在将代码转换为OO时,我会找到最明显的函数和结构分组,并将它们包含在一起。然后我看看剩下的函数是什么,并尝试确定它们是否属于现有对象,有一些可以证明对它们进行分组的关系,或者将它们保留为通用函数(如果我有选项)。
一般来说,转换为OO风格并不是秘密,大多数方法只是尝试将任何/所有共享状态/功能分组为块(对象)。
答案 2 :(得分:1)
你要做的第一件事就是削减那些全局变量。它们正在破坏代码中任何可维护性的外观。例如,Init和Destroy方法很容易就是构造函数和析构函数。