SlideShare a Scribd company logo
Идиомы C++
Гомон Сергей, Siarhei.Homan@regula.by
Обо мне
Опыт разработки ПО: 4.5 года
Основной язык: C++
Осановные сферы интересов:
▧ Сетевая разработка
▧ Защита информации
▧ Обработка изображений
2
Siarhei.Homan@regula.by
Содержание
▧ Что такое идиомы в лингвистике
▧ Что такое идиомы в программировании
▧ Почему существуют идиомы в программировании
▧ Что такое идиомы в C++
▧ Примеры идиом в C++
▧ Заключение
3
Идиомы в лингвистике
4
Идиомы в программировании
5
Идиома - это паттерн
Идиома - это использование
.each to do вместо for loop
Почему существуют идиомы
▧ Помогают выразить “невыразимое”
▧ Лаконичнее других подходов
6
Как отличить идиому
▧ Позволяют выразить задуманное элегантно
▧ Имеют смысл только для конкретного языка
▧ Требуют глубокого понимания особенностей
языка
▧ Легко подхватываются другими
7
Что такое идиомы в C++
▧ Не связаны напрямую с проектированием
▧ Относятся к уровню языка
программирования
▧ Имеют большую специфичость для C++
8
Примеры идиом
C++
9
RAII
Цель:
▧ Очистка ресурсов
▧ Basic exception safety
10
void bad() {
m.lock();
f(); // can throw!
if(!everything_ok()) return;
m.unlock();
}
void good() {
std::lock_guard<std::mutex> lk(m);
f();
if(!everything_ok()) return;
}
RAII
11
RAII в других языка
▧ C# - using
▧ Java - try with resources
▧ Python - with
12
Smart Pointer
Цель:
▧ Сымитировать поведение обычного указателя
▧ Добавить дополнительные возможности
13
void Foo() {
Bar* pBar = new Bar();
pBar->init();
LegacyApi(pBar);
NewApi(*pBar);
// Don't forget to delete!
delete pBar;
}
void Foo() {
auto pBar =
std::make_shared<Bar>();
pBar->init();
LegacyApi(pBar.get());
NewApi(*pBar);
}
Smart Pointer
14
Smart Pointer
Так это же идиома RAII!
Именно! Но с дополнительными плюшками.
15
Smart Pointer
Типы умных указателей в STL:
▧ unique_ptr
▧ shared_ptr
▧ weak_ptr
16
Pointer To Implementation (pImpl)
Также известен как:
▧ Opaque pointer
Цель:
▧ Скрыть детали реализации класса
17
// Class.h
class Class {
public:
Class();
~Class();
void method();
private:
class ClassImpl;
// We can use SmartPointer
ClassImpl* m_pImpl;
};
// Class.cpp
Class::Class() {
m_pImpl = new ClassImpl();
}
Class::~Class() {
delete m_pImpl;
}
void Class::method() {
m_pImpl->method();
}
void Class::ClassImpl::method() {
cout << "Implementation method"
<< endl;
}
Pointer To Implementation
18
Curiously Recurring Template Pattern
Цель:
▧ Специализировать шаблонный базовый класс классом-
наследником
class T : public X<T> {…};
19
Статический полиморфизм
template <class Derived> struct base {
void interface(){
static_cast<Derived*>(this)->implementation(); //Not a virtual call
}
static void static_interface() {
Derived::static_implementation();
}
};
struct derived_1 : base<derived_1> {
static void static_implementation(); //Static function overload
};
struct derived_2 : base<derived_2> {
void implementation();
};
20
Универсальный singleton
template <class ActualClass>
class Singleton {
public:
static ActualClass& GetInstance() {
if(p == 0) p = new ActualClass;
return *p;
}
protected:
static ActualClass* p;
private:
Singleton() {}
Singleton(Singleton const &);
Singleton& operator = (Singleton const &);
};
template <class T> T* Singleton<T>::p = 0;
21
Счетчик объектов
template <typename T>
struct counter {
static int objects_created, objects_alive;
counter() {
++objects_created; ++objects_alive;
}
counter(const counter&) {
++objects_created; ++objects_alive;
}
protected:
~counter() { --objects_alive; }
};
template<typename T> int counter<T>::objects_created(0);
template<typename T> int counter<T>::objects_alive(0);
22
CRTP в библиотеках
▧ std::enable_shared_from_this
▧ boost.operators
23
Clear-and-minimize
Цель:
▧ Очистить контейнер и освободить зарезервированную
память
std::vector<char> bigVector(1024);
bigVector.clear();
// capacity 1024
std::vector<char> bigVector(1024);
std::vector<char>().swap(bigVector);
// capacity 0
24
Concrete Data Type
Цель:
▧ Выбрать тип области видимости и времени жизни объекта
25
Запретить создание объекта на стеке
class EventHandler {
public:
virtual ~EventHandler() {}
};
class MouseEventHandler : public EventHandler {
protected:
~MouseEventHandler() {}
public:
MouseEventHandler() {}
};
int main() {
MouseEventHandler m; // We can’t do it
EventHandler *e = new MouseEventHandler (); // We can do it
delete e; // Polymorphic delete call
}
26
Запретить создание объекта на стеке
class MouseEventHandler {
protected:
MouseEventHandler() {}
~MouseEventHandler() {}
public:
static MouseEventHandler *instance () {
return new MouseEventHandler();
}
void destroy() {
delete this;
}
};
27
Запретить создание объекта в куче
class ScopedLock {
private:
static void *operator new(size_t size);
static void *operator new(size_t, void * mem); // placement new
};
int main() {
ScopedLock s; // We can do it
ScopedLock *sl = new ScopedLock(); // We can’t do it
void * buf = ::operator new(sizeof(ScopedLock));
ScopedLock *s2 = new(buf) ScopedLock; // We can’t do it
}
28
Другие идиомы
▧ Copy-on-write
▧ Interface Class
▧ Member Detector
▧ Named Constructor
▧ Scope Guard
▧ Runtime Static Initialization Order Idioms
Книга про идиомы C++:
https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms
29
Итоги
Преимущества:
▧ Лаконичность и простота
▧ Единый словарь
Недостатки:
▧ Код трудно понять программисту на другом языке
▧ Использование старых идиом может усложнять понимание
кода
30
Спасибо за внимание!
Гомон Сергей, Siarhei.Homan@regula.by

More Related Content

What's hot

Евгений Джамалов. Agile в условиях мульти-вендорности и распределённых команд.
Евгений Джамалов. Agile в условиях мульти-вендорности и распределённых команд.Евгений Джамалов. Agile в условиях мульти-вендорности и распределённых команд.
Евгений Джамалов. Agile в условиях мульти-вендорности и распределённых команд.
ScrumTrek
 
Алексей Трошин. Менеджер не нужен: быстрые шаблоны правильных коммуникаций
Алексей Трошин. Менеджер не нужен: быстрые шаблоны правильных коммуникацийАлексей Трошин. Менеджер не нужен: быстрые шаблоны правильных коммуникаций
Алексей Трошин. Менеджер не нужен: быстрые шаблоны правильных коммуникаций
ScrumTrek
 
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
Dakiry
 
Как же научиться программировать, в конце концов?
Как же научиться программировать, в конце концов?Как же научиться программировать, в конце концов?
Как же научиться программировать, в конце концов?
SQALab
 
“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектах“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектах
automated-testing.info
 
MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7
Alexander Levantovsky
 
Рейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчикаРейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчика
geekfamilyrussia
 
Рейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчикаРейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчика
SkillsWiki
 
Junior java standard edition developer
Junior java standard edition developerJunior java standard edition developer
Junior java standard edition developer
Dmitriy Neguritsa
 
Локализационное тестирование носителями языков
Локализационное тестирование носителями языковЛокализационное тестирование носителями языков
Локализационное тестирование носителями языков
SQALab
 
Как мы делаем Banki.ru
Как мы делаем Banki.ruКак мы делаем Banki.ru
Как мы делаем Banki.ru
Roman Ivliev
 
Модель обучения школы отраслевых переводчиков "Альянс ПРО" (для TFR-2014)
Модель обучения школы отраслевых переводчиков "Альянс ПРО" (для TFR-2014)Модель обучения школы отраслевых переводчиков "Альянс ПРО" (для TFR-2014)
Модель обучения школы отраслевых переводчиков "Альянс ПРО" (для TFR-2014)
Eugene Bartov
 
Keyword driven testing
Keyword driven testingKeyword driven testing
Keyword driven testing
automated-testing.info
 
Грабли автоматизации. Учимся на чужих ошибках
Грабли автоматизации. Учимся на чужих ошибкахГрабли автоматизации. Учимся на чужих ошибках
Грабли автоматизации. Учимся на чужих ошибках
SQALab
 
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живыхКурс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
automated-testing.info
 
Презентация для ЮТИ ТПУ "Путь отраслевого переводчика"
Презентация для ЮТИ ТПУ "Путь отраслевого переводчика"Презентация для ЮТИ ТПУ "Путь отраслевого переводчика"
Презентация для ЮТИ ТПУ "Путь отраслевого переводчика"
Eugene Bartov
 
Освоение новых тематик в научно-технических переводах с привлечением специали...
Освоение новых тематик в научно-технических переводах с привлечением специали...Освоение новых тематик в научно-технических переводах с привлечением специали...
Освоение новых тематик в научно-технических переводах с привлечением специали...
Eugene Bartov
 
Быстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием PythonБыстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием Python
automated-testing.info
 
О фреймворках Backend conf 2016
О фреймворках Backend conf 2016О фреймворках Backend conf 2016
О фреймворках Backend conf 2016
Roman Ivliev
 
Завершающая лекция - часть 1 - информатика и зомби
Завершающая лекция - часть 1 - информатика и зомбиЗавершающая лекция - часть 1 - информатика и зомби
Завершающая лекция - часть 1 - информатика и зомби
Alexey Vasyukov
 

What's hot (20)

Евгений Джамалов. Agile в условиях мульти-вендорности и распределённых команд.
Евгений Джамалов. Agile в условиях мульти-вендорности и распределённых команд.Евгений Джамалов. Agile в условиях мульти-вендорности и распределённых команд.
Евгений Джамалов. Agile в условиях мульти-вендорности и распределённых команд.
 
Алексей Трошин. Менеджер не нужен: быстрые шаблоны правильных коммуникаций
Алексей Трошин. Менеджер не нужен: быстрые шаблоны правильных коммуникацийАлексей Трошин. Менеджер не нужен: быстрые шаблоны правильных коммуникаций
Алексей Трошин. Менеджер не нужен: быстрые шаблоны правильных коммуникаций
 
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
DaKiRY_BAQ2016_QADay_Круглий стіл: "Чи помре ручне тестування з часом" Учасни...
 
Как же научиться программировать, в конце концов?
Как же научиться программировать, в конце концов?Как же научиться программировать, в конце концов?
Как же научиться программировать, в конце концов?
 
“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектах“Обезьянье тестирование” в мобильных проектах
“Обезьянье тестирование” в мобильных проектах
 
MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7MagicPlot @ UXSPb @ IT Global Meetup #7
MagicPlot @ UXSPb @ IT Global Meetup #7
 
Рейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчикаРейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчика
 
Рейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчикаРейтинг навыков .NET-разработчика
Рейтинг навыков .NET-разработчика
 
Junior java standard edition developer
Junior java standard edition developerJunior java standard edition developer
Junior java standard edition developer
 
Локализационное тестирование носителями языков
Локализационное тестирование носителями языковЛокализационное тестирование носителями языков
Локализационное тестирование носителями языков
 
Как мы делаем Banki.ru
Как мы делаем Banki.ruКак мы делаем Banki.ru
Как мы делаем Banki.ru
 
Модель обучения школы отраслевых переводчиков "Альянс ПРО" (для TFR-2014)
Модель обучения школы отраслевых переводчиков "Альянс ПРО" (для TFR-2014)Модель обучения школы отраслевых переводчиков "Альянс ПРО" (для TFR-2014)
Модель обучения школы отраслевых переводчиков "Альянс ПРО" (для TFR-2014)
 
Keyword driven testing
Keyword driven testingKeyword driven testing
Keyword driven testing
 
Грабли автоматизации. Учимся на чужих ошибках
Грабли автоматизации. Учимся на чужих ошибкахГрабли автоматизации. Учимся на чужих ошибках
Грабли автоматизации. Учимся на чужих ошибках
 
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живыхКурс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
Курс молодого бойца-автоматизатора – как стать ветераном и остаться в живых
 
Презентация для ЮТИ ТПУ "Путь отраслевого переводчика"
Презентация для ЮТИ ТПУ "Путь отраслевого переводчика"Презентация для ЮТИ ТПУ "Путь отраслевого переводчика"
Презентация для ЮТИ ТПУ "Путь отраслевого переводчика"
 
Освоение новых тематик в научно-технических переводах с привлечением специали...
Освоение новых тематик в научно-технических переводах с привлечением специали...Освоение новых тематик в научно-технических переводах с привлечением специали...
Освоение новых тематик в научно-технических переводах с привлечением специали...
 
Быстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием PythonБыстрое расширение Robot Framework под свои нужды с использованием Python
Быстрое расширение Robot Framework под свои нужды с использованием Python
 
О фреймворках Backend conf 2016
О фреймворках Backend conf 2016О фреймворках Backend conf 2016
О фреймворках Backend conf 2016
 
Завершающая лекция - часть 1 - информатика и зомби
Завершающая лекция - часть 1 - информатика и зомбиЗавершающая лекция - часть 1 - информатика и зомби
Завершающая лекция - часть 1 - информатика и зомби
 

Viewers also liked

доклад электромагнитное излучение
доклад электромагнитное излучениедоклад электромагнитное излучение
доклад электромагнитное излучение
davidovanat
 
Лекция 11 Действие электрического тока на биологические ткани организма
Лекция 11 Действие электрического тока на биологические ткани организмаЛекция 11 Действие электрического тока на биологические ткани организма
Лекция 11 Действие электрического тока на биологические ткани организмаdrtanton
 
Reverse engineering of binary programs for custom virtual machines
Reverse engineering of binary programs for custom virtual machinesReverse engineering of binary programs for custom virtual machines
Reverse engineering of binary programs for custom virtual machines
SmartDec
 
презентация савилова
презентация савиловапрезентация савилова
презентация савилова
davidovanat
 
влияние электромагнитного излучения бытовых приборов и сото
влияние электромагнитного излучения бытовых приборов и сотовлияние электромагнитного излучения бытовых приборов и сото
влияние электромагнитного излучения бытовых приборов и сотоAndrei V, Zhuravlev
 
Бинарный анализ с декомпиляцией и LLVM
Бинарный анализ с декомпиляцией и LLVMБинарный анализ с декомпиляцией и LLVM
Бинарный анализ с декомпиляцией и LLVM
SmartDec
 
электромагнитное излучение и его влияние на человека
электромагнитное излучение и его влияние на человекаэлектромагнитное излучение и его влияние на человека
электромагнитное излучение и его влияние на человека
Andrei V, Zhuravlev
 
презентация
презентацияпрезентация
презентацияAndrey Fomenko
 
Биологическое действие магнитного поля на организм человека
Биологическое действие магнитного поля на организм человека Биологическое действие магнитного поля на организм человека
Биологическое действие магнитного поля на организм человека
amtc7
 
Системноинженерное мышление в непрерывном образовании
Системноинженерное мышление в непрерывном образованииСистемноинженерное мышление в непрерывном образовании
Системноинженерное мышление в непрерывном образовании
Anatoly Levenchuk
 
Негативное воздействие компьютера на здоровье человека и способы защиты
Негативное воздействие компьютера на здоровье человека и способы защитыНегативное воздействие компьютера на здоровье человека и способы защиты
Негативное воздействие компьютера на здоровье человека и способы защиты
Hakimova_AR
 
Big Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureBig Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop Infrastructure
Dmitry Buzdin
 
влияние компьютера на человека
влияние компьютера на человекавлияние компьютера на человека
влияние компьютера на человекаZavirukhina
 
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0
COMAQA.BY
 
В топку Postman - пишем API автотесты в привычном стеке
В топку Postman - пишем API автотесты в привычном стекеВ топку Postman - пишем API автотесты в привычном стеке
В топку Postman - пишем API автотесты в привычном стеке
COMAQA.BY
 
Автоматизация тестирования API для начинающих
Автоматизация тестирования API для начинающихАвтоматизация тестирования API для начинающих
Автоматизация тестирования API для начинающих
COMAQA.BY
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
Technopark
 
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...Career boost: как джуниору случайно стать лидом и не получить от этого удовол...
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...
COMAQA.BY
 
Влияние компьютера на человека
Влияние компьютера на человекаВлияние компьютера на человека
Влияние компьютера на человекаAlex-11
 

Viewers also liked (20)

доклад электромагнитное излучение
доклад электромагнитное излучениедоклад электромагнитное излучение
доклад электромагнитное излучение
 
Лекция 11 Действие электрического тока на биологические ткани организма
Лекция 11 Действие электрического тока на биологические ткани организмаЛекция 11 Действие электрического тока на биологические ткани организма
Лекция 11 Действие электрического тока на биологические ткани организма
 
Reverse engineering of binary programs for custom virtual machines
Reverse engineering of binary programs for custom virtual machinesReverse engineering of binary programs for custom virtual machines
Reverse engineering of binary programs for custom virtual machines
 
презентация савилова
презентация савиловапрезентация савилова
презентация савилова
 
влияние электромагнитного излучения бытовых приборов и сото
влияние электромагнитного излучения бытовых приборов и сотовлияние электромагнитного излучения бытовых приборов и сото
влияние электромагнитного излучения бытовых приборов и сото
 
Бинарный анализ с декомпиляцией и LLVM
Бинарный анализ с декомпиляцией и LLVMБинарный анализ с декомпиляцией и LLVM
Бинарный анализ с декомпиляцией и LLVM
 
электромагнитное излучение и его влияние на человека
электромагнитное излучение и его влияние на человекаэлектромагнитное излучение и его влияние на человека
электромагнитное излучение и его влияние на человека
 
презентация
презентацияпрезентация
презентация
 
Java Memory Model
Java Memory ModelJava Memory Model
Java Memory Model
 
Биологическое действие магнитного поля на организм человека
Биологическое действие магнитного поля на организм человека Биологическое действие магнитного поля на организм человека
Биологическое действие магнитного поля на организм человека
 
Системноинженерное мышление в непрерывном образовании
Системноинженерное мышление в непрерывном образованииСистемноинженерное мышление в непрерывном образовании
Системноинженерное мышление в непрерывном образовании
 
Негативное воздействие компьютера на здоровье человека и способы защиты
Негативное воздействие компьютера на здоровье человека и способы защитыНегативное воздействие компьютера на здоровье человека и способы защиты
Негативное воздействие компьютера на здоровье человека и способы защиты
 
Big Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop InfrastructureBig Data Processing Using Hadoop Infrastructure
Big Data Processing Using Hadoop Infrastructure
 
влияние компьютера на человека
влияние компьютера на человекавлияние компьютера на человека
влияние компьютера на человека
 
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0
А давайте будем многопоточить и масштабировить! - записки сумасшедшего №0
 
В топку Postman - пишем API автотесты в привычном стеке
В топку Postman - пишем API автотесты в привычном стекеВ топку Postman - пишем API автотесты в привычном стеке
В топку Postman - пишем API автотесты в привычном стеке
 
Автоматизация тестирования API для начинающих
Автоматизация тестирования API для начинающихАвтоматизация тестирования API для начинающих
Автоматизация тестирования API для начинающих
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...Career boost: как джуниору случайно стать лидом и не получить от этого удовол...
Career boost: как джуниору случайно стать лидом и не получить от этого удовол...
 
Влияние компьютера на человека
Влияние компьютера на человекаВлияние компьютера на человека
Влияние компьютера на человека
 

Similar to C++ idioms

C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
DevDay
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Yandex
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 
лекция типовые ошибки
лекция типовые ошибкилекция типовые ошибки
лекция типовые ошибки
Yury Zelensky
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
Yauheni Akhotnikau
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
Dmitri Soshnikov
 
Уменьшение влияния человеческого фактора при разработке бизнес приложений
Уменьшение влияния человеческого фактора при разработке бизнес приложенийУменьшение влияния человеческого фактора при разработке бизнес приложений
Уменьшение влияния человеческого фактора при разработке бизнес приложений
ngrebnev
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
Paul Klimov
 
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
ngrebnev
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Yandex
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложенийAndrew Mayorov
 
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский..."IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
Yandex
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеSergey Nemchinsky
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013ScalaNsk
 
C++0x
C++0xC++0x
C++0x
alenacpp
 
WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
 WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь... WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
GeeksLab Odessa
 

Similar to C++ idioms (20)

C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
Шаблонизация sql, или история еще одного велосипеда, в трех частях, Алексей Р...
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 
лекция типовые ошибки
лекция типовые ошибкилекция типовые ошибки
лекция типовые ошибки
 
Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?Акторы на C++: стоило ли оно того?
Акторы на C++: стоило ли оно того?
 
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли UnitySECON'2016. Чубарь Алексей, Мобильные грабли Unity
SECON'2016. Чубарь Алексей, Мобильные грабли Unity
 
Язык программирования C#
Язык программирования C#Язык программирования C#
Язык программирования C#
 
Уменьшение влияния человеческого фактора при разработке бизнес приложений
Уменьшение влияния человеческого фактора при разработке бизнес приложенийУменьшение влияния человеческого фактора при разработке бизнес приложений
Уменьшение влияния человеческого фактора при разработке бизнес приложений
 
Ф'Yii'лософия
Ф'Yii'лософияФ'Yii'лософия
Ф'Yii'лософия
 
C# vs C++
C# vs C++C# vs C++
C# vs C++
 
Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)Cтатический анализ кода (на примере DDD-фреймворка)
Cтатический анализ кода (на примере DDD-фреймворка)
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложений
 
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский..."IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
"IntelliJ IDEA и Android Studio для Android-разработчиков". Филипп Торчинский...
 
Шаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. ВведниеШаблоны разработки ПО. Часть 1. Введние
Шаблоны разработки ПО. Часть 1. Введние
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
 
C++0x
C++0xC++0x
C++0x
 
WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
 WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь... WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
WebCamp:Back-end Developers Day Андрей Чебукин "ASP.NET Identity 2.0‏ исполь...
 

More from COMAQA.BY

Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
COMAQA.BY
 
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
COMAQA.BY
 
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
COMAQA.BY
 
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важностьRoman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
COMAQA.BY
 
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
COMAQA.BY
 
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
COMAQA.BY
 
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
COMAQA.BY
 
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
COMAQA.BY
 
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
COMAQA.BY
 
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
COMAQA.BY
 
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
COMAQA.BY
 
