Почему лучше иметь 100 функций, работающих с одной структурой данных, чем 10 функций с 10 структурами данных - PullRequest
62 голосов
/ 16 мая 2011

Я видел это во многих местах:

«Лучше иметь 100 функций, работающих с одной структурой данных, чем 10 функций с 10 структурами данных».- Алан Перлис

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

Ответы [ 2 ]

83 голосов
/ 28 мая 2011

Цитата Алан Перлис Эпиграммы по программированию , который был опубликован в 1982 году.

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

Lua , в качестве другого примера, использует таблицы для имитации классов . Зачем использовать таблицу для создания объектов, а не создавать классы уровня языка и объекты, как это делают объектно-ориентированные языки? Поскольку ваш объект теперь является таблицей, вы можете бесплатно использовать любое количество функций, определенных для таблиц вашего объекта! Более того, нам не нужно было загромождать язык синтаксисом, специфичным для класса, и нам пришлось переопределять функции из таблицы, которые мы хотим для нашего класса.

То, что сказал Перлис, определенно является видным способом мышления в Лиспе и в функциональном программировании в целом. Эти 100 функций в вашей единой структуре данных могут быть скомпонованы вместе множеством уникальных способов, поскольку все они работают с одной и той же структурой данных, но вы не можете реально смешать 10 функций и с 10 структурами данных, поскольку они были определены только работать над их конкретной структурой данных.

Более современный и простой вариант этого мышления в терминах абстракций . Если бы мы кодировали на Java, вы бы предпочли написать 100 функций в интерфейсе List или тот же набор из десяти функций, один раз для ArrayList, один раз для LinkedList, один раз для ....

8 голосов
/ 24 августа 2014

Структура и интерпретация компьютерных программ (SICP) отвечает на ваш вопрос следующим образом:

Screenshot from SICP

С оригинальным содержанием онлайн-версии книги можно ознакомиться здесь

РЕДАКТИРОВАТЬ (включено в комментарий):

«В Паскале множество декларируемых структур данных вызывает специализацию внутри функций». Специализация плоха, потому что она подавляет «случайность» / креативность - я бы сказал - своими словами.

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

Хорошим примером является fold (https://hackage.haskell.org/package/base-4.8.1.0/docs/Data-Foldable.html), который не зависит от структуры данных, общая функция более высокого порядка. Может использоваться в дереве, например

data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a).
...