Форум программистов, компьютерный форум, киберфорум
CoderHuligan
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Рейтинг: 2.33. Голосов: 9.

Бритва Оккама

Запись от CoderHuligan размещена 26.06.2019 в 15:09
Обновил(-а) CoderHuligan 26.06.2019 в 15:12

Бритва оккама - известный методологический принцип в философии, который гласит примерно следующее: "Не следует привлекать новые сущности без крайней на то необходимости.". Оккам писал:
Цитата:
…множественность никогда не следует полагать без необходимости… [но] всё, что может быть объяснено из различия материй по ряду оснований, — это же может быть объяснено одинаково хорошо или даже лучше с помощью одного основания.
Из вики:
"Принцип «бритвы Оккама» состоит в следующем: если некое явление может быть объяснено двумя способами: например, первым — через привлечение сущностей (терминов, факторов, фактов и проч.) А, В и С, либо вторым — через сущности А, В, С и D, — и при этом оба способа дают одинаковый результат, то следует предпочесть первое объяснение. Сущность D в этом примере лишняя, и её привлечение избыточно. "
Применительно к нашей теме программирования данный принцип часто нарушается. Игнорирование же его приводит к переусложнению языков и компиляторов, сложности образовательного процесса и т.п.
Индустрия должна зарабатывать деньги и её не интересуют какие-то принципы и философия.. К сожалению. Индустрия создаёт свои собственные инструменты. Индустрия создаёт своих собственных специалистов, которые её будут обслуживать.. Тут уже философией и не пахнет. Если чувствуется аромат денег, то всё остальное отступает на второй план. Во главу угла ставится конкуренция, конкуренция во всём: в отсеве специалистов, в стилях программирования, соглашениях и пр.
Так как я пропагандирую "народное программирование", то с обычным нам не по пути. Я обьясню.
Не говоря уже о том, что структурная парадигма (СП) крайне усложнила воплощение в код достаточно сложных алгоритмов, она ещё к тому же не следует принципу Оккама.
Если какую-либо сущность можно обьяснить более простыми средствами, то не нужно привлекать дополнительные.
Если полную условную конструкцию можно выразить через :
C
1
2
3
4
5
if (/*логич_выражение*/) goto L1;
/*выражение/я;*/ goto L2;
L1:
//выражение/я;
L2:
то не следует эмулировать её при помощи дополнительных сущностей:
C
1
2
3
4
5
6
7
8
if (/*логич_выражение*/) 
{
   // выражение/я;
}
else 
{
    //выражение/я;
}
первое к тому же более понятно.
Для эмулирования циклов создали аж до трёх разных их разновидностей. Цикл for, while, do while. Пришлось к тому же вводить новые сущности: continue, break. В разных языках по разному. А ведь циклы реализуются на goto гораздо проще, чем даже полная условная конструкция. Причём, заметьте, что завершение тела цикла гораздо понятнее именно применяя goto:
C
1
2
3
4
Loop1:
if (/*логич_выражение*/) goto L2;
/* выражение/я;*/ goto Loop1;
L2:
Встретив goto Loop1 мы сразу понимаем где искать его "голову", особенно если эта голова где-то на другой странице листинга.
А в такой конструкции "правильного" цикла мы встречаем не метку, а безликую скобку:
C
1
2
3
4
while (/*условие*/) 
{
    // тело цикла
}
поэтому здесь не понятно где начинается цикл. Отступы помогают не всегда. Да и эти пресловутые отступы не являясь частью языка в принципе, на практике ими являются, что уже как-то настораживает, ибо без них ну, очень трудно разобраться в нагромождениях структурных конструкций(прямо скажем: чисто искусственных).
Попытка приблизить язык, который понимает компьютер, к языку, на котором разговаривают люди обречена на провал потому, что чем ближе к естественному для человека языку мы приближаемся, тем все менее возможной становится способность выражать на нём алгоритмические построения.. Мы приближаемся к тупику, и только совсем мало думающий человек не видит этого.. Принцип "каждая кухарка может управлять государством" на практике не подтверждается..
Размещено в Без категории
Показов 17183 Комментарии 268
Всего комментариев 268
Комментарии
  1. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от voral Просмотреть комментарий
    Да, и вы тут кого то спросили, а смотрел ли он код вашего боя....
    В свое время искал для сына курс. Смотрел курсы и платные и бесплатные... 99.9% откровенный шлак.
    вот реально крутой урок(посмотрел только его из всего ITVDN),
    автор 100500 раз повторяет одно и тоже на протяжении >3 часов.
    там хотя относительно шарпа, но повествование актуально и для крестов,
    рекомендую всем:
    Запись от XLAT размещена 05.07.2019 в 15:01 XLAT вне форума
    Обновил(-а) XLAT 05.07.2019 в 15:06
  2. Старый комментарий
    Аватар для CoderHuligan
    Чем бы дитя не тешилось.. ООП неизлечим..
    Запись от CoderHuligan размещена 05.07.2019 в 15:33 CoderHuligan вне форума
  3. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Чем бы дитя не тешилось.. ООП неизлечим..
    а что по вашему есть насекомое?
    куча гоуту в мейне?
    Запись от XLAT размещена 05.07.2019 в 15:57 XLAT вне форума
  4. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от XLAT Просмотреть комментарий
    а что по вашему есть насекомое?
    куча гоуту в мейне?
    Можно кучу гото закинуть в функцию, которая будет по другому называться. Вам от этого легче будет? К тому же, тот пример уже во многом переделан, часть кода будет поделена на автоматы, которые будут в своих файлах. Короче говоря сделаю настоящий пример проекта. Хотя такие как вы даже от единичного гото шарахаетесь как от огня. И чем он вас так пугает?))
    Запись от CoderHuligan размещена 05.07.2019 в 16:20 CoderHuligan вне форума
  5. Старый комментарий
    Аватар для liv
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Можно кучу гото закинуть в функцию, которая будет по другому называться. Вам от этого легче будет?
    Намного! Хотя бы тем, что используемые метки будут локализованы...
    Цитата:
    Сообщение от CoderHuligan
    сделаю настоящий пример проекта.
    Ждем с нетерпением...
    Цитата:
    Сообщение от CoderHuligan
    Хотя такие как вы даже от единичного гото шарахаетесь как от огня.
    Единичный и к месту вполне допустим... Хотя можно обойтись вообще без них.
    Цитата:
    Сообщение от CoderHuligan
    И чем они вас так пугают?))
    Тем, что обилие переходов затрудняют понимание кода с лета. Особенно, когда надо код еще и модифицировать... Всегда будет присутствовать возможность послать не туда...
    Запись от liv размещена 05.07.2019 в 16:45 liv вне форума
  6. Старый комментарий
    Цитата:
    Сообщение от liv Просмотреть комментарий
    Особенно, когда надо код еще и модифицировать... Всегда будет присутствовать возможность послать не туда...
    Вы забыли по мнению кодехулигана, хороший проект не надо модифицировать. Вот так вот сидит программер (настоящий) фиииигак! и WindowsXP готова.... Другой сидит.... Фиииииграк! Windoiws 10 готова (в код XP не заглядывал, только в "доукументацию")
    Запись от voral размещена 05.07.2019 в 16:50 voral вне форума
  7. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Хотя такие как вы даже от единичного гото шарахаетесь как от огня. И чем он вас так пугает?))
    неа, вот вспомнил тред:
    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!!!!";
    не вдаваясь в вопрос автора, меня сразу перекорежело в такое:
    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:  ;
    это аналогичное zss, но читаемость лучше в разы!

    я всегда так делаю, если выделение этой части в отдельную функцию будет более фееричным.
    Запись от XLAT размещена 05.07.2019 в 17:33 XLAT вне форума
    Обновил(-а) XLAT 05.07.2019 в 19:23
  8. Старый комментарий
    Аватар для CoderHuligan
    О чём и речь..
    Запись от CoderHuligan размещена 05.07.2019 в 17:56 CoderHuligan вне форума
  9. Старый комментарий
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Вот именно: а поговорить.. Замечаю одну вещь. Когда человек не может привести внятных аргументов в пользу своей теории, он обычно переходит на личности, начинает искать недостатки именно в личностном плане.. Цель: увести от темы.. Они просто чувствуют свою неправоту, в подкорке..
    Это вы сейчас себя описываете? А то оскорблять всех вокруг зазомбированными дурачками вы первый начали. А ни одного вменяемого аргумента так и не привели. Напоминаю, что то, что вам непонятны структурные программы и вы не можете удержать что-то там в голове, аргументом в пользу отказа от структурной парадигмы быть не может. А других аргументов я от вас не припомню.

    Цитата:
    Сообщение от voral Просмотреть комментарий
    1. Вы утверждаете что большинство пишет так как пишет в результате "прпаганды". Кто и какой профит получает от этой пропаганды? Для чего она?
    Этот вопрос, я так понимаю, вы решили просто игнорировать? А меж тем всем читателям очень интересно узнать, что же за великий гений дергает за ниточки этого заговора и с какой целью он это делает. Глядишь, и осознаем свою зазомбированность.
    Запись от Катафалк размещена 05.07.2019 в 18:05 Катафалк на форуме
  10. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Можно кучу гото закинуть в функцию, которая будет по другому называться.
    это называется инкапсуляцией.

    Инкапсуляция это первый столп ООП.

    Далее, извиняюсь спросить,
    а с чем будет работать ваша функция?

    очевидно с какими то предназначенными только ей данными?
    или с любыми данными?

    что сделаете вы:
    скорее всего вы запихнете эти данные + функции по работе с ними в отдельный сишный файл.
    Это тоже инкапсуляция.

    далее,
    ваши эти данные скорее всего представлены в неких структурах? Верно?
    например:
    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 вне форума
    Обновил(-а) XLAT 05.07.2019 в 18:42
  11. Старый комментарий
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    О чём и речь..
    О чем?

    Вам уже не один раз сказали. Применение 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 вне форума
    Обновил(-а) voral 05.07.2019 в 18:36
  12. Старый комментарий
    И условие именно оставляю для чтения кода. Т.е. я буду знать что строка 7 будет выполняться в случае если WinPlay истина.
    В варианте с goto надо анализировать блок внутри цикла, чтобы узнать, что в нем может быть определено, перепрыгивание через строки следующие за блоком цикла. Ведь то что мы перед глазами видим и goto и цикл и метку - это всего лишь частный случай. (Тот же блок цикла я могу свернуть в своем ИДЕ.)

    Рассматривая же ситуацию того топика видим, что целесообразность goto вызвана неоптимальным алгоритмом для решения задачи (в данном случае)
    Запись от voral размещена 05.07.2019 в 18:40 voral вне форума
    Обновил(-а) voral 05.07.2019 в 18:43
  13. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от voral Просмотреть комментарий
    О чем?
    Уж извините меня за скобочки - я люблю чтоб блоки были выделены явно
    Карниган с Ричи делали скобки для компилятора, а не для себя.
    Потом стали использовать разные стили,
    да, я щитаю так неправильно,
    но такому учат кучу народа, только потому, что так пишут в гугле и яндексе.

    Этот доходит до маразма который проявляется в таком виде:
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    void foo(){
    ...
    }
     
    или 
     
    class my{
    ...
    };
    https://pbs.twimg.com/media/DZr8wzJWsAAEOMj.jpg
    Запись от XLAT размещена 05.07.2019 в 19:06 XLAT вне форума
    Обновил(-а) XLAT 05.07.2019 в 19:12
  14. Старый комментарий
    Аватар для XLAT
    voral что касается кода, то можно глянуть в дизассемблер,
    там вы сразу увидете, что на каждой итерации у вас постоянно обращения к памяти WinPlay .

    код zss будет эффективнее, т.к. там только одно обращение к памяти за весь цикл.
    Запись от XLAT размещена 05.07.2019 в 19:07 XLAT вне форума
    Обновил(-а) XLAT 05.07.2019 в 19:20
  15. Старый комментарий
    Аватар для XLAT
    ---
    Запись от XLAT размещена 05.07.2019 в 19:07 XLAT вне форума
  16. Старый комментарий
    Цитата:
    Сообщение от XLAT Просмотреть комментарий
    Карниган с Ричи делали скобки для компилятора, а не для себя.
    Про кнопочки я больше не к вам. К ТС. он на них наезжал... По мне так просто "нагляднее" каждому ифу, фору и т.п. свой яывный блок.

    Не приницпиальный это вопрос.
    Запись от voral размещена 05.07.2019 в 19:32 voral вне форума
  17. Старый комментарий
    Цитата:
    Сообщение от XLAT Просмотреть комментарий
    voral что касается кода, то можно глянуть в дизассемблер,
    Но ведь тут уже надо смотреть но задаче. В случае обхода матрицы 19х19 не столь существенная разница, но согласен
    Я еще исхожу из того что тело цикла может быть и большим, тогда выход где то в середине тела...

    Ну, в общем, я ж говорил, что я не против ГОТО вообще... Т.е. в данном случае - вполне опрадано, даже без дизасемблера
    Запись от voral размещена 05.07.2019 в 19:35 voral вне форума
  18. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от Катафалк Просмотреть комментарий
    Этот вопрос, я так понимаю, вы решили просто игнорировать? А меж тем всем читателям очень интересно узнать, что же за великий гений дергает за ниточки этого заговора и с какой целью он это делает. Глядишь, и осознаем свою зазомбированность.
    Для чего пропаганда и кем она придумана? Вопрос слишком общий и глубокий, требующий глубокого анализа и большого количества времени на ответ, поэтому и игнорирую. Да и ответив, многие, в том числе вы сами, только посмеётесь в очередной раз, а я просто потрачу свое время впустую.. Он ведёт в область философии развития общества как такового, не больше, не меньше.. В любом обществе существуют как положительные тенденции, так и отрицательные. Плюс-минус, вечный антагонизм мнений, сил, полярность противоборствующих сторон. Одна сторона тянет к хаосу, к энтропии всего и вся, в любой области действительности, а другая к порядку, основательности, строгости и чёткости положений.. Короче говоря добро и зло разлито везде и проникает всюду. Их хитросплетения и называются жизнью.. Даже в человеческом организме постоянно происходят процессы распада и восстановления.. Также и в обществе, в науке, в культуре и пр.
    Что касается нашей темы, то тут приближение к истине или отступление от таковой определяется общей мотивацией большинства программистов, которые воспитаны на определённых моделях поведения, условностей и пр. Почитайте статью Дональда Кнута "Структурное программирование совместно с оператором goto." В ней он приводит в пример того, что произошло в области программирования, когда начали отказываться от прямых переходов, с тем, что происходило некогда в области математики, когда интуитивисты начали брать верх над классиками. Классики в итоге победили предоставив другие пути для формализации своих старых понятий. И он добавляет, что то же самое происходит в области программирования, и, что возможно, классики опять возьмут верх, когда предоставят новые пути, которые облегчат приложения старых..
    Кстати, Дональд Кнут математически доказал, что структурная парадигма менее эффективна, чем классическая структуризация программ при помощи goto. Я уже приводил название соответствующей статьи, которую столько времени замалчивали. Можете поискать.
    В мире явно прослеживается воздействие некой силы, которая тянет к хаосу.. Ей выгодно падение самолётов и крушение поездов. Ей выгодны болезни, сокращение населения Земли. Она накладывает свою мохнатую лапу на всё что шевелится. Имя ему - Хаос. Не будем углубляться в конспирологические теории, для меня многие из очевидны, просто укажем, что существует один источник, одна организация на Земле, которая всё это с успехом и осуществляет. Она создаёт ущербные теории в науке и др. областях.
    Большинство программистов даже не подозревает, что то, чему их учат не верно, не правильно, ведёт к плохим решениям, к неконтролируемому коду, а в итоге к катастрофам, к потерям человеческих жизней. И виновны в этом в том числе будут и они сами. Они даже не сделали свой выбор, так как выбора-то не было, за них всё выбрали. А те, кто понимает что к чему более ответственны за то, что делают ибо делают это осознанно..
    Запись от CoderHuligan размещена 05.07.2019 в 19:36 CoderHuligan вне форума
  19. Старый комментарий
    Аватар для CoderHuligan
    Цитата:
    Сообщение от XLAT Просмотреть комментарий
    это называется инкапсуляцией.

    Инкапсуляция это первый столп ООП.
    Нет. Это называется декомпозиция.
    Инкапсуляция это когда функции-методы и данные держат в одном флаконе.

    Цитата:
    Сообщение от XLAT Просмотреть комментарий

    Вот вы и получили почти оопный класс.
    почти, потому что не хватает конструктора, спецификаторов доступа, возможно остального, но по необходимости.
    На си это легко реализуется через указатели на функции в структурах, здесь ничего сложного нет. Только это в корне не верно!
    Структура предназначена чисто для данных. Это по сути описание некой сущности. Ее действия, поведение, определяется тем, каким образом меняются её свойства. Свойства же меняют функции, которые работают с этой конкретной сущностью-структурой. Если функции становятся частью структуры-сущности, то её уже невозможно использовать, легко модифицировать и пр. Например такую структуру нельзя передать по сети или сохранить на диск без того, чтобы не изъять из неё все функциональные особенности. это уже не чистые данные, а винегрет, который приходится постоянно разделять на составляющие и потом опять всё смешивать. Поведение данной сущности-структуры определяется не методами которые в ней намертво зашиты, а отдельной переменной, которая должна содержать в себе информацию о текущем состоянии объекта. Программа должна быть разделена на две самостоятельные иерархии: обьекты и функции их обработки. А вы пытаетесь всё свалить в один обьект. Это не правильно.
    Запись от CoderHuligan размещена 05.07.2019 в 20:05 CoderHuligan вне форума
  20. Старый комментарий
    Аватар для XLAT
    Цитата:
    Сообщение от CoderHuligan Просмотреть комментарий
    Нет. Это называется декомпозиция.
    Инкапсуляция это когда функции-методы и данные держат в одном флаконе.
    нет, не так,
    для вас, как брезгующего оопом, инкапсуляция это, дословно, ЗАКЛЮЧЕНИЕ В ОБОЛОЧКУ,
    (раз не погнушались упрятать гоутушки в функции)
    а раз вы это принимаете, то можно пройтись чуть дальше.

    и вот вы уже сидите весь измазанный ООП'ом.

    что касается декомпозиции, то декомпозиция технически оформляется через заключение в оболочку.
    Запись от XLAT размещена 05.07.2019 в 20:59 XLAT вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru