Следует ли применять объектно-ориентированные принципы в процедурных языках?

Я знаю, что в принципе возможно превратить даже процедурные языки, такие как C или MATLAB, в объектно-ориентированные. Этот вопрос довольно хорошо обсуждался здесь и здесь .

Чего я не нашел в этих обсуждениях и ссылках в них, так это изложении того, следует ли применять такие принципы. Есть ли что-то конкретное от этого? Это' очевидно возможно , но целесообразно делать это? Есть ли среди проектов с открытым исходным кодом примеры, где такая практика привела к явным преимуществам?

УТОЧНЕНИЕ

Возможно, следует привести пример.

Я унаследовал некоторый код MATLAB, который реализует некоторый алгоритм машинного обучения. По сути, есть одна функция building_model , которая, в зависимости от переданного флага, либо обучит модель, либо использует ее для прогнозирования будущего значения:

building_model('train', ...) % ... stands for the data with which the model is trained

и

value = building_model('predict')

Сама модель реализована с постоянным MATLAB. переменные внутри building_model .

Я разделил building_model на две функции, одну для обучения, а другую для прогнозирования. Модель, которая раньше была реализована как постоянные переменные, теперь, так сказать, экстернализована:

model = new_model()
model = model_train(model, ...)
prediction = model_predict(model)

Это, грубо говоря, насколько мне удалось эмулировать некоторые функции ООП в MATLAB. Мой модуль модели здания теперь действует почти как класс с конструктором и двумя методами model_train и model_predict . Я добился некоторой степени инкапсуляции (хотя ничто не мешает вызывающей стороне возиться с внутренними компонентами модели ), и полиморфизм в принципе также можно приспособить. В качестве дополнительного бонуса я получаю разделение команд / запросов почти бесплатно, поскольку model_predict не возвращает модель и, следовательно, не может изменять модель .

(Внимательные читатели отметят, что в MATLAB уже есть объектно-ориентированная система. По разным причинам, включая производительность и совместимость со старыми версиями, я не могу ее использовать. )

Я мог бы представить аналогичный механизм на C, где вы бы разработали некоторую структуру данных и написали функции, первый аргумент которых был бы экземпляром этой структуры данных.

Я хотел бы знать, как далеко я могу протолкнуть этот способ программирования? Это общепринятый образец (я сказал это слово)? Есть ли проблемы с производительностью, которых я должен остерегаться?

6
задан Community 23 May 2017 в 12:26
поделиться