Бритва Оккама
Запись от CoderHuligan размещена 26.06.2019 в 15:09
Показов 19144
Комментарии 268
Бритва оккама - известный методологический принцип в философии, который гласит примерно следующее: "Не следует привлекать новые сущности без крайней на то необходимости.". Оккам писал:
"Принцип «бритвы Оккама» состоит в следующем: если некое явление может быть объяснено двумя способами: например, первым — через привлечение сущностей (терминов, факторов, фактов и проч.) А, В и С, либо вторым — через сущности А, В, С и D, — и при этом оба способа дают одинаковый результат, то следует предпочесть первое объяснение. Сущность D в этом примере лишняя, и её привлечение избыточно. " Применительно к нашей теме программирования данный принцип часто нарушается. Игнорирование же его приводит к переусложнению языков и компиляторов, сложности образовательного процесса и т.п. Индустрия должна зарабатывать деньги и её не интересуют какие-то принципы и философия.. К сожалению. Индустрия создаёт свои собственные инструменты. Индустрия создаёт своих собственных специалистов, которые её будут обслуживать.. Тут уже философией и не пахнет. Если чувствуется аромат денег, то всё остальное отступает на второй план. Во главу угла ставится конкуренция, конкуренция во всём: в отсеве специалистов, в стилях программирования, соглашениях и пр. Так как я пропагандирую "народное программирование", то с обычным нам не по пути. Я обьясню. Не говоря уже о том, что структурная парадигма (СП) крайне усложнила воплощение в код достаточно сложных алгоритмов, она ещё к тому же не следует принципу Оккама. Если какую-либо сущность можно обьяснить более простыми средствами, то не нужно привлекать дополнительные. Если полную условную конструкцию можно выразить через :
Для эмулирования циклов создали аж до трёх разных их разновидностей. Цикл for, while, do while. Пришлось к тому же вводить новые сущности: continue, break. В разных языках по разному. А ведь циклы реализуются на goto гораздо проще, чем даже полная условная конструкция. Причём, заметьте, что завершение тела цикла гораздо понятнее именно применяя goto:
А в такой конструкции "правильного" цикла мы встречаем не метку, а безликую скобку:
Попытка приблизить язык, который понимает компьютер, к языку, на котором разговаривают люди обречена на провал потому, что чем ближе к естественному для человека языку мы приближаемся, тем все менее возможной становится способность выражать на нём алгоритмические построения.. Мы приближаемся к тупику, и только совсем мало думающий человек не видит этого.. Принцип "каждая кухарка может управлять государством" на практике не подтверждается.. | |||||||||||||||||||||
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 268
Комментарии
-
сомнительное и абсолютное субъективное мнение.
Глупость чистейшей воды. Все прекрасно понятно! Кому не понятно, тот не знает языка!
Еще как помогают! Ни разу не было проблем! Если у Вас были проблемы, то так и скажите...
Вам да, мне нет
Хотя бы потому, что на метку можно попасть как угодно и откуда угодно. Какое же это завершение цикла? Все обезличено! Скажу больше, формально в конструкциях с goto вообще нет такого понятия, как цикл! Есть только переходы... Вы же сами ратуете за переход куда угодно и откуда угодно...
Между прочим, Вы не обратили внимание на конец фразы: "без крайней на то необходимости". А вот необходимость как раз имеется... Именно нагромождение большого количества goto делает трудным понимание кода, особенно чужого.
Миллионы программистов по всему миру с Вами явно не согласны... Они все малодумающие? Не слишком ли много Вы берете на себя?
Скажите честно, Вы мессия? Которого осенило новое (старое) видение подхода к программированию... 
Запись от liv размещена 26.06.2019 в 15:48
-
Можно в принципе всё что угодно испортить, запороть и пр. Даже в вашем любимом стиле. Но ведь не солнышко ясным днём решает куда нам переходить или что присвоить переменной, а программист. Или вы считаете программиста безответственным к тому, что делает? Если он не может контролировать то пусть идёт в дворники.
Сообщение от liv
Как это? У каждой метки есть своё уникальное имя. А любое имя, любая именованная сущность уже представляет из себя чистую абстракцию. Компилятор не даст вам создать две одинаковые метки втой же самой программной сущности. Метка, которая обозначает начало некоторого блока кода, придает ему осмысленное существование. Так что вы не правы. Это как раз у вас скобочки ничего не именуют.
Сообщение от liv
Ещё раз повторяю, что код это ещё не вся документация. Нагромождение флагов, скобочек, сотен операторов, как например в языке Си++, это просто какой-то кошмар. Даже Бьерн Страуструп ("дохлый страус") писал, что не знает свой же язык в полном обьёме.. Давайте запихнём в язык ещё что-нибудь, а потом ещё и ещё, что новое.. Никлаус Вирт сказал, что язык должен быть компактным и простым. Добавлю - и расширяемым своими базовыми вещами. Пока к этому приблизился лишь один язык - Форт. Хотя я не очень в восторге даже от него..
Сообщение от liv
А вы спрашивали у этих миллионов, чтобы так категорично.?.
Сообщение от liv
Я не мессия. И ничего на себя не беру. Просто говорю то, что думаю, а это не принято в современном мире. Но кто-то же должен это делать.. "Всё новое это хорошо забытое старое".. Я просто указываю, что в старом подходе было явно здоровое зерно истины, которое к сожалению, было успешно похоронено последующими "инновациями"..Запись от CoderHuligan размещена 26.06.2019 в 16:29
-
Запись от CoderHuligan размещена 26.06.2019 в 16:35
-
Запись от CoderHuligan размещена 26.06.2019 в 16:44
-
Метки-то есть, а вот законченных операторов цикла нет! Операторы цикла обезличены! Все сведено к набору переходов и меток...
Сообщение от CoderHuligan
Тем самым убираем возможность компилятору проконтролировать целостность того же оператора цикла.
Да, так пишется на Ассемлере... Сам большой любитель Ассемблера...
Только вот почему-то приверженцев Ассемблера не сильно много. Не задумывались, почему?
Наверное, хотят, чтобы было проще писать и было меньше возможностей ошибиться...
И почему это? Как раз является!
Мы, кажется, говорим об операторе цикла.
Не валите все в кучу.
Да и кто запрещает написать все в одной main()? Вот тут есть где разгуляться с переходами и метками...
Даже если и есть зерно истины, не стоит делать из этого панацею от всего! Никто не говорит о том, что вообще нельзя использовать goto. Но сводить все к goto - это перебор!Запись от liv размещена 26.06.2019 в 16:48
-
Глубокоуважаемый CoderHuligan,
мне кажется, что отступы и GOTO друг другу не мешают. Пустые строки тоже как бы лишние? Но я с удовольствием вставляю их в свой код.
Другой пример.
В математике есть функция sin(x). Её вполне достаточно, чтобы решить любую тригонометрическую задачу. Но добавили (для сервиса) ещё функции ... cos(x), tg(x) ... . Зачем? Бритва Оккама не сработала. Просто куча функций более удобна.
...
Но в целом я с вами согласен. Цикл с помощью GOTO позволяет использовать тело цикла и для других вычислений, проникнув в это тело по метке и не плодить лишний код. Хотя цикл FOR можно было бы ввести для сервиса. А так действительно введено много лишнего, чтобы любой ценой избавиться от GOTO. Лучше GOTO есть только GOTO!Запись от wer1 размещена 26.06.2019 в 16:52
-
Кто мешает оформить тело цикла отдельной функцией? Вызывай ее в любом месте, кто мешает? А вот скакать туда-сюда... Применять нестандартные подходы - это прямой путь к бессонным ночам поисков ошибок, особенно тех, кто будет после Вас править Ваш код... Да, можно так делать... Язык позволяет! И goto никто не запрещает! Но стоит ли овчинка выделки?
Сообщение от нтч
Действительно, зачем еще косинусы там разные, тангенсы? Можно же обойтись одним синусом?
Так что Ваше аппелирование к Бритве Оккамы совершенно неуместно...Запись от liv размещена 26.06.2019 в 16:58
-
Уважаемый liv,
вы во многом правы и я не буду с вами спорить только для того, чтобы показать, что я что-то знаю.
Но вот согласитесь,
Обезличенные скобки {} в Си++ (как и begin - end в Паскале) - это не самое лучшее решение. Я не против обычных циклов. Но они (особенно скобки и когда их много) ничем не лучше GOTO. Подчеркну, что я не против циклов. Но вот парадокс. Даже в Бейсике цикл FOR - NEXT лучше, чем тот же цикл в Си++.Запись от wer1 размещена 26.06.2019 в 17:14
-
не соглашусь. Наличие массы меток еще хуже.
А вот выстроенные стройными рядами с отступами пары скобок говорят о структуре программы очень много.
Для начала и конца того же цикла совершенно не надо знать имена этих мест. Более, чем достаточно, видеть их соответствие.
Разумеется, если код писать абы как, то можно в скобках и запутаться...
Это задача программиста писать так, чтобы было понятно.
Скобки хороши тем, что позволяют показать структуру программы! А это немало! Особенно, при анализе чужой программы!
нтч, представьте, чисто гипотетически, к Вам попадает некая программа, в которой Вам требуется изменить две функции.
При этом одна из них вся построена из безчисленных переходов и меток, причем переходы и во внутрь "циклов" и как угодно...
Вторая же построена без goto и красиво выстроена с отступами по парам скобок.
Какую из них Вы поймете и исправите быстрее?
Запись от liv размещена 26.06.2019 в 17:22
-
liv,
всё правильно, всё верно. Это с одной стороны. Но есть ещё и другая сторона.
О чём мы собственно говоря спорим? А вот о чём. Насколько целесообразно заменить циклы с оператором GOTO на циклы без этого оператора. Но лично я и не против. (То, что я высказался по поводу циклов в языке Си++ никак не означает, что я против циклов). Итак, цикл имеет право на существование. Хотя я поддерживаю ТС, но я против тотального применения оператора GOTO. Слава GOTO! ... но в разумных количествах и там, где он необходим.
...
liv,
я выберу второй вариант. Почему? Я употребляю GOTO только "по праздникам". Но могу понять ТС, когда пытаются заменить GOTO любой ценой. А вот эту цену я платить никогда не буду.Запись от wer1 размещена 26.06.2019 в 17:49
-
Они и не нужны. Вас просто приучили мыслить в терминах структурных конструкций. А нужно учиться мыслить в терминах состояний программного кода.
Сообщение от liv
Потому что в ассемблере надо оперировать понятиями команд процессора, что не каждому по плечу.
Сообщение от liv
Причём здесь goto? Это просто оператор безусловного перехода. Можно назвать его другим словом. В будущем может быть опять скроют этот оператор, но уверен, что тогда будут мыслить состояниями, переходы между которыми всё-равно как-то надо обозначать, ибо это сущность любого алгоритма.
Сообщение от liv
Запись от CoderHuligan размещена 26.06.2019 в 17:54
-
Запись от CoderHuligan размещена 26.06.2019 в 17:57
-
Ой ли? Совсем? Уже не надо отрабатывать циклические операции?
Сообщение от CoderHuligan
Не, я понимаю, можно такие операции реализовать и переходами... Но зачем усложнять себе жизнь? Когда есть оператор, которые призван это делать... И правильность написания которого может проверить компилятор...
Почему это должно противоречить терминам "структурных конструкций"? Я чего-то не уловил... Я всегда пишу код "в терминах состояния программного кода"... Это должно меня подвигнуть писать везде goto?
Я имею в виду весь Ваш подход использования только операторов перехода и меток.
Так он уже сейчас скрыт...
Я никак не возьму в толк, каким образом "мысление состояниями" должно приводить к повсеместному использованию goto?
Я использую состояния, дальше что?...
Я за свои 35 лет в программировании (из них на С/С++ пишу лет 20) использовал goto всего пару раз, и то это было на ранних стадиях моей программистской жизни, более того, можно было бы и обойтись... И убежден, что можно написать все, что угодно, при этом, не используя goto. А вот это уже зависит от алгоритмического мышления программиста. Если его нет, то можно (чего ж нельзя? Все можно!) с помощью goto закрутить так, что потом никто не разберется...
Или, по крайней мере, сильно подпортить жизнь тем, кто будет ковырять Ваш код...
Заметьте, поддержал далеко не во всем... А еще кто?
Все остальные против...Запись от liv размещена 26.06.2019 в 18:26
-
Циклических конструкций не бывает в природе. В природе есть нахождение некоторое время в определённом состоянии.
Сообщение от liv
Ой ли? Вы всегда определяете имена состояниям? Вы переходите из одного состояния в другое? Или вы под термином "состояние" понимаете нечто совершенно противоположенное тому, как это понимаю я? Традиционный структурный подход препятствует где только можно мышлению в терминах состояний. Он прячет состояния. Как вы программируете мне не совсем ясно.
Сообщение от liv
Я же ранее показывал на примере задачи подсчёта слов, что такое состояние и с чем его едят. Без состояний нет и переходов. Где состояния там и переходы между ними. Это машина Тьюринга. Так реализуются конечные автоматы. Если вы такой продвинутый математик, то должны знать о теории конечных автоматов. КА оперирует множеством состояний и переходов между ними. Что именно вы понимаете под состоянием мне неведомо.
Сообщение от liv
Покажите как вы используете состояния.
Сообщение от liv
А представьте себе, что вы пишете коммерческий код и вам нужно специально его обфусцировать. Лучшего решения трудно придумать. С goto можно писать просто и понятно, но можно и запутанно. Всё зависит от мотиваций.
Сообщение от liv
Опять вы за всех трёте..
Сообщение от liv
Запись от CoderHuligan размещена 26.06.2019 в 18:54
-
Запись от Usaga размещена 26.06.2019 в 19:00
-
Запись от CoderHuligan размещена 26.06.2019 в 19:13
-
Запись от Usaga размещена 26.06.2019 в 19:22
-
Запись от CoderHuligan размещена 26.06.2019 в 19:51
-
Ребята, я считаю, что есть целый ряд ситуаций, когда применение GOTO оправдано.
1. выход из цикла, процедуры
2. досрочное завершение цикла, процедуры или иной сложной конструкции.
3. выход из оператора выбора, когда выбор сделан
4. замена сложных (вложенных) условных операторов. Здесь даже тройное вложение способно ввести в шок любого структурного программиста (и не только). Зачем такие сложности? Тут GOTO выглядит небесным ангелом.
5. В то же время я считаю, что GOTO должен использоваться для спуска вниз программы. Иными словами, GOTO должен быть выше своей метки. Или, метка должна знать своё место и "не летать над GOTO"
6. Но я спокойно воспринимаю стремление ТС прояснить свою позицию. Есть два лагеря бойцов. Одни травят оператор GOTO, другие его на руках носят. Истина посредине. Надо просто выслушать обе стороны, не впадая в крайности. Я много воспринял для себя от всех участников этой битвы. И всем вам благодарен за это.
7. Я полагаю, что в будущем будут текстовые редакторы, которые, например, будут подсвечивать GOTO и соответствующую ему метку. Да много что можно сделать...Запись от wer1 размещена 26.06.2019 в 20:04
-
Нет. Сущность имеет идентичность. Что-то, что её может однозначно идентифицировать среди других такого же типа. Скобочки - границы блока. Забор. else - часть конструкции ветвления.
Сообщение от CoderHuligan
А вот метка имеет вполне конкретное имя, играет вполне конкретную роль, а так же связи, которые только поиском по коду найти и можно. Т.е. метка создаёт когнитивную нагрузку. Глядя на метку вы не можете сказать, сколько операторов goto на неё ссылается и из каких частей функции (если она здоровенная). Так же, вы вряд ли сможете быстро ответить на вопрос в каком количестве сценариев потока исполнения она участвует, ведь goto на неё ссылающиеся сами могут находиться в блоках с метками. Получается развесистый граф, натуральный клубок. В таком клубке сложно разобраться и почти невозможно дать гарантии, что изменение кода в одном месте не нарушит что-то в другом.
Разбиение кода на структурные блоки от этой проблемы позволяет уйти. У такого блока есть конкретное начало и конкретный конец. Отсутствие меток внутри гарантирует, что в обход этих двух точек в этот блок не попасть. Так же, границы блока не требуют именований как метки. Количество состояний в таком блоке кода определяется количеством переменных, что зайдействованы в нём. А с применением меток, это количество состояний дополнительно умножается ведь блок становится частью другого блока со своим состоянием.
Безусловные прыжки по коду связывают весь код в один здоровенный ком, усложняя его поддержку, отладку и просто чтение.
Сравните:
Code 1 2 3 4
{ x *= y; z += x; }
Что происходит в первом блоке однозначно понятно. Переменные изменяются строго в определённом порядке и по определённому алгоритму. А во втором что? Откуда мы можем попасть в эту метку? Сколькими путями? Это уже нужно искать по коду. Какое значение будет уCode 1 2 3 4 5
{ x *= y; L173: z += x; }
x? Это тоже неизвестно! Тоже придётся искать!
Второй блок кода безоговорочно хуже.Запись от Usaga размещена 27.06.2019 в 06:14



