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