![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Вот-вот, про эту функцию поподробнее. У тебя она одна имеет чудовищных размеров switch, который выбирает одну из десятка нужных функций. В таком переключателе - очень легко ошибиться, случайно написав код, относящийся к одной из ветви не там.
С перегрузкой - все куда проще. У нас есть десять разных наследников, и каждый момент времени времени мы работаем с ОДНИМ классом, и в нем ОДНА перегружаемая функция. Мы не можем случайно написать ее в другом классе, поскольку для этого надо открывать совсем другой файл.
Плюс - само разбирательство в этом самом огромном switch'e - на мой взгляд, куда напряжнее, чем открытие одного нужного класса, и потом разбирательство только с одной функций.
На самом деле, в ассемблерном коде вся эта пергрузка в любом случае сводится к такому же swich'у, в зависимости от указателя this. Но в случае ООП - все это скрыто от программиста, и не мешает ему в работе. Без ООП - тебе придется с ним иметь дело.
Грубо говоря, когда ты идешь - ты ведь, в конечном итоге, посылаешь на свои мышцы в определенной последовательности сигналы, которые их двигают. Однако, на уровне сознания - ты просто помнишь, какое движение надо совершить. Вот, ООП - это именно такая "память, какое движение надо совершить". Ты же "не понимаешь, зачем помнить движение, если у нас есть куча мускулов, и нервов, подведенных к ним". Ну... я уже много раз говорил, для титанов запоминания, и правда, вполне достаточно помнить какие мышцы надо напрягать в какой последовательности, чтобы идти. Смысла помнить еще и это движение целиком - ну никакого. Для остальных же, кто не может так много помнить - куда разумнее помнить именно все движение целиком, а что там с мышцами, в какой последовательности они напрягаются и насколько - это разумнее скрыть от сознания.
Да, Джорж, твои доводы разумны и логичны. Действительно, мой подход требует помнить и знать все в своей программе. Это и хорошо, и плохо. Хорошо, потому что знание обеспечивает быстрое развитие кода и решений, мало синтаксиса и много функциональности, а плохо, потому что не предусматривается переносимость частей кода в другие программы из за глобальной взаимосвязи всех блоков.
Наш разговорный язык тоже, ведь, использует глобальную память. Мы же знаем и помним все слова, а не только принадлежащие текущей тематике разговора. В нашем сознании все перемешано. Именно так работает Разум, и так работает мой подход. Все важнейшие результаты функциональных блоков повсеместно доступны. И поэтому, внутри них почти что человеческая терминология. Говорю кодом, как обычном языком. Это очень удобно. Но, помнить нужно очень много. Это правда.
ЗЫ. Кстати, гигантский switch можно разбить на файлы и скрыть содержимое. Мне просто удобно видеть все целиком.
Жесть, занимаетесь каким-то велосипедостроительством без должного изучения общепринятого подхода. Пётр, найдите каку-нибудь хорошую книгу, возможно Страуструпа, в какой-то книге он писал текстовый редактор, на реальной задаче чего-нибудь подчерпнёте, я содержание уже не помню, но вряд ли он плохому научит.
Спасибо, конечно. Но вряд ли конкретные задачи откроют мне на что то глаза, так как я их решил несметное количество за последние 6 лет. Реально несметное. Поэтому, знаю о чем говорю.
Задач много, а так и не поняли полезность перегрузки. Представьте, что функция шаблонная, через аргументы может пройти инт, дабл или пользовательский тип, а мы хотим найти абсолютное значение через abs(), как без перегрузки?
Посмотрел бы я на ваши костыли вокруг этих массивов при росте проекта: моделируем авто колесо -> автомобиль с 4мя колясам -> дорога с сотней автомобилей.
А теперь к эффективности. Switch - это что в конечном итоге? Это последовательное сравнение параметра с константами. Внимание Петр, последовательное.
Нет, switch работает по-другому. Это таблица, в которой переход осуществляется сразу к нужной константе. В этом его существенное отличие от блока if.
А теперь к эффективности. Switch - это что в конечном итоге? Это последовательное сравнение параметра с константами. Внимание Петр, последовательное. То есть, если искомая константа 100500-ая, то все эти сравнения на процессоре будут выполнены. Что такое перегруженные функции/методы - это, в машинном коде, после компиляци, абсолютно разные блоки кода, со своими точками входа. Так что эффективнее?
Увы, неизбежный оверхед. В этом проигрываю, в другом - выигрываю.
Например: Та самая функция с гигантским switch-ем осуществляет расстановку позиций объектов в элементах и элементах в окнах. Рассчитывает их размеры. Вызываю один раз и все элементы и все объекты располагаются на своих позициях в соответствии со своими привязками. Рассчитываются их размеры и положение относительно друг друга. Определяется, какие элементы нужно скрыть, какой требуемый размер канваса и прочее... Один вызов - огромная работа. Этот же блок может рассчитывать размеры или позиции одного элемента окна из тысячи. Один блок. Вызов - Объект();
Сколько классов и функций мне бы потребовалось написать в ООП, для решения такого количества задач? Боюсь представить.
Увы, неизбежный оверхед. В этом проигрываю, в другом - выигрываю.
Например: Та самая функция с гигантским switch-ем осуществляет расстановку позиций объектов в элементах и элементах в окнах. Вызываю один раз и все элементы и все объекты располагаются на своих позициях в соответствии со своими привязками. Рассчитываются их размеры и положения. Определяется, какие элементы нужно скрыть, какой требуемый размер канваса и прочее... Один вызов - огромная работа. Этот же блок может рассчитывать размеры или позиции одного элемента окна из тысячи. Один блок.
Сколько классов и функций мне бы потребовалось написать в ООП, для решения такого количества задач? Боюсь представить.
Нет, switch работает по-другому. Это таблица, в которой переход осуществляется сразу к нужной константе. В этом его существенное отличие от блока if.
Делаем функцию без параметров, внутри пишем все вычисления перегруженных функций, делаем переменные глобальными и имеем доступ к результатам из любой другой функции. Ну, красота ведь!