idioms c++

31
Идиомы C++ Гомон Сергей, [email protected]

Upload: corehardby

Post on 06-Jan-2017

305 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: idioms C++

Идиомы C++

Гомон Сергей, [email protected]

Page 2: idioms C++

Обо мнеОпыт разработки ПО: 4.5 годаОсновной язык: C++

Осановные сферы интересов:▧ Сетевая разработка▧ Защита информации▧ Обработка

изображений

2

[email protected]

Page 3: idioms C++

Содержание▧ Что такое идиомы в лингвистике▧ Что такое идиомы в программировании▧ Почему существуют идиомы в программировании▧ Что такое идиомы в C++▧ Примеры идиом в C++▧ Заключение

3

Page 4: idioms C++

Идиомы в лингвистике

4

Page 5: idioms C++

Идиомы в программировании

5

Идиома - это паттерн

Идиома - это использование .each to do вместо for loop

Page 6: idioms C++

Почему существуют идиомы▧Помогают выразить “невыразимое”▧Лаконичнее других подходов

6

Page 7: idioms C++

Как отличить идиому▧Позволяют выразить задуманное

элегантно▧Имеют смысл только для конкретного

языка▧Требуют глубокого понимания

особенностей языка▧Легко подхватываются другими

7

Page 8: idioms C++

Что такое идиомы в C++

▧ Не связаны напрямую с проектированием

▧ Относятся к уровню языка программирования

▧ Имеют большую специфичость для C++

8

Page 9: idioms C++

Примеры идиом C++

9

Page 10: idioms C++

RAIIЦель:▧ Очистка ресурсов▧ Basic exception safety

10

Page 11: idioms C++

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

Page 12: idioms C++

RAII в других языка▧C# - using▧Java - try with resources▧Python - with

12

Page 13: idioms C++

Smart PointerЦель:▧ Сымитировать поведение обычного

указателя▧ Добавить дополнительные возможности

13

Page 14: idioms C++

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

Page 15: idioms C++

Smart PointerТак это же идиома RAII!

Именно! Но с дополнительными плюшками.

15

Page 16: idioms C++

Smart PointerТипы умных указателей в STL:

▧unique_ptr▧shared_ptr▧weak_ptr

16

Page 17: idioms C++

Pointer To Implementation (pImpl)Также известен как:▧ Opaque pointer

Цель:▧ Скрыть детали реализации

класса

17

Page 18: idioms C++

// 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

Page 19: idioms C++

Curiously Recurring Template Pattern

Цель:▧ Специализировать шаблонный базовый класс

классом-наследником

class T : public X<T> {…};

19

Page 20: idioms C++

Статический полиморфизм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

Page 21: idioms C++

Универсальный 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

Page 22: idioms C++

Счетчик объектов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

Page 23: idioms C++

CRTP в библиотеках▧ std::enable_shared_from_this▧ boost.operators

23

Page 24: idioms C++

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

Page 25: idioms C++

Concrete Data TypeЦель:▧ Выбрать тип области видимости и времени жизни

объекта

25

Page 26: idioms C++

Запретить создание объекта на стеке

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

Page 27: idioms C++

Запретить создание объекта на стеке

class MouseEventHandler {protected: MouseEventHandler() {} ~MouseEventHandler() {}

public: static MouseEventHandler *instance () { return new MouseEventHandler(); } void destroy() { delete this; }};

27

Page 28: idioms C++

Запретить создание объекта в куче

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

Page 29: idioms C++

Другие идиомы▧ 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

Page 30: idioms C++

ИтогиПреимущества:▧ Лаконичность и простота▧ Единый словарь

Недостатки:▧ Код трудно понять программисту на другом языке ▧ Использование старых идиом может усложнять

понимание кода

30

Page 31: idioms C++

Спасибо за внимание!

Гомон Сергей, [email protected]