ПП для моделювання та моделювання


12

Я збираюся розпочати проект моделювання / моделювання. Я вже знаю, що OOP використовується для подібних проектів. Однак вивчення Haskell змусило мене розглянути можливість використання парадигми FP для моделювання системи компонентів. Дозвольте мені детальніше:

Скажімо, у мене є компонент типу A, який характеризується набором даних (такий параметр, як температура чи тиск, PDE та деякі граничні умови тощо) та компонент типу B, який характеризується різним набором даних (різними або той же параметр, різні PDE та граничні умови). Припустимо також, що функції / методи, які будуть застосовані до кожного компонента, однакові (наприклад, метод Галеркіна). Змінний стан об'єкта буде використовуватися для непостійних параметрів.

Якби я використовував підхід OOP, я створив би два об'єкти, які інкапсулювали б дані кожного типу, методи вирішення PDE (спадкування буде використано тут для повторного використання коду) та рішення для PDE.

З іншого боку, якби я використовував FP-підхід, кожен компонент був би розбитий на частини даних та функції, які діятимуть на дані, щоб отримати рішення для PDE. Нестабільні параметри передаються як функції чогось іншого (наприклад, час) або виражаються якоюсь мінливістю (емуляція змінності тощо). Цей підхід мені здається більш простим, якщо припустити, що лінійні операції над даними були б тривіальними.

На закінчення, чи було б реалізація підходу FP насправді простішою та простішою в управлінні (додати інший тип компонента чи новий метод вирішення pde) порівняно з OOP?

Я походжу з C ++ / Fortran, плюс я не професійний програміст, тому виправте мене з усього, що я помилився.

Відповіді:


7

Добре запитання, я розмірковував у подібних напрямках. Історично парадигма OO виникла з необхідності комп'ютерного моделювання - див. Історію Simula - і незважаючи на ранні мови OO, такі як Smalltalk, які складаються людьми, які знали, що вони роблять (наприклад, Алан Кей), OO зараз, мабуть, надмірно використовується і приносить занадто багато випадкових складностей .

Як правило, програми в стилі FP будуть коротшими, простішими для тестування та легшими для зміни, ніж програми OO. Як Роб Харроп висловився у своїй розмові, чи функціонує майбутнє? , ви ніколи не можете отримати простіші за функції та дані; вони складаються нескінченно, щоб будувати будь-які абстракції. Отож, один із способів відповісти на ваше запитання (чи я його просто перевстановлюю? :) - запитати, як виглядає функція найвищого рівня та вхідні дані вищого рівня -> вихідні дані? Тоді ви можете почати розбивати ці "альфа" функції та типи даних на наступний рівень абстракцій та повторювати за необхідності.

Ще одна точка зору (не зовсім відповіді) на ваше запитання - це поглянути на цю тему (відмова, я її почав) на StackOverflow, деякі відповіді дуже цікаві: /programming/3431654/how-does- функціональне програмування - застосувати до моделювання

Моя власна думка на даний момент полягає в тому, що якщо ви не моделюєте ситуацію, коли дійсно існують дискретні об'єкти, які взаємодіють лише певними способами (наприклад, модель комп’ютерної мережі) - і таким чином безпосередньо відображати можливості чистого повідомлення, мова прохідної парадигми OO - простіше перейти на FP. Зауважте, що навіть у спільноті програмування ігор - де симуляції є дуже поширеними та вимоги до продуктивності є першорядними - досвідчені розробники відходять від OO-парадигми та / або використовують більше FP, наприклад дивіться цю дискусію HN або коментарі Джона Кармака щодо FP


Добре знати, що я не єдиний, хто сумнівається в OOP в симуляції і дякую за відповідь на моє запитання! Я читав коментарі Джона Кармака щодо FP і думав про те, щоб реалізувати деякі аспекти FP на C ++ (скопіювати об'єкти або зібрати вхід і передати його функції), але потім знову не знаю, чи варто починати свій проект із C ++ замість мови FP, як Haskell, як аспекти FP вбудовані, і ви виражаєте змінні лише тоді, коли це потрібно. Ви продовжували використовувати Clojure або FP взагалі, вважаючи, що у вас були подібні проблеми / питання?
heaptobesquare

@heaptobesquare - Так, я невпинно нарощував мій Clojure-fu з метою написання в ньому симуляцій. Нічого ще не готове до показу, але я не бачу жодних стопорів, і дизайн Clojure прекрасно прагматичний, наприклад, ви можете використовувати перехідні / мутаційні, якщо потрібно, плюс його агенти добре підходять для асинхронних аспектів. У якийсь момент (жодних обіцянок, коли) я напишу статтю на тему ...
ліміст

Я поглянув на Clojure, але не можу сказати, що мені подобаються S-вирази. Я знаю, що це практично (код Lisp - це дані), але чи легко до нього звикнути?
heaptobesquare

@heaptobesquare - синтаксис s-вирази / Lisp насправді дуже легко звикнути; спершу виберіть хорошого редактора (Emacs або vim, мій голос - за Emacs, див. dev.clojure.org/display/doc/Getting+Started+with+Emacs ), який має режим для Clojure, отримайте хорошу книгу (наприклад, програмування Clojure ), і почніть хакерство. Через щонайбільше декількох тижнів синтаксис відійде на другий план, як слід - це так ідеально послідовно, що ви будете думати про нього експоненціально рідше і звільнити ментальні цикли для більш важливих речей. :)
ліміст

Я обов'язково спробую тоді. Гомоіконічність Ліспа зрештою цікава.
heaptobesquare

2

ІМХО майже на кожне завдання розумної складності на питання "це стиль FP або стиль OOP, кращий вибір" не можна відповісти об'єктивно. Зазвичай у такій ситуації питання не є "ні FP, ні OOP", а як поєднати найкращі частини обох парадигм для вирішення вашої проблеми.

Проблема, яку ви окреслили вище, здається, дуже математичною, і я гадаю, що вам знадобиться кілька матричних операцій. OOP дуже хороший для моделювання абстрактних типів даних, і матричне обчислення може бути легко реалізовано як "матричні об'єкти" з операціями над матрицями. Реалізація цього способу, коли всі операції з матрицею є частиною матричного класу, допомагає вам згуртовувати речі, які належать разом, і таким чином підтримує хорошу загальну структуру.

З іншого боку, PDE - це рівняння функцій, і рішення може знову функціонувати. Тож використання функціонального підходу для цього типу "компонентів" може здатися природним. Ці функції можуть мати параметри матриці, показуючи один приклад того, як поєднувати OOP і FP. Іншим прикладом може бути реалізація класу матриць, який використовує функціональні інструменти для відображення певної операції на кожен елемент вашої матриці. Тож і тут не найкращі результати приносять не "OOP проти FP", а "OOP у поєднанні з FP".


Спасибі за вашу відповідь! Отже, якщо я де використовувати C ++, інкапсулював би лише дані (тобто параметри, граничні умови та PDE у матричній формі) компонента до об'єкта та визначаючи функції (навіть деякі вищі порядку, у випадку a Параметр - це функція чогось іншого), поза сферою об'єкта, яка б діяла на дані об'єкта, бути ефективною?
heaptobesquare

@heaptobesquare: чесно, я не можу сказати, чи буде це ефективно у вашому випадку. Спробуйте, подумайте великим, почніть з малого. Почніть програмувати деякий "код відстеження" ( artima.com/intv/tracer.html ), щоб дізнатися, що найкраще працює, а що ні. І якщо ви потрапили в ситуацію, коли помітили, що щось не працює належним чином, рефактор.
Док Браун

У Haskell є бібліотека Hmatrix, яка є прив'язкою для бібліотек BLAS / LAPACK, і дуже приємний синтаксис для неї, який я б обрав особисто підходом до OOP.
Пауль

@paul: Дякую, я обов'язково погляну на це! Чи загалом бібліотеки Haskell є послідовними та багатими за змістом? Вікі говорять так, але це факт?
heaptobesquare

@heaptobesquare: Єдина бібліотека Haskell, яку я в будь-якій мірі використовував, - це Парсек (я використовував її для написання асемблера), але мені подобалось користуватися нею. Я лише робив дослідження GHCI Hmatrix та прив'язки Haskell OpenGL, але вони здаються приємними. Hmatrix виглядає майже таким же лаконічним, як MATLAB (який я використав зовсім небагато) - який був зроблений спеціально для такої речі. З мого обмеженого досвіду бібліотеки несуперечливі - це тому, що Haskell побудований на невеликій кількості простих будівельних блоків - і вони також багаті, тому що Haskellers не люблять робити щоденні речі :)
паул
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.