OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Пятница, 29 Март, 2024 02:27

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 169 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9  След.
Автор Сообщение
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 14:37 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
igor писал(а):
Глобальные переменные хранят глобальное состояние программы. Чем они Вам не угодили?

Модуль - это область видимости имен, единица компиляции, единица загрузки, единица ответственности программиста, файл и т.д. - что угодно, кроме элемента модели предметной области. А таким элементом модели предметной области является функция/процедура или объект. Модуль связан с организацией процесса программирования и исполнения программы, которые не описываются переменными, а переменные нужны для описания предметной области. Глобальное состояние программы должно храниться в главной процедуре, а не в модуле. И другим процедурам/функциям оно должно передаваться через параметры, а не в виде побочных эффектов.
igor писал(а):
Ликвидируя глобальные переменные, Вы оставляете пользователю лишь один способ получить информацию о глобальном состоянии программы: вычислять требуемые данные при каждом запросе.

Информация о глобальном состоянии программы должна передаваться через параметры функций/процедур. И такая информация (если она не представляет собой базу данных) не является слишком объемной. Никаких существенных "вычислений" не требуется.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 15:59 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Сергей Прохоренко писал(а):
Глобальное состояние программы должно храниться в главной процедуре, а не в модуле. И другим процедурам/функциям оно должно передаваться через параметры, а не в виде побочных эффектов.


Всё это красиво для определённых задач.

Элементарное конфигурирование какого-либо модуля (настройка или инсталляция динамических разъёмов) опирается на глобальные переменные - и замахаетесь делать это без них. Заставлять клиентов модуля протаскивать через все вызовы эту требуху - брр.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 16:48 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2662
Откуда: Россия, Ярославль
а вот если наложить на "понятия из ББ" модель многоагентной системы, то модулю там найдётся вполне определённое место.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 17:06 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Губанов писал(а):
Отказ от статических переменных совершенно не означает отказа от глобальных переменных, ...

Спор разгорелся, по сути, вокруг вот этого решения (выделение моё):
Сергей Прохоренко писал(а):
В соответствии с функциональной парадигмой программирования в PureBuilder не применяются глобальные и статические переменные.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 17:19 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
Заставлять клиентов модуля протаскивать через все вызовы эту требуху - брр.
Вотыменно.

В логическом смысле глобальную и относительно статическую яинформацию предлагается хранить "динамически", так что ее текущее положение нужно будет непрерывно перевычислять? :)

Оно понятно, что иногда нужно и порядок навести, книжки попереставлять там, компактифицировать ... то да сё.

Но до абсудра-то не нужно доводить.

Всё из квантов, понимаем.
Но мы-то квазиклассические существа в квазиклассических обстоятельствах.
Про кванты помнить полезно, иногда пригождается. Но чаще -- чистая классика.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 17:57 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
Глобальное состояние программы должно храниться в главной процедуре, а не в модуле.
Сергей Прохоренко писал(а):
Информация о глобальном состоянии программы должна передаваться через параметры функций/процедур.
Хочу подчеркнуть, что никто и не сомневается, что так можно сделать. Сомнения вызывает только целесообразность такого решения. Не могли бы Вы его как-то обосновать? Вы же сами делаете оговорки ("если она не представляет собой базу данных"). То есть в принципе существует класс задач, когда такое решение может вызвать большие неудобства, связанные с необходимостью как-то обойти досадное ограничение инструментальной среды на использование глобальных переменных.

Сергей Прохоренко писал(а):
Никаких существенных "вычислений" не требуется.
Это зависит от задачи.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 17:58 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Илья Ермаков писал(а):
Элементарное конфигурирование какого-либо модуля (настройка или инсталляция динамических разъёмов) опирается на глобальные переменные - и замахаетесь делать это без них. Заставлять клиентов модуля протаскивать через все вызовы эту требуху - брр.


Если Вы о работе программиста, то на то и структурный редактор, чтобы взять всю рутину на себя. Это ведь не клавиатуру долбить думая, не забыл ли чего? Хороший инструмент располагает к правильному программированию.

