Подтвердить что ты не робот

"Плоский лучше, чем вложенный" - как для данных, так и для кода?

Этот вопрос меня задумал: следует ли применять принцип, согласно которому "квартира лучше, чем вложенная" , а также код? Даже когда есть "логическая древовидная структура" для данных?

В этом случае, я полагаю, это означало бы представлять детей как список идентификаторов, а не фактический список детей, со всеми узлами в одном списке:

[ {'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 здесь вместо пустого потому что это усложняет логику, и "особые случаи не являются достаточно специальными" - здесь это не является особым.)

Конечно, это короче, но древовидная структура скрыта. Это противоречит "явным лучше, чем неявным"?

Лично я считаю, что "квартира лучше, чем вложенная" имеет ограниченную применимость и нигде рядом с самым важным аспектом Дзэн. (Конечно, я не мог сделать много приятных функционально-программирующих вещей, которые я делаю, если не позволял себе значительную вложенность.) Я подозреваю, что проблема с "вложенными" заключается в том, что для понимания информации требуется контекстное переключение. Я действительно думаю, что это больше проблема, когда вы следуете императивной логике, чем для анализа данных или кода функционального стиля, - где проще просто мысленно назвать вложенный блок и рассматривать его работу отдельно от внешнего контекста.

Что ты говоришь?

4b9b3361

Ответ 1

Я бы тоже не предпочел, но предпочитаю то, что лучше всего подходит для задачи.

Если структура важна, вложенность делает жизнь простой. Если вы регулярно работаете над каждым node, плоская структура упрощает использование for node in tree. Конечно, если вы определяете свой собственный класс, его достаточно легко абстрагировать его, поэтому оба варианта просты; но это может быть сложнее использовать с внешними системами, такими как преобразование в JSON.

Ответ 2

Это совершенно субъективный вопрос. Ответ: "Это зависит".

Это зависит от основного использования ваших данных. Если вам постоянно приходится ссылаться на вложенную структуру, тогда имеет смысл представлять ее таким образом. И если вы никогда не ссылаетесь на плоское представление, кроме как при построении вложенной структуры, то почему вообще существует плоская структура?

"Плоское" представление является одной из основ модели реляционной базы данных: каждый тип данных существует в таблице только для этого типа, и любые отношения между элементами содержатся в отдельных таблицах. Это полезная абстракция, но порой трудно работать с кодом. С другой стороны, обработка всех данных определенного типа тривиальна.

Рассмотрим, например, если я хотел найти все потомки записи с id 2 в ваших данных примера. Если данные уже находятся в иерархии (т.е. Нативное представление представляет собой "вложенную" структуру), тогда тривиально найти идентификатор записи 2, а затем пересекать его детей, детей-детей и т.д.

Но если собственное представление является последовательным, как вы его показали, я должен пройти весь набор данных, чтобы создать иерархическую структуру, а затем найти запись 2 и ее дочерние элементы.

Итак, как я уже сказал, "это зависит".

Ответ 3

следует ли применять принцип "плоский лучше, чем вложенный" к данным, а также к коду?

Нет.

Даже если в данных есть "логическая древовидная структура"?

То, что "квартира лучше, чем вложенное", не относится к данным. Только для кода.

... древовидная структура закрыта. Это противоречит "явным лучше, чем неявным"?

Это даже не сравнимо. "Плоское дерево" является общей реализацией SQL, потому что SQL не может обрабатывать неопределенную рекурсию соответствующего дерева.

Сравнение Zen Python (языка) с дизайном структуры данных бессмысленно. Эти два не более сопоставимы, чем число "2" и разделяют кирпич сыра на "2" штуки. Одна вещь, другая - действие.

Структуры данных - это вещи.

Python описывает действия.

Ответ 4

Это противоречит "явному" лучше, чем неявное "?

Да, особенно когда явное запрещение вам неявно стрелять в ногу. "Дерево" в вашем примере может иметь несколько родителей, которые утверждают, что владеют одними и теми же детьми. Он также может иметь несколько корневых узлов (и он: 2 является корнем node; 4 - это корень, а также лист node.)

Ответ 5

На этот вопрос нельзя ответить "вообще" - нет правильного ответа.

В этом конкретном примере мне действительно нравится древовидная структура. Не зная ничего о оригинальном приложении и просто глядя на структуру, связь между элементами очевидна. С плоской структурой я должен прочитать некоторую документацию или код приложения, чтобы "знать", что ваш кортеж детей относится к id.

Древовидная структура самодокументирована - плоская структура не является.

Ответ 6

"Все должно быть сделано как можно проще, но не проще". Плоский проще, чем вложенный. Если вы имеете дело с данными с соответствующим вложением, то сглаживание, вероятно, нарушает "но не более простую" часть. Вместо этого я взял Zen Python, чтобы поощрять вас не усложнять вашу жизнь вложением, которое вам действительно не нужно, например, файл конфигурации XML, где может быть достаточно простой формат.