Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
Статический анализ появился почти 40 лет назад. В своём докладе мы хотим показать, чему за это время научились статические анализаторы. Мы рассмотрим различные методики анализа, как они появлялись и какие ошибки можно найти с помощью них. Посмотрим на примеры ошибок, найденных PVS-Studio в Open Source проектах. Поговорим о том, чем статический анализатор отличается от "линтеров" и некоторых других инструментов, а также какие проблемы решает современный статический анализатор C++ кода, помимо собственно анализа кода.
Павел Беликов
@PVS-Studio, Тула, Россия
Поговорим о рефлексии в C++, о том, что это такое, для чего нужно и почему это вообще важно. На практическом примере с котами рассмотрим эволюцию подходов к рефлексии в рамках разных версий языка: C++03, C++11/14, C++17. Посмотрим на то, что для нас готовят разработчики нового стандарта, узнаем где и как можно "пощупать" эти новые возможности. Поделимся полезными утилитами и подходами, которые облегчат жизнь пока эти новые возможности не придут к вам на проект.
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
Владимир Лосев, Google
Закончил математико-механический факультет Санкт-Петербургского государственного университета в 1995 году. Работал в компаниях Motоrola, Fair Isaac и Yahoo. С 2008 года работает в Google, в группе, занимающейся вопросами повышения производительности инженеров.
Тема доклада
Юнит-тестирование и Google Mock.
Тезисы
В модульных (юнит) тестах каждый элемент программы тестируется по отдельности, в изоляции от других. Такие тесты исполняются очень быстро, поэтому их можно запускать когда угодно, что позволяет отлавливать дефекты на самых ранних стадиях разработки. Однако для тестирования объекта в изоляции от других необходимо имитировать поведение связанных с ним объектов, что на C++ довольно утомительное занятие. Разработанная в Googlе библиотека для создания и использования mock-объектов — Google Mock — позволяет существенно упростить этот процесс и ускорить написание тестов. В докладе пойдет речь о принципах и возможностях библиотеки, примерах её использования и её внутреннем устройстве.
Современный статический анализ кода: что умеет он, чего не умели линтерыcorehard_by
Статический анализ появился почти 40 лет назад. В своём докладе мы хотим показать, чему за это время научились статические анализаторы. Мы рассмотрим различные методики анализа, как они появлялись и какие ошибки можно найти с помощью них. Посмотрим на примеры ошибок, найденных PVS-Studio в Open Source проектах. Поговорим о том, чем статический анализатор отличается от "линтеров" и некоторых других инструментов, а также какие проблемы решает современный статический анализатор C++ кода, помимо собственно анализа кода.
Павел Беликов
@PVS-Studio, Тула, Россия
Поговорим о рефлексии в C++, о том, что это такое, для чего нужно и почему это вообще важно. На практическом примере с котами рассмотрим эволюцию подходов к рефлексии в рамках разных версий языка: C++03, C++11/14, C++17. Посмотрим на то, что для нас готовят разработчики нового стандарта, узнаем где и как можно "пощупать" эти новые возможности. Поделимся полезными утилитами и подходами, которые облегчат жизнь пока эти новые возможности не придут к вам на проект.
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
Кто-то верно подметил, что разработчики статических анализатора часто сталкиваются с "проблемой айсберга". Им сложно объяснить разработчикам, почему сложно написать и развивать статические анализаторы кода. Дело в том, что сторонние наблюдатели видят только вершину всего процесса, так как им доступен для изучения только простой интерфейс, который предоставляют анализаторы для взаимодействия с миром. Это ведь не графический редактор с сотнями кнопок и рычажков. В результате и возникает ощущение, что раз прост интерфейс взаимодействия, то и прост продукт. На самом деле статические анализаторы кода — это сложные программы, в которых живут и взаимодействуют разнообразнейшие методы поиска дефектов. В них реализуется множество экспертные системы, выдающие заключения о коде на основе как точных, так и эмпирических алгоритмах. В парном докладе, основатели анализатора PVS-Studio расскажут о том, как незаметно потратить 10 лет, чтобы написать хороший анализатор. Дьявол кроется в деталях!
Андрей Карпов, Приватные байки от разработчиков анализатора кодаSergey Platonov
Доклад о редких нестандартных расширениях языка С++, про которые никто не знает, но которые надо поддерживать в анализаторе кода.
О магии Visual C++ с файлом stdafx.h, когда проект компилируется, хотя не должен. О том как зародился viva64 (предшественник PVS-Studio) для поиска 64-битных проблем. Как и почему исчез анализ кода, который одно время существовал в компиляторе Intel C++.
Обобщенное программирование в C++ или как сделать свою жизнь проще через стра...corehard_by
Обобщенное программирование - это подход к программированию, когда алгоритм пишется без указания конкретных типов данных. Используя данный подход можно значительно увеличить количество повторно используемого кода. В C++ данный подход реализуется за счет механизма шаблонов. В данном докладе рассмотрим некоторые возможности по обобщенному программированию, которые предоставляет C++. На конкретных примерах рассмотрим, как они могут упростить нам жизнь и с какими трудностями приходится сталкиваться при их использовании.
Слайды доклада на конференции C++ Corehard Winter 2017 (г.Минск).
Автор доклада давно и успешно использует Модель Акторов при разработке приложений на C++. В основном это был положительный опыт. Но есть некоторые неочевидные моменты, про которые было бы хорошо узнать заранее. О том, где использование Модели Акторов уместно, а где нет, на какие грабли довелось наступить, какие шишки были набиты, как можно упростить себе жизнь и пойдет речь в докладе.
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
Владимир Лосев, Google
Закончил математико-механический факультет Санкт-Петербургского государственного университета в 1995 году. Работал в компаниях Motоrola, Fair Isaac и Yahoo. С 2008 года работает в Google, в группе, занимающейся вопросами повышения производительности инженеров.
Тема доклада
Юнит-тестирование и Google Mock.
Тезисы
В модульных (юнит) тестах каждый элемент программы тестируется по отдельности, в изоляции от других. Такие тесты исполняются очень быстро, поэтому их можно запускать когда угодно, что позволяет отлавливать дефекты на самых ранних стадиях разработки. Однако для тестирования объекта в изоляции от других необходимо имитировать поведение связанных с ним объектов, что на C++ довольно утомительное занятие. Разработанная в Googlе библиотека для создания и использования mock-объектов — Google Mock — позволяет существенно упростить этот процесс и ускорить написание тестов. В докладе пойдет речь о принципах и возможностях библиотеки, примерах её использования и её внутреннем устройстве.
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
Основываясь на опыте разработки Крипты, Дмитрий рассмотрит средства реализации статического и динамического полиморфизма в C++, а также некоторые их паттерны и антипаттерны.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Презентация для курса лекций по программированию на языке C Sharp (СИ решетка). Материал разработан специально для ресурса www.studentam-in.ru на котором Вы можете найти бесплатные учебные материалы и получить качественные образовательные услуги: китайский и английский перевод; репетиторство; заказ курсовых, контрольных; создание презентации, баннера, контента, сайта и многое другое.
Слайды одноименного доклада с конференции "C++ Russia 2018". В докладе речь идет о том, насколько C++ мешает и насколько C++ помогает в разработке акторного фреймворка для C++.
Мы живём во время, когда стала актуальной поддержка целого зоопарка платформ и устройств, а .NET Core и .NET Standard существенно упрощают переносимость C#-кода между ними. Однако каждая из платформ предлагает какие-то собственные средства для разработки, причём большая часть из них мысленно застряла где-то во временах MFC и Windows Forms, и не имеет нормальной интеграции с C#. Есть ряд решений, пытающихся привести эти платформы к общему знаменателю и хоть как-то добавить адекватную поддержку MVVM и XAML-вёрстки, но всё это как-то... не то.
.NET-разработчики привыкли к возможности стилизовать контролы где угодно и как угодно, к нормальным привязкам списков к коллекциям, богатой системе биндингов. Именно этого и пытается достичь проект AvaloniaUI, продолжающий идеи WPF в open source. Путь проекта нелёгок и тернист — помимо системы для работы привязок, необходимо самостоятельно обрабатывать весь пользовательский ввод, думать о том, как эффективно отрисовать интерфейс, бороться с разного рода несуразностями со стороны целевых платформ, разбираться с отличиями систем отрисовки (так, из-за неадекватной поддержки ArcTo пришлось адаптировать код, изначально предназначенный для правильной отрисовки орбит комет).
О том, чего уже удалось достичь, что из этого вы уже сейчас можете использовать, а также о трудностях и интересностях при разработке такого проекта — доклад от одного из его участников.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Лабораторные работы (практикум) по программированию на языке C Sharp (СИ решетка). Материал разработан специально для ресурса www.studentam-in.ru на котором Вы можете найти бесплатные учебные материалы и получить качественные образовательные услуги: китайский и английский перевод; репетиторство; заказ курсовых, контрольных; создание презентации, баннера, контента, сайта и многое другое.
В этот раз победу одержало добро. А вернее, исходные коды проекта Chromium. Chromium - один из лучших проектов, который мы проверяли с помощью PVS-Studio.
В докладе рассказывается об особенностях подхода к dependence injections в C++. Посмотрим какие подходы, в чем их плюсы и минусы. Также затрагивается тема Inversion of Control контейнеров.
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»Yandex
Мониторинг – важная часть работы хорошего сервиса. Мало просто протестировать релиз, надо также убедиться, что код работает у пользователей и работает правильно. В докладе я расскажу про логирование js-ошибок при разных способах загрузки js, подводных камнях, способах их обойти, а также почему это надо делать.
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
Основываясь на опыте разработки Крипты, Дмитрий рассмотрит средства реализации статического и динамического полиморфизма в C++, а также некоторые их паттерны и антипаттерны.
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...Yandex
Флеш-накопители используются в самых разных устройствах, от мобильных телефонов до компьютеров и серверов. Для каждой модели накопителя нужна прошивка с определённым набором параметров, которые могут отличаться в зависимости от ситуации. В докладе будет описан универсальный фреймфорк на С++, который предоставляет разработчикам симуляторов простой, прозрачный и быстрый доступ к любому параметру. Тестировщикам же он позволяет управлять конфигурациями при помощи стандартных инструментов редактирования и слияния.
Презентация для курса лекций по программированию на языке C Sharp (СИ решетка). Материал разработан специально для ресурса www.studentam-in.ru на котором Вы можете найти бесплатные учебные материалы и получить качественные образовательные услуги: китайский и английский перевод; репетиторство; заказ курсовых, контрольных; создание презентации, баннера, контента, сайта и многое другое.
Слайды одноименного доклада с конференции "C++ Russia 2018". В докладе речь идет о том, насколько C++ мешает и насколько C++ помогает в разработке акторного фреймворка для C++.
Мы живём во время, когда стала актуальной поддержка целого зоопарка платформ и устройств, а .NET Core и .NET Standard существенно упрощают переносимость C#-кода между ними. Однако каждая из платформ предлагает какие-то собственные средства для разработки, причём большая часть из них мысленно застряла где-то во временах MFC и Windows Forms, и не имеет нормальной интеграции с C#. Есть ряд решений, пытающихся привести эти платформы к общему знаменателю и хоть как-то добавить адекватную поддержку MVVM и XAML-вёрстки, но всё это как-то... не то.
.NET-разработчики привыкли к возможности стилизовать контролы где угодно и как угодно, к нормальным привязкам списков к коллекциям, богатой системе биндингов. Именно этого и пытается достичь проект AvaloniaUI, продолжающий идеи WPF в open source. Путь проекта нелёгок и тернист — помимо системы для работы привязок, необходимо самостоятельно обрабатывать весь пользовательский ввод, думать о том, как эффективно отрисовать интерфейс, бороться с разного рода несуразностями со стороны целевых платформ, разбираться с отличиями систем отрисовки (так, из-за неадекватной поддержки ArcTo пришлось адаптировать код, изначально предназначенный для правильной отрисовки орбит комет).
О том, чего уже удалось достичь, что из этого вы уже сейчас можете использовать, а также о трудностях и интересностях при разработке такого проекта — доклад от одного из его участников.
В докладе будут сделаны попытки ответить на вопросы, какой тип скрывается под маской auto, почему T&& не всегда rvalue, и почему move ничего не двигает.
Многие разработчики не представляют, как дорого обходятся ошибки в программах. Причем я имею в виду не падения ракет и прочие катастрофы, а обыкновенное прикладное программное обеспечение. Хочется показать всю важность нахождения ошибок на самых ранних этапах. Одним из способов выявить ошибку как можно раньше является статический анализ кода. Поговорим мы не только об этом, но и о различных приемах при написании кода, которые позволят избежать множество типовых ошибок.
Лабораторные работы (практикум) по программированию на языке C Sharp (СИ решетка). Материал разработан специально для ресурса www.studentam-in.ru на котором Вы можете найти бесплатные учебные материалы и получить качественные образовательные услуги: китайский и английский перевод; репетиторство; заказ курсовых, контрольных; создание презентации, баннера, контента, сайта и многое другое.
В этот раз победу одержало добро. А вернее, исходные коды проекта Chromium. Chromium - один из лучших проектов, который мы проверяли с помощью PVS-Studio.
В докладе рассказывается об особенностях подхода к dependence injections в C++. Посмотрим какие подходы, в чем их плюсы и минусы. Также затрагивается тема Inversion of Control контейнеров.
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»Yandex
Мониторинг – важная часть работы хорошего сервиса. Мало просто протестировать релиз, надо также убедиться, что код работает у пользователей и работает правильно. В докладе я расскажу про логирование js-ошибок при разных способах загрузки js, подводных камнях, способах их обойти, а также почему это надо делать.
Теории и практики фунционального программирования - GDG D2D0xffAA
Большинство разработчиков, к сожалению, считают функциональное программирование чем-то страшным и не понятным, но это совершенно не так. В своем докладе я хочу показать мощь и простоту функционального подхода, рассказать о базовых концепциях и о том, как с их помощью можно делать привычные вещи удивительным образом, а так же расскажу о новых приемах.
В любой программе разработчики сталкиваются с необходимостью обработки ошибок. Основной механизм работы с ошибками в .NET Framework — это исключения. Мы поговорим о преимуществах и недостатках их использования. Вы узнаете, используются ли исключения для обработки ошибок в программном обеспечении марсохода NASA, а также о том, какие способы обработки исключений имеются в нашем распоряжении. Также обсудим, можно ли не использовать исключения для обработки ошибочных ситуаций. Приходите, будет интересно.
Moscow .Net Meetup #3
13 октября 2016
В лекции рассказано о доступных средствах по отладке веб-сайтов, их возможностях, а также способах их использования. Также речь пойдет о том, как искать ошибки у пользователей в продакшене и контролировать качество продукта.
Язык C++ и инфраструктура вокруг него продолжает активно развиваться, что делает этот язык одним из самых эффективных инструментов в настоящее время. Хочется выделить три фактора, делающие язык C++ сейчас столь привлекательным. Первое: нововведения в стандарт языка, позволяющие писать эффективный код. Второе: зрелость инструментов разработки и увеличение скорости сборки проектов. Третье: зрелось вспомогательного инструментария, позволяющие контролировать качество кода и другие аспекты жизненного цикла проекта. Этот доклад - ода языку программирования C++!
Статический анализ исходного кода на примере WinMergeTatyanazaxarova
Сегодня я хочу посвятить пост тематике, почему инструменты анализа исходного кода полезны вне зависимости от уровня знаний и опыта программиста. А польза такого анализа будет продемонстрирована на примере инструмента, который известен всем программистам - WinMerge.
Программирование как способ выражения мыслей. Levon Avakyan
Я расскажу на простейших примерах как функционирует современный компьютер, какие языки программирования бывают, для чего они используются, какие парадигмы лежат в их основе. По сути, язык программирования это инструмент, с помощью которого можно рассказать машине, чего же мы от неё хотим, тем самым воплотив свои мысли.
Есть такая штука как инструментирование кода. Мало кто знает о ней, даже пользуясь результатами ее применения. Между тем, с инструментированием можно делать много всего интересного и, главное, полезного. Например, это может вам помочь лучше понять код или сделать процесс разработки более эффективным. Примеры инструментирования кода и принципы его работы.
CSSO – инструмент для минификации CSS, который не так давно вернулся к активной разработке. Помимо исправленных багов и новых фич, он значительно ускорился и стал одним из самых быстрых структурных минификаторов CSS.
Доклад о том как это достигалось, оптимизациях, деоптимизациях, структурах данных и подходах.
Holy.js, Санкт-Петербург, 5 июня 2016
Видео: https://www.youtube.com/watch?v=8o3gKKD_J4A
Филипп Торчинский «Анализ производительности и отладка приложений с помощью D...Yandex
Научно-технический семинар «DTrace: Проверочная работа для вашего кода» в петербургском офисе Яндекса, 29 ноября 2012 г.
Филипп Торчинский, эксперт по облачным технологиям, Семоникс.
анализ кода: от проверки стиля до автоматического тестированияRuslan Shevchenko
Рассказ о истории и использовании в реальной жизни инструментов анализа кода на основе JavaChecker и TermWare
Сопустствующий текст: http://datacenter.gradsoft.ua/files/articles/OSDN2011/
Документация на тему архитектуры языка PHP скудна и разрозненна, несмотря на то что тема интересна многим. В моем докладе я постараюсь заполнить этот пробел и рассказать о модулях PHP: как они работают, зачем и как их пишут. В процессе мы рассмотрим опыт Badoo в этой сфере на примерах двух модулей. И еще напишем очень небольшой собственный модуль.
— Что такое модули PHP, как они работают
— Как начать писать свой модуль PHP
— Скелет модуля — Функции, классы, методы
— Разбор параметров функции
— Сборка модуля
— Подгрузка модуля
— Простой пример модуля из Badoo
— Сложный пример модуля из Badoo
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
На примере некоторых архитектурных решений Крипты Дмитрий расскажет о способах реализации полиморфного поведения в программах на C++, о преимуществах и недостатках этих способов, а также о новых возможностях C++11.
Similar to практические советы по улучшению качества кода (20)
2. О себе
• PHP разработчик более 5 лет
• Работа в компаниях
• Сертификаты
Афанасьев Юрий
oriand@yandex.ru
3. Почему важна читаемость?
• Чтение кода происходит чаще, нежели чем его
написание
• Чем проще читать код, тем легче его
сопровождать и находить в нём баги
• Эстетическое восприятие влияет на многие
показатели удобства работы с кодом и его
поддержку
3
4. Что делает этот код?
function calculate() {
return (hours + overtime * rate) * days * gradeRate
}
4
6. Плохо оформленный код
• Неприятно изучать и читать
• В нём сложно найти баги
• Возникают проблемы сопровождения и поддержки
• Его сложно дописывать, исправлять и что-либо с ним
делать
• Происходит постоянное наращивание кома никому
непонятного кода
• В конечном виде код превращается в спагетти-код
6
10. Магические числа
Это числа, такие как 100 или 32767, которые
появляются в программе без объяснений
Строковые значения (например, ’creditcard’) могут
также являться магическими числами
10
11. Что здесь не так?
class Booking {
function calculate (Cargo cargo, Voyage voyage) {
float maxBooking = voyage.Capacity() * 1,1
if (voyage.bookedCargoSize() + cargo.size() > maxBooking) {
return false
}
return true
}
}
11
13. В чём удобство констант?
• Улучшает понимание значения числа за счёт
именованной константы
• Проще заменить значения таких чисел во всём
коде
• Код становится легко читаемым и понятным
13
14. Исключение
Числа исключения - 0 и 1 (если семантически
означают начало отсчёта)
integer maxRange = 10000
for (n = 0; n < maxRange; ++n) {
// ....
}
14
15. if (codeStatus == 403) {
const integer FORBIDDEN = 403
if (codeStatus == FORBIDDEN) {
15
20. Цель метода
Метод должен выполнять лишь одну четко
определенную цель: запись в БД, выполнение
сложных вычислений и т.д.
См. принципы SOLID (принцип одной
ответственности SPR)
20
22. Именование методов
• Описывайте все действия, происходящие в методе.
Например, sendRequest(), computeRecordDetails()
• Избегайте побочных действий в методах!
• Метод должен выражать действие, поэтому первое
слово всегда глагол. Например, getBankById(Id)
• Избегайте невыразительных имен.
Например, handleOutput(), formatAndPrintOutput()
22
24. Что здесь не так?
if (checkEmpty(message)) {
// … some code
if (maxValue < 100) {
// some code
if (foo->isValid()) {
// … save
} else {
logErrors();
}
}
}
24
25. Проблема вложенности
• Вложенность более 3-4 уровней сложно понять и
удержать в голове
• Глубокая вложенность говорит о том, что код
нужно рефакторить
25
26. Как избавиться?
• Переписать условия проверки if-else и циклов.
Например, чаще использовать блок выхода (return)
• Разбить код на небольшие методы
26
27. Перепишем пример
if ( !checkEmpty(message)) {
return
}
// … some code
if (maxValue > 100) {
return
}
// … some code
if (foo->isValid()) {
// … save
} else {
logErrors();
}
if (checkEmpty(message)) {
// … some code
if (maxValue < 100) {
// some code
if (foo->isValid()) {
// … save
} else {
logErrors();
}
}
}
27
28. В идеале
Пишите код таким, чтобы он читался словно книга
без постоянного перевода взгляда вверх и вниз
страницы
28
30. Комментирование кода
/* Убрано до лучших времён, которые вот-вот наступят
if (something) { return false } else { return true } */
GIT/SVN хранят историю изменений. Такие
комментарии сродни мусору в квартире
30
31. Волшебный TODO
// TODO: упрощённая реализация алгоритма
// Отрефакторить в задаче ETC-1510
• Указывайте все недоработки сразу и заводите на
них задачи
• Каждый такой комментарий указывает на
недоработку (потенциальную уязвимость)
31
32. Пояснения в начале файла
/* @author Testof Tester Testorovich
@changes 01.01.2016 bug fix
@example new A() */
• В совместном проекте нет единого автора, т.к.
каждый вносит свою лепту
• Историю изменений хранит git
• Пример использования может устареть
32
33. Описание намерений
// Проверка на загруженность транспортного средства
if (voyage.bookedCargoSize() + cargo.size() > maxBooking) {
• Такой код чаще всего некачественный
• Комментарии часто устаревают
• Между комментарием и кодом может появиться
другой код (!)
33
34. Как избавиться?
• Куски кода выделяйте в методы или классы
if (voyage.bookedCargoSize() + cargo.size() > this.getMaxBooking(voyage)) {
• Строкам присваивайте пояснительные
переменные или константы
const double OVERBOOKING = 1,1
float maxBooking = voyage.Capacity * OVERBOOKING
34
37. Один и только один раз
Повторяющиеся куски кода указывают на
упущенную возможность для абстракции
Дублирующий код чаще выделяют в отдельный
метод, реже - класс
37
38. Де жа вю?
• Куски кода выделяйте в методы или классы
if (voyage.bookedCargoSize() + cargo.size() > this.getMaxBooking(voyage)) {
38
39. Польза DRY
• Другие разработчики могут воспользоваться
вашим кодом и не выдумывать его самим
• Выделение абстракций повышает скорость
разработки и уменьшает число ошибок
• Дублирующиеся части могут содержать
различные реализации и разные ошибки
39
40. Проблема
function findByName(name) {
// …
sql = ‘SELECT * FROM bar WHERE name = ’ . name
// …
}
function findById (id) {
// …
sql = ‘SELECT * FROM bar WHERE id = ’ . id
// …
}
40
42. Ложка дёгтя
Следование принципу неоправданно, если
• Объединение реализаций плохо связанных
сущностей (отзывы и комментарии)
• Код разных версий api
• В highload проектах (денормализация БД)
• И так далее
46. Несколько правил
Пишите код так, чтобы он никого не удивлял
• Константы, методы должны располагаться на
своём уровне абстракции
• Название метода должно соответствовать тому,
что оно действительно выполняет
• Избавляйтесь от побочных эффектов в коде
46
48. Код должен выражать намерения разработчика!
Магические числа, длинные и сложные выражения
и т.д. - скрывают намерения автора
49. И напоследок
• В первую очередь, используйте стандарты,
принятые в вашей компании
• Книги и статьи дают лишь рекомендации. Как
использовать полученные знания решать вам
• Не переусердствуйте в своём желании улучшить
мир кодом. Придерживайтесь золотой середины
49