Правила программирования на Си и Си++


Применяйте указатели на функции Си в качестве селекторов


Это правило строго для программистов на Си. (Программирующие на Си++ должны использовать виртуальные функции). В Си заменяйте подобный код:

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()

будет продолжать работать без модификации, когда вы добавите новые фигуры в эту систему.



Содержание раздела