OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 17 Январь, 2019 20:27

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




Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
СообщениеДобавлено: Вторник, 07 Февраль, 2012 18:40 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
Иногда удобно заполнять поля статической записи одним оператором. Например, так:
Код:
VAR myTime: Dates.Time;

MyDates.Time(0, 0, 0, myTime);
Но бывает, что такой оператор немного нарушает структуру исходного текста. Например, если заполняются поля обширной записи, то удобнее (и лучше для восприятия) писать единообразно в виде
Код:
myTime := MyDates.Time(0, 0, 0);
Но процедура не может вернуть результат, тип которого не базовый, и для статических структур такая запись не подходит. А вот если завести указатель на соответствующий тип, то получается очень даже компактный инициализатор:
Код:
   TYPE
      PTime = POINTER TO Dates.Time;

   PROCEDURE Time* (h, m, s: INTEGER): PTime;
      VAR t: PTime;
   BEGIN
      NEW(t); t.hour := h; t.minute := m; t.second := s;
      RETURN t
   END GetTime;


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

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2289
Откуда: Россия, Санкт-Петербург
Иван Кузьмицкий писал(а):
для статических структур такая запись не подходит
Тогда можно и статические записи инициализировать:
Код:
TYPE
   PTime = POINTER TO Dates.Time;

   PROCEDURE Time* (h, m, s: INTEGER): PTime;
      VAR t: PTime;
   BEGIN
      NEW(t); t.hour := h; t.minute := m; t.second := s;
      RETURN t
   END GetTime;

VAR myTime: Dates.Time;

myTime := MyDates.Time(0, 0, 0)^;
Недостаток очевиден - мусор в куче. Красота требует жертв?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Февраль, 2012 19:02 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
Александр Ильин писал(а):
Недостаток очевиден - мусор в куче. Красота требует жертв?
А любой POINTER TO - это мусор в куче.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 07 Февраль, 2012 21:11 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Иван Кузьмицкий писал(а):
Александр Ильин писал(а):
Недостаток очевиден - мусор в куче. Красота требует жертв?
А любой POINTER TO - это мусор в куче.
Поэтому и не стоит использовать POINTER TO везде где захотелось. На мой взгляд, ради красоты это слишком высокая цена.

Если говорить про дату или время, я вообще не чураюсь писать три присваивания подряд. На крайний случай, процедура-инициализатор.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 06:49 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
Евгений Темиргалеев писал(а):
Если говорить про дату или время, я вообще не чураюсь писать три присваивания подряд. На крайний случай, процедура-инициализатор.
Ну вот свежий пример, запрос данных за определённый период. Период определён начальными и конечными датой и временем, то есть мы имеем уже четыре структуры, которые надо инициализировать:

Код:
      (* взять период из выделения *)
      kiaTextCmds.GetPeriod(em.b.start.date, em.b.end.date);
      (* все события с тегом "вызов" за указанный период *)
      em.filter := {ProjectorEvents.period};
      em.tags := SternStrings.ToPString('вызов');
      em.b.start.time := SternDates.GetTime(0, 0, 0);
      em.b.end.time := SternDates.GetTime(0, 0, 0);
      em.e.start.date := em.b.start.date;
      Dates.DayToDate(Dates.Day(em.b.end.date)+1, em.e.end.date);
      Tags.dir.HandleMessage(em);
Всё это выглядит довольно громоздко и часто возникает желание видеть более-менее единообразную конструкцию инициализации полей.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 07:46 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Иван Кузьмицкий писал(а):
Всё это выглядит довольно громоздко и часто возникает желание видеть более-менее единообразную конструкцию инициализации полей.
Если для Вашего приложения это не сказывается на требуемых от него характеристиках, а Вам так больше нравится, то почему бы и нет. Главное --- не забыть цену и не применить на автомате там, где это может выйти боком.

А вообще, если дело касается красот, --- на вкус и цвет товарища нет. Мне наоборот больше нравится код, который "ближе к реалиям железа". Пусть он объёмный, но суть очевидна, проглатывается быстро (есть же такая штука, как скорочтение, когда страницу за сколько-то секунд проглатывают?).

Код:
            ...   ELSIF fch = ":" THEN
                  el.time.hour := x; GetChar;
                  IF ("0" <= fch) & (fch <= "9") THEN
                     x := ORD(fch) - ORD("0"); GetChar;
                     IF ("0" <= fch) & (fch <= "9") THEN
                        el.time.minute := x * 10 + ORD(fch) - ORD("0"); GetChar;
                        el.time.second := 0;
                        el.knownTime := TRUE;
                        GetCurrentDate(d);
                        d1.year := d.year; d1.month := el.date.month; d1.day := el.date.day;
                        IF Dates.Day(d1) > Dates.Day(d) THEN
                           el.date.year := d.year - 1
                        ELSE
                           el.date.year := d.year
                        END
                     ELSE
                        error := 20
                     END
                  ELSE
                     ...
Код:
               IF error = 0 THEN
                  a.date.year := files.modified.year;
                  a.date.month := files.modified.month;
                  a.date.day := files.modified.day;
                  a.time.hour := files.modified.hour;
                  a.time.minute := files.modified.minute;
                  a.time.second := files.modified.second;
                  a.xmlExists := TRUE;
                  IF ~((a.date.year = currDate.year) & (a.date.month = currDate.month) & (a.date.day = currDate.day)) THEN
                     error := 10;   (* дата xml файла не совпадает с датой, определяемой каталогом ГГГГ/ММ/ДД *)
                     VW.LogGlobals("error"); VW.LogLocals("a^"); VW.LogGlobals("currDate"); Log.Ln
                  END
               END

P.S. Название SternDates.GetTime(0, 0, 0) меня по началу ввело в заблуждение. Может лучше что-то типа MakeTime?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 08:19 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
Евгений Темиргалеев писал(а):
Главное --- не забыть цену и не применить на автомате там, где это может выйти боком.
Абсолютно поддерживаю. И считаю, что для каждого типа приложений должны применяться особые паттерны, без попыток универсализации!

Евгений Темиргалеев писал(а):
Мне наоборот больше нравится код, который "ближе к реалиям железа". Пусть он объёмный, но суть очевидна, проглатывается быстро
Да, есть такое дело. К тому же, я заметил за собой, что чем старше исходник, тем больше мне нравится его "многословность", когда ничего не скрыто и не спрятано за мудрёными конструкциями. Но вот есть такой этап в разработке, когда продумываешь логику и хочется побыстрее её "увидеть", пощупать. Тут "многословность" немного мешает.

Евгений Темиргалеев писал(а):
P.S. Название SternDates.GetTime(0, 0, 0) меня по началу ввело в заблуждение. Может лучше что-то типа MakeTime?
Да у меня там уже была процедура Time, с сигнатурой
Код:
PROCEDURE Time (h, m, s: INTEGER; VAR t: Dates.Time);
а GetTime - экспериментальная :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 09:26 
Модератор
Аватара пользователя

Зарегистрирован: Среда, 16 Ноябрь, 2005 00:53
Сообщения: 4488
Откуда: Россия, Орёл
Иван Кузьмицкий писал(а):
Но вот есть такой этап в разработке, когда продумываешь логику и хочется побыстрее её "увидеть", пощупать. Тут "многословность" немного мешает.
Да, согласен, такой момент есть. И вопрос, чему больше мешает многословность --- восприятию (чтению) или скорости получения результата (написанию). Хотел было сказать что только написанию, но нашёл у себя пример, где (для меня) и восприятию способствует. Наверное, тоже зависит от задачи.
Код:
PROCEDURE Set (VAR p: Ports.Point; x, y: INTEGER);
BEGIN
   p.x := x; p.y := y
END Set;
...
      Set(p[5], ox - pS - pW, eS + mW - pW);
      Set(p[6], ox - pS - pW, base);
      Set(p[7], ox - pS, base);
      f.DrawPath(p, 8, Ports.fill, Ports.grey25, Ports.closedPoly);
      ...
Но только не POINTER TO Ports.Point! :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 09:38 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2289
Откуда: Россия, Санкт-Петербург
Иван Кузьмицкий писал(а):
Александр Ильин писал(а):
Недостаток очевиден - мусор в куче. Красота требует жертв?
А любой POINTER TO - это мусор в куче.
Не любой, а только созданный без веской причины.
В нашем случае указатель создаётся в процедуре, возвращается, данные из него копируются, а сам он больше не используется.
Это как если бы вам лень было идти за молоком со своим кувшином, вместо этого вы бы покупали в магазине точно такой же кувшин, какой у вас уже есть дома, а по приходу домой сразу переливали бы молоко из купленного в свой, после чего купленный - выбрасывали в мусорное ведро.
Вот я и говорю: вы либо не ленитесь таскать свой кувшин, либо пользуйтесь покупными. Зачем же покупать и сразу выбрасывать? Деньги лишние?

