OberonCore https://forum.oberoncore.ru/ |
|
Паттерны: инициализация статической записи https://forum.oberoncore.ru/viewtopic.php?f=29&t=3825 |
Страница 1 из 1 |
Автор: | Иван Кузьмицкий [ Вторник, 07 Февраль, 2012 18:40 ] |
Заголовок сообщения: | Паттерны: инициализация статической записи |
Иногда удобно заполнять поля статической записи одним оператором. Например, так: Код: 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 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Иван Кузьмицкий писал(а): для статических структур такая запись не подходит Тогда можно и статические записи инициализировать:Код: 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 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Александр Ильин писал(а): Недостаток очевиден - мусор в куче. Красота требует жертв? А любой POINTER TO - это мусор в куче.
|
Автор: | Евгений Темиргалеев [ Вторник, 07 Февраль, 2012 21:11 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Иван Кузьмицкий писал(а): Александр Ильин писал(а): Недостаток очевиден - мусор в куче. Красота требует жертв? А любой POINTER TO - это мусор в куче.Если говорить про дату или время, я вообще не чураюсь писать три присваивания подряд. На крайний случай, процедура-инициализатор. |
Автор: | Иван Кузьмицкий [ Среда, 08 Февраль, 2012 06:49 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Евгений Темиргалеев писал(а): Если говорить про дату или время, я вообще не чураюсь писать три присваивания подряд. На крайний случай, процедура-инициализатор. Ну вот свежий пример, запрос данных за определённый период. Период определён начальными и конечными датой и временем, то есть мы имеем уже четыре структуры, которые надо инициализировать:Код: (* взять период из выделения *) Всё это выглядит довольно громоздко и часто возникает желание видеть более-менее единообразную конструкцию инициализации полей.
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 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Иван Кузьмицкий писал(а): Всё это выглядит довольно громоздко и часто возникает желание видеть более-менее единообразную конструкцию инициализации полей. Если для Вашего приложения это не сказывается на требуемых от него характеристиках, а Вам так больше нравится, то почему бы и нет. Главное --- не забыть цену и не применить на автомате там, где это может выйти боком.А вообще, если дело касается красот, --- на вкус и цвет товарища нет. Мне наоборот больше нравится код, который "ближе к реалиям железа". Пусть он объёмный, но суть очевидна, проглатывается быстро (есть же такая штука, как скорочтение, когда страницу за сколько-то секунд проглатывают?). Код: ... 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 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Евгений Темиргалеев писал(а): Главное --- не забыть цену и не применить на автомате там, где это может выйти боком. Абсолютно поддерживаю. И считаю, что для каждого типа приложений должны применяться особые паттерны, без попыток универсализации!Евгений Темиргалеев писал(а): Мне наоборот больше нравится код, который "ближе к реалиям железа". Пусть он объёмный, но суть очевидна, проглатывается быстро Да, есть такое дело. К тому же, я заметил за собой, что чем старше исходник, тем больше мне нравится его "многословность", когда ничего не скрыто и не спрятано за мудрёными конструкциями. Но вот есть такой этап в разработке, когда продумываешь логику и хочется побыстрее её "увидеть", пощупать. Тут "многословность" немного мешает.Евгений Темиргалеев писал(а): P.S. Название SternDates.GetTime(0, 0, 0) меня по началу ввело в заблуждение. Может лучше что-то типа MakeTime? Да у меня там уже была процедура Time, с сигнатуройКод: PROCEDURE Time (h, m, s: INTEGER; VAR t: Dates.Time); а GetTime - экспериментальная ![]() |
Автор: | Евгений Темиргалеев [ Среда, 08 Февраль, 2012 09:26 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Иван Кузьмицкий писал(а): Но вот есть такой этап в разработке, когда продумываешь логику и хочется побыстрее её "увидеть", пощупать. Тут "многословность" немного мешает. Да, согласен, такой момент есть. И вопрос, чему больше мешает многословность --- восприятию (чтению) или скорости получения результата (написанию). Хотел было сказать что только написанию, но нашёл у себя пример, где (для меня) и восприятию способствует. Наверное, тоже зависит от задачи.Код: PROCEDURE Set (VAR p: Ports.Point; x, y: INTEGER); Но только не POINTER TO Ports.Point! 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); ... ![]() |
Автор: | Александр Ильин [ Среда, 08 Февраль, 2012 09:38 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Иван Кузьмицкий писал(а): Александр Ильин писал(а): Недостаток очевиден - мусор в куче. Красота требует жертв? А любой POINTER TO - это мусор в куче.В нашем случае указатель создаётся в процедуре, возвращается, данные из него копируются, а сам он больше не используется. Это как если бы вам лень было идти за молоком со своим кувшином, вместо этого вы бы покупали в магазине точно такой же кувшин, какой у вас уже есть дома, а по приходу домой сразу переливали бы молоко из купленного в свой, после чего купленный - выбрасывали в мусорное ведро. Вот я и говорю: вы либо не ленитесь таскать свой кувшин, либо пользуйтесь покупными. Зачем же покупать и сразу выбрасывать? Деньги лишние? Другими словами, зачем изначально вам статическая запись? Не для того ли, чтобы снизить нагрузку на сборщик мусора? А если так, то зачем вы временную запись в процедуре создаёте? Если статическая запись нужна не для снижения нагрузки, ну так и сделайте её динамической, и работайте везде с указателями. |
Автор: | Илья Ермаков [ Среда, 08 Февраль, 2012 09:53 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Если принять для своего проекта за аксиому, что он всегда будет однопоточным (и не надо думать, что это "неверно, устарело" и проч.), то можно из такой функции возвращать указатель на одну и ту же запись (или, например, строку), который хранится в глоб. переменной. Я бы так делать не стал, но... |
Автор: | Иван Кузьмицкий [ Среда, 08 Февраль, 2012 10:02 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Александр Ильин писал(а): Если статическая запись нужна не для снижения нагрузки, ну так и сделайте её динамической, и работайте везде с указателями. Какая нагрузка? О чём Вы? Я не думаю, что можно всерьёз говорить о "нагрузке" в данном случае. Чисто схоластически - может быть. А вот уменьшение нагрузки на мозг в случае более компактной записи - вполне ощутимо. Оптимизация высоконагруженного приложения - другой процесс и делать его надо, обложившись мониторами нагрузки. "О, что это у нас тут, паразитный указатель? Даёт скачок на полпроцента в тяжких случаях? Долой его!". А пока нет средства мониторинга нагрузки - не о чем и говорить.
|
Автор: | Александр Ильин [ Среда, 08 Февраль, 2012 10:08 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Иван Кузьмицкий писал(а): Александр Ильин писал(а): Если статическая запись нужна не для снижения нагрузки, ну так и сделайте её динамической, и работайте везде с указателями. Какая нагрузка? О чём Вы? |
Автор: | Пётр Кушнир [ Среда, 08 Февраль, 2012 10:37 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
в реальности уже существует статические записи из Dates, например. |
Автор: | Александр Ильин [ Среда, 08 Февраль, 2012 10:40 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Пётр Кушнир писал(а): в реальности уже существует статические записи из Dates, например. Объявите на них указатель, и пользуйтесь.TYPE MyDate = POINTER TO Dates.Date. |
Автор: | Иван Кузьмицкий [ Среда, 08 Февраль, 2012 11:33 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Александр Ильин писал(а): Пётр Кушнир писал(а): в реальности уже существует статические записи из Dates, например. Объявите на них указатель, и пользуйтесь.TYPE MyDate = POINTER TO Dates.Date. Один раз проинициализировать дату - необоснованный мусор в куче. А завести вместо статической даты динамическую структуру во всех сырцах - это "обосновано" и не мусор. Я, пожалуй, пойду чайку лучше попью ![]() |
Автор: | Александр Ильин [ Среда, 08 Февраль, 2012 11:45 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Иван Кузьмицкий писал(а): Один раз проинициализировать дату - необоснованный мусор в куче. А завести вместо статической даты динамическую структуру во всех сырцах - это "обосновано" и не мусор. И уже совсем не понимаю, о чём речь. То о паттерне (см. название темы), то об одном разе.Где паттерн, там и цикл с его использованием. В общем, моя мысль понятна. Dixi. |
Автор: | Иван Кузьмицкий [ Среда, 08 Февраль, 2012 12:00 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Александр Ильин писал(а): Иван Кузьмицкий писал(а): Один раз проинициализировать дату - необоснованный мусор в куче. А завести вместо статической даты динамическую структуру во всех сырцах - это "обосновано" и не мусор. И уже совсем не понимаю, о чём речь. То о паттерне (см. название темы), то об одном разе.Где паттерн, там и цикл с его использованием. В общем, моя мысль понятна. Dixi. Позволю себе напомнить, что Цитата: В разработке программного обеспечения, шаблон проектирования или паттерн (англ. design pattern) — повторимая архитектурная конструкция, представляющая собой решение проблемы проектирования в рамках некоторого часто возникающего контекста. (http://ru.wikipedia.org/wiki/Шаблон_проектирования)Очевидно, что разработка высоконагруженных приложений не является приоритетом в каждом случае и уж тем более не происходит настолько часто, чтобы можно было думать о сборке мусора при каждом объявлении POINTER TO RECORD. |
Автор: | Илья Ермаков [ Среда, 08 Февраль, 2012 12:07 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Иван Кузьмицкий писал(а): Какая нагрузка? О чём Вы? Я не думаю, что можно всерьёз говорить о "нагрузке" в данном случае. Чисто схоластически - может быть. А вот уменьшение нагрузки на мозг в случае более компактной записи - вполне ощутимо. Оптимизация высоконагруженного приложения - другой процесс и делать его надо, обложившись мониторами нагрузки. "О, что это у нас тут, паразитный указатель? Даёт скачок на полпроцента в тяжких случаях? Долой его!". А пока нет средства мониторинга нагрузки - не о чем и говорить. Иван, на самом деле, думать нужно. Дело вот в чём: на Обероне возможно разрабатывать высоконагруженные приложения, вообще не использующие сборку мусора. Т.е. сборщик просто отключен. Объекты держатся в пулах - берутся из них и в них возвращаются. Двоичные данные (строки и др.) хранятся в спец. объектах, подобных File в памяти. Такое приложение выжирает под максимальной нагрузкой некоторый объём памяти (под всякие разные объекты), а затем эти объекты живут постоянно, крутятся в пулах. Это возможно только при условии, что все компоненты не порождают при своей работе мусор. "Идиллию" может обломать вот этот безобидный NEW, где-нибудь вызываемый раз в минуту, в модуле уважаемого Ивана Кузьмицкого, который он любезно опубликовал, а я, не проверив, использовал в своём нагруженном приложении ![]() Это я не к тому, что Вы должны думать о высоконагруженной сфере. Это я к тому, что применительно к выделению памяти тезис "сначала можно вообще не думать, потом померять - и оптимизировать" не совсем верен. Потому что тут критерий качественный - не "сколько процентов даст этот NEW", а "переведёт ли этот NEW мою систему из класса способных работать без сборки мусора в класс обычных". |
Автор: | Иван Кузьмицкий [ Среда, 08 Февраль, 2012 12:37 ] |
Заголовок сообщения: | Re: Паттерны: инициализация статической записи |
Кто бы спорил, а я не буду ![]() Проектировать нагруженные приложения надо особым образом и подбирать компоненты для них тоже надо соответствующе, что и говорить. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |