514

Ответ на пост «Я написал свою книгу по программированию»3

Плохо, прям очень плохо. Надеюсь всё плюсы и положительные отзывы этому посту это по большей части аналог с али экспрессовским "товар получил, не открывал, ставлю 5 звёзд" и реакция на БЕСПЛАТНО. Даже просто открыв этот pdf можно увидеть на сколько автору было безразлично удобство чтения этого опуса. Микро формат страниц, который просто убивает форматирование кода, сразу бросается в глаза. Но в конце концов вёрстку можно исправить, если автору есть что добавить в довольно пропаханную тему базовых знаний по одному из достаточно старых ООП языков. Я как практикующий товарищ решил сразу посмотреть какой то более менее цельный и минимально содержательный фрагмент кода, так как разделяю мнение что хороший код является "само документируемым" и также может показать общий уровень книги. Первый такой фрагмент нашёлся на 119 странице и содержал очень плодотворную тему рефакторинга кода. Вообще, эта тема обсуждается начиная с банальных уроков программирования в школе, где вас просят хотя бы давать осмысленные имена переменным и проходит через весь опыт практического программирования, где является одним из ключевых элементов борьбы со сложностью. Самое сложное тут суметь уместить в маленьком примере какую то идею, чтобы читатель смог её увидеть, а не просто "поверить автору". И даже в сравнительно больших фрагментах программ с подробным разбором на протяжении всей книги (например "Чистый Код" Роберта Мартина) бывает сложно это реализовать и люди приходя на проект в 1 миллион строк сталкиваются с тем, что рефакторинг в рафинированных примерах и реальном проекте может значительно отличаться по сложности реализации. Это я увлёкся лирикой, перейдём к коду, у нас есть некоторый метод TryOpenDoor со следующей сигнатурой:

private static bool TryOpenDoor(); (посмотреть реализацию можно на странице 119)

и после ряда "улучшений" и вынесения методов получается следующий код:

Ответ на пост «Я написал свою книгу по программированию» Программирование, IT, Айтишники, Программист, Csharp, Текст, Ответ на пост, Длиннопост

Давай посмотрим что с ним не так? Пункты будут идти по моему субъективному убыванию критичности.

1) Это другое поведение ! Это прям вообще не нормальная вещь. И дело не в том что мы переименовали метод, это как раз допустимо. Мы изменили сигнатуру метода, ранее он возвращал булевское значение (правда\ложь) , теперь он ничего не возвращает. В случае реального рефакторинга IDE нам бы подсказала и такой проект просто не собрался бы. Почему так получилось ? Потому что по факту начальный код и конечный выполняет немного разные вещи, и оригинальный метод является частью InteractWithDoor() и он естественным образом разваливается на 2 метода, которые и хочется объединить под новым более общим методом.

2) Смешение уровней абстракции. Это может показаться не критичным на таком маленьком примере, но в реальности это огромная проблема и очень важно на начальном этапе дать правильное понимание базовых вещей в архитектуре кода. Так как когда вы перейдёте от 20 строчных примеров к проектам с 20 000 классов вы сможете намного ухудшить качество своего кода, но не улучшить его. У нас есть метод запроса\чтения возраста из консоли, если кто не знает это ReadInt, и первый вывод консоли логически относится к этому методу, тем более в нём уже есть интерактивность с пользователем. На том уровне где мы оперируем методом ReadInt aka GetAge как правильно не должно быть вывода в консоль, если он есть внутри ReadInt.

3) ReadInt() - это вызывает вопросы. Для начала сообщу что почти любая IDE выведет тип возвращаемого значения просто при наведение на метод. В старом коде на си, например, можно встретить обозначение типов в приватных переменных класса, но даже в таком случае оно дополняет название, а не заменяет его. Если бы метод хотя бы назывался GetAgeInt я бы не стал придираться, в конце концов есть принятые в командах стандарты и практики ,а также вкусовщина. Можно возразить "но этот же метод действительно просто получает Int32 из консоли", и с этим можно было бы согласиться, если бы это был какой то публичный метод для consol-и, но даже в таком случае ключевым тут было бы что это значение из консоли. То есть выглядеть должно было, либо так ConsoleEx.GetInt32(), либо GetInt32FromConsole(). Приватный метод, особенно с таким маленьким скоупом, должен иметь очень специфичное функции имя.

