Я просто хотел бы добавить к этому, что выбор функций вместо классов — непростая задача: большие проекты выигрывают от классов, а маленькие — с функциями.
По сей день это открытый вопрос в сообществе программистов.
Никто точно не знает, что более продуктивно.
Считается, что в некоторых языках, таких как Java и C#, классы более продуктивны.
Другие языки, особенно Haskell, придерживаются совершенно противоположного мнения.
Кроме того, есть многое, что вы можете выбрать для себя, например PHP, javascript (у js здесь странная история, и вся его структура ООП полностью отличается почти от всего остального, за исключением некоторых устаревших языков).
Часть расширения классов более полезна с точки зрения дизайна, на самом деле речь идет не о распространении классов для расширения другими.
На самом деле, при распространении вещей для расширения я бы сказал, что предоставление интерфейса так же распространено (в функциональном программировании, таком как Haskell, этот интерфейс часто становится функцией закрытия лямбда, возможно, заключенной в более крупный тип данных.
лямбда-функции работают быстрее.
писать, но интерфейсы, как правило, имеют более строгую структуру и не могут быть каррированы, поэтому я считаю, что это открытый вопрос о том, что более продуктивно в долгосрочной перспективе).
Позвольте мне привести пример того, почему ООП выгодно в интернет-магазине.
Я могу создать объект BaseProduct.
Это позволит справиться с 90% того, что я хочу сделать со своими продуктами, но затем я решаю, что MultiColorProduct — это новый объект, который расширяет его и будет обрабатывать элементы управления рисованием для выбора цвета.
Это надуманный пример, но выгода заключается не только в том, что я распространяю класс для других людей, чтобы они могли расширить свои собственные продукты.
Он обеспечивает хорошее разделение кода на два четко определенных файла, причем то, что они делают, совершенно очевидно.
Опять же, не соглашаясь с вами в том, что функции потенциально хорошо подходят для такого небольшого проекта, как его, я мог бы написать точно такой же код с функциями и замыканиями и сделать его таким же читабельным.
Однако есть много людей, которым выгодно думать о своем проекте в объектном стиле.
Однако с чем я в основном не согласен, так это с комментарием к компиляции.
Внутренне, когда вы компилируете класс C++, он искажает имя члена класса, а затем преобразует его в необработанную функцию, которая принимает указатель объекта в качестве первого аргумента.
Наследование объекта затем обрабатывается с помощью таблицы поиска, прикрепленной к объекту в памяти.
Существует очень небольшая разница в том, как я буду ссылаться на библиотеку, написанную только с функциями, по сравнению с библиотекой, написанной с классами (за исключением того, что вам нужен компилятор/компоновщик C++ для использования классов, потому что искажение и тому подобное специфичны и сложны для компилятора, поэтому ржавчина может ссылаться на C, но не на C++). Функции Rust можно без особых проблем экспортировать в приложения C. Я также могу расширить чужой класс, не требуя исходного кода, если у меня есть заголовочные файлы на C++.
Java также не полностью скомпилируется для процессора x86-64, пока она не будет запущена.
Вместе с Java-программой поставляется масса метаданных, из которых вы можете восстановить исходный код очень близко к тому, с чего он начинался.
Он компилируется для работы на несуществующем виртуальном процессоре, а затем компилируется снова при запуске на реальном процессоре.
Таким образом, разрыв между интерпретируемым и компилируемым постоянно увеличивается.
Чтобы подчеркнуть мою точку зрения, исторически Javascript является интерпретируемым языком, а Java считается компилируемым языком.
Однако сегодня оба используют JIT-компилятор к моменту фактического запуска на ПК конечного пользователя.
Итак, существуют ли еще большие различия между кодом Java и кодом JavaScript?
Это тоже не риторический вопрос: если ваш код работает на JIT, является ли он компилируемым языком? У PHP теперь тоже есть JIT.
Тот факт, что библиотеки поставляются с исходным кодом в js и php, не означает, что многие люди на самом деле меняют их, точно так же, как они не стали бы/не смогли бы изменить их с компилируемым языком.
Изменение чужой библиотеки — это кошмар обновления/отладки.