Когда и почему мы используем объект, а не структуру?
Это ключевой вопрос. Я использую структуры и модули процедурного кода, чтобы обеспечить большую часть преимуществ ООП. Структуры предоставляют большую часть возможностей хранения данных объектов (кроме свойств только для чтения). Процедурные модули обеспечивают завершение кода, аналогичное тому, которое предоставляется объектами. Я могу ввести module.function в IDE вместо object.method. Полученный код выглядит так же. Большинство моих функций теперь возвращают структуры, а не отдельные значения. Влияние на мой код было впечатляющим: читаемость кода возросла, а количество строк значительно уменьшилось. Я не знаю, почему процедурное программирование, которое широко использует структуры, не является более распространенным. Почему бы просто не использовать ООП? Некоторые из языков, которые я использую, являются только процедурными (PureBasic), а использование структур позволяет ощутить некоторые преимущества ООП. Другие языки допускают выбор процедурного или ООП (VBA и Python). В настоящее время мне проще использовать процедурное программирование, и в своей дисциплине (экологии) мне очень трудно определять объекты. Когда я не могу понять, как сгруппировать данные и функции вместе в объекты в философски последовательной коллекции, у меня нет основы для создания классов / объектов. Со структурами и функциями нет необходимости определять иерархию классов. Я свободен перетасовывать функции между модулями, что помогает мне улучшить организацию моего кода на ходу. Возможно, это предвестник выхода на ОО.
Код, написанный со структурами, имеет более высокую производительность, чем код на основе ООП. ООП-код имеет инкапсуляцию, наследование и полиморфизм, однако я думаю, что процедурный код на основе структуры / функции часто разделяет эти характеристики. Функция возвращает значение только вызывающей стороне и только в области видимости, тем самым достигая инкапсуляции. Точно так же функция может быть полиморфной. Например, я могу написать функцию, которая вычисляет разницу во времени между двумя местами с двумя внутренними алгоритмами, один, который учитывает международную линию дат, а другой - нет. Наследование обычно относится к методам, наследуемым от базового класса. Существует своего рода наследование функций, которые вызывают другие функции и используют структуры для передачи данных. Простой пример - передача сообщения об ошибке через стек вложенных функций. Когда сообщение об ошибке передается, оно может быть добавлено вызывающими функциями. В результате получается трассировка стека с очень описательным сообщением об ошибке. В этом случае сообщение наследуется через несколько уровней. Я не знаю, как описать наследование снизу вверх (программирование на основе событий?), Но это особенность использования функций, которые возвращают структуры, отсутствующие в процедурном программировании с использованием простых возвращаемых значений. На данный момент я не встречал ситуаций, в которых ООП был бы более продуктивным, чем функции и структуры. Удивительно для меня то, что очень мало кода, доступного в Интернете, написано таким образом. Это заставляет меня задуматься, есть ли причина для этого?