4) В книге автор заявляет что он добился успеха выделив "чистое правило" открытия двери в TryOpenDoor() , кстати это было названием оригинального метода. Но давайте посмотрим на этот метод, что в этой строке "age >= 18" есть о двери ??? У меня нейминг вызывает вопросы

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

Многие в комментариях гонятся за какими то "актуальными знаниями", которые толи должны быть в книге, толи не могут быть в ней т.к. она устаревает. Но в реальности я легко могу сказать тимлиду, что не знаю что то требуемое из нового реквайремента или таски и мне нужно время на изучение документации\кода. Но я плохо себе представляю как бы я смог объяснить такое качество кода, при том что в нём самый базовый функционал, который будет работать и на версиях языка десятилетней давности, такой код плох даже для intern позиции.

Как мог бы выглядеть этот код с моей точки зрения. Если мы хотим реализовать InteractWithDoor, то исходный метод, конечно, недостаточен и он разбивается на 2 составляющие, получение возраста и его валидация, но далее нам требуется открытие\отказ в открытие двери, что в коде автора реализовано через сообщение "Дверь не для тебя!" с очередным нарушением уровня абстракции.

Ответ на пост «Я написал свою книгу по программированию» Программирование, IT, Айтишники, Программист, Csharp, Текст, Ответ на пост, Длиннопост

Пара комментариев по коду.

1) Конечно, метод EnableRussianSymbolsForConsole не относится к InteractWithDoor, но когда книжный пример при копирование в IDE на некоторых системах будет выдавать тебе вопросы вместо текста это не очень хорошо. И для примера добавить такой вызов допустимо, но лично я бы предпочёл просто использовать английский во всех запросах.

2) Длинный нейминг методов допустим и даже хорош для само документирования кода, в случае если это внутренние методы с малым скоупом видимости (в данном случае все методы кроме InteractWithDoor являются приватными).

3) Может показаться что методы ShowNotAllowedMessage и OpenDoor немного избыточны т.к. у них однострочная реализация, но лично моя практика показывает что такая разбивка оправдана.

4) Код получился длиннее и это нормально, особенно когда речь идёт про рефакторинг таких маленьких фрагментов. Главный показатель качества кода не его количество, а его читаемость и простота модификации. При рефакторинге больших объёмов кода часто бывает и обратный эффект из-за устранение дублирования и избыточной логики, вызванной кривой архитектурой.

Хороший код на верхнем уровне читается почти как осмысленный текст без матана и всяких сложных условий.

Взять возраст из консоли и используя его попробовать открыть дверь

Что же такое попробовать открыть дверь?

Если открытие двери разрешено для данного возраста, то открыть дверь, иначе показать сообщение, что открытие запрещено.

не идеально, согласен, но я на многое и не претендую, а теперь попробуйте прочитать оригинальную программу автора.

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

Я смог - сможешь и ты!

2.2K поста6.7K подписчик

Правила сообщества

Нельзя:

- оскорблять;

- использовать нецензурную лексику;

- обесценивать чужие достижения, даже если для вас они незначительны.

Вы смотрите срез комментариев. Показать все
145
Автор поста оценил этот комментарий

Шо то хуйня, шо эта хуйня шо обе эти хуйни и т.д.


В "улучшенном" примере просто нахерачил абстракций ради абстракций. В реальном проекте такое распиливание превратится в простыню из мелких непонятных методов. Что по сути усложнит чтение.


За каким хукм вообще выносить обычную проверку age >= 18 в отдельный приватный метод. Private говорит о том, что этот метод не планируется изменятся в дочернем классе. Есть условие на текущий момент age >=18, все! Это задача бизнес логики работы приложения, будет ли она меняется - хуй его знает. Может да, а может нет. Дак зачем сейчас из одной строчки кода if age >= 18 плодить целый вызов метода, который будет жить ещё н-лет.

