SlideShare a Scribd company logo
1 of 96
Download to read offline
Константность как
инструмент повышения
качества кода
Кудрин Игорь
Обо мне
Data Analysis designed by Brennan Novak from the thenounproject.com
Mesh Network designed by Lance Weisser from the thenounproject.com
Overlap designed by Nadir Balcikli from the thenounproject.com
Fibonacci Circles designed by Jae Aquino from the thenounproject.com
Проблема
• Язык C++ предоставляет слишком
много возможностей
template <typename T> T f(T&& t);
#define M(...) { __VA_ARGS__ }
class virtual
publicdecltype
const
auto a = [](){}; throw
• Язык C++ предоставляет слишком
много возможностей
• Нет времени научиться использовать
их правильно
• Язык C++ предоставляет слишком
много возможностей
• Нет времени научиться использовать
их правильно
• Следствие: сложный и ненадёжный
код
Что делать?
• Не использовать лишнего
• Не использовать лишнего
• Множественное наследование
• Не использовать лишнего
• Множественное наследование
• Макросы
• Не использовать лишнего
• Множественное наследование
• Макросы
• Шаблоны
• Не использовать лишнего
• Множественное наследование
• Макросы
• Шаблоны
• Исключения
• Не использовать лишнего
• Множественное наследование
• Макросы
• Шаблоны
• Исключения
• Наследование реализации
• Не использовать лишнего
• Упрощать интерфейс
• Не использовать лишнего
• Упрощать интерфейс
• Минимум публичных методов
• Не использовать лишнего
• Упрощать интерфейс
• Минимум публичных методов
• Избегать парных операций
• Не использовать лишнего
• Упрощать интерфейс
• Минимум публичных методов
• Избегать парных операций
• Стабильное состояние
• Не использовать лишнего
• Упрощать интерфейс
• Использовать const
Неизменяемая
переменная
std::vector<int> v = gen_v();
int s;
for (int i : v)
{
s += i;
}
...
f(s);
h(s);
std::vector<int> v = gen_v();
int s;
for (int i : v)
{
s += i;
}
...
f(s);
h(s);
> gcc –Wall –std=c++11 x.cpp
No warnings
std::vector<int> v = gen_v();
int s;
for (int i : v)
{
s += i;
}
...
f(s);
h(s);
> gcc –Wall –std=c++11 x.cpp
No warnings
> gcc –Wall –O –std=c++11 x.cpp
warning: ‘s’ may be used uninitialized
std::vector<int> v = gen_v();
int s;
for (int i : v)
{
s += i;
}
...
f(s);
h(s);
std::vector<int> v = gen_v();
int s = 0;
for (int i : v)
{
s += i;
}
...
f(s);
h(s);
std::vector<int> v = gen_v();
int s = 0;
for (int i : v)
{
s += i;
}
...
f(s);
h(s);
А вдруг?
void f(int&);
std::vector<int> v = gen_v();
int s = std::accumulate(begin(v), end(v), 0);
...
f(s);
h(s);
const std::vector<int> v = gen_v();
const int s = std::accumulate(begin(v), end(v), 0);
...
f(s);
h(s);
const std::vector<int> v = gen_v();
const int s = std::accumulate(begin(v), end(v), 0);
...
f(s);
h(s);
• Код становится проще
const std::vector<int> v = gen_v();
const int s = std::accumulate(begin(v), end(v), 0);
...
f(s);
h(s);
• Код становится проще
• Защищает от части ошибок
const std::vector<int> v = gen_v();
const int s = std::accumulate(begin(v), end(v), 0);
...
f(s);
h(s);
• Код становится проще
• Защищает от части ошибок
• Способствует рефакторингу
Неизменяемый
класс
class Point
{
public:
Point(int x, int y) : x_(x), y_(y) {}
int X() const { return x_; }
int Y() const { return y_; }
void Move(int ox, int oy)
{ x_ += ox; y_ += oy; }
private:
int x_, y_;
};
PointThread1 Thread2
Move()
X()
Y()
class Point
{
public:
Point(int x, int y) : x_(x), y_(y) {}
int X() const { Lock lock(mtx_); return x_; }
int Y() const { Lock lock(mtx_); return y_; }
void Move(int ox, int oy)
{ Lock lock(mtx_); x_ += ox; y_ += oy; }
private:
int x_, y_;
mutable std::mutex mtx_;
typedef std::lock_guard<std::mutex> Lock;
};
PointThread1 Thread2
Move()
X()
Y()
// External synchronization is required!
class Point
{
public:
Point(int x, int y) : x_(x), y_(y) {}
int X() const { return x_; }
int Y() const { return y_; }
void Move(int ox, int oy)
{ x_ += ox; y_ += oy; }
private:
int x_, y_;
};
PointThread1 Thread2Mutex
Lock()
X()
Y()
Lock()
Move()
Unlock()
Unlock()
class Point
{
public:
Point(int x, int y) : x_(x), y_(y) {}
int X() const { return x_; }
int Y() const { return y_; }
Point Move(int ox, int oy) const
{ return Point(x_ + ox, y_ + oy); }
private:
int x_, y_;
};
class Point
{
public:
Point(int x, int y) : x_(x), y_(y) {}
int X() const { return x_; }
int Y() const { return y_; }
Point Move(int ox, int oy) const
{ return Point(x_ + ox, y_ + oy); }
private:
int x_, y_;
};
Point p(10, 20);
p = Point(20, 10);
class Point
{
public:
Point(int x, int y) : x_(x), y_(y) {}
int X() const { return x_; }
int Y() const { return y_; }
Point Move(int ox, int oy) const
{ return Point(x_ + ox, y_ + oy); }
private:
const int x_, y_;
};
class Point
{
public:
Point(int x, int y) : x_(x), y_(y) {}
Point& operator=(const Point&) = delete;
int X() const { return x_; }
int Y() const { return y_; }
Point Move(int ox, int oy) const
{ return Point(x_ + ox, y_ + oy); }
private:
const int x_, y_;
};
Point2
Thread1 Thread2Point1
X()
Y()
Move()
Point2
Thread1 Thread2Point1
X()
Y()
Move()
X()
Y()
Point2
Thread1 Thread2Point1
X()
Y()
Move()
X()
Y()
X()
Y()
• Стабильное состояние
• Стабильное состояние
• Невозможно сломать
• Стабильное состояние
• Невозможно сломать
например, неправильной внешней синхронизацией
• Стабильное состояние
• Невозможно сломать
• Экономит время на синхронизации
• Стабильное состояние
• Невозможно сломать
• Экономит время на синхронизации
• Удобно для многопоточной среды
Персистентные
структуры
K
D
QL
N
F
GB
K
D
QL
N
F
GB
P
K
D
QL
N
F
GB
P
?
K
D
QL
N
F
GB
P
K
D
QL
N
F
GB
P
K’
N’
Q’
D’
L’B’ G’
F’
K
D
QL
N
F
GB
P
K’
N’
Q’
K
D
QL
N
F
GB
P
K’
N’
Q’
std::shared_ptr<T>
Небольшой
пример
Magnifying Glass designed by Karl Schaeffler from the thenounproject.com
Поиск
Magnifying Glass designed by Karl Schaeffler from the thenounproject.com
Book designed by Olivier Guin from the thenounproject.com
Поиск
Справочник
Magnifying Glass designed by Karl Schaeffler from the thenounproject.com
Book designed by Olivier Guin from the thenounproject.com
Map designed by Nicholas Menghini from the thenounproject.com
Поиск
Справочник
Карта
Magnifying Glass designed by Karl Schaeffler from the thenounproject.com
Book designed by Olivier Guin from the thenounproject.com
Map designed by Nicholas Menghini from the thenounproject.com
Folder Tree designed by Juan Pablo Bravo from the thenounproject.com
Поиск
Справочник
Карта
VFS
Magnifying Glass designed by Karl Schaeffler from the thenounproject.com
Book designed by Olivier Guin from the thenounproject.com
Map designed by Nicholas Menghini from the thenounproject.com
Folder Tree designed by Juan Pablo Bravo from the thenounproject.com
Поиск
Справочник
Карта
VFS
Magnifying Glass designed by Karl Schaeffler from the thenounproject.com
Book designed by Olivier Guin from the thenounproject.com
Map designed by Nicholas Menghini from the thenounproject.com
Folder Tree designed by Juan Pablo Bravo from the thenounproject.com
Поиск
Справочник
Карта
Обновления
VFS
Magnifying Glass designed by Karl Schaeffler from the thenounproject.com
Book designed by Olivier Guin from the thenounproject.com
Map designed by Nicholas Menghini from the thenounproject.com
Folder Tree designed by Juan Pablo Bravo from the thenounproject.com
Поиск
Справочник
Карта
Обновления
VFS
Виртуальная
файловая
система
IDir
File(string): IFilePtr
Dir(string): IDirPtr
VfsNode
Create(path, dir): VfsNodePtr
AddDir(path, dir): VfsNodePtr
RemoveDir(path): VfsNodePtr
0..*
Path
Head(): string
Tail(): Path
Vfs
Root(): IDirPtr
AddDir(path, dir)
RemoveDir(path)
1
typedef std::shared_ptr<const IFile> IFilePtr;
typedef std::shared_ptr<const IDir> IDirPtr;
IDir
File(string): IFilePtr
Dir(string): IDirPtr
VfsNode
Create(path, dir): VfsNodePtr
AddDir(path, dir): VfsNodePtr
RemoveDir(path): VfsNodePtr
0..*
Path
Head(): string
Tail(): Path
Vfs
1 Root(): IDirPtr
AddDir(path, dir)
RemoveDir(path)
typedef std::shared_ptr<const IFile> IFilePtr;
typedef std::shared_ptr<const IDir> IDirPtr;
IDir
File(string): IFilePtr
Dir(string): IDirPtr
VfsNode
Create(path, dir): VfsNodePtr
AddDir(path, dir): VfsNodePtr
RemoveDir(path): VfsNodePtr
0..*
Path
Head(): string
Tail(): Path
Vfs
1 Root(): IDirPtr
AddDir(path, dir)
RemoveDir(path)
IDir
File(string): IFilePtr
Dir(string): IDirPtr
VfsNode
Create(path, dir): VfsNodePtr
AddDir(path, dir): VfsNodePtr
RemoveDir(path): VfsNodePtr
0..*
Path
Head(): string
Tail(): Path
Vfs
1 Root(): IDirPtr
AddDir(path, dir)
RemoveDir(path)
typedef std::shared_ptr<const VfsNode> VfsNodePtr;
IDir
File(string): IFilePtr
Dir(string): IDirPtr
VfsNode
Create(path, dir): VfsNodePtr
AddDir(path, dir): VfsNodePtr
RemoveDir(path): VfsNodePtr
0..*
Path
Head(): string
Tail(): Path
Vfs
1 Root(): IDirPtr
AddDir(path, dir)
RemoveDir(path)
typedef std::shared_ptr<const VfsNode> VfsNodePtr;
IDir
File(string): IFilePtr
Dir(string): IDirPtr
VfsNode
Create(path, dir): VfsNodePtr
AddDir(path, dir): VfsNodePtr
RemoveDir(path): VfsNodePtr
0..*
Path
Head(): string
Tail(): Path
Vfs
1 Root(): IDirPtr
AddDir(path, dir)
RemoveDir(path)
typedef std::shared_ptr<const VfsNode> VfsNodePtr;
class Vfs
{
public:
IDirPtr Root() const;
void AddDir(const Path& path, IDirPtr dir);
void RemoveDir(const Path& path);
};
class Vfs
{
public:
IDirPtr Root() const;
void AddDir(const Path& path, IDirPtr dir);
void RemoveDir(const Path& path);
private:
std::mutex update_mtx_;
std::atomic<VfsNodePtr> root_;
};
void Vfs::AddDir(const Path& path, IDirPtr dir)
{
std::lock_guard<std::mutex> lock(update_mtx_);
const VfsNodePtr root = root_;
root_ = root
? root->AddDir(path, std::move(dir))
: VfsNode::Create(path, std::move(dir));
}
std::mutex update_mtx_;
std::atomic<VfsNodePtr> root_;
void Vfs::RemoveDir(const Path& path)
{
std::lock_guard<std::mutex> lock(update_mtx_);
if (const VfsNodePtr root = root_)
{
root_ = root->RemoveDir(path);
}
}
std::mutex update_mtx_;
std::atomic<VfsNodePtr> root_;
IDirPtr Vfs::Root() const
{
return root_.load();
}
std::mutex update_mtx_;
std::atomic<VfsNodePtr> root_;
Выводы
• Используем const
• Используем const
• Делаем «неубиваемые» классы
• Используем const
• Делаем «неубиваемые» классы
• Используем персистентные структуры
Кудрин Игорь
i.kudrin@2gis.ru
Mail designed by Andy Fuchs from the thenounproject.com
igor.kudrin@gmail.com
struct IFile;
typedef std::shared_ptr<const IFile> IFilePtr;
struct IDir;
typedef std::shared_ptr<const IDir> IDirPtr;
struct IDir
{
virtual IFilePtr File(const std::string& name) const = 0;
virtual IDirPtr Dir(const std::string& name) const = 0;
};
Бонус: IDir
class Path {
public:
const std::string& Head() const;
Path Tail() const;
};
Бонус: Path
class VfsNode : public IDir,
public std::enable_shared_from_this<VfsNode>
{
typedef std::unordered_map<std::string, VfsNodePtr>
ChildrenMap;
const IDirPtr dir_;
const ChildrenMap children_;
public:
explicit VfsNode(IDirPtr dir)
: dir_(std::move(dir)), children_() {}
explicit VfsNode(ChildrenMap children)
: dir_(), children_(std::move(children)) {}
};
Бонус: VfsNode
VfsNodePtr VfsNode::Create(const Path& path, IDirPtr dir)
{
if (path.Head().empty()) {
return std::make_shared<VfsNode>(std::move(dir));
}
else {
ChildrenMap children = {
{ path.Head(), Create(path.Tail(), std::move(dir)) }
};
return std::make_shared<VfsNode>(std::move(children));
}
}
Бонус: VfsNode
VfsNodePtr VfsNode::AddDir(const Path& path, IDirPtr dir) const
{
if (path.Head().empty())
{
return std::make_shared<VfsNode>(std::move(dir));
}
ChildrenMap children = children_;
VfsNodePtr& node = children[path.Head()];
node = (nullptr != node)
? node->AddDir(path.Tail(), std::move(dir))
: VfsNode::Create(path.Tail(), std::move(dir));
return std::make_shared<VfsNode>(std::move(children));
}
Бонус: VfsNode
VfsNodePtr VfsNode::RemoveDir(const Path& path) const {
if (path.Head().empty()) return VfsNodePtr();
ChildrenMap children = children_;
const auto it = children.find(path.Head());
if (it == children.end()) return shared_from_this();
VfsNodePtr new_child_node = it->second->RemoveDir(path.Tail());
if (new_child_node == it->second) return shared_from_this();
if (new_child_node) it->second.swap(new_child_node);
else {
children.erase(it);
if (children.empty()) return VfsNodePtr();
}
return std::make_shared<VfsNode>(std::move(children));
}
Бонус: VfsNode

More Related Content

What's hot

Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очередиMikhail Kurnosov
 
презентация
презентацияпрезентация
презентацияLIANA180
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Python Meetup
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPython Meetup
 
Производительный специализированный поиск: архитектура, область применимости ...
Производительный специализированный поиск: архитектура, область применимости ...Производительный специализированный поиск: архитектура, область применимости ...
Производительный специализированный поиск: архитектура, область применимости ...Ontico
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовТранслируем.бел
 
Ошибка. Осознание, примирение, извлечение пользы. Вадим Макишвили
Ошибка. Осознание, примирение, извлечение пользы. Вадим МакишвилиОшибка. Осознание, примирение, извлечение пользы. Вадим Макишвили
Ошибка. Осознание, примирение, извлечение пользы. Вадим МакишвилиТранслируем.бел
 
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...AvitoTech
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonPython Meetup
 

What's hot (12)

Progr labrab-4-2013-c++
Progr labrab-4-2013-c++Progr labrab-4-2013-c++
Progr labrab-4-2013-c++
 
Лекция 4. Стеки и очереди
Лекция 4. Стеки и очередиЛекция 4. Стеки и очереди
Лекция 4. Стеки и очереди
 
презентация
презентацияпрезентация
презентация
 
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
Быстрые конструкции в Python - Олег Шидловский, Python Meetup 26.09.2014
 
Pyton – пробуем функциональный стиль
Pyton – пробуем функциональный стильPyton – пробуем функциональный стиль
Pyton – пробуем функциональный стиль
 
Производительный специализированный поиск: архитектура, область применимости ...
Производительный специализированный поиск: архитектура, область применимости ...Производительный специализированный поиск: архитектура, область применимости ...
Производительный специализированный поиск: архитектура, область применимости ...
 
Использование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетовИспользование GNU OCTAVE для инженерных и математических расчетов
Использование GNU OCTAVE для инженерных и математических расчетов
 
Ошибка. Осознание, примирение, извлечение пользы. Вадим Макишвили
Ошибка. Осознание, примирение, извлечение пользы. Вадим МакишвилиОшибка. Осознание, примирение, извлечение пользы. Вадим Макишвили
Ошибка. Осознание, примирение, извлечение пользы. Вадим Макишвили
 
Ошибки
ОшибкиОшибки
Ошибки
 
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
Применение компьютерного зрения для анализа спортивных соревнований (Николай ...
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Красота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки PythonКрасота и изящность стандартной библиотеки Python
Красота и изящность стандартной библиотеки Python
 

Viewers also liked

Лабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовЛабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовDevDay
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homeworkchlo464
 
Resume--Preston Fields
Resume--Preston FieldsResume--Preston Fields
Resume--Preston Fieldswed081885
 
Идеальное хранилище геоданных для вашего приложения
Идеальное хранилище геоданных для вашего приложенияИдеальное хранилище геоданных для вашего приложения
Идеальное хранилище геоданных для вашего приложенияDevDay
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homeworkchlo464
 
Health econ Chapter 1
Health econ Chapter 1Health econ Chapter 1
Health econ Chapter 1rahman_mar
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homeworkchlo464
 
«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел СташевскийDevDay
 
Frontend
FrontendFrontend
FrontendDevDay
 
Isko product launch workshop
Isko product launch workshopIsko product launch workshop
Isko product launch workshopÖzge Duman
 
Digitization of sales and marketing seminar in stockholm 17 october 2014
Digitization of sales and marketing seminar in stockholm 17 october 2014Digitization of sales and marketing seminar in stockholm 17 october 2014
Digitization of sales and marketing seminar in stockholm 17 october 2014Kimmo Kanerva
 
Converse Case Study
Converse Case StudyConverse Case Study
Converse Case StudyÖzge Duman
 
Nintendo Case Study
Nintendo Case StudyNintendo Case Study
Nintendo Case StudyÖzge Duman
 

Viewers also liked (16)

Лабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим ИпполитовЛабиринт на Arduino, Вадим Ипполитов
Лабиринт на Arduino, Вадим Ипполитов
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homework
 
Resume--Preston Fields
Resume--Preston FieldsResume--Preston Fields
Resume--Preston Fields
 
Идеальное хранилище геоданных для вашего приложения
Идеальное хранилище геоданных для вашего приложенияИдеальное хранилище геоданных для вашего приложения
Идеальное хранилище геоданных для вашего приложения
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homework
 
S4 tarea4 logam
S4 tarea4 logamS4 tarea4 logam
S4 tarea4 logam
 
Health econ Chapter 1
Health econ Chapter 1Health econ Chapter 1
Health econ Chapter 1
 
Ancient egypt homework
Ancient egypt homeworkAncient egypt homework
Ancient egypt homework
 
Before the gym
Before the gymBefore the gym
Before the gym
 
«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский«Тестируем веб приложения», Павел Сташевский
«Тестируем веб приложения», Павел Сташевский
 
Frontend
FrontendFrontend
Frontend
 
Isko product launch workshop
Isko product launch workshopIsko product launch workshop
Isko product launch workshop
 
2 lina-y-diego-nic1
2 lina-y-diego-nic12 lina-y-diego-nic1
2 lina-y-diego-nic1
 
Digitization of sales and marketing seminar in stockholm 17 october 2014
Digitization of sales and marketing seminar in stockholm 17 october 2014Digitization of sales and marketing seminar in stockholm 17 october 2014
Digitization of sales and marketing seminar in stockholm 17 october 2014
 
Converse Case Study
Converse Case StudyConverse Case Study
Converse Case Study
 
Nintendo Case Study
Nintendo Case StudyNintendo Case Study
Nintendo Case Study
 

Similar to «Используем неизменяемые данные и создаем качественный код», Игорь Кудрин

Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Platonov Sergey
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Yandex
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksRoman Dvornov
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийAndrey Akinshin
 
Проблемы 64-битного кода на примерах
Проблемы 64-битного кода на примерахПроблемы 64-битного кода на примерах
Проблемы 64-битного кода на примерахTatyanazaxarova
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановYandex
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭOleg Parinov
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаPositive Hack Days
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кодаAndrey Karpov
 
Python
PythonPython
Pythonpelid
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Yandex
 
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...JSFestUA
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадZheka Kozlov
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorDevGAMM Conference
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кодаAndrey Karpov
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода Pavel Tsukanov
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x IntroductionFedor Vompe
 

Similar to «Используем неизменяемые данные и создаем качественный код», Игорь Кудрин (20)

Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
Игорь Кудрин, «Используем неизменяемые данные и создаем качественный код»
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11Дмитрий Прокопцев — R-ссылки в С++11
Дмитрий Прокопцев — R-ссылки в С++11
 
Парсим CSS
Парсим CSSПарсим CSS
Парсим CSS
 
Парсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricksПарсим CSS: performance tips & tricks
Парсим CSS: performance tips & tricks
 
Продолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложенийПродолжаем говорить о микрооптимизациях .NET-приложений
Продолжаем говорить о микрооптимизациях .NET-приложений
 
Проблемы 64-битного кода на примерах
Проблемы 64-битного кода на примерахПроблемы 64-битного кода на примерах
Проблемы 64-битного кода на примерах
 
Статический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий ЛевановСтатический и динамический полиморфизм в C++, Дмитрий Леванов
Статический и динамический полиморфизм в C++, Дмитрий Леванов
 
2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ2-е занятие курса iPhone разработки в ГУ-ВШЭ
2-е занятие курса iPhone разработки в ГУ-ВШЭ
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя:опыт статического анализа исходного кода200 open source проектов спустя:опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода200 open source проектов спустя: опыт статического анализа исходного кода
200 open source проектов спустя: опыт статического анализа исходного кода
 
Python
PythonPython
Python
 
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
 
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
JS Fest 2019/Autumn. Дмитрий Жарков. Blockchainize your SPA or Integrate Java...
 
msumobi2. Лекция 1
msumobi2. Лекция 1msumobi2. Лекция 1
msumobi2. Лекция 1
 
Интерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монадИнтерпретирование языков с помощью Free-монад
Интерпретирование языков с помощью Free-монад
 
Convert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at VizorConvert this: peculiarities of cross-platform mobile game development at Vizor
Convert this: peculiarities of cross-platform mobile game development at Vizor
 
статический анализ кода
статический анализ кодастатический анализ кода
статический анализ кода
 
Статический анализ кода
Статический анализ кода Статический анализ кода
Статический анализ кода
 
Cpp0x Introduction
Cpp0x IntroductionCpp0x Introduction
Cpp0x Introduction
 

More from DevDay

«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений ТютюевDevDay
 
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий МузюкинDevDay
 
«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья ПастушковDevDay
 
Фреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковФреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковDevDay
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковDevDay
 
Devops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevDay
 
Inversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковInversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковDevDay
 
«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных«Велогосипед», Данил Ильиных
«Велогосипед», Данил ИльиныхDevDay
 
«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим БерёзкинDevDay
 
«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета АлексеенкоDevDay
 
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоМанипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоDevDay
 
«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя ПономарёвDevDay
 
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев «Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев DevDay
 
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...DevDay
 
«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья ТаратухинDevDay
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис РечкуновDevDay
 
Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»DevDay
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»DevDay
 
Распределенные приложения и Azure Service Bus
Распределенные приложения и Azure Service BusРаспределенные приложения и Azure Service Bus
Распределенные приложения и Azure Service BusDevDay
 
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»DevDay
 

More from DevDay (20)

«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев«Bdd и реактивщина в 2ГИС», Евгений Тютюев
«Bdd и реактивщина в 2ГИС», Евгений Тютюев
 
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
«Интеграция push-уведомлений в Яндекс.Браузер под iOS», Юрий Музюкин
 
«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков«Я спросил у сервера...», Илья Пастушков
«Я спросил у сервера...», Илья Пастушков
 
Фреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр БирюковФреймворк Slot, Good Parts, Александр Бирюков
Фреймворк Slot, Good Parts, Александр Бирюков
 
Рендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей СолодовниковРендеринг может больше: vue.js vs React, Андрей Солодовников
Рендеринг может больше: vue.js vs React, Андрей Солодовников
 
Devops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим ПашукDevops-практики в разработке решений для бизнеса, Максим Пашук
Devops-практики в разработке решений для бизнеса, Максим Пашук
 
Inversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий КожевниковInversion of Control в деталях, Дмитрий Кожевников
Inversion of Control в деталях, Дмитрий Кожевников
 
«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных«Велогосипед», Данил Ильиных
«Велогосипед», Данил Ильиных
 
«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин«Процесс создания продукта», Максим Берёзкин
«Процесс создания продукта», Максим Берёзкин
 
«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко«Вывод продукта на новых территориях», Елизавета Алексеенко
«Вывод продукта на новых территориях», Елизавета Алексеенко
 
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша РоманенкоМанипулятор на Ti Stellaris Launchpad, Лёша Романенко
Манипулятор на Ti Stellaris Launchpad, Лёша Романенко
 
«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв«Хоба-хоба и в продакшн», Женя Пономарёв
«Хоба-хоба и в продакшн», Женя Пономарёв
 
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев «Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
«Бегущий по лезвию. Продуктовые сценарии в дизайне», Макс Карпылев
 
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
«Роль исследований в формировании продуктового видения компании», Лиза Алексе...
 
«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин«Открытая веб картография», Илья Таратухин
«Открытая веб картография», Илья Таратухин
 
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
«Изоморфные js приложения с использованием catberry.js», Денис Речкунов
 
Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»Матвей Мальков «Ещё один поиск контактов на Android»
Матвей Мальков «Ещё один поиск контактов на Android»
 
Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»Олег Годовых «Страх и ненависть в Event Bus»
Олег Годовых «Страх и ненависть в Event Bus»
 
Распределенные приложения и Azure Service Bus
Распределенные приложения и Azure Service BusРаспределенные приложения и Azure Service Bus
Распределенные приложения и Azure Service Bus
 
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»
Илья Беда «Как Erlang сделает ваши приложения реалтаймовыми»
 

«Используем неизменяемые данные и создаем качественный код», Игорь Кудрин