Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Классика карточных игр! Яркий геймплей, простые правила. Развивайте стратегию, бросайте вызов соперникам и станьте королем карт! Играйте прямо сейчас!

Дурак подкидной и переводной

Карточные, Настольные, Логическая

Играть

Топ прошлой недели

  • solenakrivetka solenakrivetka 7 постов
  • Animalrescueed Animalrescueed 53 поста
  • ia.panorama ia.panorama 12 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая «Подписаться», я даю согласие на обработку данных и условия почтовых рассылок.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
2
YellowClub
YellowClub

Слабое зацепление и сильная связность⁠⁠

2 года назад

Наставник, который учит меня писать чистый код, наехал на неверное употребление словосочетания «слабосвязанный код». Наставник из мира 1С, поэтому иногда почитывает посты в ЖК.

Исправляюсь. Правильнее сказать, что код «сильнозацепленный». Выделяют два понятия:

Low Coupling - слабое зацепление

High Cohesion - сильная связность

Это шаблоны проектирования GRASP. В GRASP девять шаблонов.

Функции должны быть слабо зацеплены (связанны), но при этом хорошо, чтобы функция была сильно связана (или просто сильная), т.е. выполняла только одно назначение.

Зацепление — мера зависимости одного кода от другого, а не связность.

Что думаете, прав мужик?

Показать полностью
1С Проектирование Чистый код Опыт Саморазвитие Личный опыт Текст
0
82
YtYt.Pikabu
YtYt.Pikabu
Программирование на python

Учимся писать чистый код на Python: сезон 1, серия 2⁠⁠

3 года назад

Ну что ж, вот и подъехала вторая серия сериала про чистый код. Первая серия здесь.


Напоминаю, что вся эта серия постов предназначена для тех, кто изучает Python и уже имеет базовые знания. Если вы пока что не можете написать ничего сложнее `print('Hello, world!')`, то посты будут для вас слишком сложными. Поскорее изучайте основы и присоединяйтесь к движу :)

Нейминг: выбираем хорошие имена для объектов

Выбор имён для объектов - это большая тема, поэтому она будет разделена на 2 поста. Сейчас разберём общие принципы, а в следующем посте займёмся деталями.


Начнём с короткого наглядного примера.

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


А если серьёзно, то этот пример должен ответить на вопрос "Зачем правильно выбирать имена объектов?". Прочитать вышенаписанный код и не истечь кровью из глаз навряд ли кому-то удалось. А теперь представьте, что вы с командой работаете над проектом, в котором 100 000+ строк кода, и всё написано в таком стиле.


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

Самый главный принцип

Имя объекта должно чётко и коротко передавать его суть. Оно не должно быть "просто словом", которое пришло на ум в первые 5 секунд. Оно должно недвусмысленно показывать, для чего этот объект предназначен.


В примере выше есть сразу несколько нарушений этого принципа:

- аргумент "безумно полезной функции" называется `number_or_list`, хотя в реальности функция может работать только со строкой;

- имя самой функции вообще не несёт никакой смысловой нагрузки;

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

Алгоритм выбора имени

1. Определяете, какой смысл имеет объект;

2. Передаёте этот смысл 1-3 словами на русском, старательно отбрасывая всё лишнее;

3. Переводите на английский.


Если у вас хороший уровень английского, то пункты 2 и 3 можно совместить. Но ни в коем случае не пытайтесь это сделать, если английский у вас пока что на уровне "Лондон из зэ кэпитал оф Грейт Бритн". Имена вроде `pikture_draw` и `data_chek_completly` - это зло и боль для любого, кто будет читать код впоследствии. Не ленитесь - пользуйтесь переводчиками и словарями.

Исправляем проблему с именами

Давайте подумаем над тем, какой смысл заложен в каждый из объектов.

1. `number_or_list`: это строка, которая выводится на экран;

2. `InsanelyUseful_function_withaveryDescriptivename`: аналог `print()`, но работающий только со строками, а не с любыми объектами;

3. `incrediblylonglowercasedvariablewhichcontainsamessage`: сообщение/вопрос для пользователя.


То есть нам нужно подобрать имена для следующих сущностей:

- строка/текст;

- напечатать строку;

- сообщение/вопрос.


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

Выбор конкретного варианта остаётся на ваше усмотрение, но есть пара нюансов.