Уж лучше бы оба автора запихали настройку для age=18 в сам класс. Потому что это единственная величина которая может поменяться и ее выгодно хранить в конфигурации чтобы не править код по сто раз.


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


За ким хером настройки консоли про кодировку ушли в класс который открывает двери. Разделяй ответственность! Классу открытия дверей похуй на консоль. Если так любишь абстракции дай классу интерфейс пусть он туда срет свой вывод.

С таким подходом логика будет размазана по всему коду и новый прогер будет бегать искать где что, а потом охуевать.


Зачем вывод ошибки в консоль выносить в отдельный метод? Что ты планируешь там писать, выбор языка? А захуй там выбор языка? Если уж и будем мултиланг то это будет какая-нибудь обертка в один вызов, а это значит что в 99.9 процентов ты ради одной строчки создал отдельный, нахуй не кому ненужный метод.

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


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


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


Давай возьмём пример который вы обсасываете и делаете его "лучше". На самом деле, в этом коде, главное говно - это функция ReadInt.

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

Красиво звучит? А это хуйня, потому что есть задачи и предположения. Я сделал предложение, из своего опыта, но даже не читал про задачу, а это значит меня можно послать нахуй с таким рефакторингом.

раскрыть ветку (36)
14
Автор поста оценил этот комментарий

Поддерживаю, товарищ. Написал всё что я хотел, но было влом )))

раскрыть ветку (2)
8
Автор поста оценил этот комментарий

Ууу сцука, я только пунктуацию хотел поправить, а ты уже написал:))

1
Автор поста оценил этот комментарий
Да, то ты не послал товарища нахуй, а там как раз можно
7
Автор поста оценил этот комментарий

age >=18

У нас бы чиселку вынесли в константу в специально созданном для этого enum (речь про Swift), шоб по велению пятки на изи менялось везде (даже если это пока единственное место, где проверка есть).

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Конечно нужно, там еще много плохих решений, по сути надо все переделывать.

Изначальный пример очень плохой

0
Автор поста оценил этот комментарий

А я бы вывел в сервис, который бы возвращал getAllowedAge(), потому что при разных условиях, могут быть разные проверки на возраст. Условно от типа заведения или страны нахождения. И уже там бы для начала просто вывел значение по умолчанию.

2
Автор поста оценил этот комментарий

конечно этот пример нарушает и ООП и не по SOLID'у, но камон коллеги это книга для начинающих, тем более это программирование под юнити ( вы хоть раз пробовали писать шарпом под юнити?), там у вас есть готовые обьекты которые вы добавляете в проект в визуальном редакторе и потом пишете код в нем в уже готовых классах, там наговнокодить очень легко, это вам не КРУДы делать , в коре или мвс, там что бы хорошую архитектуру сделать прям очень попотеть надо, короче геймдев это очень и очень непросто

раскрыть ветку (9)
23
Автор поста оценил этот комментарий

ООП и SOLID тут вообще не причем.

На самом деле, случился испорченный телефон:

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


2) Есть автор этого топика, он глянул первый код в книге, у него сгорела жепь. Что надо делать? Правильно, писать на пикабу.

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

- задвинул тему про абстракции,

- прихуярил к псевдо-коду мешок велосипедов, что бы он запускался везде, а он не будет запускаться, потому что это псевдо-код, тут даже объявления класса нет - это просто пример.

- ввел промежуточные переменные, что бы, блять, было легче читать код оптимизированный для чтения. Охуенно?


3) Ну и есть я, который занимается хуйней, и пишет все вот это, вместо того чтобы делами заниматься.

Тут вообще не про парадигмы программирования диалог.

раскрыть ветку (8)
4
Автор поста оценил этот комментарий

Не, ну комментатор отметил важный момент - у рефакторинга должна быть цель.

