OO Design with C++: 0. Intro

556 views
513 views

Published on

Published in: Technology, Business
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
556
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

OO Design with C++: 0. Intro

  1. 1. Курс лекций по C++ : введение Дмитрий Штилерман, Рексофт
  2. 2. <ul><li>Чему можно научить тех, кто сам завтра станет неактуальным старпером? </li></ul><ul><li>Модест Колеров «О сокращении пребывания в настоящем» </li></ul>
  3. 3. Тенденция: сравнительные затраты на HW/SW 100 80 60 40 20 0 1955 1970 1985 Hardware Software И сследование US Air Force, цит. по “Software Economics”, Barry Boehm, Software Pioneers Conference, June 29, 2001
  4. 4. Минимизация стоимости разработки: стратегии <ul><li>Минимизация размера продукта ( economy of scale) </li></ul><ul><ul><li>Языки и технологии </li></ul></ul><ul><ul><li>Методы проектирования и в изуальное моделирование </li></ul></ul><ul><ul><li>Повторное использование (reuse) и компоненты </li></ul></ul><ul><ul><li>Архитектурные решения </li></ul></ul><ul><li>Оптимизация процессов </li></ul><ul><li>Увеличение эффективности команды </li></ul><ul><li>Автоматизация (development environments) </li></ul><ul><li>Walker Royce, “Software Project Management: A Unified Framework” </li></ul>
  5. 5. Минимизация стоимости разработки: требования к ЯП <ul><li>Полнота/мощность (решение любых задач) </li></ul><ul><li>Легкость обучения (learning curve) </li></ul><ul><li>Поддержка современных методов проектирования (на уровне концепций) </li></ul><ul><li>Поддержка повторного использования </li></ul><ul><ul><li>Разделяемый исходный код ( copy-paste ) </li></ul></ul><ul><ul><li>Библиотеки </li></ul></ul><ul><ul><li>Компоненты </li></ul></ul><ul><li>Легкость автоматизации и создания сред разработки </li></ul>
  6. 6. Основные классы ПО <ul><li>Клиентское ПО: пользовательский интерфейс, бизнес-логика </li></ul><ul><li>Серверное ПО: бизнес-логика, хранение данных </li></ul><ul><li>Системное ПО: управление на низком уровне </li></ul><ul><li>Встроенное (embedded) ПО : сродни системному, но в условиях ограничений по ресурсам и производительности </li></ul>
  7. 7. Основные классы ПО: п риоритетные требования <ul><li>Клиентское ПО </li></ul><ul><ul><li>Скорость разработки </li></ul></ul><ul><ul><li>Гибкость </li></ul></ul><ul><ul><li>Производительность </li></ul></ul><ul><li>Серверное ПО </li></ul><ul><ul><li>Скорость разработки </li></ul></ul><ul><ul><li>Надежность </li></ul></ul><ul><ul><li>Гибкость </li></ul></ul><ul><li>Системное ПО </li></ul><ul><ul><li>Надежность </li></ul></ul><ul><ul><li>Производительность </li></ul></ul><ul><ul><li>Гибкость </li></ul></ul><ul><li>Встроенное ПО </li></ul><ul><ul><li>Производительность </li></ul></ul><ul><ul><li>Надежность </li></ul></ul><ul><ul><li>Гибкость </li></ul></ul>
  8. 8. Основные классы ПО: требования к языкам и технологиям <ul><li>Скорость разработки </li></ul><ul><ul><li>Простота </li></ul></ul><ul><ul><li>Reuse </li></ul></ul><ul><ul><li>Автоматизация </li></ul></ul><ul><li>Гибкость </li></ul><ul><ul><li>Функциональная полнота </li></ul></ul><ul><ul><li>Концептуальная полнота </li></ul></ul><ul><li>Производительность </li></ul><ul><ul><li>Компиляция </li></ul></ul><ul><ul><li>Оптимизация </li></ul></ul><ul><ul><li>Низкоуровневые средства </li></ul></ul><ul><li>Надежность </li></ul><ul><ul><li>Зрелость </li></ul></ul><ul><ul><li>Стандартизация </li></ul></ul>
  9. 9. Сильные и слабые стороны C++ <ul><li>Сильные стороны </li></ul><ul><li>Гибкость </li></ul><ul><ul><li>Функционально богат </li></ul></ul><ul><ul><li>Хорошо поддерживает любые стили дизайна </li></ul></ul><ul><li>Производительность </li></ul><ul><ul><li>Компилируемый язык </li></ul></ul><ul><ul><li>Низкоуровневая семантика </li></ul></ul><ul><ul><li>Минимальные накладные расходы </li></ul></ul><ul><li>Слабые стороны </li></ul><ul><li>Скорость разработки </li></ul><ul><ul><li>Сложен для изучения (высокий входной порог) </li></ul></ul><ul><ul><li>Reuse затруднен, т.к. невозможно основать к омпонентную модель прямо на средствах языка </li></ul></ul><ul><ul><li>Автоматизация затруднена (сверх уровня code browsers) </li></ul></ul>
  10. 10. Предпосылки слабых сторон C++ <ul><li>Низкоуровневая семантика </li></ul><ul><li>Отсутствие поддержки метаинформации (RTTI не в счет) </li></ul><ul><li>Чрезмерное разнообразие способов решения той или иной проблемы </li></ul>
  11. 11. Слабые стороны C++ : низкоуровневая семантика (1) Корень зла - доступ к физической памяти и свобода смешивания указателей и целых ! (int)pObject a.k.a. reinterpret_cast<int>(pObject)
  12. 12. Слабые стороны C++ : низкоуровневая семантика (2) <ul><li>SomeObject* p = new SomeObject; </li></ul><ul><li>// Создали объект в куче </li></ul><ul><li>long n1 = long(p) & 0x0000FFFFUL; </li></ul><ul><li>long n2 = long(p) & 0xFFFF0000UL; </li></ul><ul><li>p = 0; </li></ul><ul><li>// Теперь ни один указатель не </li></ul><ul><li>// ссылается на выделенную память! </li></ul><ul><li>// Сборщик мусора мог бы удалить объект. </li></ul><ul><li>p = (SomeObject*) (n1 | n2); </li></ul><ul><li>// Опаньки! </li></ul>Пример проблемы: невозможность создания полноценного сборщика мусора
  13. 13. Слабые стороны C++ : отсутствие метаинформации <ul><li>Метаинформация - информация о свойствах конструкций языка, доступная в самом языке. </li></ul><ul><li>Пример: по указателю на объект получить все методы класса данного объекта </li></ul><ul><li>Что нельзя/трудно реализовать без метаинформации? </li></ul><ul><ul><li>Инструментальные средства </li></ul></ul><ul><ul><li>Компонентные архитектуры </li></ul></ul><ul><ul><li>Сериализация объектов и объектные БД </li></ul></ul><ul><ul><li>Передача объектов по значению </li></ul></ul><ul><ul><li>Средства обеспечения безопасности </li></ul></ul>
  14. 14. Ответ Java на слабые стороны C++ <ul><li>Невозможность опасных низкоуровневых манипуляций - ссылку на объект ни во что непристойное не преобразуешь и с физической памя т ью напрямую не поработаешь. </li></ul><ul><li>Java Reflection API - богатейшая поддержка метаинформации, являющаяся частью стандартной библиотеки. </li></ul>
  15. 15. Reuse и уровни совместимости реализаций <ul><li>Разделяемый исходный код </li></ul><ul><ul><li>Уровень совместимости: исходный код </li></ul></ul><ul><ul><li>Объект стандартизации: синтаксис/семантика </li></ul></ul><ul><li>Разделяемый объектный код: библиотеки </li></ul><ul><ul><li>Уровень совместимости: объектный код </li></ul></ul><ul><ul><li>Объект стандартизации: Application Binary Interface (ABI) </li></ul></ul><ul><li>Компоненты </li></ul><ul><ul><li>Уровень совместимости: компонентная архитектура </li></ul></ul><ul><ul><li>Объект стандартизации: протоколы управления компонентами </li></ul></ul>
  16. 16. Примеры уровней совместимости: ANSI C <ul><li>Исходный код </li></ul><ul><ul><li>Официальный стандарт языка и библиотеки </li></ul></ul><ul><li>ABI </li></ul><ul><ul><li>Стандартизован в пределах практически каждой основной платформы (формат объектного файла, работа линкера etc.) </li></ul></ul><ul><li>Компонентные архитектуры </li></ul><ul><ul><li>COM: можно и на C... </li></ul></ul><ul><ul><li>CORBA: стандартное отображение (IDL to C mapping) </li></ul></ul>
  17. 17. Примеры уровней совместимости: ANSI/ISO C++ <ul><li>Исходный код </li></ul><ul><ul><li>Официальный стандарт языка и библиотеки (наконец-то...) </li></ul></ul><ul><li>ABI </li></ul><ul><ul><li>Отсутствие стандартного ABI </li></ul></ul><ul><ul><li>Работа в пределах C ABI с помощью name mangling </li></ul></ul><ul><li>Компонентные архитектуры </li></ul><ul><ul><li>COM: почти родной </li></ul></ul><ul><ul><li>CORBA: стандартное отображение (IDL to C++ mapping) </li></ul></ul>
  18. 18. Примеры уровней совместимости: Java <ul><li>Исходный код </li></ul><ul><ul><li>Общепринятый стабильный стандарт языка (элементы официальности в виде JCP) </li></ul></ul><ul><ul><li>Эволюционирующий стандарт библиотеки (версии JDK 1.0  1.1  1.1.8  1.2.2  …) </li></ul></ul><ul><li>ABI </li></ul><ul><ul><li>Общепринятый стабильный стандарт ABI (JVM, class file) </li></ul></ul><ul><li>Компонентные архитектуры </li></ul><ul><ul><li>Специфичные для языка: JavaBeans, J2EE </li></ul></ul><ul><ul><li>CORBA: стандартное отображение (IDL to Java mapping) , CORBA и J2EE - близнецы-братья </li></ul></ul>
  19. 19. Компонентные модели: два уровня <ul><li>1. « Доступ » </li></ul><ul><li>Уровень объекта </li></ul><ul><li>Как получить указатель на объект и вызвать метод? </li></ul><ul><li>Как предоставить клиентам доступ к объекту? </li></ul><ul><li>COM, RMI, CORBA </li></ul><ul><li>2. « Упаковка » </li></ul><ul><li>Уровень компонента </li></ul><ul><li>Как упаковать объекты в компонент? </li></ul><ul><li>Как добавить компонент в систему? </li></ul><ul><li>ActiveX, JavaBeans, J2EE, CORBABeans </li></ul>
  20. 20. Основные классы ПО: сравнительная адекватность ЯП Highly subjective
  21. 21. The End

×