Я угадаю этот код с трех строк
Понятный код — красивый код. Когда ничего не нужно гадать, ничего не ломается от малейших правок и программа работает стабильно и быстро.
Вы можете отличить красивый код от обычного? Нестандартное решение от «копипасты»? Тогда присмотритесь к вакансиям от Сбера. А если вы не до конца уверены в своих силах — пройдите наш тест!
Реклама. ПАО Сбербанк. Генеральная лицензия Банка России на осуществление банковских операций №1481 от 11.08.2015
Пишем красивый код
Код, который вы пишете, должен быть красивым, как кот. Когда мы смотрим на красивого кота, мы умиляемся и говорим: ми-ми-ми. При чтении вашего кода должно возникать такое же чувство. В противном случае, у вас не код, а, извините, говнокод.
Косо смотрит кот на код, Написанный хозяином. Код большой, как бегемот, Плохо он читаемый. Кот переписал бы код, Только вот хозяин Очень сильно занял комп И со стола сгоняет. Этим сильно он коту Душу задевает, И программера в коте Тихо подавляет. *** Тихо смотрит кот на код И в душе сомненье Мой хозяин идиот, нет другого мнения. Пишет код и жрет, баран, сахарные кексики, Ты бы тему запорол, даже в старом бейсике, Запятую не туда, снова эти скобки. И мяуканье кота выбивает пробки. Засыпает в темноте программист от скуки, Кот дописывает код. на старом ноутбуке! --- С просторов интернета.
Я часто получаю письма от пользователей, которые делятся своими листингами. И порой волосы дыбом встают. Некоторые программисты наивно полагают, что свой код они прекрасно понимают и им не нужно писать красиво — мол и так понятно. В своё время я тоже так думал, а потом мучительно вспоминал, что делает та или иная функция в программе, которую писал несколько лет назад. Кроме того, правильная система написания кода помогает разработке, как это ни странно звучит.
Сравните код для запуска второй активности через нажатие кнопки (из урока 5):
public void onClick(View v) < Intent intent = new Intent(PassingDataDemoActivity.this, Privet.class); intent.putExtra("username", userNameEditText.getText().toString()); // в ключ username пихаем текст из текстового поля intent.putExtra("gift", descriptionEditText.getText().toString()); // в ключ gift пихаем текст из текстового поля startActivity(intent); >
А вот реальный пример из письма пользователя, который на основе того урока, писал своё приложение:
public void oc(View v)
В обоих случаях код делает одну и ту же работу. Но сколько же лишних усилий мне пришлось потратить, чтобы уяснить код даже в таком простом примере. При чтении такого кода нужно помнить, что oc — это метод обработки нажатия кнопки, t1 и t2 — это текстовые метки и т.д. и т.п.
Вот почему я беру плату за чтение чужих программ — разбор листингов отнимает много времени и сил.
А ведь писать красивый код не так уж и сложно. Не надо экономить на лишних символах в названиях классов и методов, а также не стоит избегать комментариев. Впрочем, и в другую крайность впадать тоже не стоит.
Понимание к такому подходу приходит не сразу. Когда я только начинал учиться программированию, то не обращал внимания на подобные «мелочи». Потом стал приглядываться не только к коду, но и как он написан. Стиль написания кода многое говорит о программисте. Есть очень интересная книга Читаемый код, или Программирование как искусство, который рекомендую к прочтению. Вот одна иллюстрация из этой книги.
Используйте говорящие имена
Код намного проще читать, если в нём будут использоваться говорящие имена, хорошо написанные комментарии, а также будет использоваться форматирование кода.
Когда вы придумываете имя для переменной, метода, класса и т.д., то подойдите к данному действию ответственно. Не стоит давать имена из непонятного набора символов типа m1, wl, KU, o, p, r, s, t. Представьте себе, что вы даёте имя коту. Вряд ли ему понравится имя m1 или t. Конечно, он сделает вид, что его это не касается, но карма у вас вряд ли повысится. А если вам такое имя дадут родители?
Итак, договорились — давайте нормальные имена. Даже если это временный тестовый пример на пять минут, который вы удалите. Выбрав хорошее имя, вы сообщаете гораздо больше информации, чем кажется на первый взгляд. По сути правильное имя уже содержит комментарий. Сравним:
// в этой переменной будем хранить имена котов String c; String catname;
Во втором случае даже не обязательно писать комментарий, уже понятно по названию переменной для чего она создана.
С другой стороны даже целые слова типа size, put тоже не всегда оправданны, так как не дают ясности. Избегайте пустых и неинформативных слов и выражений.
Допустим, мы создали метод getPage(url), который получает какую-то страницу. А откуда получает: из интернета, базы данных, диска? Если из интернета, то может стоит назвать метод downloadPage(url)? Кстати, мы пока не рассматриваем приёмы, связанные со стилем кодирования. Например, для Android имена методов должны начинаться с маленькой буквы, а второе слово с большой. В других языках могут использоваться другие стили, например, в Visual Basic совсем по другому.
class Cat
Что возвращает метод size()? Метод getTailSize() даёт основание предполагать, что речь идёт о размере хвоста. Кроме того, метод должен начинаться с глагола.
Или метод stop() — мы понимаем, что метод что-то останавливает. Но может есть более подходящие имена, например, kill() или pause() с родственным ему методом resume(). Ищите яркие запоминающие имена-синонимы.
- send (посылать) — deliver (доставлять), announce (извещать), route (направлять)
- find (искать) — search (искать), locate (обнаруживать)
- start (начинать) — launch (запускать), create (создавать), begin (начинать)
- make (создавать) — create (создавать), setup (устанавливать), build (строить), generate (генерировать)
Избегайте общих имён
Часто разработчики используют имена вроде tmp, retval, foo и т.д. В учебных примерах этот приём вполне допустим, чтобы показать, что это именно учебный пример. В своих программах следует избегать подобной практики. Иначе получается, что автор признаётся, что никак не может придумать имя. Придумайте такое имя, которое описывает назначение или содержание объекта. Тот же retval — совершенно неинформативное имя, которое сообщает, что это возвращаемое значение, что и так очевидно.
В некоторых случаях общие имена допустимы. Например, у нас есть код, где две переменные обмениваются своими значениями:
if(right
Здесь tmp хорошо подходит, так как служит для временного хранилища значения. Больше он нигде не используется и чтение кода не вызовет затруднений.
В более сложных примерах использование слова tmp неоправданно и свидетельствует о лени программиста.
String tmp = user.name(); tmp += " " + user.phone_number(); text.setText("Пользователь: " + tmp);
Если речь идёт о временном файле, то используйте, например, вариант tmp_file. Одного взгляда на код будет достаточно, чтобы понять, что в выражении используется объект файла:
saveData(tmp_file, . );
Сравните с вариантом:
saveData(tmp, . );
Для итераторов в цикле обычно используют имена i, j, k. Поэтому не стоит использовать подобные имена в других местах вашего кода. С другой стороны и циклах тоже лучше использовать говорящие имена. Иногда это помогает избежать ошибок, особенно во вложенных циклах, когда можно перепутать имена переменных и использовать неправильные индексы для массивов.
Имя переменной можно использовать как маленький комментарий. Любая информация, добавленная в имя переменной, будет напоминать вам о сущности переменной. Например, если у вас есть переменная, которая содержит строчку в шестнадцатеричном формате, то почему бы не использовать данный факт в имени:
string hex_id; // содержит "AF45CD98" string id; // плохой вариант
Переменные, связанные с измерениями
Удобно записывать единицы времени или другие данные в имя переменных. Например, если речь идёт о миллисекундах, то можно создать переменные таким образом:
int start_ms; int elapsed_ms; // и т.д.
Подобный стиль напомнит, что результат возвращается в миллисекундах и нужно проделать дополнительные операции, если результат нужно вывести в секундах, минутах и т.д.
Аналогично можно поступать и с другими мерами измерений:
start(int delay_secs); createCache(int size_mb); downloadFile(float max_kbps); rotate(float degrees_cw);
Взглянув на подобный код, вы уже можете приблизительно предположить, что делает метод.
Стиль кодирования для Android
На официальном сайте для разработчиков есть отдельная страница Code Style Guidelines for Contributors, посвящённая правилам оформления кода для проектов, написанных под Android.
А также есть ещё одна страница правил — Google Java Style
Как новичку научиться писать красивый код?
Красивый код = хороший код = код, который легко читается. Он должен быть максимально понятен даже начинающему разработчику. Чем выше требуется квалификация программиста для чтения вашего кода, тем он хуже. В идеале ваш код должен понимать даже человек, не знающий программирование вообще и читаться просто как английский текст.
С чего начать изучение искусства написания красивого кода?
1. Code Style. Как только вы освоили синтаксис языка и задумались, как сделать код максимально хорошим, ищите code style для вашего языка, а потом просто изучите информацию. Например, что называть большими и маленькими буквами, используем KML, подчеркивание или что-то другое, какие правила разложения по папкам, каталогам и пр.
Все современные IDE поддерживают автоматическое форматирование. Вы нажимаете комбинацию клавиш и код форматируется так, как нужно: правильно расставляются скобки, делаются пробелы в нужных местах и пр.
2. Чистый код. После того как вы освоили code style, стоит изучить книгу Роберта Мартина «Clean Code». Эта книга идеальна. Если не хотите читать, на моем ютуб-канале есть лекция по этой книге — «Как помыть кота».
Основное в чистом коде — это названия (переменных, методов, классов, namespace, package и т.д.)
Человек мыслит словами. Даже если ваш код плохо структурирован, но с правильно подобранными названиями — другой программист сможет его прочитать. Да, он будет материться на вашу структуру, но понять код он сможет. Если же вы прекрасно все структурировали, красиво оформили, но дали названия а1, а2 — ваш код будет нечитабельным. Не просто непонятным, это все равно что обработать его обфускатором. Т.е. если выбирать самое важное в чистом коде — это именно названия.
Я придерживаюсь такого правила: если на написание метода вы потратили больше времени, чем на придумывания его названий, значит они плохие. Названия должны быть продуманы очень хорошо.
Дальше уже идут вопросы архитектуры, паттерны и пр. А начинать нужно с code style и наименований.
Красивый код: почему он так важен?
22.10.2018
1115
Рейтинг: 5 . Проголосовало: 1
Вы проголосовали:
Для голосования нужно авторизироваться
Красивый код — не просто абстрактное понятие, а вполне реально существующая вещь в среде программистов. Научившись писать красивый код, вы значительно сэкономите своё (и чужое) время, а ваши программы станут работать быстрее и стабильнее. Как научиться писать красивый код и каким нюансам стоит уделить внимание — узнаете в этой статье.
Почему так важно писать красивый код?
Код — штука тонкая, в которой эстетика и полезность тесно связаны, как в архитектуре. Полезный, но не эстетично выглядящий код будет трудночитаемым и в результате менее эффективным, чем мог бы быть. Каким образом?
- Трудночитаемый код сложно корректировать и тестировать возможные решения, поэтому он отнимает больше времени на корректировку, чем обычный код.
- Чистый код создан для людей, поэтому другие программисты, которые будут читать его, будут вам очень благодарны за красивый код.
Благодаря чистому коду поиски одного бага могут сократиться с нескольких часов до нескольких минут, а программа будет работать стабильнее и не выдавать сюрпризов.
Однако овладеть мастерством написания чистого кода с наскока не получится — до момента написания первого элегантного кода, вызывающего восхищение коллег, вы напишите ещё десяток не самых красивых кодов, от которых будут плеваться.
Впрочем, если вы немного измените мышление и овладеете несколькими навыками, то успехи у вас будут значительно лучше, и к написанию красивого кода вы придёте значительно быстрее. Для начала определимся, как вообще научиться писать красивый код, и какие знания нужны для этого, а затем — с навыками, которые необходимо будет развить.
Как научиться писать чистый код?
Прежде чем приступить к написанию красивого кода, запомните два основных принципа, которые вытекают из прошлой части статьи:
- Красивый код должен быть легко читаемым и понятным для других программистов.
- Красивый код должен работать, а если он не работает — легко фикситься.
Тема связана со специальностями:
Для того, чтобы соответствовал этим требованиям, он должен быть коротким, а функции — линейными. Таким образом, при написании чистого кода вы должны ориентироваться на эти принципы. И постоянно практиковаться: пишите код каждый день, и каждый раз пытайтесь написать наиболее лучший вариант. Со временем у вас начнёт получаться.
Не забудьте почитать книгу Clean Code под авторством Роберта Мартина. Эта книга — настольная библия для программистов, которые стремятся к совершенному коду. На 900 страницах расписано всё, что следует знать программисту, который стремится к чистому коду.
Во время чтения книги можете также зайти на Хабру или другие сайты с полезными для прогеров статьями. Так вы сможете узнать ещё больше о чистом коде и позже закрепить свои знания практикой.
Также вы можете пройти обучение по видео курсам ITVDN. Авторы видео курсов – сертифицированные разработчики. Они помогут вам научиться писать хороший код.
Нужно ли изучать алгоритмы и паттерны?
Изучение алгоритмов — дело ваше, но запоминание паттернов является обязательным для программистов, как изучение таблицы умножения для детей. Без паттернов найти решение типичной проблемы будет трудно, поскольку не будет готового решения.
Впрочем, это не значит, что вы всегда должны использовать паттерны в каждой непонятной ситуации, иногда они не смогут помочь и вам придётся продумывать самостоятельное нестандартное решение, или обращаться за помощью к старшим коллегам. Но само изучение паттернов существенно упростит вам жизнь.
Для желающих начать изучение паттернов рекомендуем великолепный курс Александра Шевчука.
Изучение алгоритмов — чуть более глубокая сторона программирования. Сам алгоритм — это записанные в определённой последовательности команды, которые должны решить стоящую перед ними задачу. Если вы решили взяться за их изучение, то вам нужно не только знать сами алгоритмы, но и уметь их выводить, иначе от знаний не будет толку.
Если вы решили изучать алгоритмы, то рекомендуем обратиться к школьному курсу информатики и статьям для программистов, где подробно рассказывают об алгоритмах. Если в статье вы встретили упоминания как минимум трёх основных видов алгоритмов (линейный, разветвлённый и циклический) — то вы на верном пути.
Видео курсы по схожей тематике: