Иметь слишком много уровней абстракции или инкапсуляции так же плохо, как и слишком мало
Основной смысл использования таких абстракций, как функции или символьные константы (или инкапсуляций, подобных определениям struct или class), заключается в улучшении читаемости программ. Не пользуйтесь ими просто потому, что вы можете делать это. Например, вложенные структуры в данном фрагменте не служат какой-либо полезной цели:
struct tree_node;
struct child_ptr
{
unsigned is_thread;
struct tree_node *child;
};
struct tree_node
{
struct child_ptr left,
right;
};
tree_node *p;
if( !p-left.am_a_thread )
p = p-left.child;
Следующий код лучше читается, потому что в нем меньше точек, и легче сопровождается, так как в нем нужно отлаживать на одно определение меньше:
struct tree_node
{
struct tree_node *left_child;
unsigned left_is_thread : 1;
struct tree_node *right_child;
unsigned right_is_thread : 1;
};
if( !p-left_is_thread )
p = p-left_child;