Другими словами, зачем изначально вам статическая запись? Не для того ли, чтобы снизить нагрузку на сборщик мусора? А если так, то зачем вы временную запись в процедуре создаёте?
Если статическая запись нужна не для снижения нагрузки, ну так и сделайте её динамической, и работайте везде с указателями.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 09:53 
Модератор
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 10:02 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
Александр Ильин писал(а):
Если статическая запись нужна не для снижения нагрузки, ну так и сделайте её динамической, и работайте везде с указателями.
Какая нагрузка? О чём Вы? Я не думаю, что можно всерьёз говорить о "нагрузке" в данном случае. Чисто схоластически - может быть. А вот уменьшение нагрузки на мозг в случае более компактной записи - вполне ощутимо. Оптимизация высоконагруженного приложения - другой процесс и делать его надо, обложившись мониторами нагрузки. "О, что это у нас тут, паразитный указатель? Даёт скачок на полпроцента в тяжких случаях? Долой его!". А пока нет средства мониторинга нагрузки - не о чем и говорить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 10:08 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2289
Откуда: Россия, Санкт-Петербург
Иван Кузьмицкий писал(а):
Александр Ильин писал(а):
Если статическая запись нужна не для снижения нагрузки, ну так и сделайте её динамической, и работайте везде с указателями.
Какая нагрузка? О чём Вы?
Вот я и говорю, не делайте запись статической изначально (см. название данной темы), и не будет проблемы с инициализацией/присваиванием.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 10:37 

Зарегистрирован: Вторник, 29 Август, 2006 12:32
Сообщения: 2546
Откуда: Россия, Ярославль
в реальности уже существует статические записи из Dates, например.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 10:40 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2289
Откуда: Россия, Санкт-Петербург
Пётр Кушнир писал(а):
в реальности уже существует статические записи из Dates, например.
Объявите на них указатель, и пользуйтесь.
TYPE MyDate = POINTER TO Dates.Date.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 11:33 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
Александр Ильин писал(а):
Пётр Кушнир писал(а):
в реальности уже существует статические записи из Dates, например.
Объявите на них указатель, и пользуйтесь.
TYPE MyDate = POINTER TO Dates.Date.


Один раз проинициализировать дату - необоснованный мусор в куче. А завести вместо статической даты динамическую структуру во всех сырцах - это "обосновано" и не мусор. Я, пожалуй, пойду чайку лучше попью :)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 11:45 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2289
Откуда: Россия, Санкт-Петербург
Иван Кузьмицкий писал(а):
Один раз проинициализировать дату - необоснованный мусор в куче. А завести вместо статической даты динамическую структуру во всех сырцах - это "обосновано" и не мусор.
И уже совсем не понимаю, о чём речь. То о паттерне (см. название темы), то об одном разе.
Где паттерн, там и цикл с его использованием.
В общем, моя мысль понятна. Dixi.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 12:00 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
Александр Ильин писал(а):
Иван Кузьмицкий писал(а):
Один раз проинициализировать дату - необоснованный мусор в куче. А завести вместо статической даты динамическую структуру во всех сырцах - это "обосновано" и не мусор.
И уже совсем не понимаю, о чём речь. То о паттерне (см. название темы), то об одном разе.
Где паттерн, там и цикл с его использованием.
В общем, моя мысль понятна. Dixi.


Позволю себе напомнить, что
Цитата:
В разработке программного обеспечения, шаблон проектирования или паттерн (англ. design pattern) — повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста.
(http://ru.wikipedia.org/wiki/Шаблон_проектирования)

Очевидно, что разработка высоконагруженных приложений не является приоритетом в каждом случае и уж тем более не происходит настолько часто, чтобы можно было думать о сборке мусора при каждом объявлении POINTER TO RECORD.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 12:07 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9072
Откуда: Россия, Орёл
Иван Кузьмицкий писал(а):
Какая нагрузка? О чём Вы? Я не думаю, что можно всерьёз говорить о "нагрузке" в данном случае. Чисто схоластически - может быть. А вот уменьшение нагрузки на мозг в случае более компактной записи - вполне ощутимо. Оптимизация высоконагруженного приложения - другой процесс и делать его надо, обложившись мониторами нагрузки. "О, что это у нас тут, паразитный указатель? Даёт скачок на полпроцента в тяжких случаях? Долой его!". А пока нет средства мониторинга нагрузки - не о чем и говорить.


Иван, на самом деле, думать нужно.
Дело вот в чём: на Обероне возможно разрабатывать высоконагруженные приложения, вообще не использующие сборку мусора. Т.е. сборщик просто отключен. Объекты держатся в пулах - берутся из них и в них возвращаются. Двоичные данные (строки и др.) хранятся в спец. объектах, подобных File в памяти. Такое приложение выжирает под максимальной нагрузкой некоторый объём памяти (под всякие разные объекты), а затем эти объекты живут постоянно, крутятся в пулах.

Это возможно только при условии, что все компоненты не порождают при своей работе мусор.
"Идиллию" может обломать вот этот безобидный NEW, где-нибудь вызываемый раз в минуту, в модуле уважаемого Ивана Кузьмицкого, который он любезно опубликовал, а я, не проверив, использовал в своём нагруженном приложении :)

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 08 Февраль, 2012 12:37 

Зарегистрирован: Четверг, 17 Ноябрь, 2005 11:51
Сообщения: 2930
Откуда: г. Ярославль
Кто бы спорил, а я не буду :)

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

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


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

Сейчас этот форум просматривают: Google [Bot] и гости: 1


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

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