ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
Часть 1
ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
Часть 2
‹#›ЛЕКЦИЯ №8 Перспективы и паттерны .
 Архитектура
 Модель качества
 Характеристики и подхарктеристики
модели качества продукта
 Сценарии атрибутов качества...
ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
• An architectural style is a specific
method of construction,
characterized by the features that
make it notable. A style...
• Component-based
• Monolithic application aka "Big Ball of Mud"
style
• Layered
• Pipes and filters
ЛЕКЦИЯ №8 Перспективы...
• Shared Memory
• Data-centric
• Blackboard
• Rule-based
• Messaging
• Event-
driven aka Implicit
invocation
• Publish-sub...
• Adaptable systems
• Plug-ins
• Microkernel
• Reflection
• Domain specific languages
• Distributed Systems
• Client-serve...
ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
ЛЕКЦИЯ №8
Перспективы и
паттерны .
Архитектурный
элемент
Архитектура
Взаимосвязь
Система
Заинтересованные
лица
Архитектурн...
• Несмотря на то что совокупность всех проекций (view) системы
описывает систему полностью , каждая из проекций является
д...
• Применимость (Applicability)
– Описывает к каким проекциям наиболее вероятно может быть применена
перспектива.
• Вопросы...
• Определение важных атрибутов
качества1
• Анализ проекций с точки зрения
удовлетворения выделенных атрибутов
качества2
• ...
07.05.2013
Владелец продукта (Product Owner).
Работа с требованиями в Agile среде
16
Rosenberg.Use.Case.Driven.Object.Modeling.with.UML.Jan.2007
Stand Up
Meeting at
9:00
Pair Up -- Quick
Design Session
Test Q&A
Code Refactor
Integrate or
Toss
Go Home at
17:00
‹#›ЛЕКЦИЯ №8 Перспективы и паттерны .
• Бизнес приложения
– ERP, биллинг, credit scoring, logistics tracking
• Огромный объем сложных данных
– Терабайтные храни...
Каждый слой это согласованное целое
Замещение слоев
Множество вышестоящих слоев над одним
Предупреждения:
• Некоторые в...
• Презентационный
– Взаимодействует с пользователем приложения
– Толстый/тонкий клиент, web сервис
• Домен
– Бизнес правил...
ЛЕКЦИЯ №8 Перспективы и паттерны .
Presentation
Controller / Mediator
Domain
Data Mapping
Data Source
Presentation
Domain
...
ЛЕКЦИЯ №8 Перспективы и паттерны .
Client
Presentation
Business
Integration
Resource
Presentation
Domain
Data Source
Clien...
ЛЕКЦИЯ №8 Перспективы и паттерны .
Presentation
Domain
Data Source
Presentation
Business
Data Access
Kirtland, Designing C...
• Transaction Script
• Domain Model
• Table Module
ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
ЛЕКЦИЯ №8 Перспективы и паттерны .
recognizedRevenue (contractNumber: long, asOf: Date) : Money
calculateRevenueRecognitio...
ЛЕКЦИЯ №8 Перспективы и паттерны .
a Recognition
Service
calculateRecognitions (contractID)
a Data Gateway
a contract resu...
ЛЕКЦИЯ №8 Перспективы и паттерны .
recognizedRevenue (date)
calculateRecognitions
Contract
calculateRecognitions (contract...
ЛЕКЦИЯ №8 Перспективы и паттерны .
a Contract
calculateRecognitions
a Product
calculateRecognitions (a Contract)
a Recogni...
ЛЕКЦИЯ №8 Перспективы и паттерны .
CalculateRecognitions (ID)
Contract
GetProductType (ID)
Product
Insert (ID, amount, dat...
ЛЕКЦИЯ №8 Перспективы и паттерны .
a Contract
new (theDataSet)
calculateRecognitions (contractID)
a Product
new (theDataSe...
Преимущества :
Простая (процедурная) модель
программирования
Простое взаимодействие с базой данных
Предупреждения:
• Дуб...
Преимущества :
Позволяет работать с предметной областью
крайне высокой сложности
Предупреждения:
• Сдвиг парадигмы разраб...
Преимущества :
Единая структура данных для всех слоев
(Record Set)
Организована для процедур
Предупреждения:
• Сложно ра...
• Модель вид контролер (Model View Controller)
• Контроллер приложения (Application Controller)
• Контроллер ВводаВывода (...
• Model
– The domain object
• View
– Presents information to user
• (Input) Controller
– Handles user input
ЛЕКЦИЯ №8 Перс...
ЛЕКЦИЯ №8 Перспективы и паттерны .
an input controller
an application
controller
request
get domain command
a domain
comma...
ЛЕКЦИЯ №8 Перспективы и паттерны .
Input Controller
View
Application
Controller
Domain Layer
‹#›
• Единая точка контроля для изменения
порядка выполнения и навигации
• Может быть расположен в промежуточном
слое между пр...
• Один контроллер для каждого действия или страницы
• Может использовать серверные страницы в качетсве обработчика
ЛЕКЦИЯ ...
ЛЕКЦИЯ №8 Перспективы и паттерны .
• Один контроллер ввода/вывода в приложении
doGet
doPost
Handler
process
Abstract
Comma...
Контроллер страницы
• Легко сопровождать
• Не рекомендовано
хранить логику
контроллера в страницах
Центральный контроллер
...
ЛЕКЦИЯ №8 Перспективы и паттерны .
Book
Author
Model
<HTML><P><B>
<jsp:getProperty
name="bookHelper"
property="title"/></B...
ЛЕКЦИЯ №8 Перспективы и паттерны .
transformAlbum
transformArtist
Transformer
Album
Artist
Model
HTML
read
creates
‹#›
ЛЕКЦИЯ №8 Перспективы и паттерны .
artist: Artist
Album
renderAlbum
renderArtist
Stage 1
artist: Field
Screen
renderScreen...
• Шаблон представления
– Следует естественным принципам редактирования
– Позволяет редактирование HTML не программистами
–...
• Table Data Gateway
• Row Data Gateway
• Active Record
• Data Mapper
• Structural Patterns
– Foreign Key Mapping, Identit...
ЛЕКЦИЯ №8 Перспективы и паттерны .
find (id) : RecordSet
findForCompany(company id) : RecordSet
update (id, lastname, firs...
ЛЕКЦИЯ №8 Перспективы и паттерны .
insert
update
delete
find (id)
findForCompany(companyID)
lastname
firstname
numbeOfDepe...
ЛЕКЦИЯ №8 Перспективы и паттерны .
find (id)
findForCompany(company id)
Person Finder
insert
update
delete
lastname
firstn...
ЛЕКЦИЯ №8 Перспективы и паттерны .
insert
update
delete
getExemption
isFlaggedForAudit
getTaxableEarnings
lastName
firstNa...
ЛЕКЦИЯ №8 Перспективы и паттерны .
insert
update
delete
Person Mapper
getExemption
isFlaggedForAudit
getTaxableEarnings
la...
• Если используется Table Module
– Table Data Gateway
• Если используетсяTransaction Script и не
Domain Model
– Table Data...
• Если вы используете простую и сходную по
структуре Domain Model
– Active Record
– Data Mapper: В случае использования
сп...
• Remote Façade
• Data Transfer Object
ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
ЛЕКЦИЯ №8 Перспективы и паттерны .
Invoice Customer
Order Delivery
‹#›
• Детальное представление адреса:
– getStreet
– setStreet
– getCity
– setCity
– getZip
– setZip
ЛЕКЦИЯ №8 Перспективы и па...
ЛЕКЦИЯ №8 Перспективы и паттерны .
getAddressData
setAddress(street, city, zip)
Address Facade
getStreet()
getCity()
getZi...
ЛЕКЦИЯ №8 Перспективы и паттерны .
toXmlElement
readXml
title: String
artist: String
AlbumDTO
Album Assembler
title: Strin...
• Fowler – Patterns of Enterprise Application Architecture –
martinfowler.com/eaaCatalog
• Hohpe and Woolf – Enterprise In...
• Software Systems
Architecture : Working
With Stakeholders Using
Viewpoints and
Perspectives
ЛЕКЦИЯ №8 Перспективы и патт...
•
•
•
•
•
•
•
•
ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
Часть 1
ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
Часть 2
‹#›ЛЕКЦИЯ №8 Перспективы и паттерны .
Безуглый Дмитрий
bdl@system-approach.ru
ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
Upcoming SlideShare
Loading in …5
×

Бизнес и системный анализ весна 2013 лекция 8

436
-1

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
436
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
23
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Бизнес и системный анализ весна 2013 лекция 8

  1. 1. ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  2. 2. Часть 1 ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  3. 3. Часть 2 ‹#›ЛЕКЦИЯ №8 Перспективы и паттерны .
  4. 4.  Архитектура  Модель качества  Характеристики и подхарктеристики модели качества продукта  Сценарии атрибутов качества  Профиль качества продукта ЛЕКЦИЯ №8 Перспективы и паттерны . 4
  5. 5. ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  6. 6. ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  7. 7. • An architectural style is a specific method of construction, characterized by the features that make it notable. A style may include such elements as form, method of construction, materials, and regional character. ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  8. 8. • Component-based • Monolithic application aka "Big Ball of Mud" style • Layered • Pipes and filters ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  9. 9. • Shared Memory • Data-centric • Blackboard • Rule-based • Messaging • Event- driven aka Implicit invocation • Publish-subscribe • Asynchronous messaging ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  10. 10. • Adaptable systems • Plug-ins • Microkernel • Reflection • Domain specific languages • Distributed Systems • Client-server (2-tier, 3- tier, n-tier exhibit this style) • Shared nothing architecture • Space based architecture • Broker • Peer-to-peer • Representational State Transfer • Service-oriented ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  11. 11. ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  12. 12. ЛЕКЦИЯ №8 Перспективы и паттерны . Архитектурный элемент Архитектура Взаимосвязь Система Заинтересованные лица Архитектурное описание Состоит из Обладает Может иметь Описывает архитектуру для Удовлетворяет потребности Связывает Вопрос / Интерес Имеет Точка зрения (Viewpoint) Проекция (View) Состоит из Соответствует Перспектива (perspective) Уточняется Удовлетворяет Удовлетворяет ‹#›
  13. 13. • Несмотря на то что совокупность всех проекций (view) системы описывает систему полностью , каждая из проекций является достаточно независимой. • Кроме того, большая часть атрибутов качества системы проявляются и влияют на несколько проекций. • Определение: Перспектива (perspective) это совокупность действий, приемов и руководств которые используются для представления реализации конкретного набора атрибутов качества которые требуют рассмотрения в нескольких архитектурных проекциях. ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  14. 14. • Применимость (Applicability) – Описывает к каким проекциям наиболее вероятно может быть применена перспектива. • Вопросы (Concerns) – Определяет атрибут качества системы которому соответсвует перспектива • Действия (Activities) – Описание шагов по применению перспективы к проекции. • Архитектурная тактика (Architectural tactics): – Это признанная практика которую вы можете использовать для достижения определенного качества системы • Проблемы и подводные камни: • Контрольные списки • Ссылки и рекомендации для углубленного изучения ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  15. 15. • Определение важных атрибутов качества1 • Анализ проекций с точки зрения удовлетворения выделенных атрибутов качества2 • Принятие архитектурных решений которые модифицируют и улучшают соответствующие проекции3 ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  16. 16. 07.05.2013 Владелец продукта (Product Owner). Работа с требованиями в Agile среде 16
  17. 17. Rosenberg.Use.Case.Driven.Object.Modeling.with.UML.Jan.2007
  18. 18. Stand Up Meeting at 9:00 Pair Up -- Quick Design Session Test Q&A Code Refactor Integrate or Toss Go Home at 17:00
  19. 19. ‹#›ЛЕКЦИЯ №8 Перспективы и паттерны .
  20. 20. • Бизнес приложения – ERP, биллинг, credit scoring, logistics tracking • Огромный объем сложных данных – Терабайтные хранилища содержащие сотни таблиц • Множество одновременных пользователей • Большое кол-во ролей пользователей • Бизнес логика может быть сложной и иррациональной • Большое кол-во систем с которыми приходится интегрироваться ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  21. 21. Каждый слой это согласованное целое Замещение слоев Множество вышестоящих слоев над одним Предупреждения: • Некоторые вопросы нельзя инкапсулировать достаточно хорошо • Может угрожать производительности ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  22. 22. • Презентационный – Взаимодействует с пользователем приложения – Толстый/тонкий клиент, web сервис • Домен – Бизнес правила , валидаторы , расчеты • Данные (Data Source) – Интеграция – Персистентность - способность ПО создавать и поддерживать перманентные объекты (Persistence): RDBMs – Обмен сообщениями, Web сервисыЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  23. 23. ЛЕКЦИЯ №8 Перспективы и паттерны . Presentation Controller / Mediator Domain Data Mapping Data Source Presentation Domain Data Source Application Controller Data Mapper Brown et al, Enterprise Java Programming with IBM Websphere, Addison-Wesley ‹#›
  24. 24. ЛЕКЦИЯ №8 Перспективы и паттерны . Client Presentation Business Integration Resource Presentation Domain Data Source Client side Server Side External systems Alur, Crupi and Malks, Core J2EE Patterns, Prentice Hall ‹#›
  25. 25. ЛЕКЦИЯ №8 Перспективы и паттерны . Presentation Domain Data Source Presentation Business Data Access Kirtland, Designing Component Based Architectures, Microsoft Press ‹#›
  26. 26. • Transaction Script • Domain Model • Table Module ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  27. 27. ЛЕКЦИЯ №8 Перспективы и паттерны . recognizedRevenue (contractNumber: long, asOf: Date) : Money calculateRevenueRecognitions (contractNumber long) : void Recognition Service ‹#›
  28. 28. ЛЕКЦИЯ №8 Перспективы и паттерны . a Recognition Service calculateRecognitions (contractID) a Data Gateway a contract result set findContract (contract ID) get data * insert revenue recognition ‹#›
  29. 29. ЛЕКЦИЯ №8 Перспективы и паттерны . recognizedRevenue (date) calculateRecognitions Contract calculateRecognitions (contract) Product Recognition Strategy Complete Recognition Strategy 1 1 * ‹#›
  30. 30. ЛЕКЦИЯ №8 Перспективы и паттерны . a Contract calculateRecognitions a Product calculateRecognitions (a Contract) a Recognition Strategy calculateRecognitions (a Contract) a Revenue Recognition new ‹#›
  31. 31. ЛЕКЦИЯ №8 Перспективы и паттерны . CalculateRecognitions (ID) Contract GetProductType (ID) Product Insert (ID, amount, date) RecognizedRevenue (contractID, date) Revenue Recognition ‹#›
  32. 32. ЛЕКЦИЯ №8 Перспективы и паттерны . a Contract new (theDataSet) calculateRecognitions (contractID) a Product new (theDataSet) a Revenue Recognition new (theDataSet) getProductType (productID) * insert ‹#›
  33. 33. Преимущества : Простая (процедурная) модель программирования Простое взаимодействие с базой данных Предупреждения: • Дублирование логики в различных скриптах • Сложность нарастает по мере усложнения предметной области ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  34. 34. Преимущества : Позволяет работать с предметной областью крайне высокой сложности Предупреждения: • Сдвиг парадигмы разработки • Сложная стыковка с базой данных ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  35. 35. Преимущества : Единая структура данных для всех слоев (Record Set) Организована для процедур Предупреждения: • Сложно работать со сложной предметной областью ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  36. 36. • Модель вид контролер (Model View Controller) • Контроллер приложения (Application Controller) • Контроллер ВводаВывода (Input Controller) – Page Controller – Front Controller • Представление (View) – Template View – Transform View – Two Step View ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  37. 37. • Model – The domain object • View – Presents information to user • (Input) Controller – Handles user input ЛЕКЦИЯ №8 Перспективы и паттерны . Model View Controller Separation of Presentation (View/Controller) from Domain (Model) Separation of View and Controller ‹#›
  38. 38. ЛЕКЦИЯ №8 Перспективы и паттерны . an input controller an application controller request get domain command a domain command run get view a view forward Централизованная точка для обработки навигации между экранами ‹#›
  39. 39. ЛЕКЦИЯ №8 Перспективы и паттерны . Input Controller View Application Controller Domain Layer ‹#›
  40. 40. • Единая точка контроля для изменения порядка выполнения и навигации • Может быть расположен в промежуточном слое между презентационным слоем и слоем бизнес логики (domain) • Позволяет использовать разные слои представления • Может быть протестирован отдельно от уровня презентации ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  41. 41. • Один контроллер для каждого действия или страницы • Может использовать серверные страницы в качетсве обработчика ЛЕКЦИЯ №8 Перспективы и паттерны . -- handle http get and post -- decide which model and view to use Page Controller -- domain logic Model -- display HTML View ‹#›
  42. 42. ЛЕКЦИЯ №8 Перспективы и паттерны . • Один контроллер ввода/вывода в приложении doGet doPost Handler process Abstract Command process Concrete Command 1 process Concrete Command 2 ‹#›
  43. 43. Контроллер страницы • Легко сопровождать • Не рекомендовано хранить логику контроллера в страницах Центральный контроллер • Единая точка для добавления поведения • Позволяет добавлять поведение динамически (перехватывающий фильтр) ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  44. 44. ЛЕКЦИЯ №8 Перспективы и паттерны . Book Author Model <HTML><P><B> <jsp:getProperty name="bookHelper" property="title"/></B> <BR/> Author: <jsp:getProperty name="bookHelper" property="author"/> </P> </HTML> getTitle getAuthor Book Helper ‹#›
  45. 45. ЛЕКЦИЯ №8 Перспективы и паттерны . transformAlbum transformArtist Transformer Album Artist Model HTML read creates ‹#›
  46. 46. ЛЕКЦИЯ №8 Перспективы и паттерны . artist: Artist Album renderAlbum renderArtist Stage 1 artist: Field Screen renderScreen renderField Stage 2 HTML read read create create ‹#›
  47. 47. • Шаблон представления – Следует естественным принципам редактирования – Позволяет редактирование HTML не программистами – Требует дисциплины для избежания скриплетов • Преобразование представления – Может быть протестировано без использования Web сервера – Хорош работает с XML (XSLT) • Двух шаговое представление (Two Step View) – Легко осуществлять глобальное изменение дизайна – Легко поддерживать шкуры (skins) – Сложно в реализации ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  48. 48. • Table Data Gateway • Row Data Gateway • Active Record • Data Mapper • Structural Patterns – Foreign Key Mapping, Identity Field, Association Table Mapping, Single Table Inheritance…. ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  49. 49. ЛЕКЦИЯ №8 Перспективы и паттерны . find (id) : RecordSet findForCompany(company id) : RecordSet update (id, lastname, firstname, numberOfDependents) insert (lastname, firstname, numberOfDependents) delete (id) Person Gateway ‹#›
  50. 50. ЛЕКЦИЯ №8 Перспективы и паттерны . insert update delete find (id) findForCompany(companyID) lastname firstname numbeOfDependents Person Gateway ‹#›
  51. 51. ЛЕКЦИЯ №8 Перспективы и паттерны . find (id) findForCompany(company id) Person Finder insert update delete lastname firstname numbeOfDependents Person Gateway ‹#›
  52. 52. ЛЕКЦИЯ №8 Перспективы и паттерны . insert update delete getExemption isFlaggedForAudit getTaxableEarnings lastName firstName numberOfDependents Person Row Data Gateway plus domain logic in one class ‹#›
  53. 53. ЛЕКЦИЯ №8 Перспективы и паттерны . insert update delete Person Mapper getExemption isFlaggedForAudit getTaxableEarnings lastName firstName numberOfDependents Person ‹#›
  54. 54. • Если используется Table Module – Table Data Gateway • Если используетсяTransaction Script и не Domain Model – Table Data Gateway – Row Data Gateway – Выбирайте по принципу комфортности работы с record sets или row gateway objects ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  55. 55. • Если вы используете простую и сходную по структуре Domain Model – Active Record – Data Mapper: В случае использования специального инструментария • Если используете сложную Domain Model – Data Mapper ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  56. 56. • Remote Façade • Data Transfer Object ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  57. 57. ЛЕКЦИЯ №8 Перспективы и паттерны . Invoice Customer Order Delivery ‹#›
  58. 58. • Детальное представление адреса: – getStreet – setStreet – getCity – setCity – getZip – setZip ЛЕКЦИЯ №8 Перспективы и паттерны . • Укрупненное : – getAddressData – setAddressData ‹#›
  59. 59. ЛЕКЦИЯ №8 Перспективы и паттерны . getAddressData setAddress(street, city, zip) Address Facade getStreet() getCity() getZip() setStreet(arg) setCity(arg) setZip(arg) Address ‹#›
  60. 60. ЛЕКЦИЯ №8 Перспективы и паттерны . toXmlElement readXml title: String artist: String AlbumDTO Album Assembler title: String Album name: String Artist 1 * ‹#›
  61. 61. • Fowler – Patterns of Enterprise Application Architecture – martinfowler.com/eaaCatalog • Hohpe and Woolf – Enterprise Integration Patterns – enterpriseIntegrationPatterns.com • Hohmann – Beyond Software Architecture - lukehohmann.com • Evans – Domain Driven Development – domainLanguage.com • Alur, Crupi, and Malks – Core J2EE Patterns • Marinescu – EJB Patterns По материалам ThoughtWorks martinfowler.com ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  62. 62. • Software Systems Architecture : Working With Stakeholders Using Viewpoints and Perspectives ЛЕКЦИЯ №8 Перспективы и паттерны . 62
  63. 63. • • • • • • • • ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  64. 64. Часть 1 ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  65. 65. Часть 2 ‹#›ЛЕКЦИЯ №8 Перспективы и паттерны .
  66. 66. Безуглый Дмитрий bdl@system-approach.ru ЛЕКЦИЯ №8 Перспективы и паттерны . ‹#›
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×