Семинар 1 1. Вводная часть 2. Самые общие ошибки разработчиков
Цель и задачи Цель – подготовка потенциала кафедры Задачи: 1. Обсуждение наиболее популярных подходов к программированию, проектированию и управлению проектами. 2. Разбор наиболее острых проблем программирования. 3. Передача практического опыта.
Предполагаемые группы тем Ошибки программирования Модульное и интеграционное тестирование Рефакторинг Проектирование, UML, паттерны TDD, XP Многопоточность и мультипроцессинг на практике Структуры данных, алгоритмы, библиотеки
Обсуждение формата семинаров Мое видение Ваши предложения 1. 2. 3. 4. 5. 6. Слайды. Написание и разбор кода. Пояснения, обсуждения, вопросы. Рекомендация литературы, порядка её освоения. Оформление “напоминающих” материалов. По желанию участи в прохождении и разработки тестов.
Вопросы За лучший вопрос приз…. . Автограф… За лучшее зрение – два автографа
Наиболее распространенные ошибки программирования Общий смысл Причины: ◦ Вы косячите. ◦ Я косячу. ◦ Мы косячим. ◦ ◦ Не знание. Лень. Недостаточная заинтересованность. Одиночество Цель – повышение понятности, надежности кода, возможности его повторного использования, гибкости, производительности. Антицель – слепое использование инструментов и техник ради них самих.
ДУБЛИРОВАНИЕ КОДА Разбухание кода Сложность модификации кода Решение: Выделение функций. Выделение классов. Использование наследования. Использование делегирования.
ДЛИННЫЕ ФУНКЦИИ Разбиваем функцию на несколько простых функций. Цели – понятность кода и повторное исследование. Антицель – фанатичная минимизация функций и создание их огромного количества
ОДНА ФУНКЦИЯ (КЛАСС) – МНОГО ЗАДАЧ Do. Everything() class God. Object БЕЗ ФАНАТИЗМА В ДРОБЛЕНИИ НА ЗАДАЧИ!
ИМЕНОВАНИЕ master_channel_counter или master. Channel. Counter НО НЕ mchc !!!
КОММЕНТАРИИ Должны быть только там, где они помогают. Отвечают на вопрос зачем, а не что делается! Если комментариев много внутри кода – код плохой. Нужны для интерфейсных функций, должны пояснять возможные параметры, пред и пост условия.
МАГИЧЕСКИЕ ЧИСЛА Используем именованные константы, дефайны, перечисления
ПРЕЖДЕВРЕМЕННАЯ ОПТИМИЗАЦИЯ Проще сделать корректную программу быстрой, чем быструю корректной. Оптимизации должны предшествовать исследования. А исследованиям должна предшествовать выработка целей оптимизации. Необходимость оптимизации надо доказать! Оптимизируйте алгоритмы.
ПРЕЖДЕВРЕМЕННАЯ ПЕССИМИЗАЦИЯ При прочих равных условиях не стоит отказываться от общеизвестных более эффективных решений. ОТКАЗ ОТ ОПТИМИЗАЦИИ БЕЗ ФАНАТИЗМА ! Примеры: ◦ Использование i++ вместо ++i; ◦ Передача параметра по значению, там где можно передать по ссылке; ◦ Использование присваивания в конструкторах вместо списка инициализации. ◦ Использование собственных циклов вместо библиотечных алгоритмов или генераторов списков (в Python).
Глобальные и совместно используемые данные Избегаем Я бы даже сказал, чураемся…. (по возможности конечно) То что можно сделать локальным в методе, инкапсулированным и/или статическим в классе, таким и должно быть. Портят понимание кода. Сложные зависимости. Портят возможность распараллеливания.
Не использование систем контроля версий и систем управления проектом Коллективная работа, четкая работа с задачами. Одиночество не причина отказа от благ цивилизации.
Рекомендуемая литература С. Мейерс. Эффективное использование С++. С. Мейерс. Более эффективное использование С++. А. Александреску. , Г. Саттер. Стандарты программирования на С++.