... і, ймовірно, одна з тих статей, на яких базувався ООП.
Не дуже, але це додало до дискусії, спеціально для практикуючих, які в той час були навчені розкладати системи, використовуючи перші критерії, які він описав у статті.
Спершу я хочу знати, чи моя оцінка правильна. Чи не узгоджується парадигма ФП та ця стаття по-філософськи?
Ні. Крім того, на мій погляд, ваш опис того, як виглядає програма FP, не відрізняється від будь-якої іншої, яка використовує процедури чи функції:
Дані передаються від функції до функції, причому кожна функція ретельно усвідомлює дані та "змінює їх" по дорозі.
... за винятком "інтимної" частини, оскільки ви можете (і часто це робити) функціонувати на абстрактних даних, саме щоб уникнути близькості. Таким чином, у вас є певний контроль над цією "близькістю", і ви можете регулювати її як завгодно, встановивши інтерфейси (тобто функції) для того, що ви хочете приховати.
Отже, я не бачу жодної причини, чому ми не змогли б дотримуватися критеріїв Парнасу інформації, що приховується за допомогою функціонального програмування, і в кінцевому підсумку реалізувати індекс KWIC з аналогічними загостреними перевагами, як і його другий варіант.
Припускаючи, що вони згодні, я хотів би дізнатися, що таке FP-реалізація приховування даних. Очевидно це бачити в OOP. Ви можете мати приватне поле, до якого не може отримати доступ ніхто поза класом. Очевидною аналогією мені це у FP немає.
Що стосується даних, ви можете розробити вилучення даних та абстрагування типів даних за допомогою FP. Будь-яка з них приховує бетонні конструкції та маніпуляції з цими бетонними конструкціями, використовуючи функції як абстракції.
EDIT
Тут зростає кількість тверджень, що стверджують, що "приховування даних" в контексті ПП не є настільки корисним (або OOP-ish (?)). Отже, дозвольте мені навести тут дуже простий і зрозумілий приклад з 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
це . Звичайно, це легко може бути системою ПП. Отже, "приховування даних" (в даному випадку більш відоме як абстракція даних або зусилля по інкапсуляції уявлень і конкретних конструкцій) є відповідною концепцією і методом, широко використовуваним і дослідженим, чи то в контексті ОО, функціонального програмування чи що завгодно.
І справа в тому, що ... хоч можна спробувати розрізнити, що таке "приховування" чи інкапсуляція вони роблять (чи приховують вони проектне рішення, або структури даних чи алгоритми - у випадку процедурних абстракцій), всі вони мають однакову тему: вони мотивовані одним або кількома пунктами, які Парнас зробив явним. Це є:
- Змінність: чи потрібно внести необхідні зміни на локальному рівні або поширити через систему.
- Самостійний розвиток: наскільки дві частини системи можна розвивати паралельно.
- Дослідність: яка частина системи потрібна, щоб знати, щоб зрозуміти одну з її частин.
Наведений вище приклад взятий з книги SICP, тому для повного обговорення та представлення цих понять у книзі я настійно рекомендую переглянути розділ 2 . Я також рекомендую ознайомитись з абстрактними типами даних у контексті FP, що вносить інші питання до таблиці.