...

воскресенье, 15 марта 2015 г.

Лекции Технопарка. 1 семестр. С/С++

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

Лекция 1. Язык С. Основы организации и использования оперативной и сверхоперативной памяти




Лекция начинается с введения в язык С: рассказывается об истории его появления, особенностях, преимуществах и недостатках, о сферах применения. Описываются основы препроцессорной обработки, рассматриваются вопросы управления памятью (модели управления памятью, области видимости объектов хранения) и производительность программ на языке С. Обсуждается связывание объектов хранения и их инициализация. Затем рассказывается о классах памяти в языке С. Следующая часть лекции посвящена проблематике указателей, а также работе с одномерными массивами. В заключение рассматривается стандарт POSIX и вопросы переносимости.





Лекция 2. Дополнительные вопросы организации и использования оперативной и сверхоперативной памяти




Лекция начинается с рассмотрения многомерных массивов. На примере двумерного массива показывается эффективный обход. Разбирается пример задачи об умножении матриц, обсуждаются векторы векторов. Далее рассматривается ряд вопросов, посвящённых указателям:


  • указатели и двумерные массивы;

  • совместимость указателей;

  • указатели на константы и константные указатели;

  • указатели и квалификатор restrict.




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


Лекция 3. Специальные вопросы инкапсуляции




Инкапсуляция — один из трёх базовых принципов объектно-ориентированного проектирования. В первую очередь описывается, что представляет собой инкапсуляция. Даётся определение класса, разбирается его состав, перечисляются существующие виды классов. Подробно рассматриваются объекты класса, в том числе константные, атрибуты и методы класса, битовые поля и вложенные классы. Далее описываются разные виды методов класса (статические и нестатические, встроенные, константные, неустойчивые), а также указатели на них. Затем рассматриваются так называемые дружественные классы и функции. Ближе к концу лекции рассказывается про классы-объединения, анонимные и безымянные объединения, битовые поля в определении классов. Финальная часть лекции посвящена конструкторам и деструкторам.


Лекция 4. Специальные вопросы наследования и полиморфизма. Множественное и виртуальное наследование. Динамическая идентификация типов (RTTI)




В начале лекции обсуждаются инициализация без конструктора, конструкторы по умолчанию, конструкторы с параметрами, закрытые и защищённые конструкторы. Далее рассказывается о механизмах почленной инициализации и присваивания, о конструкторах копирования, операциях преобразования, а также о деструкторах, в том числе виртуальных. Обсуждается идиома RAII (Resource acquisition is initialization), явный вызов деструкторов и список инициализации в конструкторе. Рассказывается о переносе в языке С++11, в том числе о семантике и конструкторе переноса. Далее обсуждаются такие базовые принципы ООП, как наследование (раннее и позднее связывание, базовые и производные классы) и полиморфизм (защищённые и закрытые члены класса, перегрузка и перекрытие членов класса). Затем говорится о вызове конструкторов и деструкторов производных классов, списке инициализации при наследовании, виртуальных функциях и абстрактных классах. Рассказывается о виртуальном и множественном наследовании. В завершение лекции обсуждаются такие вопросы, как динамическая идентификация типов времени выполнения (RTTI) и операции приведения типов, производительность и безопасность полиморфизма и средств поддержки RTTI.


Лекция 5. Шаблоны классов и методов. Обработка исключительных ситуаций. Обобщённое и безопасное программирование




В начале лекции даётся определение шаблонов классов и рассматриваются их параметры. Объясняется механизм конкретизации шаблонов классов. Рассказывается о методах шаблонов, о дружественных объектах в шаблонах, о статических членах, о специализации шаблонов, в том числе о полной и частичной. В качестве примера метапрограммирования рассматривается рекурсивное определение шаблонов. Объясняется суть новой идиомы, SFINAE (Substitution failure is not an error), в том числе применительно к интроспекции времени компиляции. Солидная часть лекции посвящена всевозможным характеристикам типов. Рассказывается о технологии обработки исключительных ситуаций. Следующий блок информации посвящён безопасному программированию: безопасности классов, методов, конструкторов и деструкторов, критериям безопасности и нейтральности кода. В конце лекции обсуждаются различные исключения в стандартной библиотеке.


Лекция 6. Практическое введение в STL. Функциональное программирование в С++