1. Если используется 1 переменная со смыслом "просто объект", то можно использовать однобуквенное имя `s` как сокращение от `string`. Например:

Здесь неважно, какая строка передаётся в функцию. Строка и всё, никакого особого смысла у неё нет. К тому же функция короткая и принимает всего 1 аргумент. Поэтому можно смело использовать `s`.


2. Если же производится работа с несколькими разными сущностями, или у сущности есть конкретный узконаправленный смысл, то лучше использовать более наглядное имя. Сравните:

То же самое в случае с одним аргументом, имеющим конкретный смысл:

Разбор заданий из предыдущего поста

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


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


Вот имена, которые разные пользователи подобрали для функции, разбивающей IP-адрес на 4 октета:

Самая распространённая проблема - это вложение в функцию смысла "проверяльщик IP". Но ведь её основное назначение - не проверка, а извлечение октетов из IP-адреса и возврат кортежа. Проверка самого адреса - это лишь косвенное действие. Название объекта не соответствует его смыслу.


Наиболее интересный вариант - это `checker(string)`. Судя по названию, функция проверяет строку. В чём именно заключается проверка и что это за строка - неясно. Чтобы понять, для чего нужна эта функция, придётся полностью разбирать её исходный код.


Были и другие варианты:

Вариант с `parse_ip(ip)` наиболее близок к идеальному. Лаконично, стилистически корректно, отлично передаёт суть. Возможные аналоги: `extract_octets(ip)`, `split_ip(ip)`.


Остальные варианты тоже неплохи, но имеют некоторые недочёты, которые будут разобраны в следующей серии.

Новая задачка

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


Критерии для расчёта:

- максимум 50 строк на 1 странице;

- максимум 55 символов, включая пробелы, в 1 строке.


Значения "50" и "55" пока что можно захардкодить, то есть вручную написать в коде программы. Но если хотите, можно сделать их параметрами функции.


Обязательно подумайте над именами объектов. Самое главное в текущем задании - это не супер-крутой алгоритм, а хорошие названия. Над алгоритмами и декомпозицией задач поработаем чуть позже.


UPD: учитывайте, что в настоящем тексте будут переносы строки `'\n'`. Изначально не указал это, подумав, что все сами догадаются :)

Как оформлять решение

Должно быть изображение, а под ним ссылка на код. В прошлом посте вместо ссылки на код делали цитату, но это оказалось неудобно, т.к. Пикабу нещадно кромсает отступы.


1. Изображение из кода генерируется с помощью https://carbon.now.sh/

2. Ссылка на код - с помощью https://www.codepile.net/ или аналогичного ресурса.


Решения, оформленные в стиле тяп-ляп, в разбор гарантированно не попадут, потому что их неудобно читать и на работу с ними уйдёт много лишнего времени.


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


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

Показать полностью 10
Программирование Python IT Обучение Чистый код Длиннопост
51
164
YtYt.Pikabu
YtYt.Pikabu
Программирование на python

Учимся писать чистый код на Python: разбор задания к S1E1⁠⁠

3 года назад

Ну что, решений в комментах к прошлому посту скинули немало, пора их разобрать. Но сначала небольшое отступление.


Очень радует, когда люди не только отправляют свой код, но и помогают другим увидеть ошибки. Добавить бы ещё активных срачей, и будет совсем огонь :) Так что не стесняйтесь, обсуждайте решения других участников, для этого мы все здесь и собираемся.

Общие ошибки

Как и ожидалось, у многих встречаются одни и те же ошибки. В разном виде, в разном контексте, но суть одна и та же.


Их можно разделить на 2 группы:

- нейминг (названия объектов);

- структура/компоновка кода внутри функции.


В этом посте разберу компоновку, а в следующей серии подробнее расскажу про нейминг. Погнали :)

if/else в одну строку

@Amplicon, @kashinec, достаточно неплохие решения.

Малину немного попортило стремление впихнуть невпихуемое, а именно - записать тело `if/else` в одну строку.

Делать так категорически не рекомендуется. Против этого выступает как PEP8, так и Google Style Guide. Просто переносите тело на новую строку, даже если оно небольшое. Это выглядит гораздо красивее и читабельнее.

Пробелы

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

Лишние слои

Следующая распространённая ошибка - это заворачивание куска кода в ненужный `if` или `else`. @DavidSarif, @Nikydzman, вы в телевизоре.

Ту же самую логику можно реализовать так:

Вместо того, чтобы использовать `if - pass` или `if - continue`, можно просто инвертировать условие, и код станет проще и линейнее.


Также стоит помнить о том, что `raise` и `return` прерывают выполнение, поэтому добавление `else` после `return` уже излишне.


P.S. Долго думал, разбирать ли код Nikydzman или нет, потому что он ЕДИНСТВЕННЫЙ НЕ ПОДПИСАЛСЯ 😈, но решил всё-таки разобрать, потому что он идеально иллюстрирует ситуацию с лишними слоями. Во второй раз такой халявы уже не будет)

Декомпозиция задачи

Отдельно отмечу решение @DarkPavlov. Дело в том, что он разбил большую задачу на отдельные функции. Это очень хороший подход, который значительно упрощает отладку и тестирование программы.

Сейчас выглядит довольно громоздко, но если убрать лишние слои `if/else`, то получается уже так:

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

UPD: Скорость выполнения кода

По совету @kashinec добавил результаты замеров скорости. Средние значения за 100 000 итераций, измеряются в микросекундах:


kashinec: 1.10

Nikydzman: 1.38

AnimalPy: 1.66

NuVasche: 1.79

Amplicon: 1.83

DavidSarif: 2.09

Mirakonda: 2.59

DarkPavlov: 3.24

budu.krokodit: 4.07

HaneLeiko: - (код не в виде функции)


Если кого-то забыл - прошу простить. Измерить можно самостоятельно с помощью модуля `timeit`. Абсолютная точность не гарантируется, на результаты могут повлиять разные факторы.

Что дальше?

Вчера много думал над тем, как правильно организовать выпуск постов, и пришёл к следующему варианту.


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

- спустя 1-2 дня после этого буду публиковать разбор задания. Пауза в 1-2 дня нужна для того, чтобы все успели почитать и написать код;

- спустя ещё пару дней буду выкладывать "прикладной" пост, в котором буду рассматривать какие-нибудь интересные фишки или давать полноценные идеи проектов для практики.


Таким образом, каждую неделю - новая итерация цикла. От таки дела :) Надеюсь, вам зайдёт.

Показать полностью 7
Python Программирование IT Обучение Чистый код Длиннопост
35
278
YtYt.Pikabu
YtYt.Pikabu
Программирование на python

Учимся писать чистый код на Python: сезон 1, серия 1⁠⁠

3 года назад

Эта серия постов создаётся для тех, кто учится программировать на Python. А точнее для тех, кто хочет заниматься разработкой за деньги, а не просто для развлечения.


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


Чистый код

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

- задачи правильно декомпозированы;

- отсутствует избыточность и дублирование;

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

- для всех объектов подобраны хорошие, говорящие имена;

- соблюдаются стандарты, принятые в сообществе разработчиков в целом и в конкретной команде в частности. PEP8, Google Style Guide и прочие.


Зачем нужен чистый код?

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


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


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


Простейший пример

Есть задача: взять список и создать на его основе новый список, в котором все элементы будут удвоены. То есть из списка [1, 2, 3] нужно получить [2, 4, 6]. Решить эту задачу на Python можно разными способами.


Вариант №1: сделать всё "в лоб", перебрав исходный список по индексам. Для лучшего эффекта не будем использовать пустые строки и накосячим с отступами между оператором и операндами.

На C или подобных языках такой код вполне естественен. Но на Python его можно написать гораздо проще и лаконичнее.


Вариант №2: вместо ручного увеличения индекса воспользуемся встроенной функцией `range()`. Заодно поправим названия переменных и добавим пустую строку для разделения логических блоков кода.

Вариант №3: вообще не будем трогать индексы, а переберём исходный список поэлементно с помощью `for`.

Вариант №4: используем генератор списков.

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

Сравниваем производительность

С помощью модуля `timeit` я замерил время выполнения кода в каждом из 4 вариантов. Исходный список `data` создал заранее, так как он используется без изменений в каждом варианте. Результаты следующие:


- Вариант №1: 573 наносекунды в среднем за 1 000 000 итераций;

- Вариант №2: 468 наносекунд в среднем за 1 000 000 итераций;

- Вариант №3: 257 наносекунд в среднем за 1 000 000 итераций;

- Вариант №4: 253 наносекунды в среднем за 1 000 000 итераций.


