OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Воскресенье, 17 Ноябрь, 2019 22:57

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




Начать новую тему Ответить на тему  [ Сообщений: 132 ]  На страницу Пред.  1, 2, 3, 4, 5, 6, 7  След.
Автор Сообщение
СообщениеДобавлено: Пятница, 14 Январь, 2011 18:14 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Geniepro писал(а):
Нет гарантии, что SrvIPStream не будет уничтожен в других процессах...

А как там можно уничтожить? Это ж шарп. Сохраним ссылку на объект и всё. Он не будет уничтожен (собран сборщиком). А Disposed он или нет -- пусть проверяет функция SrvIPStream.CanWrite().


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

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья Ермаков писал(а):
Евгений, при нормальном составлении циклов Вы не избежите этого дублирования, во многих случаях.
Норма -- понятие относительное и субъективное.

Авторы Ады не погнушались и сделали цикл с выходом из середины.
Может быть, они не так уж и неправы с этим хаком?


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

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Alexey Veselovsky писал(а):
Geniepro писал(а):
Нет гарантии, что SrvIPStream не будет уничтожен в других процессах...

А как там можно уничтожить? Это ж шарп. Сохраним ссылку на объект и всё. Он не будет уничтожен (собран сборщиком). А Disposed он или нет -- пусть проверяет функция SrvIPStream.CanWrite().

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


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

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Илья Ермаков писал(а):
Во-вторых, break даёт программисту свободу и "искушение" писать "оригинальные" циклы, непохожие друг на друга, вместо того, чтобы разглядеть в задаче цикла её основную природу и организовать цикл какой-либо типичной структуры.

Логическое выражение для while дает не меньшую (а то и бОльшую) свободу самовыражения :-) Если мы рассматриваем примитивные циклы, то они достаточно короткие и простые. Посмотреть внутрь них не бОльшая проблема нежели разобраться с шапкой его. Глаз охватывает его целиком и сразу.

Если у нас условия прекращения цикла достаточно сложные, анализировать СЛОЖНУЮ булеву функцию в заголовке цикла будет ничуть не легче, а порою и сложнее нежели просмотреть несколько дополнительных условий для выхода непосредственно в теле цикла. Особенно если автор самовыразился и сделал несколько эквивалентных преобразований наивной формы булевой функции.

Во всём нужно чувство меры. А вот догмы, напротив, не нужны.


Последний раз редактировалось Alexey Veselovsky Пятница, 14 Январь, 2011 18:28, всего редактировалось 1 раз.

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

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Илья, а как Вы относитесь к "адскому" "exit when (exit-cond)"?

Это ведь что-то вроде дополнительной ветви в мнорговеточной конструкции (типа длинного IFа, CASE или цикла Дейкстры). Эта ветвь видна сразу при взгляде на цикл, в отличие от break, который может быть где угодно, вплоть до вложенных циклов.


Последний раз редактировалось Сергей Прохоренко Пятница, 14 Январь, 2011 18:33, всего редактировалось 2 раз(а).

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

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Сергей Прохоренко писал(а):
Илья, а как Вы относитесь к "адскому" "exit when (exit-cond)"?

Это ведь что-то вроде дополнительной ветви в мнорговеточной конструкции (типа длинного IFа, CASE или цикла Дейкстры). Эта ветвь видна сразу при взгляде на цикл, в отличие от break, который может быть где угодно, вплоть до вложенных циклов.

Причем в Аде циклы именованные и при exit'e можно сказать из какого цикла выходим. Дюже удобно. И читабельно.


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

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
albobin писал(а):
albobin писал(а):
А если последний не отосланный message за пределами while не нужен, то можно написать функцию с параметрами: откуда однократно прочитать, логить?, куда передать. А возвращать флаг "эндец" (нет собщения или некому отправлять) и заwhileить её

Я имел ввиду вот это сообщение

Что-то вроде этого (на си не пишу :? )

Немного переделал Ваш вариант. Кроме того, посмотрев на внутренности процедуры TCPStreamIO.SendMsg, обнаружил, что там тоже проверяется условие ((stream != null) && stream.CanWrite), то есть бесполезная двойная проверка.
Если доработать эту процедуру, что бы она возвращала результат проверки этого условия, то получается вот так:
Код:
bool TransferAndLogMessage(Stream streamin, Stream streamout)
{
    string message = TCPStreamIO.ReceiveString(streamin);
    safeLogAppend(message);
    return (message != null) && TCPStreamIO.SendMsg(streamout, message + "\n");
}

while (TransferAndLogMessage(POSIPStream, SrvIPStream)) {}

Выглядит уже неплохо, но смущает пустое тело цикла... :о)


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 23:38 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
Geniepro писал(а):
Авторы Ады не погнушались и сделали цикл с выходом из середины.
Может быть, они не так уж и неправы с этим хаком?


Я для себя в голове "вижу" цикл как грамматику на последовательность действий, которая имеет некоторые "периоды". Если в цикле есть IF-ы, то там какие-то участки возникают не на каждом обороте, а реже. Ну, примерно так (математически говоря, всё строже).
Ваш цикл с брейк али чем ещё для меня сразу же очень странно выглядит - в его развёртке есть одиночный "особый" участок в конце или в начале. Если он одиночный, то что он делает в цикле? Как, например, в случае, когда народ прямо внутрь поискового for засовывает в if обработку найденного элемента - и затем break.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Пятница, 14 Январь, 2011 23:53 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья Ермаков писал(а):
Я для себя в голове "вижу" цикл как грамматику на последовательность действий, которая имеет некоторые "периоды". Если в цикле есть IF-ы, то там какие-то участки возникают не на каждом обороте, а реже. Ну, примерно так (математически говоря, всё строже).
Ваш цикл с брейк али чем ещё для меня сразу же очень странно выглядит - в его развёртке есть одиночный "особый" участок в конце или в начале. Если он одиночный, то что он делает в цикле? Как, например, в случае, когда народ прямо внутрь поискового for засовывает в if обработку найденного элемента - и затем break.
А как же в этом случае выглядит цикл Дейкстры? Там же тоже нужно анализироватьусловие завершения цикла по всему телу цикла...


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
в ЦД условия - это селекторы на то, какую ветку выполнять. Цикл выполняется до тех пор, пока есть хоть одна возможность.
ЦД как раз описывает "сложнопериодическую" последовательность, где на каждом обороте цикла может быть выбрана разная подпоследовательность.

Не говоря про то, что в ЦД на каждом обороте выполняется одна из секций, а не секция за секцией, как в циклах с exit when.


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
Alexey Veselovsky писал(а):
Логическое выражение для while дает не меньшую (а то и бОльшую) свободу самовыражения :-) Если мы рассматриваем примитивные циклы, то они достаточно короткие и простые. Посмотреть внутрь них не бОльшая проблема нежели разобраться с шапкой его. Глаз охватывает его целиком и сразу.


Чтобы составить "шапку", нужно сосредоточенно подумать. Чтобы составить break, можно "покомбинировать", а потом так и оставить... До когда-нибудь, когда в этом месте вылезут баги.

Цитата:
Во всём нужно чувство меры. А вот догмы, напротив, не нужны.


Дело не в догмах. А в наложении языком и стилем сильных ограничений, которые заставят подумать. Чтобы уложить свой случай под жёсткие рамки "как можно и как нельзя", обычно нужно подумать. Это будет сильной гарантией, что разработчик действительно разобрался с этим местом задачи, а не просто "наклепал" и пошёл дальше.

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


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

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Илья Ермаков писал(а):
Alexey Veselovsky писал(а):
Логическое выражение для while дает не меньшую (а то и бОльшую) свободу самовыражения :-) Если мы рассматриваем примитивные циклы, то они достаточно короткие и простые. Посмотреть внутрь них не бОльшая проблема нежели разобраться с шапкой его. Глаз охватывает его целиком и сразу.


Чтобы составить "шапку", нужно крупно подумать. Чтобы составить break, можно "покомбинировать", а потом так и оставить... До когда-нибудь, когда в этом месте вылезут баги.

Не нужно там крупно думать чтобы составить шапку. Делается на спинномозговом рефлексе. Сам наблюдал. А потом долго ищутся баги.

Но если на спинномозговом это ещё полбеды. Беда это когда там реально "крупно подумали". Потом в таком крупнонадуманном хрен разберешься. А ведь там баги будут. Обязательно. Не сейчас, так потом, после изменения окружения. И такой код проще выкинуть чем разобраться и поправить.


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
Это как с отладкой...
Известный факт, что самый эффективный способ найти мелкие ошибки в нормально написанной программе - это её вычитать. Одному или совместным аудитом.

Я вот знаю по личному опыту, что лучше и быстрее вычитать новые модуль(и). Но когда на усталую голову, то мне проще потыкаться с тестами, отладочной печатью, устроить "сафари на ошибку". Это как-то расслабляет и развлекает, что ли :)
Но не способствует быстрому и наилучшему результату.

Так и со "свободными стилями" программирования. Расслабленная работа (когда тебя ничего не ограничивает) не способствует сосредоточенности и качеству.


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
Alexey Veselovsky писал(а):
Но если на спинномозговом это ещё полбеды. Беда это когда там реально "крупно подумали". Потом в таком крупнонадуманном хрен разберешься. А ведь там баги будут. Обязательно. Не сейчас, так потом, после изменения окружения. И такой код проще выкинуть чем разобраться и поправить.


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

Кроме того, в циклах у обученного программиста вообще багов нет... Большинство циклов - стандартны. Такой вот факт.
И большинство программистов этого не знает и пишет не похожие одни на другие "творческие продукты" с брейками.


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

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья Ермаков писал(а):
Дело не в догмах. А в наложении языком и стилем сильных ограничений, которые заставят подумать. Чтобы уложить свой случай под жёсткие рамки "как можно и как нельзя", обычно нужно подумать. Это будет сильной гарантией, что разработчик действительно разобрался с этим местом задачи, а не просто "наклепал" и пошёл дальше.

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

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

Как Вы говорите? Разумная достаточность, баланс, чувство меры?
Как это объективно измерить, что бы ни у кого не осталось сомнений в достоверности измерений?
Как вообще можно измерить "чувство меры"?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Январь, 2011 01:03 

Зарегистрирован: Четверг, 12 Июль, 2007 23:18
Сообщения: 1982
Откуда: Узбекистан, Чирчик
Илья Ермаков писал(а):
И большинство программистов этого не знает и пишет не похожие одни на другие "творческие продукты" с брейками.

Ну лично я у себя статистику проделал -- на 87 циклов всего два с брейками... :lol:
Не было бы в C# оператора break -- и в этих двух циклах я без них обошёлся бы как-нибудь, и не знал бы даже, лучше или хуже без этих брейков, так как был бы в роли блаб-программиста... :lol:


Последний раз редактировалось Geniepro Суббота, 15 Январь, 2011 01:05, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Январь, 2011 01:04 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Илья Ермаков писал(а):
Это как с отладкой...
Известный факт, что самый эффективный способ найти мелкие ошибки в нормально написанной программе - это её вычитать. Одному или совместным аудитом.

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

PS. ADD-2010 конференция рулит :-) Кстати, в конце апреля будет ADD-2011


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
А как Вы хотите измерять? ))

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

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


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

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9155
Откуда: Россия, Орёл
Geniepro писал(а):
Ну лично я у себя статистику проделал -- на 87 циклов всего два с брейками... :lol:
Не было бы в C# оператора break -- и в этих двух циклах я без них обошёлся бы как-нибудь, и не знал бы даже, лучше или хуже без этих брейков, так как был бы в роли блаб-программиста... :lol:


Если Вы просто "обходитесь без брейков", то это, чаще всего, далеко не то, об чём речь. Булевские флаги понатыкать - те же яйцы :) Булевских флагов точно так же в нормально составленном цикле (кроме редких случаев) быть не должно. Хотя они чуть лучше брейков иногда, немного явнее семантика видна.

---
О чём речь, не раз уже показывалось на примерах, типа вот этого: http://oberoncore.ru/wiki/%D1%81%D1%82% ... 0%BB%D0%B0


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 15 Январь, 2011 01:11 

Зарегистрирован: Вторник, 25 Апрель, 2006 16:21
Сообщения: 2180
Откуда: Нижний Новгород
Илья Ермаков писал(а):
"Крупно подумать" надо над нормированием. Как унифицировать и привести к наиболее типичному виду. К какой-то схеме.
Пока не приводится, значит, в большинстве случаев, ещё недопроектировано. Ибо реально "эксклюзив" на уровне структуры тех же циклов встречается очень редко.

Кроме того, в циклах у обученного программиста вообще багов нет... Большинство циклов - стандартны. Такой вот факт.
И большинство программистов этого не знает и пишет не похожие одни на другие "творческие продукты" с брейками.

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

Нет цикла в явном виде -- нет проблемы. Есть цикл -- значит он не стандартный. А нужен ли тут не стандартный цикл? А если доказать попросить? Отлично будет такая схема работать в больших конторах с ревью кода.

Такие оформленные в стандартной либе функции-циклы дают ещё меньше свободы совершить ошибку. И это правильно.


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

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


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

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


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

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