Должны ли объектно-ориентированные принципы применяться на процедурных языках? - PullRequest
6 голосов
/ 21 января 2011

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

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

РАЗЪЯСНЕНИЕ

Возможно, приведен пример.

IУнаследовал некоторый код 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), и полиморфизм в принципе также можно учесть.В качестве дополнительного бонуса я получаю разделение команд / запросов почти бесплатно, поскольку model_predict не возвращает model и, следовательно, не может изменять model.

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

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

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

Ответы [ 2 ]

2 голосов
/ 21 января 2011

Я думаю, что это действительно важное обсуждение. Я думаю, можно с уверенностью сказать, что ООП не всегда является лучшим решением на всех языках. Например, C ++ или Python, ООП обычно является естественным способом, например, инкапсулировать данные. Эти языки предназначены для занятий на уроках. На других языках может быть проще создавать код хорошего качества другими способами.

Я думаю, что Common Lisp - хороший пример. У него действительно хорошая ООП-система (CLOS), которая, я бы сказал, действительно завершена. Но, тем не менее, ООП не так широко используется в Common Lisp, как в Python или C ++, поскольку это удобная функция, а не то, что необходимо для обеспечения базовых блоков разработки программного обеспечения.

Следует ли вам использовать ООП или нет, зависит от проблемы, которую вы пытаетесь решить. Например, я думаю, что материал с графическим интерфейсом может быть очень полезен для работы с ООП.

0 голосов
/ 21 января 2011

Ориентация на объект - средство для достижения целей разработки программного обеспечения.

Цель: Простота обслуживания, Расширяемость, Организованный исходный код (возможность поиска и т. Д.)
OO Construct: инкапсуляция (только методы, принадлежащие 'типу данных / структуре', могут работать с его данными)

Цель: возможность разработки новых функций без изменения существующих, повторное использование кода
OO Construct: наследование реализации, полиморфизм

Цель: абстракции (вам не нужно фиксировать определенный тип или операции, изменение реализации без изменения клиентов)
OO Construct: наследование интерфейсов, интерфейсы, абстрактные классы

Цели не нуждаются в обосновании.Хотите ли вы / нуждаетесь в поддержке языка ОО или нет, зависит от вашей конкретной ситуации.Если вам нужно использовать C, вы все равно можете имитировать некоторую OO-конструкцию и, надеюсь, воспользоваться ее преимуществами.

Имейте в виду, что абсолютно возможно разработать беспорядочный код с соблюдением всех принципов OO.

Я уверен, что другие могут перечислить другие цели и примеры (и знать, как редактировать таблицы в сообщениях stackoverflow)

...