Как помочь студентке по инфо-тематике? - страница 7

 
Vladislav Boyko #:

Та можно, почему нет?)


Я написал вопросы, на которые сам не могу пока что найти ответ, так как я еше не очень далеко продвинулся в C#. За исключением третьего вопроса, который легко гуглится, он просто для количества. Если кто из знатоков напишет свою точку зрения - буду благодарен.

Вот примитивный пример (на MQL4 - первое, что под руку попалось). Класс принимает в конструкторе координаты точек линии и с помощью метода valueOn() можно получить ее цену на любом баре.

Прикол в том, что все поля константны.... 

А как быть, если потребуется изменить эту линию? 

Как мне кажется, в данном случае константные члены класса неразумны.  Я вобще чаще всего константные члены класса делаю ещё и статическими. В данном случае - статичные члены не подходят, в случае двух линий возникнет ошибка с их инициализацией. 

Спецификатор константы, на мой взгляд, предназначен для того, чтобы ограничить пользователя там, где алгоритмом не предусмотрено изменение. Однако, в данном классе, по-моему, изменение должно быть доступно. Как минимум, для того, чтобы при изменениях - использовать уже существующую линию, а не создавать новую. 

Ну и в качестве своего видения прямой и использования спецификатора const - прикрепляю свой класс CPlaneStraight - Прямая на плоскости.

Файлы:
 
На шарпе процедурно писать нельзя, это вполне известный факт.)) Там все только через ООП.)) В принципе, поэтому я не стал продолжать его изучать.. Не понравилось принуждение майкрософта.))
 
Любая реализация ООП формата в программе изначально заточена под иерархическое структурирование связей и свойств обьектов. Это совсем не подходит тем кто выбирает табличный формат. А заворачивать таблицы обьектов в иерархию классов это извращение какое то.))
 
Реter Konow #:
На шарпе процедурно писать нельзя, это вполне известный факт.)) Там все только через ООП.)) В принципе, поэтому я не стал продолжать его изучать.. Не понравилось принуждение майкрософта.))
Ну почему же нельзя? Делаем один класс и все свои процедуры и функции делаем методами этого класса, а глобальные переменные - полями этого класса. Так что от ООП там можно использовать не сильно больше, чем заклинание функции main() в C/C++.
 
Yuriy Bykov #:
Ну почему же нельзя? Делаем один класс и все свои процедуры и функции делаем методами этого класса, а глобальные переменные - полями этого класса. Так что от ООП там можно использовать не сильно больше, чем заклинание функции main() в C/C++.
Технически да, но проще выбрать язык не навязывающий чью то парадигму построения программ. Более "демократический". Получается что кто то решил, что ИХ ООП единственно возможный подход и все должны подстраиваться.) 

Короче, и плоскогубцами можно заворачивать шурупы, но проще взять отвертку.))
 
Uladzimir Izerski #:

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

Все заняты бизнесом.? 

Всегда считал, что надо деверсифицировать способы дохода. Фора штука выгодная, но переменчивая, как погода у нас в Питере. Например, я предложил подруге в НГ подработать Дед Морозом и Снегурочкой. По возрастам мы как раз годимся для ролей. Ну, а детишек веселить я умею ))

 
Yuriy Bykov #:
Ну почему же нельзя? Делаем один класс и все свои процедуры и функции делаем методами этого класса, а глобальные переменные - полями этого класса. Так что от ООП там можно использовать не сильно больше, чем заклинание функции main() в C/C++.

Если пишем исключительно для себя на срок использования 5 минут, такой подход допустим. Если для заказчика, то всегда найдется кадр, который начнет менять эти публичные глобальные переменные с непредсказуемыми эффектами. Лучше не лениться и делать геттеры/сеттеры с проверками на вшивость.

 
Alexey Volchanskiy #:

Если пишем исключительно для себя на срок использования 5 минут, такой подход допустим. Если для заказчика, то всегда найдется кадр, который начнет менять эти публичные глобальные переменные с непредсказуемыми эффектами. Лучше не лениться и делать геттеры/сеттеры с проверками на вшивость.

Да ты сам же их и начнёшь через некоторое время менять! Со всеми этими непредсказуемыми эффектами! 

Это я ещё на заре своего занятия С++ хорошо усвоил. Скажем, написал неплохой класс, который понадобился через полгода. Берёшь его, а уже не помнишь некоторые неявные условия, в которых этот класс работал. И они не всегда описаны в комментариях (я обычно стараюсь все подобные вещи обязательно комментировать, но как правило, через полгода выясняется, что некоторые-таки, описал недостаточно чётко, а то и вовсе не описал). Ну, меняешь их по своему теперешнему усмотрению... а оно - бац! - и начинает тебе портить работу в других местах, и ты только потом ВНЕЗАПНО вспоминаешь эти неявные моменты. Всё это весьма неприятно. 

В тоже время, если все переменные protected (private не люблю, потом в наследниках до них тяжело добираться)  - то  на входе, при установках - я считаю за хороший тон проверять диапазоны переменных, как минимум, на ASSERT(), а то и с возвращением кода ошибки, когда уж совсем неверный параметр. И это снимает большинство ошибок. 

Когда к такому коду возвращаешься через полгода, и пытаешься менять нужные тебе переменные - то они "не меняются", все эти ASSERT'ы или коды ошибок возвращаются, и ты сперва даже не понимаешь - что за фигня! Почему здесь нельзя изменить, когда надо?!! Но, это тебя уже предупреждает о том, что где-то есть некие неучтённые тобой факторы, начинаешь разбираться, и довольно быстро обнаруживаешь... ага... если здесь изменить переменную так, как тебе хочется - вот, в другом месте это будет неожиданно, здесь надо дополнительная обработка. 


В общем, глобальные переменные - это весьма опасные объекты, которые, конечно, иногда необходимы, но, от которых всеми силами надо уходить. 

Скажем, в моих экспертах глобальный объект один (кроме входных переменных-настроек, которые по-другому не сделаешь, и то, если настройки запрашиваются из БД, то и их тоже не надо делать глобальными) - CExpert, который в шаблонном файле обрабатывает все стандартные функции событий, и уже внутри себя вызывает все рабочие классы ТС.

По-моему, это хорошо и правильно.

 
Глобальный уровень видимости переменных - это колоссальная сила. Только пользоваться ей внутри иерархической структуры, где на каждом шагу ограничения доступа, действительно неудобно. Глобальные переменные ломают парадигму иерархического ООП. А для табличного ООП такой проблемы нет. Если все обьекты записаны в таблицах и к ним есть прямой доступ из любой точки программы,... нет проще и эффективнее такого механизма. Я именно так все и разрабатываю.
 
Alexey Volchanskiy #:

Если пишем исключительно для себя на срок использования 5 минут, такой подход допустим.

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