Самый короткий и наглядный вариант вдобавок оказался ещё и самым быстрым. Разница во времени выполнения кода между подходом "в лоб" и использованием генератора списков - в два с лишним раза.

Как научиться писать чистый код?

Есть 2 способа:

1. Учиться на своих ошибках. Написать хреновенький код, спустя некоторое время понять, что он непригоден для дальнейшего использования, погрустить и переделать. Повторять 100500 раз до тех пор, пока не начнёт получаться что-то нормальное;

2. Учиться на чужих ошибках. Этим я и предлагаю заняться прямо сейчас.


Ниже написана задача, которую вы можете решить и выложить своё решение в комментариях. Самые интересные решения я отдельно разберу в следующем посте.


ВАЖНО: не смотрите на чужие решения до того, как выложите своё. Суть именно в том, чтобы вы сначала попробовали сами решить задачу, и только потом сравнили свой код с тем, что получилось у остальных. Так вы сможете проанализировать свои ошибки и чему-то научиться. Если вы просто пробежитесь взглядом по чужим решениям, то в голове отложится гораздо меньше.


Задача

Создайте функцию, которая разобьёт IP-адрес на 4 октета. IP-адрес - это строка вида "127.0.0.1". Октет - это число от 0 до 255. Например, если передать в функцию строку "123.124.125.126", то она должна вернуть кортеж из 4 чисел: (123, 124, 125, 126). Если передать в неё некорректный IP-адрес, то должно возникнуть исключение ValueError.


Оформление решения

Код нужно представить в 2 форматах: изображение, сгенерированное на https://carbon.now.sh/, и текст, помещённый в цитату. Например:

print('Привет, мир!')

Это нужно для того, чтобы по решению можно было как пробежаться глазами прямо в посте, так и скопировать его к себе в IDE для экспериментов.


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

Разбор интересных решений

Как уже говорилось выше, самые интересные решения я отдельно разберу в следующем посте. Будет ли это одно решение или несколько - ещё не знаю, зависит от трудозатрат на разбор.


Приоритет, естественно, буду отдавать подписчикам. Для меня подписка - это признак того, что человек заинтересован в следующих постах и гарантированно увидит разбор. Ну и в целом приятно, когда на тебя подписываются :)

Пробуйте, учитесь, становитесь лучше. По мере возможностей постараюсь помочь. Удачи!

Показать полностью 6
Python Программирование IT Обучение Чистый код Длиннопост
106
9
echo0x00
echo0x00
Online Tutorials | Web 3.0

Выключатель на чистом CSS⁠⁠

3 года назад
Перейти к видео

Полное видео на канале Чистый код

OnOff CSS Программирование Чистый код Видео
9
920
Firkraag
Firkraag
IT-юмор

Чистый код, который мы заслужили⁠⁠

3 года назад
Чистый код, который мы заслужили
Показать полностью 1
Юмор IT IT юмор Скриншот Картинки Программирование Чистый код
13
14
wizard2122
Unity

C# Свойства и поля класса. Чистый код⁠⁠

4 года назад

Всем привет! Хотел бы поделиться парой уроков по полям и свойствам класса (да один из них я уже публиковал, но решил продублировать, т.к. эти два урока непосредственно связаны). В них мы поговорим о том для чего нужны и что отражают поля класса, о модификаторах доступа, а самое главное - о свойствах. Разберем какую роль они играют в ООП и как помогают реализовывать принцип инкапсуляции и конечно все разберем на примерах как в обычной консоли, так и в Unity! А во втором уроке я немного затронул тему чистого кода относительно полей и свойств, т.е. как правильно называть поля и свойства и на что стоит уделить внимание при этом. Я дам вам несколько общепринятых вариантов именования, которые помогут вам найти общий язык с другими  программистами и также улучшить читаемость вашего кода, что полезно в том числе и для себя! Так что всем приятного просмотра!

https://youtu.be/cw6PZ1nxT7k
https://youtu.be/wLA9rtbFiII

Показать полностью 1
[моё] Программирование Чистый код Unity Видео
0
36
georgiyglinskikh

Гостья из будущего⁠⁠

5 лет назад

Купил я значит книгу Роберта Мартина "Чистый код", а в ней все даты редакции поставлены как за 2021 год:

Кто-нибудь знает, почему это произошло?
ПыСы: мой первый пост, судите строго

Показать полностью 3
[моё] Книги Несостыковки Программирование Чистый код Длиннопост
20
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии