... и, вероятно, одна из тех статей, на которых основывалось ООП.
Не совсем, но это добавило к дискуссии, особенно для практиков, которые в то время были обучены разлагать системы, используя первые критерии, которые он описывает в статье.
Сначала я хочу знать, правильна ли моя оценка. Парадигма FP и эта статья философски не согласны?
Нет. Более того, на мой взгляд, ваше описание того, как выглядит FP-программа, ничем не отличается от любого другого, использующего процедуры или функции:
Данные передаются от функции к функции, каждая функция тщательно осведомлена о данных и «меняет их» на своем пути.
... за исключением части "интимности", поскольку вы можете (и часто делаете) иметь функции, работающие с абстрактными данными, именно для того, чтобы избежать интимности. Таким образом, у вас есть некоторый контроль над этой «интимностью», и вы можете регулировать ее по своему усмотрению, устанавливая интерфейсы (то есть функции) для того, что вы хотите скрыть.
Таким образом, я не вижу причин, по которым мы не смогли бы следовать критериям скрытия информации Parnas при использовании функционального программирования и в конечном итоге реализовать индекс KWIC с теми же преимуществами, что и его вторая реализация.
Предполагая, что они согласны, я хотел бы знать, что такое реализация сокрытия данных в FP. Это очевидно в ООП. У вас может быть личное поле, к которому никто за пределами класса не может получить доступ. Там нет очевидной аналогии этого для меня в FP.
Что касается данных, вы можете разработать абстракции данных и абстракции типов данных, используя FP. Любые из них скрывают конкретные структуры и манипуляции с этими конкретными структурами, используя функции в качестве абстракций.
РЕДАКТИРОВАТЬ
Растет число утверждений о том, что «сокрытие данных» в контексте FP не так полезно (или ООП-иш (?)). Итак, позвольте мне напечатать здесь очень простой и понятный пример из SICP:
Предположим, что ваша система должна работать с рациональными числами. Один из способов их представления - это пара или список из двух целых чисел: числителя и знаменателя. Таким образом:
(define my-rat (cons 1 2)) ; here is my 1/2
Если вы игнорируете абстракцию данных, скорее всего вы получите числитель и знаменатель, используя car
и cdr
:
(... (car my-rat)) ; do something with the numerator
Следуя этому подходу, все части системы, которые манипулируют рациональными числами, будут знать, что рациональное число - это cons
- они будут cons
числами создавать рациональные числа и извлекать их, используя операторы списка.
Одна из проблем, с которой вы можете столкнуться, - это необходимость сокращения рациональных чисел в уменьшенном виде - изменения потребуются по всей системе. Кроме того, если вы решите уменьшить во время создания, позже вы можете обнаружить, что сокращение при доступе к одному из рациональных терминов лучше, приводя к другому полномасштабному изменению.
Другая проблема заключается в том, что, если гипотетически, альтернативное представление для них предпочтительнее, и вы решаете отказаться от cons
представления - снова полномасштабное изменение.
Любые разумные попытки справиться с этими ситуациями, скорее всего, начнут скрывать представление рациональности за интерфейсами. В конце вы можете получить что-то вроде этого:
(make-rat <n> <d>)
возвращает рациональное число, числитель которого является целым числом, <n>
а знаменатель - целым числом <d>
.
(numer <x>)
возвращает числитель рационального числа <x>
.
(denom <x>)
возвращает знаменатель рационального числа <x>
.
и система больше не будет (и не должна) знать, из чего сделаны рациональные решения. Это происходит потому cons
, car
и cdr
не присущи рациональные числа, но make-rat
, numer
и denom
это . Конечно, это может быть система FP. Таким образом, «сокрытие данных» (в данном случае более известное как абстракция данных или попытка инкапсулировать представления и конкретные структуры) представляет собой актуальную концепцию и метод, широко используемый и исследуемый, будь то в контексте ОО, функционального программирования или без разницы.
И дело в том ... хотя можно попытаться провести различие между тем, какой «вид сокрытия» или инкапсуляция они выполняют (скрывают ли они проектное решение, структуры данных или алгоритмы - в случае процедурных абстракций), все они имеют одинаковую тему: они мотивированы одним или несколькими пунктами, которые Парнас сделал явными. То есть:
- Изменчивость: могут ли необходимые изменения быть сделаны локально или распространяться через систему.
- Независимое развитие: в какой степени две части системы могут развиваться параллельно.
- Понятность: какая часть системы требуется знать, чтобы понять одну из ее частей.
Приведенный выше пример взят из книги SICP, поэтому для полного обсуждения и представления этих концепций в книге я настоятельно рекомендую ознакомиться с главой 2 . Я также рекомендую ознакомиться с абстрактными типами данных в контексте FP, что приводит к другим проблемам.