Качество кода как важный аспект работы программиста | SHIFU.IO
Переводы
Как начать писать качественный код
Перевод 04.12.2017

Автор: Edmond Atto


Для начала разберёмся, зачем.


Если вы хотите написать код не только для себя и в стол, то качество кода – это важный аспект вашей работы, которому нужно уделять много внимания. Качество кода определяют следующие атрибуты: ремонтопригодность (maintainability), повторное использование (reusability), читаемость (readability), эффективность (efficiency), погрешность (error proneness) и модульность (modularity).


Рассмотрим подробнее некоторые из них:




Модульность.


Определяет, насколько независимы разные куски вашего кода друг от друга, т. е. может ли неудачное изменение одной части вашего кода испортить всё остальное? Уверен, вы бы хотели ответить на этот вопрос отрицательно. Это похоже на концепцию связи, используемую в ООП (объектно-ориентированном программировании). Код, который является модульным, может иметь свои составные блоки функциональности, заменённые или вытесненные, не приводя к "обрушению" кода на вашу голову. Возможно не сразу, а только со временем вы начнёте ценить способность иметь модульный код, например, когда вам придётся полностью переработать определенную функцию или функциональность вашего кода как таковую, но лучше бы вам освоить это поскорее.





Повторное использование.











 




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


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


 


 




Читабельность. ​​​​​​​


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






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




Я хочу написать качественный код ... что мне нужно сделать?


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


 




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


(Ниже приведены примеры для Python)


 




 


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


 


}} задал две строки в качестве аргументов нашей функции?


 


}} задал целое число и строку в нашу функцию?


 


Затем мы можем писать тесты для этих маловероятных, но апокалиптических сценариев, например:



 


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


Очевидно, подход TDD создает код, который может выдержать различную степень "злоупотребления" со стороны пользователей и с меньшей вероятностью сломаться. Теперь ясно, что наш код из подхода 1 не будет эффективно обрабатывать эти неожиданные сценарии, потому что у нас не было возможности рассмотреть их существование в первую очередь.


 


Во многих отношениях TDD берет на себя закон Мерфи:


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


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


 


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


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


Использовать инструменты автоматического анализа кода


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


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


Мне нравится думать об инструментах проверки кода как о часовых: они наблюдают за вами, когда вы пишете свой код и все так часто, они позволят вам узнать, как вы можете улучшить свой код. Есть множество инструментов для проверки кода, и вы можете увидеть список здесь. Я лично экспериментирую с Codacy и Code Climate.


 


Начало работы с инструментами проверки кода


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


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



Анализ результатов


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


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


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


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


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


 


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



Используйте инструменты непрерывной интеграции (CI)


 


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


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



Давайте закрепим это


 


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


 


Дисклеймер: Я не эксперт (еще по крайней мере), просто парень, документирующий свое учебное путешествие.


Перевод 04.12.2017