Багато алгоритмів, що використовуються в наукових обчисленнях, мають іншу притаманну структуру, ніж алгоритми, які зазвичай розглядаються в менш інтенсивних математичних формах програмної інженерії. Зокрема, окремі математичні алгоритми, як правило, дуже складні, часто включають сотні чи тисячі рядків коду, але, тим не менш, не містять стану (тобто не діють на складній структурі даних) і часто можуть бути зменшені - з точки зору програмних інтерфейс - до однієї функції, що діє на масив (або два).
Це говорить про те, що функція, а не клас, є природним інтерфейсом більшості алгоритмів, що зустрічаються в наукових обчисленнях. Однак цей аргумент пропонує мало розуміння щодо того, як слід реалізувати реалізацію складних алгоритмів, що складаються з декількох частин.
Хоча традиційним підходом було просто мати одну функцію, яка викликає ряд інших функцій, передаючи відповідні аргументи по шляху, OOP пропонує інший підхід, де алгоритми можуть бути інкапсульовані як класи. Для наочності під інкапсуляцією алгоритму в класі я маю на увазі створення класу, в якому входи алгоритму вводяться в конструктор класів, і тоді публічний метод викликається для фактичного виклику алгоритму. Така реалізація багаторешітки в C ++ psuedocode може виглядати так:
class multigrid {
private:
x_, b_
[grid structure]
restrict(...)
interpolate(...)
relax(...)
public:
multigrid(x,b) : x_(x), b_(b) { }
run()
}
multigrid::run() {
[call restrict, interpolate, relax, etc.]
}
Моє запитання полягає в наступному: які переваги та недоліки такого роду практики порівняно з більш традиційним підходом без занять? Чи є питання розширюваності чи ремонту? Щоб було зрозуміло, я не маю наміру висловлювати думку, а краще зрозуміти ефекти нижче (тобто такі, які можуть не виникати, поки кодова база не стане досить великою) прийняття такої практики кодування.