Правильные методы по Clean Code

  Рет қаралды 77,158

Sergey Nemchinskiy

Sergey Nemchinskiy

Күн бұрын

Сегодня мы продолжаем серию лекций по Clean Code. Тема: Как правильно писать методы с точки зрения Clean Code?
Как называть переменные по Clean Code - • Как называть переменны...
Курс о котором говорится в видео: FRONT-END - bit.ly/3r15eMk
00:00 - вступление Сергея Немчинского
00:24 - курс FRONTEND с ментором
01:24 - длина методов
03:40 - метод должен делать что-то одно
04:47 - один уровень абстракции на метод
07:30 - никогда не используйте оператор switch
10:50 - описательные имена
11:50 - аргументы в методах
15:59 - флаги
18:11 - методы не должны иметь сайд эффектов
19:50 - аргументы используемые как результат
21:38 - что-то делаешь или возвращаешь
22:27 - exception или return code
23:55 - DRY (don’t repeat yourself)
24:31 - используйте guard clause
Курсы для новичков:
JAVA - bit.ly/3vDEd58
JAVA Start - bit.ly/3128f4p
PYTHON - bit.ly/3qZWl5J
C# START - bit.ly/3s2ibqu
C#/.NET - bit.ly/3eUWDsi
Инструментарий JAVA - bit.ly/3c1ilZX
Automation QA (Java) - bit.ly/3cQhUkp
ANDROID - bit.ly/3f6nXnJ
WORDPRESS Developer - bit.ly/38X3EVA
SALESFORCE Developer - bit.ly/3tAbZX8
UI/UX дизайн - bit.ly/2P95nA1
GAME DEVELOPMENT - bit.ly/30VFUgi
Обучение на проекте - bit.ly/3bX9acU
Продвинутые курсы для состоявшихся девелоперов:
GRASP and GoF Design patterns - bit.ly/3ttIS7O
Enterprise patterns - bit.ly/30VciQb
Другие услуги:
Пробное собеседование - bit.ly/3r4kZC9
Карьерная консультация - bit.ly/3vG4SOY
Сайт Foxminded: bit.ly/38V9lDt
Foxminded в ФБ: / foxmindedco
FoxmindEd в Instagram: / foxminded.ua
Foxminded в VK: foxminded
Мой Telegram: t.me/nemchinskiyOnBusiness
Для деловых запросов: youtube@foxminded.com.ua

Пікірлер: 408
@enkryp
@enkryp 3 жыл бұрын
После слов о том, что метод должен умещаться на один экран, я понял, зачем некоторые разработчики используют два монитора, один из которых они поворачивают на 90 градусов.
@maxlich9139
@maxlich9139 3 жыл бұрын
сломали систему))))
@AnrelD
@AnrelD 2 жыл бұрын
Притом второй монитор ультраширокий)
@trofimchikchik
@trofimchikchik 2 жыл бұрын
@@AnrelD и разрешением повыше
@forty_se7en
@forty_se7en 2 жыл бұрын
И делают шрифт 6го размера)
@alexperemey6046
@alexperemey6046 Жыл бұрын
Да, это сразу бросается в глаза. Экраны разные, шрифты разные... И насчет базовых "10 строк" тоже не все однозначно. Поскольку те же фигурные скобки люди проставляют по-разному. И колбаса типа func().func() тоже начинает смотреться как выход.
@ansarozden5767
@ansarozden5767 3 жыл бұрын
Аналогия уровня абстракции с просмотром карты города самое лучшее объяснение того, что такое уровень абстракции.
@0imax
@0imax 3 жыл бұрын
@@kitten-free биологам, может, и понятнее, но мне больше нравится с картой :)
@pranatank4965
@pranatank4965 3 жыл бұрын
Привет. Спасибо. Очень хочу видео по поводу комитов - что комитить, когда комитить, и какие названия давать, ну и вообще может поглубже разобраться в теме
@niknikagain
@niknikagain 2 жыл бұрын
каждый коммит должен решать только одну задачу. Описание должно кратко, но полно описывать что именно решает этот коммит.
@jollyroger2757
@jollyroger2757 3 жыл бұрын
Добавьте примеры, так сказать интерактивности в видео.
@kirillamber6056
@kirillamber6056 3 жыл бұрын
Нагляднее будет, если ты сам напишешь говнокод и потом посмотришь это видео
@user-mm1xr5to1o
@user-mm1xr5to1o 3 жыл бұрын
@@kirillamber6056 ага , а если тебе после него прийдется его читать?)))
@kirillamber6056
@kirillamber6056 3 жыл бұрын
@@user-mm1xr5to1o легко можно сделать код ревью, даже не понимая с какой предметной областью он работает.
@nabiisakhanov3522
@nabiisakhanov3522 3 жыл бұрын
Он и так примеры приводит но устно
@user-mm1xr5to1o
@user-mm1xr5to1o 3 жыл бұрын
@@nabiisakhanov3522 я так понял, что те, кто хорошо разбирается против, чтоб было понятнее тем, кто хуже это умеет?
@max_mgtow
@max_mgtow 3 жыл бұрын
Как раз досматриваю вашу 2х часовую лекцию по Clean code. Классная подача, спасибо, Сергей 👍
@doopath8737
@doopath8737 3 жыл бұрын
К сожалению, даже при том, что про клин код говорят на каждом углу, а про значащие имена переменных слышали даже менеджеры по продаже кондитерских изделий, програм аля той, которая рисует искры от волшебной палочки на экране (анклбоб рассказывал про нее в книге), я (думаю, все мы) встречаю очень редко. Обычно это небольшие модули или отдельные файлы\классы, но никогда системы или подсистемы. В большинстве случаев все утыкано методами, называющимися getName (которые, по-хорошему, должны называться getNameOrNullIfUserDoesntExistAndCacheGivenNameAndWriteLogIfNameIsAlreadyCached) и имеющими 300 строк кода после открывающей скобки.
@playerkilleryakutia9415
@playerkilleryakutia9415 3 жыл бұрын
Обычно когда хочешь разделить метод который делает хорошо 2 вещи, тебе нужно делить не на 2 а на 3 и более методов, так как тебе нужны будут вспомогательные/промежуточные методы и т.д. А потом тебе в голову приходит что эти вспомогательные методы как-то унифицировать, чтобы применять и в других местах и тут начинаешь сидеть и думать, что тебе надо вообще кучу всего рефакторить)
@userlink-12345
@userlink-12345 3 жыл бұрын
А если изначально писать с таким расчетом, то зачастую все необходимые методы будут уже под рукой)
@user-qv4hn6qq4n
@user-qv4hn6qq4n 3 жыл бұрын
А если ещё до написания любых методов помнить что один метод должен делать что-то одно, то и рефакторить не придется ;)
@VladisS.Vostok2000
@VladisS.Vostok2000 3 жыл бұрын
Ага, а ещё лучше и вычленять все статические методы из нестатических, с единственной ссылкой на них, можно прям через => перенаправлять, правда методов будет овердохуя, читаться будет как гавно, зато метод в 10 строк...
@Drmidon
@Drmidon 3 жыл бұрын
@@user-qv4hn6qq4n Судя по 10 правилу(21:38​ - что-то делаешь или возвращаешь) Python плохой язык. Ибо там есть методы типа list.pop()
@maxlich9139
@maxlich9139 3 жыл бұрын
@@Drmidon а что этот метод делает?
@ilyamorozov2186
@ilyamorozov2186 3 жыл бұрын
Видео топ! Продолжайте цикл по Clean Code 👍
@alexxx4434
@alexxx4434 3 жыл бұрын
Запихнуть код в enum - спасибо док!
@kai3341
@kai3341 3 жыл бұрын
Подхвати коллбэк (или его имя) из enum или dict/object или даже array/list/tuple. Просто делегируй
@ValentinNechayev
@ValentinNechayev 3 жыл бұрын
А если несколько типов реакций в разных местах и они разные? Уже не пойдёт.
@kai3341
@kai3341 3 жыл бұрын
@@ValentinNechayev я не зря сказал "или его имя". Подхвати метод класса по его имени -- и всё пойдёт
@boevoyhomyachok
@boevoyhomyachok 3 жыл бұрын
@@kai3341 поподробней плз где там в с#, например, код в enum писать?
@kai3341
@kai3341 3 жыл бұрын
@@boevoyhomyachok в шарпах можно положить в enum строку, и метод, соответственно, подхватить по его имени. Но эта история совсем о другом. Не важно, в какой именно контейнер ты положишь коллбэк. Ещё раз читай внимательнее мой комментарий -- я указал контейнеры, частным примером которого является enum. Ещё раз и внимательно -- собери коллбэки в контейнер и делегируй
@michaeldeyev8809
@michaeldeyev8809 3 жыл бұрын
Спасибо за видео! Даже разрабы с опытом могут подчерпнуть некоторые нюансы!
@MgsMen
@MgsMen 2 жыл бұрын
Лайк за описание что такое уровень абстракции на примере города. Реально топ !
@user-ee1lx1pe7n
@user-ee1lx1pe7n 3 ай бұрын
Сергей, как же вы прекрасны!
@samdistortion7588
@samdistortion7588 3 жыл бұрын
Очень удобно стало рекламу проматывать - в самом видео Сергей без усов, а в рекламе с усами :D
@KillerCourse
@KillerCourse 3 жыл бұрын
Отличное видео, спасибо. Не заметил как пролетело полчаса, очень полезная инфа, и для новичка почти все понятно было)
@yankilo
@yankilo 3 жыл бұрын
Спасибо за отличное видео! Так же хочу сказать, что Вам, Сергей, очень идёт борода без усов. Прям помолодели :D
@vahekhachaturian2424
@vahekhachaturian2424 3 жыл бұрын
Самый главный аргумент против switch в конце, и то в двух словах. Хотелось бы больше узнать про использование полиморфизма вместо switch. Не совсем согласен с тем чтобы поменять switch на if else. Таким образом мы только из одного проблема сделаем другую.
@user-lu8vb1pm9p
@user-lu8vb1pm9p Жыл бұрын
Согласен. На мой взгляд конструкция switch вполне приемлема в варианте case one: return One(); case two: return Two(); case three: return Three();
@ShargTV
@ShargTV 3 жыл бұрын
Топ, это очень интересно и полезно. Спасибо большое)
@Enthusiast91
@Enthusiast91 3 жыл бұрын
Офигенная рубрика. Работаю уже чуть больше года, и часто задумываюсь, а как в той или иной ситуации лучше сделать. И некоторые вопросы прям по полочкам ровно разложили зачем и почему. Видимо пора уже все таки прочитать Роберта Мартина - Clean code и Джошуа Блоха - Effective java )) Спасибо большое за видео, было полезно и интересно!
@user-hq3dj6ix8g
@user-hq3dj6ix8g 3 жыл бұрын
Благодарю, интересно слушать
@progressive_agriculture
@progressive_agriculture 3 жыл бұрын
Большое спасибо! Очень полезная информация.
@sviatoslavhavrylo8580
@sviatoslavhavrylo8580 3 жыл бұрын
Гм populateAssetAndSave() сделаю с него два метода populateAsset() saveAsset() и буду вызывать два метода. и тот метод откуда буду вызвать будет назваться populateAssetAndSave() ?
@fallenangel1395
@fallenangel1395 3 жыл бұрын
Ой, плюсую. Очень часто задумываюсь об этом во время работы.
@VladisS.Vostok2000
@VladisS.Vostok2000 3 жыл бұрын
Ну формально, да. Если у тебя, допустим, такая особенная логика, что в свитче где-то по нескольку раз есть populate, где-то Save, а где-то, тоже несколько раз, PopulateAssetSave, то ты обязан объеденить связный вызов.
@0imax
@0imax 3 жыл бұрын
Вызов нескольких действий одним методом - это регулярная боль. И ладно если они *всегда* идут толпой, тогда в названии можно оставить более важное действие или придумать какое-то более общее название сему действу. А вот когда они же могут использоваться ещё и по-отдельности, то начинается веселье. И тут либо держать в голове (что уже плохо), что для конкретных случаев вызываем все три, а в других - вот эти два, либо сделать метод с "неправильным" названием, вызывающий три других метода.
@cheefoxcheefox2372
@cheefoxcheefox2372 3 ай бұрын
К сожалению,все эти правила не без исключений. Очень часто метод вынужден атомарно делать две, а то и три операции, типа классического CompareAndSwap в многопоточке.
@PianoElipse
@PianoElipse 3 жыл бұрын
все программисты, у которых 4к мониторы, расслабились :D
@artemartem3375
@artemartem3375 3 жыл бұрын
Все программисты у кого микроскопический шрифт тоже расслабились
@PianoElipse
@PianoElipse 3 жыл бұрын
@@artemartem3375 8 пунктов XD
@demiurgen13
@demiurgen13 3 жыл бұрын
Особенно те, у кого они развернуты вертикально )
@maxlich9139
@maxlich9139 3 жыл бұрын
ну программисты с 50-дюймовые экранами тоже расслабились)))
@maxlich9139
@maxlich9139 3 жыл бұрын
@@kitten-free печально =(((
@user-bt9hx3ik6e
@user-bt9hx3ik6e 3 жыл бұрын
хорошее видео, хорошая подача. единственное, что хотелось бы хотя бы 1 пример на каждый случай. ждем следующих лекций!
@user-ky2zi4fp9r
@user-ky2zi4fp9r 3 жыл бұрын
Отличное видео, спасибо!
@igorpoznyakov5486
@igorpoznyakov5486 3 жыл бұрын
Спасибо за видео!
@RUMACTEP
@RUMACTEP 3 жыл бұрын
9:20 "Не используйте switch" - Pattern Matching in Switch Expressions (C#, Python) не согласны с вами
@user-ff1sd6wl1h
@user-ff1sd6wl1h 3 жыл бұрын
Очень интересно!
@linkernick5379
@linkernick5379 3 жыл бұрын
Маловато внимания уделяется побочным эффектам, производимым методами. Побочные эффекты как мутация полей класса, мутация объектов-параметров, захват локов, и походы в IO необходимо минимизировать как можно сильнее. В идеале переходить к иммутабельным объектам и ФП - чем меньше побочных эффектов, тем более предсказуемее работа функций.
@0imax
@0imax 3 жыл бұрын
А лучше вообще все переменные сделать ридонли и на каждый чих создавать новый объект вместо изменения старого :)
@linkernick5379
@linkernick5379 3 жыл бұрын
@@0imax Можно. Если грамотно сделать, тормозить не будет. Читайте про персистентные структуры данных (книга Криса Окасаки и другие источники)
@0imax
@0imax 3 жыл бұрын
@@linkernick5379 осталось подготовить стопицот тысяч специалистов, способных читать и поддерживать такой код...
@romantsyupryk3009
@romantsyupryk3009 3 жыл бұрын
Велике дякую вам за це відео.
@user-jg1lh7pm6l
@user-jg1lh7pm6l 2 жыл бұрын
Подписываюсь всеми пятью тентаклями!
@alexeymezenin
@alexeymezenin 3 жыл бұрын
На счет длины методов, Мартин говорил о многословной Java. Если используется какой-либо современный фреймворк (особенно из семейства RoR, Laravel, Django, Sails), то нормальная длина метода будет не более 1-5 строк. Вообще, когда человек начинает писать тесты не для галочки (работодатель просит), а чтобы действительно снизить возможность возникновения ошибок в коде, он сразу понимает для чего нужен Clean Code и короткие методы в частности.
@at0m1x191919
@at0m1x191919 3 жыл бұрын
Круто!
@Zohan136
@Zohan136 Жыл бұрын
Спасибо большое спасибо большое спасибо большое спасибо большое спасибо большое спасибо большое спасибо большое спасибо большое спасибо 🙏
@SamWhiteRK23
@SamWhiteRK23 3 жыл бұрын
Было бы интересно послушать про clean architecture
@Alex11Fox
@Alex11Fox 3 жыл бұрын
про enam вместо switch, было полезно спасибо. Да и вообще тема Как помыть кота интересна.
@user-zg9ov1oy7z
@user-zg9ov1oy7z 3 жыл бұрын
epam?
@KaputTV
@KaputTV 2 жыл бұрын
@@user-zg9ov1oy7z Легкий Митин клитор?))
@sssauka
@sssauka 3 жыл бұрын
спасибо за пояснение про свитч !!! от всей души :) ..бо, когда смотрел лекции дяди Боба, я так и не понял, на что его заменять и почему
@Kenny251195
@Kenny251195 3 жыл бұрын
Насчёт switch я бы поспорил, в контексте языка Go. В нём break работает по-умолчанию, так что лишний раз проваливаться в другую ветку не будет. Ещё особенность, уже языковая: только с помощью него можно проверять тип у какой-нибудь переменной (не касаясь рефлексии)
@fidana_blog
@fidana_blog 3 жыл бұрын
Здравствуйте Сергей! На счёт switch-case: Начиная с Java 14, выражение switch имеет дополнительный синтаксис типа Lambda (case ... -> labels), и его можно использовать не только как оператор, но и как выражение, вычисляющее одно значение. В таком случае break не пишется. И это реально очень удобно. Я хоть пока только учусь, но это реально упрощает задачи.
@zentox8480
@zentox8480 3 жыл бұрын
Switch expressions придумали как раз чтобы устранить недостатки обычных свитчей, так что использовать можно и нужно.
@user-nz2hh9po2r
@user-nz2hh9po2r 3 жыл бұрын
если б еще конструкция if else была только выражением, вычисляющим одно значение, то 'это приучило бы разбивать код на небольшие функции-методы
@persoloid
@persoloid 3 жыл бұрын
Насчёт не дублирования кода очень верное замечание, зачем плодить мусор
@peterswinoff1886
@peterswinoff1886 2 жыл бұрын
Лучше всего сделать нечто вроде универсального Range where T : IComparable.
@swan-bird
@swan-bird 2 жыл бұрын
По поводу оператора switch полностью согласен. Можно голову сломать, пока пытаешься понять что человек пытался сделать. А если приходится усложнить немного код, добавить функционала, то приходится полностью его выпиливать, и переписывать на if else
@yuriihizun7183
@yuriihizun7183 3 жыл бұрын
Thanks!
@VladisS.Vostok2000
@VladisS.Vostok2000 3 жыл бұрын
Те, кто писал бизнес-логику на высоком уровне для бинарных деревьев, двусвязных списков - лул. В методе удаления какого-лиюо элемента со списка будет высокий уровень абстракции и, например в цикле, низкий. Не, ну можно, конечно, создать подметод для поиска элемента с единственным к ему обращением, ещё можно его статическим пометить ДЛЯ ВЯЗКОСТИ, но это правило к печали будет противоречить правилу методов без параметров, потому что такие методы придётся вызывать с десятью параметрами ref. Я делаю вывод, что либо эти советы неверные, нелепые, или отсутствует контекст, а именно, когда следует следовать этим правилам, а когда нет. Один говорит суслику всегда бояться, тот с голоду дохнет, другой - всегда делай, и тот скармливает себя хищнику. Может, стоит как-то обозначить баланс? По поводу сокращения методов - ну явно путается причина и следствие. Ну т.е. вся эта инфа в видео - информационный мусор. Я огорчён.
@user-pc5ww4mp4v
@user-pc5ww4mp4v Жыл бұрын
Позволю себе поспорить про switch'и "в любом си-подобном языке": 1. В некоторых языках break в switch обязателен (например, C#); 2. Есть пример "почти" switch'а -- конструкция when в Kotlin'е, которая, на мой взгляд, лишена почти всех недостатков switch; 3. В некоторых случаях обработку enum'а не перенесёшь внутрь него же -- например, когда он библиотечный. P.S.: if-else-if-else выглядит тоже скверно
@user-pv3hz3bw1g
@user-pv3hz3bw1g 3 жыл бұрын
От завжди мізгував над тим якою повинна бути довжина метода. І тут бачу розгорнуту відповідь. Ще красне дякую за ідею з обджектами, в методі. Часто є такі ситуації. А стосовно ідеї того що в методі не повинно бути and... Ну власне думав це очевидно. Якщо в тебе є щось дуже складне, логічно розбити код на куски і розбирати його по запчастинам.
@Dima-fr8cw
@Dima-fr8cw 3 жыл бұрын
БОЛЬШЕ ЧИСТОГО КОДА!
@alexandernikolaychuk8405
@alexandernikolaychuk8405 3 жыл бұрын
@Sergey Nemchinskiy switch в языке Swift сделан так что-бы НЕ проваливаться и break писать не нужно. Для Swift можно пересмотреть эту рекомендацию по switch statement?). А если вдруг хотите провалиться - то там вместо break как в других языках, можно написать fallthrough )
@oinochoe
@oinochoe 2 жыл бұрын
Я конечно понимаю, что год прошёл уже)) но.. возможно вы за год уже нашли ответ на этот вопрос?? Как, используете switch??
@AntiSmithhh
@AntiSmithhh Жыл бұрын
некоторых языках по сигнатуре метода можно понять, что он и с чем делает, например: декларация: delete( _ item: Item, withCode deleteCode: Code ) вызов: delete( subSet, withCode: cleanCode )
@IPWchild
@IPWchild 3 жыл бұрын
Интересно, вот если был метод, который делал 2-3 действия, мы из него выделили каждое действие в отдельный метод, и потом их по очереди вызвали в первоначальном методе - это будет нормальный код, или калечный? В случае, если эти несколько действий нужно всегда выполнять вместе в строгой очередности - я не вижу нормальной альтернативы. Но и название нормальное придумать в таком случае бывает сложно, ведь это по прежнему метод, вызывающий выполнение нескольких действий...
@0imax
@0imax 3 жыл бұрын
Вызов нескольких действий одним методом - это регулярная боль. И ладно если они всегда идут толпой, тогда в названии можно оставить более важное действие или придумать какое-то более общее название сему действу. А вот когда они же могут использоваться ещё и по-отдельности, то начинается веселье. И тут либо держать в голове (что уже плохо), что для конкретных случаев вызываем все три, а в других - вот эти два, либо сделать метод с "неправильным" названием, вызывающий три других метода.
@DiabloZq
@DiabloZq 3 жыл бұрын
Спасибо вам, Сергей! Подскажите котлиновский when ≠ джавовский switch?
@MarchenkoAnton
@MarchenkoAnton 3 жыл бұрын
Спасибо Сергей за материал. Вопрос: Правильно я понял про switch? Его не использовать только по той причине, что каждое условие требует break? Следовательно, что это к when() не относится, верно?
@mrybs
@mrybs Жыл бұрын
Я вот на данный момент разрабатываю псевдографический движок и его модули. Так вот, у меня в модулях и в ядре почти все методы имеют по 5+ аргументов и перегружены в среднем 2-4 раза. Допустим есть метод для вывода текста. Он принимает текст, координаты x, y, две цветовой константы. И что предлагаете? Сделать объект richText, в нем хранить текст и цвета? Потом сделать vector2 в котором хранить координаты? Лишние объекты получается. Как их инициализировать? Если через конструктор, то та же "проблема" возникает, много аргументов. Еще добавить объект color, который хранит в себе цвета. Если инициализировать через методы, то это тонна кода появится, вместо одной строчки. Ну и зачем мне это? Избавляться от перегруза смысла нет, так как в коде практически во всех перегрузка есть что-то вроде такого: mn *func(){ return func(defaultBackground); } mn *func(std::string background) { ... } Смысла в отдельных функциях нет, будет повторение кода. А повторение кода это плохо, не ради этого делали все эти процедурные парадигмы, объектно ориентированные парадигмы и шаблоны типов. Считаю то, что вы сказали применимо не во всех случаях и не во всех языках программирования. А иногда если это и применимо, то не меняется ничего от слова совсем И вот что вам свич не нравится не понятно. Потому что причина о том, что синтаксис стрёмный высосана из пальца. if else писать замучаешься. Это же повторение кода, когда вместо одного значения ты повторяешь целую конструкцию. Да и к тому же если ограничивать длину методов и дробить их, то можно из вида ... case 9: result = "fJw"; break; ... return result; Можно придти к виду ... case 9: return "fJw" Удобно, не правда ли?
@artursveshnikov7668
@artursveshnikov7668 3 жыл бұрын
Супер классные ролики, очень легко заходят, старые лекции тоже интересные, но довольно гружёные, это всё-таки лекции. А так пока едешь на работу самое то и откладывается хорошо. И побольше по индусов и антипаттерны)) оч. забавно о них слушать
@user-bt1jg6vu4y
@user-bt1jg6vu4y 2 жыл бұрын
Всем добрырого времени суток. Спасибо за полезное видео. Подскажите как уйти от switch и tapescript. Также буду благодарен за ссылки где это обьясняется или те или иные технологии используемые для достижения данной задачи!
@user-ft5nc4wm9f
@user-ft5nc4wm9f Жыл бұрын
Много маленьких методов это тоже плохо, т.к. их можно по ошибке вызвать. Всё-таки функция должна быть жестко связана неразделимой логикой и читаться четко и линейно сверху вниз без вариантов. Тогда функцию легко прочитав держать в голове и понимать что же там было выше
@LevPoptcov
@LevPoptcov 3 жыл бұрын
буду теперь писать на CleanCodeском языке))
@drl232
@drl232 3 жыл бұрын
На эту тему есть хорошая книга Макконела «Совершенный код»
@admenmod
@admenmod 3 жыл бұрын
блин теперь новый монитор покупать придется)
@user-ds4mk7nb8q
@user-ds4mk7nb8q 2 ай бұрын
Цікаво, корисно. Дуже дякую!
@dmitryvlasov931
@dmitryvlasov931 3 жыл бұрын
Сергей - это Том Хэнкс мира ИТ.
@SergeyNemchinskiy
@SergeyNemchinskiy 3 жыл бұрын
приятно :) Люблю этого актера
@user-uo2ph3ul3d
@user-uo2ph3ul3d 3 жыл бұрын
Скажите а эти правила касаються большинтсва языков програмирования? Работаю из С++ и Пайтон. Эти советы применяються к ним?
@NesseratiousChannel
@NesseratiousChannel 3 жыл бұрын
4. Swift С-подобный, при этом свитч там работает нормально, не проваливается и брейк писать не нужно, а если нужно провалится, то есть специальный кейворд. Использования свича всегда проще, быстрее и выглядит лучше, чем большая конструкция ифов. 7. Опять же, в Свифте есть внешнее и внутреннее название аргумента, флаги не страшны если нормально описать что они делают во внешнем названии аргумента функции.
@playerkilleryakutia9415
@playerkilleryakutia9415 3 жыл бұрын
Null же многие используют в качестве некой логики, даже в языке есть конструкция ?? типа тернарного для проверки на нулл при присваивании результата
@phpdevelopercode636
@phpdevelopercode636 2 жыл бұрын
12:00 А какой объект создавать, тоесть какое название классу давать?
@alexanderradzin1224
@alexanderradzin1224 2 жыл бұрын
Builder Pattern построен на side effect by definition. Теперь я понял, почему я не люблю этот паттерн - он по определению нарушает конвенцию - имеет side effect и возвращает значение - сам себя.
@kuplumozga
@kuplumozga 3 жыл бұрын
Создатели спринга явно не слышали об ограничении в экран )) Та же AutowiredAnnotationBeanPostProcessor, хотя название очень говорящее )
@EgorychKononenko
@EgorychKononenko 3 жыл бұрын
Конечно для таких тем видео надо не только рассказывать, а приводить примеры скринов экранов с кодом. Не понял как switch оформить через enum.
@0imax
@0imax 3 жыл бұрын
В Java можно в enum нафигачить перегруженные методы для каждого значения, и вместо свича просто вызвать метод у енама, который отработает как полиморфизм в зависимости от значения этого енама.
@John_Connor
@John_Connor 3 жыл бұрын
Читай DZone > Java Zone > Enum Tricks: Featured Enum Instead of Switch
@brilliant_almazov
@brilliant_almazov 3 жыл бұрын
со всем согласен ряд тезисов по switch вызвало вопросы, но это уже по другое
@niknikagain
@niknikagain 2 жыл бұрын
Все нестатические методы объекта подразумеваются как изменяющие объект. Если метод не изменяет объект, а только производит вычисления с его данными и возвращает результат - этот метод должен быть геттером. Если метод не изменяет _данный_ объект, но имеет прямое отношение к объектам данного класса, он должен быть статическим. Т.е. метод str.toUpper() изменяет регистр внутри самого объекта (возвращает новое значение или нет - не важно), а String::toUpper(str) возвращает копию исходного объекта с измененным регистром, не трогая сам исходный объект.
@joymusicstudio1
@joymusicstudio1 3 жыл бұрын
Вподобайка і коментар для підтримки каналу!!!!!!!!!!!!
@asobyanin
@asobyanin 3 жыл бұрын
Впечатление, что это java/php-проблемы) Но, думаю, можно применить эти советы даже к python.
@jamalzeynalov2196
@jamalzeynalov2196 3 жыл бұрын
Идея крутая, но без примеров «плохо vs хорошо» очень тяжело воспринимать. Ещё круче, если примеры будут не такие как в книге
@0imax
@0imax 3 жыл бұрын
Позвольте поинтересоваться, а что конкретно из данного видео сложно воспринимается? Примеры вроде банальные. Мне вот, как не-джаверу, было удивительно узнать, что в enum можно засунуть код - не все языки такое умеют :(
@vrabosh
@vrabosh 3 жыл бұрын
C guard clause я с начала нуливых на пхп так делать начал, сам интуитивно пришел. а вот с exception вместо return както не понятно, почему так надо делать?
@0imax
@0imax 3 жыл бұрын
Если просто вернуть null, это не обязывает программиста, вызывающего твой код, проверять результат. Этот самый null может уйти очень далеко от того места, где был создан, и поиски ошибки могут занять очень много времени. Тогда как исключение возникнет конкретно там, где ошибка возникла, и неинициализированный объект не будет бродить по системе.
@vrabosh
@vrabosh 3 жыл бұрын
@@0imax исключение типа вызывать тогда когда функция в стиле процедуры сделана?
@user-nz2hh9po2r
@user-nz2hh9po2r 3 жыл бұрын
Все проблемы со switch и if else if в си-подобных языках произошли и-за того, что if изначально не сделали просто функцией с возвратом значения по условию, это кстати приучило бы кодеров делать лаконичные методы
@andreyburmagin3030
@andreyburmagin3030 3 жыл бұрын
В функциональном программировании есть отличный аналог оператору switch - сопоставление с образцом.
@user-nz2hh9po2r
@user-nz2hh9po2r 3 жыл бұрын
в Джаве недавно добавили такой вариант свича
@andreyburmagin3030
@andreyburmagin3030 3 жыл бұрын
@@user-nz2hh9po2r жду, когда завезут в C++.
@sergeynovikov9607
@sergeynovikov9607 9 ай бұрын
На счет if, elsieif, разве разработчику не придется проверять, не отработают ли другие elseif-ы, перед твоим? Это к вопросу о том, что в случае switch приходится проверять предыдущие условия. Но я не "C-подобный" программист, не могу разделить боль С-шников( У меня switch всегда выполняет только одно условие и выходит без брейков.
@natalieastafeva4885
@natalieastafeva4885 2 жыл бұрын
10. Также можно сказать - метод должен быть либо accessor,либо mutator
@user-km8cl1iq1u
@user-km8cl1iq1u 3 жыл бұрын
1991-1994г кто-то меня учил, что код подпрограммы должен помещаться на стандартном листе формата А4. В те времена принято было код распечатывать. Зарисовка тех лет. 1993г. Одесса. СКБ... все разваливается. Бородатый программист маргинального вида подался писать в направлении пенсионного фонда. Остался его начальник, папки с программами. Минивакс в рабочем состоянии. Я остался без непосредственного руководства и сидел изучал Си на IBM 486. Чтобы меня как то загрузить предложили сделать какое то разбиение Фазоманипулированных сигналов ( М последовательностей ) на ортогональные составляющие ( ну или что то такое подобное). Дали книгу про поля Галуа. Дерзай! :-) написал. Решили проверить. Скомпилировали по юниксом мою программы. Минут 15 ушло на изменение кода, чтобы прошло на компиляторе Юникса. ( я писал под Турбо Си Борланла). Потом скриптами написали связь между подпрограммами фильтров М последовательностей. И как бы прогнали задачу вперед-назад. И все сошлось. Это было прикольно. За час где-то из готовых подпрограмм довольно сложная задача была решена. К сожалению красивая идея доктора наук по этим манипуляциям в жизни не сработала. Пытались тогда добить до Парижа. Работали с ними. Но не получилось. Да в общем и французы к нам интерес в то время теряли и мы уже разбегались кто куда.
@John_Connor
@John_Connor 3 жыл бұрын
По поводу того (13:08), что по сигнатуре метода ничего не поймёшь и в него обязательно нужно залезть для того, чтобы понять, как он работает. А имена у параметров для чего?
@user-ot4vh9ks2d
@user-ot4vh9ks2d 2 жыл бұрын
Имеется ввиду по сигнатуре вызова тип obj.cancel(true, false, 42);
@user-km8cl1iq1u
@user-km8cl1iq1u 3 жыл бұрын
Рассмешило про маргинальных товарищей которые где-то там сидели. Работал как то с одним программистом, который в принципе по внешнему виду мог бы наверное быть отнесен к маргинальным товарищам. Борода у него была знатная. Писал он тогда на Си и Клипере. Одно время он работал под юниксом на миниваксе. Это был 1992-1993г. Он все подпрограммы распечатывал на принтере и подшивал в специальные папки со скоросшивателем. Когда он менял код, он заменял листы. Очень все у него было старательно описано и содержалось в порядке. Он любил говорить, что он ни разу в своей жизни не видел настоящего программиста! И в этой шутке была только доля шутки. Зато я с трех лет очень даже видел программиста, настоящего. И большого желания становиться программистом поэтому не имел. Это простыни кода и бессонные ночи. У меня мама математик-программист. Положительное правда тоже в этом было. Бумага в виде рулонов была удобна для устилания полок, а с перфокарт выходили неплохие закладки в книги:-) кстати книги по структурному программированию недавно нашел на полке с книгами про разные Алголы и PL. По поводу длинного, не читаемого кода. Недавно разглядывал такой шедевр своего хорошего знакомого математика. Несколько файлов в каждом кишка по десятку тысяч строк. Он человек умный и какое то время он даже справлялся с модификацией этого кода. Но через лет 8 после написания и последней модификации этого кода надежды его поднять стали практически нулевыми. И что интересно, там практически нет комментариев. Такой ужас мне бы наверное в страшном сне не приснился:-) бывает...
@xxxbunx
@xxxbunx 2 жыл бұрын
switch - отличный олдскульный оператор, то что ему нужен break - это скорее фича. Потому что он как бы проходит и по 1 и по 2 и по 3 блоку, пока не встретит break По вашей логике можно сказать, что "Не используйте С++, вы можете выстрелить себе в ногу!" Да, не используйте C++ если вы его не знаете
@locktar-o-dark5664
@locktar-o-dark5664 3 жыл бұрын
Это рекомендации, как маску носить))) Вы бы ещё методы по количеству символов ограничили и поставили это ограничение в настройки код ревью, кто превысил, уволить))) Switch отличная конструкция, не надо головой крутить вверх вниз и тем более скролить километры индусячего кода, есть code folding (сворачивание блоков кода) Если ты не поставил break в case или не поставил return, ide с правильно настроенным code linter сообщит об этом)))
@SergeyNemchinskiy
@SergeyNemchinskiy 3 жыл бұрын
вот миллион раз рассказываешь одно и то же, но все равно найдется человек, который ничего не услышит и все равно притащит уже разобранные доводы в тред. Не надо так
@user-zr6dn4ke9m
@user-zr6dn4ke9m 3 жыл бұрын
По поводу флагов и их наглядности при вызове методов: в C#, если не лениться можно писать имена аргументов. Например: Cancel(paramName1: true, paramName2: false); // не надо объекты городить и всё наглядно.
@ValentinNechayev
@ValentinNechayev 3 жыл бұрын
IDE типа IDEA умеет показывать имена аргументов - это тоже помогает. Но я тут за реформу языков в сторону явных имён в таких случаях (например, Swift позволяет требовать такое - явно назвать определённые аргументы).
@PianoElipse
@PianoElipse 3 жыл бұрын
1:45 да и не только надежды и мечты :D
@pond2949
@pond2949 Жыл бұрын
А если к примеру я использую swing и имею определенный класс с gui в котором есть конструктор с добавлением всех компонентов (предположим это какой-то сложный инетрфейс). И вот проблема - конструктор будет иметь уже не до 10 строк кода, а до 40 и больше) Вопрос: нарушает ли это принципы чистого кода? Если да, то как избежать кроме банальной перефразировки?
@rasulmagomedov493
@rasulmagomedov493 3 жыл бұрын
я так понимаю, совет завернуть быший код со switch блоком в enum основывается на возможностях enum именно в джаве (в c++ например enum это тупо набор числовых констант). а как в других яп поступать, может только switch блок выделить в свой метод и назвать вроде OnKind ?
@SergeyNemchinskiy
@SergeyNemchinskiy 3 жыл бұрын
а вот тут лучше посмотреть рекомендации по хорошему коду в вашем языке
@feoktant
@feoktant 3 жыл бұрын
По switch особенно интересно в свете JEP 361. Половину сказанных проблем убрали. Конструкцию всё больше двигают к паттерн матчингу, так что скорее его использование наоборот возрастет
@lolowkalolowka8868
@lolowkalolowka8868 3 жыл бұрын
Ребят, кто-то может пояснить что имеется ввиду на 10:04. Каким образом код можно "вынести в enum"?
@SergeyNemchinskiy
@SergeyNemchinskiy 3 жыл бұрын
Если вы не в курсе языка программирования. на котором пишете, это не Немчинский несет ересь, это вы - недоучка. enum can contain both concrete methods and abstract methods. If an enum class has an abstract method, then each instance of the enum class must implement it.
@bormanbor8740
@bormanbor8740 3 жыл бұрын
1. Часто Switch удобнее и понятнее if-a 2. Метод без параметров - это жесть. Не понятно что и откуда он берет, начинаешь ходить по нему искать какие переменные он использует, какой они имеют тип и откуда они вообще взялись. А еще такой метод приводит к появлению глобальных переменных. 3. Так и не понял, как if в начале метода и закрывающая скобка в конце мешает сделать return посреди метода
@user-ie4gn8ct1q
@user-ie4gn8ct1q 2 жыл бұрын
Про аргументы в методах типа ДатаНачала1, ДатаКонец1, ДатаНачала2, ДатаКонец2... . Как программист на 1С скажу даже более крутую вешь. В 1С есть такая фича, как периодические расчёты, связанные, в основном, с расчётом зарплаты, где учитывается каждый день месяца. Так вот, я видел методы, в которых 31 аргумент вида ЗначениеНа1ЧислоМесяца, ЗначениеНа2ЧислоМесяца и так далее...
@phpdevelopercode636
@phpdevelopercode636 2 жыл бұрын
Я про enum не понял. 10:00 Мне нужно выносить такие вещи в отдельный класс, массив?
@AlexAlex-jk2tn
@AlexAlex-jk2tn 3 ай бұрын
Речь шла о фишках Java, на сколько я знаю, в других языках этого нет.
@Mr43046721
@Mr43046721 3 жыл бұрын
Очень полезное видео, ждём про еррор хенддинг. Подскажите, как намекнуть коллегам почитать Clean Code ? Некоторые коллеги называют переменные в 1 букву, не пишут никаких комментариев к дикому коду... А мне как новичку сложно читать порой что там они наколбасили
@0imax
@0imax 3 жыл бұрын
Устраивать дружеские диверсии: присылать ролики по клинкоду, лучше с кликбейтными названиями :)
@jozakatkin
@jozakatkin 2 жыл бұрын
это жесть...
@Mr43046721
@Mr43046721 2 жыл бұрын
@@jozakatkin Работали по принципу, ну оно же работает. Как хорошо что я оттуда уволился
@max_mgtow
@max_mgtow 3 жыл бұрын
Так и скажу на собеседовании, Немчинский запретил юзать switch 😆
@maxlich9139
@maxlich9139 3 жыл бұрын
он что царь или бог?)))
@prohorovgen
@prohorovgen 3 жыл бұрын
Немчинскому можно. Он из палеозоя вылез, и до сих пор не в курсе про нормальные ЯП, про pattern matching, и вообще ничего кроме своей джавы не знает. А вот у вас, боюсь, с таким ответом собеседование закончится очень быстро.
@Grandjets
@Grandjets 3 жыл бұрын
длина метода зависит от решаемой им задачи. и разбивать решение на много методов редко поможет решению задачи.. Если задачки простенькие то да. Но читать код состоящий из названий методов совсем неудобно. После того как метод написан можно его оптимизировать и унифицировать, но для других это вряд ли упростит его чтение. А так в принципе любая хорошая программ занимает не более 10 строк. Но понять ее практически невозможно.
@ievgenk.8991
@ievgenk.8991 3 жыл бұрын
Ну работа с enum через switch удобнее, но то ладно - вкусовщина. Вот switch оператор затронули, а что на счёт switch expression?
@maxlich9139
@maxlich9139 3 жыл бұрын
это ты про фичи в новой джавке?)
@AlexAlex-jk2tn
@AlexAlex-jk2tn 2 жыл бұрын
К стати вот интересно, на счёт возвращения объекта, полученного как параметр, в С++ с этим очень легко: каждый параметр это уже копия, и можно её же и возвращать, главное помнить, что у вас является объектом, например если в качестве параметра выполучили ссылку или если ещё хуже, указатель, и вернуть хотите тоже ссылку, то вы обязаны создать копию того, на что изначальная ссылка указывала и вернуть уже ссылку на копию. Тоже самое и с контейнерами, типа умных указателей.
@anatagenki2056
@anatagenki2056 Жыл бұрын
К слову о том, что нельзя использовать аргумент как реультат метода и к тому, что изменение состояния объекта должны только void методы. Как тогда реализовывать паттерн строитель? Его методы же как раз и меняют состояние билдера и возвращают ссылку на себя же
@feoktant
@feoktant 3 жыл бұрын
Exception или return code. А так же Optional, и другие извращения джентельменов)
@user-ny5nq3qz6l
@user-ny5nq3qz6l Жыл бұрын
Экран можно развернуть по вертикали)
@JamesBond-bu8co
@JamesBond-bu8co 3 ай бұрын
Приветствую всех! Подскажите, пожалуйста, кто в теме - как передать в метод несколько аргументов, с помощью параметра object, как предлагается в видео? Создавал темы на двух форумах, мне рассказывали, но из видео следует, что введение данного параметра должно (по идее) упрощать работу и уменьшать количество кода, а из полученных мною объяснений следует, что это ни разу не проще, количество кода меньше не станет, а наоборот нам ещё понадобится целый класс для этой задачи (возможно, даже не один). Помогите, пожалуйста, разобраться.
ОДИН ДОМА #shorts
00:34
Паша Осадчий
Рет қаралды 6 МЛН
Miracle Doctor Saves Blind Girl ❤️
00:59
Alan Chikin Chow
Рет қаралды 26 МЛН
FOOTBALL WITH PLAY BUTTONS ▶️ #roadto100m
00:29
Celine Dept
Рет қаралды 72 МЛН
OMG 😨 Era o tênis dela 🤬
00:19
Polar em português
Рет қаралды 9 МЛН
Великовозрастный программист. Стоит ли идти в IT в 40 лет
8:17
Дилетант широкого профиля
Рет қаралды 8 М.
Принцип хорошего кода DRY (dont repeat yourself)
16:20
Sergey Nemchinskiy
Рет қаралды 70 М.
Почему нельзя возвращать NULL?
22:11
Sergey Nemchinskiy
Рет қаралды 115 М.
Как учиться программированию эффективно?
21:35
ОДИН ДОМА #shorts
00:34
Паша Осадчий
Рет қаралды 6 МЛН