В жизни же как бывает - пишем пишем пишем.

Потом стало очень неприятно где-то развивать решение.

2-3 раза поговнокодили, почувствовали и обдумал проблему, покрутил в голове, придумали как сделать лучше, отрефакторили.

В ходе рефакторинга сильно задели функционал ядра и получили пиздюлей от бизнеса когда из-за рефакторинга на проде появились дефекты.

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

Поэтому отьебитесь от изначально го автора, у него энтузиазм и он написал как мог. И каждый из нас написал бы как мог но нам всем лень потому что энтузиазма не хватает.

раскрыть ветку (7)
2
Автор поста оценил этот комментарий

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

Об этом, собственно, и идёт повествование в высерах в данном треде.


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

Но в дополнение к этому: в книге есть хуевые примеры с сомнительной ценностью.

раскрыть ветку (6)
1
Автор поста оценил этот комментарий

При чем тут все это. Поясню.

Чтобы понять что пример хуевый нужно в чем-то разбираться.

Зачем нужны разбиения на отдельные классы и вынос кода оидельно из ванильного примера непонятно. Пока вы не поели говна всерьёз все эти примеры из трех классов будут очень интуитивно восприниматься и лично по мне на примере их трёх классов этого понять нельзя.

Также ни в первом ни в исправленный версиях, к примеру, нет ни одного интерфейса. И это тоже плохой код тк его будет сложно тестировать, а также у него сильные зависимости между компонентами. И это тоже не понять пока в реальном проекте не столкнуться с этой болью.

То же самое с разделением кода бизнес логики и иныраструктурно-прикладноно. Пока не увидишь портянку где смешались в лапшу например, запросы и обращения в источники данных и бизнес логика - сложно понять почему так писать нельзя и за такое нужно бить.

И то же самое со всеми остальными примерами о которых я написал.

Мысль - реальные проблемы плохо иллбстрируются ванильнвми примерами на 10 строчек. Новичок не поймёт. Дядьки с опытом на таких примерах друг друга поймут и мысль поймут. Но книжка-то пожиционируется как для новичков.

Поэтому говенные примеры никуда не деть, лучше плохой пример чем никакой. Это моё личное мнение.

раскрыть ветку (5)
0
Автор поста оценил этот комментарий

Вы все верно пишете, но от вас ускользает суть. Еще раз:

Есть книга для новичков, в ней есть пример "best practices", он заключается в улучшении восприятия кода. Похуй на изначальный код, похуй на все парадигмы - книга для новичков. Автор пытается показать что есть два кода - код А и код Б, оба кода выполняют одно и тоже, но код Б легче читать. Отличная идея чтобы приоткрыть дверь и показать новичку малую толику мира концепций и бэст практис.

Но автор делает это так хуево, что оптимизированный код выглядит хуже неоптимизированного.

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


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


По этому я пишу что пример автора книги - хуевый, а автор топика - пытается сделать теслу из лады, попутно объясняя рабочим что лада говно и должно быть как у Илона.

раскрыть ветку (4)
1
Автор поста оценил этот комментарий

Я как раз и отмечаю, что сложно написать короткий, качественный и правильный пример.

Чтобы он был наглядным и было очевидно в чем плюс - его нужно сильно раздуть, подчеркнуть недостатки. Чтобы недостатки стали сильно заметными, как в реальной жизни.

На мелком масштабе примера преимущества того же srp абсолютно непонятны. И тут и там три каких то класса со слегка отличающимися буковками. Автор утверждает что вот эти буковки лучше и рассказывает что-то на умном языке. Ну ок.

Если я пишу код объёмом в 10 строчек для личных целей - я запихну все в один класс, потому что не нужно заранее усложнять.

А автор пытается из кода в 10 строчек без будущего(этот код написан только для примера, его не надо расширять и поддерживать) что-то там объяснить про концепции, которые не каждый мидл вменяемо понимает или сможем рассказать своими словами.

Как ни меняй текст в десяти строчках - это так и останется ненаглядным и непонятным для новичка.

