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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

Screenshot from SICP

Вы можете увидеть исходное содержимое онлайн-версию книги здесь

EDIT (включен в комментарий):

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

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

Хорошим примером является 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).