Применяйте указатели на функции Си в качестве селекторов
Это правило строго для программистов на Си. (Программирующие на Си++ должны использовать виртуальные функции). В Си заменяйте подобный код:
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()
будет продолжать работать без модификации, когда вы добавите новые фигуры в эту систему.