И ещё раз подчеркну - это лично моё мнение, не навязываю.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Все верно, но, бля, там же видно - как автору было похуй. Это не дает ему плюсов в карму.

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Вариант - написал насколько хватило опыта. Не сторонник хейтить сразу, я придерживаюсь мнения - чтобы написать хорошую книгу, нужно вначале написать 10 плохих.

0
Автор поста оценил этот комментарий

поддерживаю коллега

1
Автор поста оценил этот комментарий
Во, одобряю 👍
1
Автор поста оценил этот комментарий

чтобы создать действительно что то новое и ценное нужно быть незаурядным программистом.

Сильно зависит от области, по многим достаточно популярным технологиям часто не бывает нормальной документации и применений в реальном коде, книг по тому как правильно логировать, мониторить приложение не особо много. Для примера можно взять доку прометеуса, там просто куча опциональной инфы, а большинство людей хотят просто собирать базовые метрики по типу загрузки cpu/ram/кол-во запрсов, но по факту первое что видит человек в метриках - это то сколько горутин запущено. В целом думаю там можно написать небольшую книгу на 100-250 страниц с настройкой базовой метрик и совместным использованием с графаной. В целом это не что особо новое, но вполне ценное для людей которые просто хотят собирать базовые метрики с минимумом телодвижений.


По стилистике ещё пиздану: не надо убирать фигурные скобки в if else, код от этого не становится легче. То что ты убрал пару строк не делает код читаемым.

Я в целом тоже не люблю когда люди игнорят скобки на if/for, у некоторых как раз обратная ненависть к скобкам(хз почему), но по ощущениям большинству легче со скобками т.к. сразу виден отдельный логический кусок кода

Давай возьмём пример который вы обсасываете и делаете его "лучше". На самом деле, в этом коде, главное говно - это функция ReadInt.

В целом сомнительная идея обучать рефакторингу на примерах для новичков, где половина кода - это взаимодействие с консолью.

1
Автор поста оценил этот комментарий

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

ну да, в python, например.

Другие языки тут ни при чём. Наличие скобок для одной строки кода -- вкусовщина, либо должны регулироваться внутренними стандартами команды (отдела) разработки.

Работал в разных компаниях, стандарты были разными, и никакие из них не были хуже или лучше.


"разнос"-то верный, но в некоторых местах переусердствовал))

раскрыть ветку (4)
2
Автор поста оценил этот комментарий

