idioms c++
TRANSCRIPT
Идиомы C++
Гомон Сергей, [email protected]
Обо мнеОпыт разработки ПО: 4.5 годаОсновной язык: C++
Осановные сферы интересов:▧ Сетевая разработка▧ Защита информации▧ Обработка
изображений
2
Содержание▧ Что такое идиомы в лингвистике▧ Что такое идиомы в программировании▧ Почему существуют идиомы в программировании▧ Что такое идиомы в 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.hclass Class {public: Class(); ~Class(); void method();
private: class ClassImpl;
// We can use SmartPointer ClassImpl* m_pImpl;};
// Class.cppClass::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
Универсальный singletontemplate <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
Спасибо за внимание!
Гомон Сергей, [email protected]