Правила программирования на С и С++. Главы 1-6 - Применяйте указатели на функции С в качестве селекторов
ОГЛАВЛЕНИЕ
59. Применяйте указатели на функции С в качестве селекторов.
Это правило строго для программистов на С. (Программирующие на С++ должны использовать виртуальные функции). В С заменяйте подобный код:
typedef enum shape_type { CIRCLE, LINE, TEXT };typedef struct
{
shape_type type;
union shape_data
{ // здесь данные для различных форм.
} data;
} shape;
extern void print_circle( shape *p );
extern void print_line ( shape *p );
extern void print_text ( shape *p );
shape a_circle = { CIRCLE, ... };
print_shape( shape *p )
{
switch( p->type )
{
case CIRCLE: print_circle( p );
case LINE: print_line ( p );
case TEXT: print_text ( p );
}
}
на следующий: typedef struct{
void (*print)( struct *shape );
union shape_data;
{ // здесь данные для различных фигур.
}
}
shape;
extern void print_circle( shape *p );
extern void print_line ( shape *p );
extern void print_text ( shape *p );
shape a_circle = { print_circle, ... };
print_shape( shape *p )
{
( p->type )( p );
}
Главные преимущества такого подхода заключаются в следующем:- Вам больше не нужен перечислитель shape_type.
- Функцию print_shape() теперь написать гораздо проще.
- print_shape() будет продолжать работать без модификации, когда вы добавите новые фигуры в эту систему.