Если же речь идет об исполнении программы, тоже не вижу никаких проблем. Что передавать состояние программы в вызываемую процедуру из модуля через глобальные переменные, что передавать через пареметры - это почти одно и то же с точки зрения производительности. Подстановка фактических параметров вместо формальных для небольшого количества переменных, описывающих состояние программы - это небольшие накладные расходы. Вон, в автоматном программировании вообще обходятся одной переменной для описания состояния.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 18:00 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Info21 писал(а):
ее текущее положение нужно будет непрерывно перевычислять? :)
Чего тут непрерывно перевычислять?

Module1.Variable1 := 42; (* Module1 - модуль *)

module1.Variable1 := 42; (* module1 - указатель на объект исполняющий роль модуля *)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 18:16 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
igor писал(а):
Хочу подчеркнуть, что никто и не сомневается, что так можно сделать. Сомнения вызывает только целесообразность такого решения. Не могли бы Вы его как-то обосновать? Вы же сами делаете оговорки ("если она не представляет собой базу данных"). То есть в принципе существует класс задач, когда такое решение может вызвать большие неудобства, связанные с необходимостью как-то обойти досадное ограничение инструментальной среды на использование глобальных переменных.


Такие классы задач можно перечислить по пальцам одной руки: обработка файлов на жестком диске, обращение к базе данных, передача данных через каналы связи. Для всего этого в языке должны быть специальные средства, и в функциональных языках такие средства есть.

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

Целесообразность такого решения очень проста. Глобальные переменные - источник побочных эффектов и, следовательно, ошибок.

Хочу обратить Ваше внимание вот на какое обстоятельство. Когда в некоторых объектно-ориентированных языках модуль (организационно-техническое средство) и объект (элемент модели предметной области) смешиваются в одну сущность, то это вызывает справедливые возражения. Но когда на тот же модуль навешивается функция хранения состояния программы в форме глобальных переменных (тоже по сути описание предметной области), то это почему-то не вызывает возражений. Дескать, плохо, но ведь меньше мороки! Где же хваленая "ортогональность" средств?


Последний раз редактировалось Сергей Прохоренко Вторник, 13 Декабрь, 2011 18:19, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 18:17 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
Если Вы о работе программиста, то на то и структурный редактор, чтобы взять всю рутину на себя. Это ведь не клавиатуру долбить думая, не забыл ли чего? Хороший инструмент располагает к правильному программированию.
Поскольку в Ваших сообщениях выражение "долбить клавиатуру" замелькало слишком часто, позвольте мне как-то отреагировать на это.
Практически все пользователи PC используют клавиатуру. Думаю, что и Вы не исключение. Ввод данных при помощи клавиатуры отнюдь не означает, что пользователь долбит по ней. Тем более это касается программистов, то есть большинства из тех, кто общается на этом форуме.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 18:25 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
В структурном редакторе нет необходимости использовать клавиатуру, кроме как для ввода новых идентификаторов и ввода слов в строку поиска. Потому что нет компилятора. Внутреннее представление программы формируется сразу. Для этого можно манипулировать графическими элементами интерфейса и "программного кода". Способ ввода диктует стиль программирования (лень вбивать, держать в голове), а тот - используемые парадигмы. Всё взаимосвязано.
Цитата:
Бытие определяет сознание (c)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 18:33 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
Целесообразность такого решения очень проста. Глобальные переменные - источник побочных эффектов и, следовательно, ошибок.
Корень зла не в существовании глобальных переменных, а в том, что функциям разрешили менять глобальное (по отношению к этим функциям) состояние. Ещё функциям следовало бы запретить содержать в себе вызовы процедур (не функций). Таким образом, побочные эффекты исчезнут, а глобальные переменные останутся.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 18:36 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
igor писал(а):
Ввод данных при помощи клавиатуры отнюдь не означает, что пользователь долбит по ней.

Сергей Прохоренко писал(а):
В структурном редакторе нет необходимости использовать клавиатуру, кроме как для ввода новых идентификаторов и ввода слов в строку поиска.
Да, это наверное так. Но я-то говорил не об этом. Ну, да ладно...


Последний раз редактировалось igor Вторник, 13 Декабрь, 2011 18:41, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 18:39 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
Потому что нет компилятора. Внутреннее представление программы формируется сразу.
Компилятор нужен не только для того, чтобы сформировать внутреннее представление программы.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 20:16 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Цитата:
Чего тут непрерывно перевычислять?

Module1.Variable1 := 42; (* Module1 - модуль *)

module1.Variable1 := 42; (* module1 - указатель на объект исполняющий роль модуля *)

Тогда вызовем поочерёдно две процедуры А и Б, передав каждой объект-модуль:

А(М);
Б(М);

Вот их код:

Код:
PROCEDURE A (M) ... M.Variable1 := 1;
PROCEDURE B (M) ... M.Variable1 := 2;


И чего мы добились? А в многопоточном окружении? А при том, что создавать более одного контекста модуля накладно? Вот вам побочные эффекты, вот вам лишние аргументы, вот вам нулевая польза. Предложенный подход ничем не отличается от отсутствия модулей вовсе, когда класс выполняет роль модуля, а объект класса передаётся по ссылке. А далее Singleton и повторение пройденного.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 21:27 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3261
Откуда: Астрахань
Вообще-то при наличии модулей глобальных переменных фактически не существует.
Вернее, есть управляемая глобальность - объявить имя видимым, или не объявить.
Это ГОРАЗДО лучше того, что есть в мире С/С++ - практически неуправляемая глобальность.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 21:51 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Александр Шостак писал(а):
А(М);
Б(М);

М.А();
М.Б();

Вы о чём спорите?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 22:00 

Зарегистрирован: Четверг, 23 Апрель, 2009 18:01
Сообщения: 219
Цитата:
М.А();
М.Б();

Вы о чём спорите?

Да всё о том же.

Смотрите. Что на текущий момент делается, если мы из текущей процедуры хотим обратиться к процедурам P1 и P2, расположенным в модулях M1 и M2, которые в свою очередь нуждаются в контексте модуля M?

M1.P1; // Контекст модуля M не нужен, достаточно в M1 написать "IMPORT M"
M2.P2; // Контекст модуля M не нужен, достаточно в M2 написать "IMPORT M"

Такой подход чреват ошибками, так как и P1 и P2 меняют переменные (контекст) модуля M.

Нам предлагается отказ от глобального пространства и передача контекста вручную:

M1.P1(M);
M2.P2(M);

Вот и спрашивается, чем такой подход вообще отличается от простого класса и передачи объекта класса функциям в качестве контекста?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 13 Декабрь, 2011 23:04 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
igor писал(а):
Корень зла не в существовании глобальных переменных, а в том, что функциям разрешили менять глобальное (по отношению к этим функциям) состояние... Таким образом, побочные эффекты исчезнут, а глобальные переменные останутся.

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

Можно было бы пойти еще дальше и сказать, что в вызываемой процедуре/функции доступны для чтения все переменные, доступные в вызывающей процедуре/функции. Но тогда возникает проблема: как вызвать процедуру/функцию из какой-то новой процедуры/функции, в которой уже нет тех переменных? Получилось что-то сильно напоминающее проблему хрупкости базового класса. Теряется универсальность и гибкость - любое изменение структура программы становится слишком затратным и опасным, а смысл разделения программы на процедуры и функции частично выхолащивается (теперь вызов возможен только из одной и той же процедуры/функции).

Глобальные (объявленные непосредственно в модуле) переменные обладают тем же недостатком - при их наличии в модуле имеется только одна "точка входа" с изменяемыми данными о состоянием программы. "Плоская" одноуровневая архитектура модуля с отсутствием глобальных переменных в модуле и вложенных друг в друга процедур и функций является самой гибкой и безопасной.

igor писал(а):
Ещё функциям следовало бы запретить содержать в себе вызовы процедур (не функций).

А зачем? Если к процедурам предъявляются те же требования, что и к функциям (отсутствие побочных эффектов), то в вызове процедур нет ничего страшного. Процедуры смогут передать свои параметры только в вызывающую функцию.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 14 Декабрь, 2011 06:16 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
igor писал(а):
Ещё функциям следовало бы запретить содержать в себе вызовы процедур (не функций).
А зачем?
Затем, что процедура, вызванная из функции, может изменить глобальное сосотояние, и вызвать тем самым побочный эффект.

Сергей Прохоренко писал(а):
Если к процедурам предъявляются те же требования, что и к функциям (отсутствие побочных эффектов), то в вызове процедур нет ничего страшного.
Я предъявляю к процедурам (proper procedure) и к функциям совершенно разные требования. То, что для функции является побочным эффектом, для процедуры является полезным действием.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 169 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB