Бритва Оккама
Бритва оккама - известный методологический принцип в философии, который гласит примерно следующее: "Не следует привлекать новые сущности без крайней на то необходимости.". Оккам писал: Цитата:
…множественность никогда не следует полагать без необходимости… [но] всё, что может быть объяснено из различия материй по ряду оснований, — это же может быть объяснено одинаково хорошо или даже лучше с помощью одного основания.
"Принцип «бритвы Оккама» состоит в следующем: если некое явление может быть объяснено двумя способами: например, первым — через привлечение сущностей (терминов, факторов, фактов и проч.) А, В и С, либо вторым — через сущности А, В, С и D, — и при этом оба способа дают одинаковый результат, то следует предпочесть первое объяснение. Сущность D в этом примере лишняя, и её привлечение избыточно. " Применительно к нашей теме программирования данный принцип часто нарушается. Игнорирование же его приводит к переусложнению языков и компиляторов, сложности образовательного процесса и т.п. Индустрия должна зарабатывать деньги и её не интересуют какие-то принципы и философия.. К сожалению. Индустрия создаёт свои собственные инструменты. Индустрия создаёт своих собственных специалистов, которые её будут обслуживать.. Тут уже философией и не пахнет. Если чувствуется аромат денег, то всё остальное отступает на второй план. Во главу угла ставится конкуренция, конкуренция во всём: в отсеве специалистов, в стилях программирования, соглашениях и пр. Так как я пропагандирую "народное программирование", то с обычным нам не по пути. Я обьясню. Не говоря уже о том, что структурная парадигма (СП) крайне усложнила воплощение в код достаточно сложных алгоритмов, она ещё к тому же не следует принципу Оккама. Если какую-либо сущность можно обьяснить более простыми средствами, то не нужно привлекать дополнительные. Если полную условную конструкцию можно выразить через :
Для эмулирования циклов создали аж до трёх разных их разновидностей. Цикл for, while, do while. Пришлось к тому же вводить новые сущности: continue, break. В разных языках по разному. А ведь циклы реализуются на goto гораздо проще, чем даже полная условная конструкция. Причём, заметьте, что завершение тела цикла гораздо понятнее именно применяя goto:
А в такой конструкции "правильного" цикла мы встречаем не метку, а безликую скобку:
Попытка приблизить язык, который понимает компьютер, к языку, на котором разговаривают люди обречена на провал потому, что чем ближе к естественному для человека языку мы приближаемся, тем все менее возможной становится способность выражать на нём алгоритмические построения.. Мы приближаемся к тупику, и только совсем мало думающий человек не видит этого.. Принцип "каждая кухарка может управлять государством" на практике не подтверждается.. |
Всего комментариев 268
Комментарии
-
Цитата:
автор 100500 раз повторяет одно и тоже на протяжении >3 часов.
там хотя относительно шарпа, но повествование актуально и для крестов,
рекомендую всем:
Запись от XLAT размещена 05.07.2019 в 15:01
Обновил(-а) XLAT 05.07.2019 в 15:06 -
Запись от CoderHuligan размещена 05.07.2019 в 15:33 -
Запись от XLAT размещена 05.07.2019 в 15:57 -
Можно кучу гото закинуть в функцию, которая будет по другому называться. Вам от этого легче будет? К тому же, тот пример уже во многом переделан, часть кода будет поделена на автоматы, которые будут в своих файлах. Короче говоря сделаю настоящий пример проекта. Хотя такие как вы даже от единичного гото шарахаетесь как от огня. И чем он вас так пугает?))
Запись от CoderHuligan размещена 05.07.2019 в 16:20 -
Цитата:Цитата:Сообщение от CoderHuliganсделаю настоящий пример проекта.Цитата:Сообщение от CoderHuliganХотя такие как вы даже от единичного гото шарахаетесь как от огня.Цитата:Сообщение от CoderHuliganИ чем они вас так пугают?))
Запись от liv размещена 05.07.2019 в 16:45 -
Вы забыли по мнению кодехулигана, хороший проект не надо модифицировать. Вот так вот сидит программер (настоящий) фиииигак! и WindowsXP готова.... Другой сидит.... Фиииииграк! Windoiws 10 готова (в код XP не заглядывал, только в "доукументацию")
Запись от voral размещена 05.07.2019 в 16:50 -
Цитата:
https://www.cyberforum.ru/cpp-... st13659388
там zss предложил вот такой код:
не вдаваясь в вопрос автора, меня сразу перекорежело в такое:C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
bool WinPlay = true; for(xc=0;xc<N;xc++) { for(yc=0;yc<M;yc++) { if ( opened[xc][yc] && field[xc][yc] == 9) { WinPlay = false; break; } } if( !WinPlay ) break; } if(WinPlay) cout<<"Win!!!!";
это аналогичное zss, но читаемость лучше в разы!C++ 1 2 3 4 5 6 7 8 9
for(xc=0;xc<N;xc++) { for(yc=0;yc<M;yc++) { if ( opened[xc][yc] && field[xc][yc] == 9) { goto m; } } } cout<<"Win!!!!"; m: ;
я всегда так делаю, если выделение этой части в отдельную функцию будет более фееричным.Запись от XLAT размещена 05.07.2019 в 17:33
Обновил(-а) XLAT 05.07.2019 в 19:23 -
Запись от CoderHuligan размещена 05.07.2019 в 17:56 -
Цитата:Вот именно: а поговорить.. Замечаю одну вещь. Когда человек не может привести внятных аргументов в пользу своей теории, он обычно переходит на личности, начинает искать недостатки именно в личностном плане.. Цель: увести от темы.. Они просто чувствуют свою неправоту, в подкорке..
Этот вопрос, я так понимаю, вы решили просто игнорировать? А меж тем всем читателям очень интересно узнать, что же за великий гений дергает за ниточки этого заговора и с какой целью он это делает. Глядишь, и осознаем свою зазомбированность.Запись от Катафалк размещена 05.07.2019 в 18:05 -
Цитата:
Инкапсуляция это первый столп ООП.
Далее, извиняюсь спросить,
а с чем будет работать ваша функция?
очевидно с какими то предназначенными только ей данными?
или с любыми данными?
что сделаете вы:
скорее всего вы запихнете эти данные + функции по работе с ними в отдельный сишный файл.
Это тоже инкапсуляция.
далее,
ваши эти данные скорее всего представлены в неких структурах? Верно?
например:
вы можете генерить экземпляры этой структуры в том количестве, в котором вам потреба.C++ 1 2 3 4
struct smy { int id; ... };
например:
и вот ваши функции хоть с гоуту, хоть без гоуту, например:C++ 1
smy my1[5];
bool func(smy* m, int n);
А теперь вам нужно сделать прорыв в череп-кости, чтобы пустить туда нечто для вас новое:
РАЗМЕСТИТЕ ФУНКЦИЮ func ВНУТРИ СТРУКТУРЫ smy!
Вот вы и получили почти оопный класс.C++ 1 2 3 4 5
struct smy { int id; ... bool func(int n); };
почти, потому что не хватает конструктора, спецификаторов доступа, возможно остального, но по необходимости.Запись от XLAT размещена 05.07.2019 в 18:26
Обновил(-а) XLAT 05.07.2019 в 18:42 -
О чем?
Вам уже не один раз сказали. Применение GOTO в некоторых ситуациях оправдано. И действительно дает больше наглядности. Но, это не значит, что она дает наглядность всегда... ТО что творится в вашем коде - это перебор.
Выход из нескольких вложенных циклов не частая задача. кроме того. И так же, не вдаваясь в задачу и целеесообразность данного алгоритма можно и упростить. Т.е. делаем "Когда в закрытых клетках остались только мины, мы выигрываем" (хотя я б не стал к этому сводить задачу - уже не оптимально)
Уж извините меня за скобочки - я люблю чтоб блоки были выделены явноC++ 1 2 3 4 5 6 7 8
for(xc=0; xc < N && WinPlay; xc++) { for(yc=0;yc<M && WinPlay;yc++) { WinPlay = !(opened[xc][yc] && field[xc][yc] == 9); } } if(WinPlay) { cout<<"Win!!!!"; }
Запись от voral размещена 05.07.2019 в 18:34
Обновил(-а) voral 05.07.2019 в 18:36 -
И условие именно оставляю для чтения кода. Т.е. я буду знать что строка 7 будет выполняться в случае если WinPlay истина.
В варианте с goto надо анализировать блок внутри цикла, чтобы узнать, что в нем может быть определено, перепрыгивание через строки следующие за блоком цикла. Ведь то что мы перед глазами видим и goto и цикл и метку - это всего лишь частный случай. (Тот же блок цикла я могу свернуть в своем ИДЕ.)
Рассматривая же ситуацию того топика видим, что целесообразность goto вызвана неоптимальным алгоритмом для решения задачи (в данном случае)Запись от voral размещена 05.07.2019 в 18:40
Обновил(-а) voral 05.07.2019 в 18:43 -
Цитата:
Потом стали использовать разные стили,
да, я щитаю так неправильно,
но такому учат кучу народа, только потому, что так пишут в гугле и яндексе.
Этот доходит до маразма который проявляется в таком виде:
https://pbs.twimg.com/media/DZr8wzJWsAAEOMj.jpgC++ 1 2 3 4 5 6 7 8 9
void foo(){ ... } или class my{ ... };
Запись от XLAT размещена 05.07.2019 в 19:06
Обновил(-а) XLAT 05.07.2019 в 19:12 -
Запись от XLAT размещена 05.07.2019 в 19:07
Обновил(-а) XLAT 05.07.2019 в 19:20 -
Запись от XLAT размещена 05.07.2019 в 19:07 -
Запись от voral размещена 05.07.2019 в 19:32 -
Но ведь тут уже надо смотреть но задаче. В случае обхода матрицы 19х19 не столь существенная разница, но согласен
Я еще исхожу из того что тело цикла может быть и большим, тогда выход где то в середине тела...
Ну, в общем, я ж говорил, что я не против ГОТО вообще... Т.е. в данном случае - вполне опрадано, даже без дизасемблераЗапись от voral размещена 05.07.2019 в 19:35 -
Цитата:
Что касается нашей темы, то тут приближение к истине или отступление от таковой определяется общей мотивацией большинства программистов, которые воспитаны на определённых моделях поведения, условностей и пр. Почитайте статью Дональда Кнута "Структурное программирование совместно с оператором goto." В ней он приводит в пример того, что произошло в области программирования, когда начали отказываться от прямых переходов, с тем, что происходило некогда в области математики, когда интуитивисты начали брать верх над классиками. Классики в итоге победили предоставив другие пути для формализации своих старых понятий. И он добавляет, что то же самое происходит в области программирования, и, что возможно, классики опять возьмут верх, когда предоставят новые пути, которые облегчат приложения старых..
Кстати, Дональд Кнут математически доказал, что структурная парадигма менее эффективна, чем классическая структуризация программ при помощи goto. Я уже приводил название соответствующей статьи, которую столько времени замалчивали. Можете поискать.
В мире явно прослеживается воздействие некой силы, которая тянет к хаосу.. Ей выгодно падение самолётов и крушение поездов. Ей выгодны болезни, сокращение населения Земли. Она накладывает свою мохнатую лапу на всё что шевелится. Имя ему - Хаос. Не будем углубляться в конспирологические теории, для меня многие из очевидны, просто укажем, что существует один источник, одна организация на Земле, которая всё это с успехом и осуществляет. Она создаёт ущербные теории в науке и др. областях.
Большинство программистов даже не подозревает, что то, чему их учат не верно, не правильно, ведёт к плохим решениям, к неконтролируемому коду, а в итоге к катастрофам, к потерям человеческих жизней. И виновны в этом в том числе будут и они сами. Они даже не сделали свой выбор, так как выбора-то не было, за них всё выбрали. А те, кто понимает что к чему более ответственны за то, что делают ибо делают это осознанно..Запись от CoderHuligan размещена 05.07.2019 в 19:36 -
Нет. Это называется декомпозиция.
Инкапсуляция это когда функции-методы и данные держат в одном флаконе.
Цитата:
Структура предназначена чисто для данных. Это по сути описание некой сущности. Ее действия, поведение, определяется тем, каким образом меняются её свойства. Свойства же меняют функции, которые работают с этой конкретной сущностью-структурой. Если функции становятся частью структуры-сущности, то её уже невозможно использовать, легко модифицировать и пр. Например такую структуру нельзя передать по сети или сохранить на диск без того, чтобы не изъять из неё все функциональные особенности. это уже не чистые данные, а винегрет, который приходится постоянно разделять на составляющие и потом опять всё смешивать. Поведение данной сущности-структуры определяется не методами которые в ней намертво зашиты, а отдельной переменной, которая должна содержать в себе информацию о текущем состоянии объекта. Программа должна быть разделена на две самостоятельные иерархии: обьекты и функции их обработки. А вы пытаетесь всё свалить в один обьект. Это не правильно.Запись от CoderHuligan размещена 05.07.2019 в 20:05 -
Цитата:
для вас, как брезгующего оопом, инкапсуляция это, дословно, ЗАКЛЮЧЕНИЕ В ОБОЛОЧКУ,
(раз не погнушались упрятать гоутушки в функции)
а раз вы это принимаете, то можно пройтись чуть дальше.
и вот вы уже сидите весь измазанный ООП'ом.
что касается декомпозиции, то декомпозиция технически оформляется через заключение в оболочку.Запись от XLAT размещена 05.07.2019 в 20:59