Моя роль в конфликте
Моя роль в конфликтеМоя роль в конфликте
Моя роль в конфликте
COMAQA.BY
 
Организация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиковОрганизация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиков
COMAQA.BY
 
Развитие или смерть
Развитие или смертьРазвитие или смерть
Развитие или смерть
COMAQA.BY
 
Системный взгляд на параллельный запуск Selenium тестов
Системный взгляд на параллельный запуск Selenium тестовСистемный взгляд на параллельный запуск Selenium тестов
Системный взгляд на параллельный запуск Selenium тестов
COMAQA.BY
 
Эффективная работа с рутинными задачами
Эффективная работа с рутинными задачамиЭффективная работа с рутинными задачами
Эффективная работа с рутинными задачами
COMAQA.BY
 
Как стать синьором
Как стать синьоромКак стать синьором
Как стать синьором
COMAQA.BY
 
Open your mind for OpenSource
Open your mind for OpenSourceOpen your mind for OpenSource
Open your mind for OpenSource
COMAQA.BY
 
JDI 2.0. Not only UI testing
JDI 2.0. Not only UI testingJDI 2.0. Not only UI testing
JDI 2.0. Not only UI testing
COMAQA.BY
 
Out of box page object design pattern, java
Out of box page object design pattern, javaOut of box page object design pattern, java
Out of box page object design pattern, java
COMAQA.BY
 

More from COMAQA.BY (20)

Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
Тестирование аналогов инсталлируемых приложений (Android Instant Apps, Progre...
 
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
Anton semenchenko. Comaqa Spring 2018. Nine circles of hell. Antipatterns in ...
 
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
Vivien Ibironke Ibiyemi. Comaqa Spring 2018. Enhance your Testing Skills With...
 
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важностьRoman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
Roman Soroka. Comaqa Spring 2018. Глобальный обзор процесса QA и его важность
 
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
Roman Iovlev. Comaqa Spring 2018. Архитектура Open Source решений для автомат...
 
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
Vladimir Polyakov. Comaqa Spring 2018. Особенности тестирования ПО в предметн...
 
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
Kimmo Hakala. Comaqa Spring 2018. Challenges and good QA practices in softwar...
 
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
Дмитрий Лемешко. Comaqa Spring 2018. Continuous mobile automation in build pi...
 
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
Ivan Katunov. Comaqa Spring 2018. Test Design and Automation for Rest API.
 
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
Vadim Zubovich. Comaqa Spring 2018. Красивое тестирование производительности.
 
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
Alexander Andelkovic. Comaqa Spring 2018. Using Artificial Intelligence to Te...
 
Моя роль в конфликте
Моя роль в конфликтеМоя роль в конфликте
Моя роль в конфликте
 
Организация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиковОрганизация приемочного тестирования силами матерых тестировщиков
Организация приемочного тестирования силами матерых тестировщиков
 
Развитие или смерть
Развитие или смертьРазвитие или смерть
Развитие или смерть
 
Системный взгляд на параллельный запуск Selenium тестов
Системный взгляд на параллельный запуск Selenium тестовСистемный взгляд на параллельный запуск Selenium тестов
Системный взгляд на параллельный запуск Selenium тестов
 
Эффективная работа с рутинными задачами
Эффективная работа с рутинными задачамиЭффективная работа с рутинными задачами
Эффективная работа с рутинными задачами
 
Как стать синьором
Как стать синьоромКак стать синьором
Как стать синьором
 
Open your mind for OpenSource
Open your mind for OpenSourceOpen your mind for OpenSource
Open your mind for OpenSource
 
JDI 2.0. Not only UI testing
JDI 2.0. Not only UI testingJDI 2.0. Not only UI testing
JDI 2.0. Not only UI testing
 
Out of box page object design pattern, java
Out of box page object design pattern, javaOut of box page object design pattern, java
Out of box page object design pattern, java
 

C++ idioms

  • 2. Обо мне Опыт разработки ПО: 4.5 года Основной язык: C++ Осановные сферы интересов: ▧ Сетевая разработка ▧ Защита информации ▧ Обработка изображений 2 Siarhei.Homan@regula.by
  • 3. Содержание ▧ Что такое идиомы в лингвистике ▧ Что такое идиомы в программировании ▧ Почему существуют идиомы в программировании ▧ Что такое идиомы в C++ ▧ Примеры идиом в C++ ▧ Заключение 3
  • 5. Идиомы в программировании 5 Идиома - это паттерн Идиома - это использование .each to do вместо for loop
  • 6. Почему существуют идиомы ▧ Помогают выразить “невыразимое” ▧ Лаконичнее других подходов 6
  • 7. Как отличить идиому ▧ Позволяют выразить задуманное элегантно ▧ Имеют смысл только для конкретного языка ▧ Требуют глубокого понимания особенностей языка ▧ Легко подхватываются другими 7
  • 8. Что такое идиомы в C++ ▧ Не связаны напрямую с проектированием ▧ Относятся к уровню языка программирования ▧ Имеют большую специфичость для C++ 8
  • 11. void bad() { m.lock(); f(); // can throw! if(!everything_ok()) return; m.unlock(); } void good() { std::lock_guard<std::mutex> lk(m); f(); if(!everything_ok()) return; } RAII 11
  • 12. RAII в других языка ▧ C# - using ▧ Java - try with resources ▧ Python - with 12
  • 13. Smart Pointer Цель: ▧ Сымитировать поведение обычного указателя ▧ Добавить дополнительные возможности 13
  • 14. void Foo() { Bar* pBar = new Bar(); pBar->init(); LegacyApi(pBar); NewApi(*pBar); // Don't forget to delete! delete pBar; } void Foo() { auto pBar = std::make_shared<Bar>(); pBar->init(); LegacyApi(pBar.get()); NewApi(*pBar); } Smart Pointer 14
  • 15. Smart Pointer Так это же идиома RAII! Именно! Но с дополнительными плюшками. 15
  • 16. Smart Pointer Типы умных указателей в STL: ▧ unique_ptr ▧ shared_ptr ▧ weak_ptr 16
  • 17. Pointer To Implementation (pImpl) Также известен как: ▧ Opaque pointer Цель: ▧ Скрыть детали реализации класса 17
  • 18. // Class.h class Class { public: Class(); ~Class(); void method(); private: class ClassImpl; // We can use SmartPointer ClassImpl* m_pImpl; }; // Class.cpp Class::Class() { m_pImpl = new ClassImpl(); } Class::~Class() { delete m_pImpl; } void Class::method() { m_pImpl->method(); } void Class::ClassImpl::method() { cout << "Implementation method" << endl; } Pointer To Implementation 18
  • 19. Curiously Recurring Template Pattern Цель: ▧ Специализировать шаблонный базовый класс классом- наследником class T : public X<T> {…}; 19
  • 20. Статический полиморфизм template <class Derived> struct base { void interface(){ static_cast<Derived*>(this)->implementation(); //Not a virtual call } static void static_interface() { Derived::static_implementation(); } }; struct derived_1 : base<derived_1> { static void static_implementation(); //Static function overload }; struct derived_2 : base<derived_2> { void implementation(); }; 20
  • 21. Универсальный singleton template <class ActualClass> class Singleton { public: static ActualClass& GetInstance() { if(p == 0) p = new ActualClass; return *p; } protected: static ActualClass* p; private: Singleton() {} Singleton(Singleton const &); Singleton& operator = (Singleton const &); }; template <class T> T* Singleton<T>::p = 0; 21
  • 22. Счетчик объектов template <typename T> struct counter { static int objects_created, objects_alive; counter() { ++objects_created; ++objects_alive; } counter(const counter&) { ++objects_created; ++objects_alive; } protected: ~counter() { --objects_alive; } }; template<typename T> int counter<T>::objects_created(0); template<typename T> int counter<T>::objects_alive(0); 22
  • 23. CRTP в библиотеках ▧ std::enable_shared_from_this ▧ boost.operators 23
  • 24. Clear-and-minimize Цель: ▧ Очистить контейнер и освободить зарезервированную память std::vector<char> bigVector(1024); bigVector.clear(); // capacity 1024 std::vector<char> bigVector(1024); std::vector<char>().swap(bigVector); // capacity 0 24
  • 25. Concrete Data Type Цель: ▧ Выбрать тип области видимости и времени жизни объекта 25
  • 26. Запретить создание объекта на стеке class EventHandler { public: virtual ~EventHandler() {} }; class MouseEventHandler : public EventHandler { protected: ~MouseEventHandler() {} public: MouseEventHandler() {} }; int main() { MouseEventHandler m; // We can’t do it EventHandler *e = new MouseEventHandler (); // We can do it delete e; // Polymorphic delete call } 26
  • 27. Запретить создание объекта на стеке class MouseEventHandler { protected: MouseEventHandler() {} ~MouseEventHandler() {} public: static MouseEventHandler *instance () { return new MouseEventHandler(); } void destroy() { delete this; } }; 27
  • 28. Запретить создание объекта в куче class ScopedLock { private: static void *operator new(size_t size); static void *operator new(size_t, void * mem); // placement new }; int main() { ScopedLock s; // We can do it ScopedLock *sl = new ScopedLock(); // We can’t do it void * buf = ::operator new(sizeof(ScopedLock)); ScopedLock *s2 = new(buf) ScopedLock; // We can’t do it } 28
  • 29. Другие идиомы ▧ Copy-on-write ▧ Interface Class ▧ Member Detector ▧ Named Constructor ▧ Scope Guard ▧ Runtime Static Initialization Order Idioms Книга про идиомы C++: https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms 29
  • 30. Итоги Преимущества: ▧ Лаконичность и простота ▧ Единый словарь Недостатки: ▧ Код трудно понять программисту на другом языке ▧ Использование старых идиом может усложнять понимание кода 30
  • 31. Спасибо за внимание! Гомон Сергей, Siarhei.Homan@regula.by

Editor's Notes

  1. Здравствуйте! Меня зовут Гомон Сергей. Я являюсь сотрудником компании Regula. У меня примерно 4.5 года опыта разработки на C++. В основном приходилось заниматься сетевой разработкой. В настоящее время пытаюсь заниматься новой для себя областью - обработкой изображений.
  2. Сегодня я бы хотел обсудь с вами тему “Идиомы C++”. В докладе будут рассмотрены следующие вопросы: Что такое идиомы в лингвистике Что такое идиомы в программировании Почему сущесвуют идиомы в программировании Что такое идиомы в C++ Примеры идиом в C++ В конце мы подведем краткий итог.
  3. Итак, начнем с идиом в лингвистике. Идиома (или фразеологические сращения) - это присущий только данному языку и не переводимый на другие языки устойчивый оборот речи, значение которого не вытекает из суммы значений составляющих его элементов. Из-за того, что идиому невозможно перевести дословно (теряется смысл) часто возникают трудности перевода и понимания. С другой стороны такие фразеологизмы придают языку яркую эмоциональную окраску. На картинке можно увидить пример буквального понимания идиомы I’ve got your back. Дословный перевод на русский данной идиомы не имеет большого смысла. Идиома означает, что за тобой кто-то приглядывает, чтобы ты был в порядке. Подразумевается, что человеку сложно следить за тем, что происходит у него за спиной, и чтобы быть в безопасности, за ней нужно приглядывать. Стоит отметить, что некоторые идиомы имеют смысл как в английском, так и врусском языках, например идиома “ветер перемен”. В данном случае приведенное определение не является точным в том смысле, что идиома может быть присуща не только одному языку, но и нескольким языкам.
  4. Теперь рассмотрим вопрос, что же подразумевают, когда говорят об идиомах в контексте языков программирования. Определение из википедии звучит следующим образом: Программная идиома — способ выражения некой не-элементарной конструкции, типичный для одного или нескольких языков программирования. Идиома представляет собой типовой способ выразить задачу, алгоритм или структуру данных, не встроенные в язык на уровне примитивов, либо наоборот, нетривиальный способ использования встроенных элементов языка. Термин часто используется в широком смысле, в том числе в качестве синонима термина шаблон проектирования, и знание идиом в этом случае часто служит показателем свободного владения этим языком. Среди программистов часто наблюдается путаница в понимании того, что является идиомами. Как следует из определения, идиомы иногда путают с паттернами проектирования. От паттернов проектировани идиомы отличаются своей специфичностью для языка. Трудудно их применить на этапе проектирования системы, в отличии от паттернов. Также в интернетах можно найти статьи, в которых утверждается, что в языках программирования идиом не сущесвует. Это также происходит от неправильного понимания смысла идиом. Иногда говорят об идиоматичном использовании конструкций языков программирования. Например, в ruby использование циклов .each to do вместо циклов foor loop, является идиоматичным. Это значит, что для опытного разработчика на ruby увидеть использование цикла foor loop будет непривычным. Он, конечно, поймет написанный код, но так обычно не делают. То же самое с генерацией списков в Python. Иногда можно услышать фразу типа “Pythonc way”, что подразумевает использование чегото идиоматически для питона. Если проводить аналогии с естественным языком, то это как спросить “сколько времени”, чтобы выяснить “который час”. Скорее всего вас поймут, но люди, которые хорошо владеют языком, обычно так не говорят.
  5. Почему же сущесвуют идиомы в языках программирования? Ни один язык не может содержать достаточно средств для выражения всего. Когда появляется необходимость выразить какой-то аспект, для которого язык не имеет прямых средств, на помощь приходят идиомы. С развитием языка в нем могу появляться новые средства, которые могут позволять выражать новые аспекты, в этом случае необходимость в некоторых идиомах может исчезать. Например, благодаря появлению enum class в C++11 отпадает необходимость в использовании идиомы Type Safe Enum. Также зачастую идиомы являются лаконичнее других подходов для выражения задуманного, при отсутвии прямой поддержки от языка программирования.
  6. Нет единого критерия для того, чтобы определить, содержит написанный код идиомы или нет. Тем не менее, можно ориентироваться не некоторые признаки. Например: Часто идиомы позволяют выразить задуманную идею элегантно по сравнению с другими доступными решениями Часто идиомы имееют смысл только для конкретного языка программирования Часто идиомы требуют глубокого понимания особенностей языка программирования (но чтобы их использовать, глубоких знаний языка не нужно. Например, я знаю, что означает “бить баклуши”, но я не знаю, что такое “баклуши” и почему данная идиома означает “ничего не делать”) Часто идиомы легко используются другими программистами, которые о них узнали (их использование не нужно навязывать, как и идиомы в естественном языке, которые сами случайно вырываются при появлении нужных условий) Эти признаки не являются 100% способом отличить идиому от чего-то другого, например от паттернов. Однако, на мой взгялд, в большинстве случаев их хватает. Также стоит понимать, что конкретная идиома необязательно должна удовлетворять всем этим требованиям. Есть идиомы, которые не требуют глубокого понимания языка программирования. Есть идиомы, которые не очень-то и подхватываются другими программистами. А некоторые идиомы имеют смысл для большого количества языков программирования.
  7. Теперь перейдем непосредственно к C++. Под идиомами C++ будем понимать такие приемы программирования на C++, которые: Решают задачу, которая не связана напрямую с проектированием Решают задачу, которая должна быть решена на уровне языка программирования Имеют большую специфичность для C++ и вряд ли будут полезны для других языков (но могут быть и полезны!)
  8. Цели у данной идиомы следующие: Гарантировать очисту ресурсов в конце области видимости Гарантировать basic exception safety (no-leak guarantee) Basic exception safety - гарантия отсутсвия утечер ресурсов. Частичное выполнение или ошибка выполнения операции может привести к побочным эффектам, но все инварианты остаются верны и не происходит утечки ресурсов. Все хранимые данные имеют валидные значения, но могут отличаться от тех, которые были перед выполнением операции.
  9. Рассмотрим небольшоей пример использования RAII. Из-за наличия условий в функции, нам нужно дублировать очистку ресурсов в каждой ветке с return. Также есть опасность, что вызовы функций бросят исключения. Попытки предусмотреть все возможные выходы из функции могут сделать код сложным для понимания и очень запутанным. В свою очередь использование RAII позволяет не беспокоится об очистке ресурсов. ВАЖНО!!! Деструктор не должен бросать исключений, так как нам нужно обеспечить basic exception safety. Если бросить исключение в деструкторе, то появляется большая вероятность, что некоторые ресурсы будут не очищены. В C++ данная идиома испольуезтся крайне широко: ее используют контейнеры (удаляют за собой память), потоки (закрывают за собой файлы), умные указатели (удаляют память, когда на нее никто не ссылается). Большое количество идиом и паттернов реализованы с ипользованием идиомы RAII.
  10. В языках программирования со сборщиком мусора RAII также часто имеет смысл, сборщик мусора не закрывает открытые файлы. Отсутсвие деструкторов у классов делает идиому RAII не родной для данных языков. Часто для этого используется блок try-finally (иногда это единственный способ). Иногда для подобной конструкции в языке добавляют синтаксический сахар типа using в C# и with в Python. В целом деструкторы в C++ позволяют добиться большей гибкости, RAII для C++ - это что-то естественное, не доставляющее дискомфорта и даже наоборот, делающее жизнь лучше, в то время как в языках со сборщиком мусора его использования выглядит чужиродно.
  11. Данная идиома приследует 2 основные цели: Сымитировать поведение обычного указателя Добавить дополнительные фунеции к указателю: проверка выхода за границы массива, автоматическое удаление памяти и т. п. Smart Pointer позволяет создавать объекты в куче, при этом избежать большого количества проблем, связанных с работой с сырыми указателями, в частности, с проблемой удаления памяти. Однако злоупотребление умными указателями может привести к появлению трудноуловимых багов.
  12. Рассмотрим небольшой пример. Экземпляр класса Bar создается в куче через оператор new. Память очищается в конце метода. К сожалени, есть очень много факторов, которые могут привести к тому, что выполнение программы никогда не попадет в конец функции, и память останется неочищенной. Чтобы не беспокоится о вызове оператора delete, можно не использовать оператор new. Это становится возможможным, если соединить идиому SmartPointer вместе с шаблонной магией. В примере память под объект выделяется вызовом функции make_shared. Возвращаемый объект имеет семантику указателя. При этом нам не нужно беспокоится об удалении памяти, вызов деструктора нам гарантирован.
  13. Сейчас вы можете заметить, что Smart Pointer - это идиома RAII. Это действительно так. Но в отличии от RAII идиома Smart Pointer призвана решать немного другие проблемы. Это пример того, как одни идиомы могут реализовываться через использование других.
  14. В STL уже реализован набор умных указателей: unique_ptrs - для единоличного владения объектом shared_ptrs - для совместного владения объектом weak_ptrs - для проверки существования объекта перед его использованием. Этот умный указатель реализует невладеющую семантику, его можно использовать вместо сырых указателей для решения циклических ссылок. В этой ситуации использование владеющих указателей может приводить к утечке ресурсов.
  15. Очень мощная и полезная идиома.
  16. Преимущества: Инкапсуляция всех деталей реализации: легко читать заголовочный файл, легко поддерживать бинарную совместимость при изменении реализации, можно скрыть реализацию от пользователей Ускоряется компиляция (в больших проектах - значительно ускоряется) Недостатки: Дополнительное выделение памяти Косвенный вызов методов класса Проблемы с использованием inline методов Много дополнительного кода Очень ярким и удачным примером использования идиомы является библиотека Qt. В Qt Wiki данную идиому называют d-pointer. Также на нее ссылкаются как на паттерн проектирвоания. Это связано с тем, что паттерн проектирования “Bridge” реализуется через идиому pImpl. В Qt pImpl используется для двух основных целей: Обеспечение бинарной совместимости между версиями библиотек Закрыть реализацию Также pImpl позволяет упростить реализацию implicit-sharing (Copy-on-write)
  17. Идиома немного выносит мозг. Не смотря на это является одной из самых распространенных и полезных.
  18. Идиому CRTP можно использовать для реализации статического полиморфизма. Статический полиморфизм подразумевает, что во время компиляции мы точно знаем у какого объекта будет вызван метод, поэтому нет необходимости тратиться на виртуальный вызов. Также данный подход позволяет делать некоторое подобие перегрузки статических методов.
  19. CRTP позволяет унаследовать реализацию. Написав такой класс, мы можем легко сделать другой класс синглетоном, просто отнаследовавшить. Не стоит забывать, что для C++ паттерн singleton является антипаттерном, что требует особой осторожности при его использовании.
  20. Еще один пример унаследования реализации. Таким образом можно легко добавить счетчик объектов в любой класс, который отнаследуется от counter. Для идиомы SmartPointer похожим образом можно реализовать счетчик ссылок.
  21. В стандартной библиотеке std::enable_shared_from_this. Позволяет классам наследникам создавать std::shared_ptr на самих себя. В boost.operators реализуя один из операторов и унаследовав один из классов представленных в operators мы получаем весь спектр необходимых операторов. Данная идиомя очень широко распространена, поэтому примеры ее реализации и использования можно найти почти где угодно.
  22. Небольшая но полезная идиома. При удалении элементов из вектора, он автоматически не очищает зарезервированную память при вызове метода clean(). Чтобы освободить память, можно воспользоваться данной идиомой.
  23. Данная идиома может пригадиться для создателей библиотек. Она позволяет предотвратить некоторые варианты неправильного использования классов библиотеки.
  24. При помощи данного приема можно запретить создание объектов на стеке. Однако это не мещает нам создавать объект в куче.
  25. Еще один способ запретить создание объектов на стеке.
  26. А данный способ позволяет запретить создание объекта в куче через использование операторов new и placement new. В частости приведен пример использование данной идиомы для класса ScopedLock, создание объектов которого на стеке не имеет смысла.
  27. Copy-on-write - широко используется в Qt. Контейнеры в Qt могут передаваться по значению, при это не будет происходит копирования данных, если нет их модификации. Interface Class - позволяет отделить интерфейс класса от его реализации. Member Detector - позволяет получить метоинформацию о классе во время выполнения. Named Constructor - позволяет создавать объекты класса осмысленным способом. Scope Guard - позволяет очищать ресурс только в случае, если произошло исключение, и оставлять его занятым, если исключения не было. Runtime Static Initialization Order Idioms - позволяет задать порядок инициализации статических переменных.
  28. Преимущества использования идиом: Лаконичность и простота кода по сравнению с доступными альтернативами Единый словарь среди разработчиков Недостатки: Код трудно понять программисту на другом языке Использование старых идиом при наличии средств в языке программирования может неоправданно усложнять понимание кода