OberonCore
https://forum.oberoncore.ru/

"Стоимость", уровень языка и абстракций
https://forum.oberoncore.ru/viewtopic.php?f=27&t=3157
Страница 3 из 7

Автор:  Alexey Veselovsky [ Пятница, 14 Январь, 2011 18:14 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

Geniepro писал(а):
Нет гарантии, что SrvIPStream не будет уничтожен в других процессах...

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

Автор:  Geniepro [ Пятница, 14 Январь, 2011 18:15 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

Илья Ермаков писал(а):
Евгений, при нормальном составлении циклов Вы не избежите этого дублирования, во многих случаях.
Норма -- понятие относительное и субъективное.

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

Автор:  Geniepro [ Пятница, 14 Январь, 2011 18:16 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

Alexey Veselovsky писал(а):
Geniepro писал(а):
Нет гарантии, что SrvIPStream не будет уничтожен в других процессах...

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

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

Автор:  Alexey Veselovsky [ Пятница, 14 Январь, 2011 18:27 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

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

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

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

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

Автор:  Сергей Прохоренко [ Пятница, 14 Январь, 2011 18:28 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

Илья, а как Вы относитесь к "адскому" "exit when (exit-cond)"?

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

Автор:  Alexey Veselovsky [ Пятница, 14 Январь, 2011 18:29 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

Сергей Прохоренко писал(а):
Илья, а как Вы относитесь к "адскому" "exit when (exit-cond)"?

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

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

Автор:  Geniepro [ Пятница, 14 Январь, 2011 22:20 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

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 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

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


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

Автор:  Geniepro [ Пятница, 14 Январь, 2011 23:53 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

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

Автор:  Илья Ермаков [ Суббота, 15 Январь, 2011 00:40 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

в ЦД условия - это селекторы на то, какую ветку выполнять. Цикл выполняется до тех пор, пока есть хоть одна возможность.
ЦД как раз описывает "сложнопериодическую" последовательность, где на каждом обороте цикла может быть выбрана разная подпоследовательность.

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

Автор:  Илья Ермаков [ Суббота, 15 Январь, 2011 00:45 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

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


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

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


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

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

Автор:  Alexey Veselovsky [ Суббота, 15 Январь, 2011 00:49 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

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


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

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

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

Автор:  Илья Ермаков [ Суббота, 15 Январь, 2011 00:52 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

Это как с отладкой...
Известный факт, что самый эффективный способ найти мелкие ошибки в нормально написанной программе - это её вычитать. Одному или совместным аудитом.

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

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

Автор:  Илья Ермаков [ Суббота, 15 Январь, 2011 00:54 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

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


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

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

Автор:  Geniepro [ Суббота, 15 Январь, 2011 00:58 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

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

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

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

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

Автор:  Geniepro [ Суббота, 15 Январь, 2011 01:03 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

Илья Ермаков писал(а):
И большинство программистов этого не знает и пишет не похожие одни на другие "творческие продукты" с брейками.

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

Автор:  Alexey Veselovsky [ Суббота, 15 Январь, 2011 01:04 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

Илья Ермаков писал(а):
Это как с отладкой...
Известный факт, что самый эффективный способ найти мелкие ошибки в нормально написанной программе - это её вычитать. Одному или совместным аудитом.

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

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

Автор:  Илья Ермаков [ Суббота, 15 Январь, 2011 01:06 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

А как Вы хотите измерять? ))

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

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

Автор:  Илья Ермаков [ Суббота, 15 Январь, 2011 01:08 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

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


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

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

Автор:  Alexey Veselovsky [ Суббота, 15 Январь, 2011 01:11 ]
Заголовок сообщения:  Re: "Стоимость", уровень языка и абстракций

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

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

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

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

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

Страница 3 из 7 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/