Этот вопрос заставил меня задуматься: должны ли мы применять принцип, согласно которому «плоские данные лучше вложенных» как для данных, так и для кода? Даже когда есть «логическая древовидная структура» для данных?
В этом случае, я полагаю, это будет означать представление детей в виде списка идентификаторов, а не фактического списка детей со всеми узлами в одном списке:
[ {'id': 4, 'children': ()},
{'id': 2, 'children': (1, 7)},
{'id': 1, 'children': (6, 5)},
{'id': 6, 'children': ()},
{'id': 5, 'children': ()},
{'id': 7, 'children': (3,)},
{'id': 3, 'children': ()} ]
(Я использовал кортежи, потому что я предпочитаю не давать себе гибкости при мутировании объекта, пока эта гибкость не окажется полезной и понятной для использования. В любом случае, я бы никогда не использовал None
здесь вместо пустого последовательность, потому что это усложняет логику, и «особые случаи не достаточно особенные» - здесь, это вовсе не особенное.)
Конечно, это короче, но древовидная структура скрыта. Означает ли это, что «явное лучше, чем неявное»?
Лично я считаю, что «квартира лучше вложенной» имеет ограниченную применимость и нигде не приближается к самому важному аспекту дзен. (Конечно, я не смог бы сделать много приятных вещей, связанных с функциональным программированием, если бы я не позволил себе значительную вложенность.) Я подозреваю, что проблема с «вложенными» заключается в том, что при переключении информации требуется переключение контекста. Я действительно думаю, что это больше проблема, когда следует императивной логике, чем для анализа данных или кода функционального стиля - когда проще просто мысленно назвать вложенный блок и рассмотреть его работу отдельно от внешнего контекста.
Что скажете вы?