Сначала рассказывается об истории создания стандартной библиотеки шаблонов (STL): о предпосылках, о предназначении STL и гарантиях производительности. Далее подробно рассказывается обо всех компонентах, входящих в состав STL:


  • последовательных контейнерах (векторах, деках, списках);

  • упорядоченных ассоциативных контейнерах (множествах и мультимножествах, отображениях и мультиотображениях);

  • последовательных алгоритмах;

  • алгоритмах упорядочения;

  • алгоритмах на числах;

  • копирующих, предикатных алгоритмах;

  • алгоритмах, работающих на месте;

  • алгоритмах сортировки.




Рассматриваются отношения сравнения в алгоритмах, обратные отношения, операции над множествами и хипами. Затем говорится об итераторах STL, об их видах (в том числе об итераторах вставки и потоковых итераторах), о поддерживаемых итераторами диапазонах и операциях. Ближе к концу лекции обсуждаются стандартные функциональные объекты STL и их базовые классы. Даётся информация об адаптерах (контейнерных, функциональных). В конце затрагивается вопрос применения контейнеров в STL.


Лекция 7. Практическое введение в Boost




Лекция начинается с рассказа о лямбда-функциях, основных правилах их оформления, ключевых преимуществах и применении замыканий. Затем обсуждается Boost (набор из нескольких десятков автономных библиотек), его состав и назначение. Основная часть лекции посвящена рассмотрению примеров использования Boost: проверке времени компиляции, характеристикам типов, вариантным контейнерам, «умным» указателям. В заключение рассказывается об использовании средств Boost для повышения производительности и безопасности кода.


Лекция 8. Принципы и шаблоны объектно-ориентированного проектирования. Базовые шаблоны, шаблоны GoF




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


  • наследование и композиция;

  • делегирование;

  • неизменяемые объекты;

  • интерфейс.




После этого разбираются три группы шаблонов GoF. Порождающие шаблоны:


  • абстрактная фабрика;

  • строитель;

  • фабричный метод;

  • прототип;

  • класс с единственным экземпляром.




Структурные шаблоны:


  • адаптер;

  • декоратор;

  • мост;

  • компоновщик;

  • фасад;

  • приспособленец;

  • заместитель.




Поведенческие шаблоны:


  • интерпретатор;

  • команда;

  • цепочка ответственности;

  • итератор;

  • хранитель;

  • состояние;

  • наблюдатель;

  • стратегия;

  • посредник;

  • посетитель;

  • шаблонный метод.




И в заключение рассказывается о принципах S.O.L.I.D.


Лекция 9. Идиоматика языка С++. Основы рефакторинга и качество исходного кода. Стандарты кодирования и методология разработки ПО




Завершающая лекция в рамках данного курса. Сначала даётся определение термина «идиома языка программирования». Рассказывается об идиомах процедурного программирования, об объектно-ориентированных идиомах. Обсуждаются методы управления памятью, относящиеся к идиомам повышенного уровня сложности:


  • контекстно-зависимая перегрузка индексирования;

  • «автоматическая» сборка мусора и подсчёт ссылок;

  • управление памятью заменой операций new и delete;

  • идиома «конверт/письмо» и делегированный полиморфизм.




Следующая часть лекции посвящена рефакторингу и статическому анализу исходного кода: даются определения, рассказывается о возможном применении, рассматриваются преимущества, недостатки и сопутствующие риски. Далее разбираются типовые анти-шаблоны, «грязные техники», логико-семантические ошибки. Обсуждаются вопросы оптимизации программ с точки зрения производительности, размера объектного кода и объёма памяти данных. Затем рассматривается понятие «качественного ПО», описываются функциональные и структурные показатели качества кода. Рассказывается о моделях и факторах качества ПО, в том числе о модели МакКола. Далее говорится о сложности кода как об атрибуте качества ПО, о способах управления сложностью и о влиянии на неё модульности. Затем рассматриваются понятие «технического долга», стандарты и стили кода, методологии промышленной разработки (правила организации и способы записи, комментирование и документирование, жизненный цикл разработки ПО, его модели). И в завершение курса даётся обзор SWEBoK (Software engineering body of knowledge).


This entry passed through the Full-Text RSS service - if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий