Страница 66 из 93 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() будет продолжать работать без модификации, когда вы добавите новые фигуры в эту систему.
|