Видел достаточно много код-стайлов и стандартов, и, честно говоря, ткнул пальцем в небо, думая что у майков так же. Но нет, у них по другому (глянул их бэст практис по c#, там как раз так и пишут: без фигурных скобок). Поэтому можно смело ссать в мою чашку с кофем и тыкать пальцем, приговаривая "ха-ха".

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

какой ты категоричный. То по рукам палкой бить, то ссать в чашку с кофе.

0
Автор поста оценил этот комментарий

>> там как раз так и пишут: без фигурных скобок


Это где такое? О_о


Вижла с дефолтными настройками на иф без скобок разродится ворнингом сразу: https://learn.microsoft.com/en-us/dotnet/fundamentals/code-a...


Не встречал проектов с гайдлайнами, не то что призывающими, а хотя бы просто разрешающими условия и циклы без фигурных скобок.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

https://learn.microsoft.com/en-us/dotnet/csharp/fundamentals...


Там где циклы, пример. А про сами скобки чет не нашел, значит на усмотрение команды.

1
Автор поста оценил этот комментарий

Тут нет никакого класса, потому что в книге это пример дан до описания классов и я это учитывал когда писал логику, так как в случае класса door код выглядел совсем бы по другому.

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

По поводу фигурных скобок, можно заметить что этого нет в моих претензиях к оригинальному коду. Если метод состоит из 4 строк не вижу проблем в отсутствие скобок, но это субъективщена и я просто не вижу смысла об этом спорить т.к. суть поста не про это и в моих пунктах нет ничего про скобки.

Про настройки консоли написано буквально в первом пункте под моим кодом и откуда они вообще появились, будь пример мой, весь текст был бы на английском. Такой длинный коммент, но оригинальный пост даже не прочитан :/

По поводу нужен ли рефакторинг тут. В некой виртуальном продукте этот код мог бы оставаться в изначальном виде хоть десятки лет и нормально работать, но это был БУКВАЛЬНО ПРИМЕР РЕФАКТОРИНГА ОТ АВТОРА. Поэтому претензия не ясна.

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

раскрыть ветку (1)
10
Автор поста оценил этот комментарий

Тут нет никакого класса, потому что в книге это пример дан до описания классов и я это учитывал когда писал логику, так как в случае класса door код выглядел совсем бы по другому.

Дак а захуй тогда ты добавляешь логику, которая все равно работать не будет. Это псевдо-код, его показывают как пример, а не как код для запуска.


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

По поводу нужен ли рефакторинг тут. В некой виртуальном продукте этот код мог бы оставаться в изначальном виде хоть десятки лет и нормально работать, но это был БУКВАЛЬНО ПРИМЕР РЕФАКТОРИНГА ОТ АВТОРА. Поэтому претензия не ясна.

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

Твоя декомпозиция еще больше усложнила код, он не стал от этого легче читаться, не стал быстрее выполнятся(ты процу накинул несколько тактов с нихуя), появились доп. переменные, логика размазалась по классу и там дохуя чего еще.
По сути из простой задачи вынести блядскую логику с консолью из метода, что у тебя, что у автора, декомпозиция привела к хер пойми чему. Причем, ты хорошо вынес логику в GetInt32FromConsole, а дальше растекся по коду в поисках пресловутого клин кода, потеряв смысл задачи пытаясь сделать код "чистым".

Глянув на твою портянку, которая не помещается на экран ноута, я решил пиздануть свое "охуенно важное" мнение на тему декомпозиции. Все, что, по идее, нужно было сделать в аттаче.


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

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

Иллюстрация к комментарию
0
Автор поста оценил этот комментарий
Да вы задрали! Куда диван то разворачивать!?)))
0
Автор поста оценил этот комментарий
Начал изучать в своё время си но бросил остановился на пайтоне) теперь не понимаю этих проблем 😂
раскрыть ветку (1)
2
Автор поста оценил этот комментарий

Как и многого другого.

Автор поста оценил этот комментарий
Вообще, насколько я понимаю (я ламер в программировании, если что, чисто из интереса им немного увлекаюсь), в отдельный метод выносить определенные функции имеет смысл только если архитектурой предполагается возможность в актуальной или будущих версиях программы использовать его в разных местах, или если там достаточно большая и сложная функция, которую возможно придется перерабатывать.
раскрыть ветку (7)
2
Автор поста оценил этот комментарий

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

1
Автор поста оценил этот комментарий

метод это и есть функция в скоупе класса, там все намного сложней чем вы предполагаете, но в принципе одна из причин использования функций это да повторное использование кода ( code reuse / reusability )

1
Автор поста оценил этот комментарий

Есть множество причин у каждой из которых свои условности. Как бы это тупо не звучало разбивать метод стоит тогда, когда появляется необходимость разбивать метод. Это может быть или на этапе построения архитектуры или уже в боевом режиме. Главное не пытаться построить архитектуру которая и все умеет, и все знает, и в неё заложены все будущие варианты развития. Такую вещь очень сложно доделать.

0
Автор поста оценил этот комментарий
Класс - абзац, метод - предложение.
раскрыть ветку (3)
1
Автор поста оценил этот комментарий
В методе могут быть свои классы.
раскрыть ветку (2)
0
Автор поста оценил этот комментарий
Как и в предложении термины, описание которых может занимать тот самый абзац.
раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Скорее тогда метод - термин, класс - понятие - свойства класса - определение понятия. В принципе учитывая то, что ООП работает на формальной логике - в принципе я с вами согласен.
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку