high level principles, micro-patterns and anti-patterns

79
© 2014 VMware Inc. All rights reserved High-level principles, Micro-patterns and anti-patterns Dimitar Dimitrov Software engineer

Upload: hackbulgaria

Post on 25-May-2015

254 views

Category:

Education


2 download

DESCRIPTION

The presentation from VMWare Bulgaria, that was done during their guest lecture for the "Programming 101" course in Hack Bulgaria. The presentation was done by Dimitar Dimitrov

TRANSCRIPT

Page 1: High level principles, micro-patterns and anti-patterns

© 2014 VMware Inc. All rights reserved

High-level principles, Micro-patterns and anti-patterns

Dimitar Dimitrov Software engineer

Page 2: High level principles, micro-patterns and anti-patterns

Лекцията накратко

2

Page 3: High level principles, micro-patterns and anti-patterns

Лекцията накратко

! High-level principles • Добри практики на по-високо ниво (от обичайните design patterns)

2

Page 4: High level principles, micro-patterns and anti-patterns

Лекцията накратко

! High-level principles • Добри практики на по-високо ниво (от обичайните design patterns)

! Micro-patterns and code idioms • Добри практики на гранулярно ниво

2

Page 5: High level principles, micro-patterns and anti-patterns

Лекцията накратко

! High-level principles • Добри практики на по-високо ниво (от обичайните design patterns)

! Micro-patterns and code idioms • Добри практики на гранулярно ниво

! Anti-patterns • Често срещани лоши практики или конструкции, за които съществува алтернативен подход

2

Page 6: High level principles, micro-patterns and anti-patterns

Лекцията накратко

! High-level principles • Добри практики на по-високо ниво (от обичайните design patterns)

! Micro-patterns and code idioms • Добри практики на гранулярно ниво

! Anti-patterns • Често срещани лоши практики или конструкции, за които съществува алтернативен подход

! Examples of design patterns • Примери от Java 7 SE API !

2

Page 7: High level principles, micro-patterns and anti-patterns

Лекцията накратко

! High-level principles • Добри практики на по-високо ниво (от обичайните design patterns)

! Micro-patterns and code idioms • Добри практики на гранулярно ниво

! Anti-patterns • Често срещани лоши практики или конструкции, за които съществува алтернативен подход

! Examples of design patterns • Примери от Java 7 SE API !

! Disclaimer: Безогледна смес на български и английски ahead. Приемете на доверие, че това спомага за краткостта и яснотата на изложението. Авторът приема критики за грамотността си и преводаческите си способности.

2

Page 8: High level principles, micro-patterns and anti-patterns

High-level principles

3

Page 9: High level principles, micro-patterns and anti-patterns

High-level principles

! Като цяло не са обвързани с конкретен език или платформа.

3

Page 10: High level principles, micro-patterns and anti-patterns

High-level principles

! Като цяло не са обвързани с конкретен език или платформа.

! Могат да бъдат както implementation-centric, така и practice-centric.

3

Page 11: High level principles, micro-patterns and anti-patterns

High-level principles

! Като цяло не са обвързани с конкретен език или платформа.

! Могат да бъдат както implementation-centric, така и practice-centric.

! Design pattern-ите, които имат сходна структура и/или употреба, обикновено изхождат от един и същ implementation-centric принцип.

3

Page 12: High level principles, micro-patterns and anti-patterns

High-level principles

! Като цяло не са обвързани с конкретен език или платформа.

! Могат да бъдат както implementation-centric, така и practice-centric.

! Design pattern-ите, които имат сходна структура и/или употреба, обикновено изхождат от един и същ implementation-centric принцип.

! Добрите практики, свързани с процеса на проектиране, изграждане и поддържане на софтуер, обикновено изхождат от practice-centric принципи. • The Pragmatic Programmer, ISBN 978-0-2016-1622-4

3

Page 13: High level principles, micro-patterns and anti-patterns

High-level principles

! Като цяло не са обвързани с конкретен език или платформа.

! Могат да бъдат както implementation-centric, така и practice-centric.

! Design pattern-ите, които имат сходна структура и/или употреба, обикновено изхождат от един и същ implementation-centric принцип.

! Добрите практики, свързани с процеса на проектиране, изграждане и поддържане на софтуер, обикновено изхождат от practice-centric принципи. • The Pragmatic Programmer, ISBN 978-0-2016-1622-4

! Disclaimer: Термините implementation-centric и practice-centric са измислени от автора и имат определени недостатъци.

3

Page 14: High level principles, micro-patterns and anti-patterns

Implementation-centric principles

4

Page 15: High level principles, micro-patterns and anti-patterns

Implementation-centric principles

! Четирите основни принципа на ООП • Abstraction

• Encapsulation

• Inheritance

• Polymorphism

4

Page 16: High level principles, micro-patterns and anti-patterns

Implementation-centric principles

! Четирите основни принципа на ООП • Abstraction

• Encapsulation

• Inheritance

• Polymorphism

! Separation of concerns • Свързан с encapsulation, loose coupling и strong cohesion

4

Page 17: High level principles, micro-patterns and anti-patterns

Implementation-centric principles

! Четирите основни принципа на ООП • Abstraction

• Encapsulation

• Inheritance

• Polymorphism

! Separation of concerns • Свързан с encapsulation, loose coupling и strong cohesion

! Single responsibility principle

4

Page 18: High level principles, micro-patterns and anti-patterns

Implementation-centric principles

! Четирите основни принципа на ООП • Abstraction

• Encapsulation

• Inheritance

• Polymorphism

! Separation of concerns • Свързан с encapsulation, loose coupling и strong cohesion

! Single responsibility principle! DRY principle

• Свързан със single responsibility principle и maintainability

4

Page 19: High level principles, micro-patterns and anti-patterns

Implementation-centric principles

! Четирите основни принципа на ООП • Abstraction

• Encapsulation

• Inheritance

• Polymorphism

! Separation of concerns • Свързан с encapsulation, loose coupling и strong cohesion

! Single responsibility principle! DRY principle

• Свързан със single responsibility principle и maintainability

! Design by contract • Pre-conditions, post-conditions, invariants

• Особено важен при проектирането и създаването на API

4

Page 20: High level principles, micro-patterns and anti-patterns

Implementation-centric principles (2)

5

Page 21: High level principles, micro-patterns and anti-patterns

Implementation-centric principles (2)

! Open-closed principle • Компонентите трябва да са отворени за разширяване

• Но затворени за модификация

5

Page 22: High level principles, micro-patterns and anti-patterns

Implementation-centric principles (2)

! Open-closed principle • Компонентите трябва да са отворени за разширяване

• Но затворени за модификация

! Liskov substitution principle • Обект от даден тип трябва да може да се използва прозрачно навсякъде, където се очаква обект от базов на дадения тип (µs и ns)

5

Page 23: High level principles, micro-patterns and anti-patterns

Implementation-centric principles (2)

! Open-closed principle • Компонентите трябва да са отворени за разширяване

• Но затворени за модификация

! Liskov substitution principle • Обект от даден тип трябва да може да се използва прозрачно навсякъде, където се очаква обект от базов на дадения тип (µs и ns)

! Law of Demeter • “Не говори със съседа на съседа си”

• Ограничава методи на кои обекти могат да бъдат изпълнявани директно

5

Page 24: High level principles, micro-patterns and anti-patterns

Implementation-centric principles (2)

! Open-closed principle • Компонентите трябва да са отворени за разширяване

• Но затворени за модификация

! Liskov substitution principle • Обект от даден тип трябва да може да се използва прозрачно навсякъде, където се очаква обект от базов на дадения тип (µs и ns)

! Law of Demeter • “Не говори със съседа на съседа си”

• Ограничава методи на кои обекти могат да бъдат изпълнявани директно

! Inversion of control + Dependency injection • Абстракцията не трябва да зависи от детайлите, детайлите трябва да зависят от абстракцията

• Предпочитане на интерфейси пред абстрактни класове

5

Page 25: High level principles, micro-patterns and anti-patterns

Implementation-centric principles (3)

6

Page 26: High level principles, micro-patterns and anti-patterns

Implementation-centric principles (3)

! Interface segregation principle • Абстракции и зависимости трябва да бъдат ограничавани до възможно най-малък интерфейс • Ползвайте маркер интерфейси и интерфейси с един метод

6

Page 27: High level principles, micro-patterns and anti-patterns

Implementation-centric principles (3)

! Interface segregation principle • Абстракции и зависимости трябва да бъдат ограничавани до възможно най-малък интерфейс • Ползвайте маркер интерфейси и интерфейси с един метод

! Acyclic dependency principle • Структурата на зависимостите между компонентите не трябва да съдържа циклични зависимости

6

Page 28: High level principles, micro-patterns and anti-patterns

Implementation-centric principles (3)

! Interface segregation principle • Абстракции и зависимости трябва да бъдат ограничавани до възможно най-малък интерфейс • Ползвайте маркер интерфейси и интерфейси с един метод

! Acyclic dependency principle • Структурата на зависимостите между компонентите не трябва да съдържа циклични зависимости

! Principle of least astonishment • Операциите трябва да имат ясен и консистентен резултат, разбираем от името, документацията и очакваното приложение на метода или класа • Много важен, когато имплементирате API

6

Page 29: High level principles, micro-patterns and anti-patterns

Implementation-centric principles (3)

! Interface segregation principle • Абстракции и зависимости трябва да бъдат ограничавани до възможно най-малък интерфейс • Ползвайте маркер интерфейси и интерфейси с един метод

! Acyclic dependency principle • Структурата на зависимостите между компонентите не трябва да съдържа циклични зависимости

! Principle of least astonishment • Операциите трябва да имат ясен и консистентен резултат, разбираем от името, документацията и очакваното приложение на метода или класа • Много важен, когато имплементирате API

! Principle of least resource usage • Използвайте минимално количество ресурси

• Оптимизирайте само на базата на резултати от тестове, за да избегнете premature optimization

6

Page 30: High level principles, micro-patterns and anti-patterns

Practice-centric principles

7

Page 31: High level principles, micro-patterns and anti-patterns

Practice-centric principles

! Яснота и простота преди всичко • Модулите, класовете, методите и др. трябва да бъдат възможно най-малки, но не по-малки (Еinstein reference)

• Пазете се от семантично замърсяване или “излишен шум” в методите и класовете си (припомнете си какво са cross-cutting concerns)

7

Page 32: High level principles, micro-patterns and anti-patterns

Practice-centric principles

! Яснота и простота преди всичко • Модулите, класовете, методите и др. трябва да бъдат възможно най-малки, но не по-малки (Еinstein reference)

• Пазете се от семантично замърсяване или “излишен шум” в методите и класовете си (припомнете си какво са cross-cutting concerns)

! Принцип на Парето • 80% от ефектите се причиняват от 20% от факторите

• Научете се да идентифицирате важните 20%

7

Page 33: High level principles, micro-patterns and anti-patterns

Practice-centric principles

! Яснота и простота преди всичко • Модулите, класовете, методите и др. трябва да бъдат възможно най-малки, но не по-малки (Еinstein reference)

• Пазете се от семантично замърсяване или “излишен шум” в методите и класовете си (припомнете си какво са cross-cutting concerns)

! Принцип на Парето • 80% от ефектите се причиняват от 20% от факторите

• Научете се да идентифицирате важните 20%

! Спазвайте създадените правила и конвенции • Консистентността води до четимост и разбираемост

• Не нарушавайте конвенциите си заради малки оптимизации (защо?)

7

Page 34: High level principles, micro-patterns and anti-patterns

Practice-centric principles

! Яснота и простота преди всичко • Модулите, класовете, методите и др. трябва да бъдат възможно най-малки, но не по-малки (Еinstein reference)

• Пазете се от семантично замърсяване или “излишен шум” в методите и класовете си (припомнете си какво са cross-cutting concerns)

! Принцип на Парето • 80% от ефектите се причиняват от 20% от факторите

• Научете се да идентифицирате важните 20%

! Спазвайте създадените правила и конвенции • Консистентността води до четимост и разбираемост

• Не нарушавайте конвенциите си заради малки оптимизации (защо?)

! Възползвайте се максимално от наличните инструменти • Отделете време, за да оптимизирате максимално тези 20% от дейностите си, които изпълнявате през 80% от времетo си

7

Page 35: High level principles, micro-patterns and anti-patterns

Practice-centric principles (2)

8

Page 36: High level principles, micro-patterns and anti-patterns

Practice-centric principles (2)

! Хващайте грешки, колкото се може по-рано • Свързано не само с имплементацията, но и с целия процес на разработка

(Quality Engineering) • Важно изискване: Признавайте грешките си

8

Page 37: High level principles, micro-patterns and anti-patterns

Practice-centric principles (2)

! Хващайте грешки, колкото се може по-рано • Свързано не само с имплементацията, но и с целия процес на разработка

(Quality Engineering) • Важно изискване: Признавайте грешките си

! Винаги планирайте и изпълнявайте, имайки предвид контекста на вашия проект • Пример: И производителността, и user experience-а са важни, но ако се наложи, с кое от двете бихте направили компромис?

8

Page 38: High level principles, micro-patterns and anti-patterns

Practice-centric principles (2)

! Хващайте грешки, колкото се може по-рано • Свързано не само с имплементацията, но и с целия процес на разработка

(Quality Engineering) • Важно изискване: Признавайте грешките си

! Винаги планирайте и изпълнявайте, имайки предвид контекста на вашия проект • Пример: И производителността, и user experience-а са важни, но ако се наложи, с кое от двете бихте направили компромис?

! Познавайте спецификите на проблемната област • Познавайте лошите практики и техническите предизвикателства

• Идентифицирайте коя платформа ви върши най-добра работа, използвайте идиомите на езика и проблемната област

8

Page 39: High level principles, micro-patterns and anti-patterns

Practice-centric principles (2)

! Хващайте грешки, колкото се може по-рано • Свързано не само с имплементацията, но и с целия процес на разработка

(Quality Engineering) • Важно изискване: Признавайте грешките си

! Винаги планирайте и изпълнявайте, имайки предвид контекста на вашия проект • Пример: И производителността, и user experience-а са важни, но ако се наложи, с кое от двете бихте направили компромис?

! Познавайте спецификите на проблемната област • Познавайте лошите практики и техническите предизвикателства

• Идентифицирайте коя платформа ви върши най-добра работа, използвайте идиомите на езика и проблемната област

! Нито един принцип не е абсолютен • Не следвайте сляпо принципи, които не ви носят добавена стойност

8

Page 40: High level principles, micro-patterns and anti-patterns

Micro-patterns and code idioms

9

Page 41: High level principles, micro-patterns and anti-patterns

Micro-patterns and code idioms

! Като цяло обхващат добри практики със scope не повече от тялото на един метод. • Понякога разграничаването между pattern и micro-pattern е нетривиално

(Lazy loading)

9

Page 42: High level principles, micro-patterns and anti-patterns

Micro-patterns and code idioms

! Като цяло обхващат добри практики със scope не повече от тялото на един метод. • Понякога разграничаването между pattern и micro-pattern е нетривиално

(Lazy loading)

! Често са обвързани с платформата или езика, за които се прилагат. • Под code idiom често се разбира специфична за езика конструкция

(idiomatic code)

9

Page 43: High level principles, micro-patterns and anti-patterns

Micro-patterns and code idioms

! Като цяло обхващат добри практики със scope не повече от тялото на един метод. • Понякога разграничаването между pattern и micro-pattern е нетривиално

(Lazy loading)

! Често са обвързани с платформата или езика, за които се прилагат. • Под code idiom често се разбира специфична за езика конструкция

(idiomatic code)

! За разлика от design principles, code idioms по-често биват неправилно използвани. • Най-често всичко започва с доброто намерение на програмиста

• Понякога обаче това нарушава “Яснота и простота преди всичко”, “Спазвайте създадените правила и конвенции” или “Не следвайте сляпо принципи, които не ви носят добавена стойност”

9

Page 44: High level principles, micro-patterns and anti-patterns

Примери - micro-patterns

10

Page 45: High level principles, micro-patterns and anti-patterns

Примери - micro-patterns

! Създаване и използване на immutable обекти • Изключително полезно при multithreaded приложения, и не само там

• Какво недостатъци може да има?

10

Page 46: High level principles, micro-patterns and anti-patterns

Примери - micro-patterns

! Създаване и използване на immutable обекти • Изключително полезно при multithreaded приложения, и не само там

• Какво недостатъци може да има?

! Ограничаване на scope-a на локалните променливи • Ограничава възможността да злоупотребим, подпомага garbage collect-ването

• А ако пишем на JavaScript (как се определя scope-a там)?

10

Page 47: High level principles, micro-patterns and anti-patterns

Примери - micro-patterns

! Създаване и използване на immutable обекти • Изключително полезно при multithreaded приложения, и не само там

• Какво недостатъци може да има?

! Ограничаване на scope-a на локалните променливи • Ограничава възможността да злоупотребим, подпомага garbage collect-ването

• А ако пишем на JavaScript (как се определя scope-a там)?

! Lazy loading • Може да подобри бързината и заеманата памет на приложението

• Рядко подобрението на бързината е фактор (виж http://goo.gl/5L4fi)

10

Page 48: High level principles, micro-patterns and anti-patterns

Примери - micro-patterns

! Създаване и използване на immutable обекти • Изключително полезно при multithreaded приложения, и не само там

• Какво недостатъци може да има?

! Ограничаване на scope-a на локалните променливи • Ограничава възможността да злоупотребим, подпомага garbage collect-ването

• А ако пишем на JavaScript (как се определя scope-a там)?

! Lazy loading • Може да подобри бързината и заеманата памет на приложението

• Рядко подобрението на бързината е фактор (виж http://goo.gl/5L4fi)

! Defensive copying • Може негативно да повлияе на бързината и заеманата памет, ако не се изисква

• Все пак по-добре да загубите производителност, отколкото да нарушите encapsulation-а

10

Page 49: High level principles, micro-patterns and anti-patterns

Примери - micro-patterns

! Създаване и използване на immutable обекти • Изключително полезно при multithreaded приложения, и не само там

• Какво недостатъци може да има?

! Ограничаване на scope-a на локалните променливи • Ограничава възможността да злоупотребим, подпомага garbage collect-ването

• А ако пишем на JavaScript (как се определя scope-a там)?

! Lazy loading • Може да подобри бързината и заеманата памет на приложението

• Рядко подобрението на бързината е фактор (виж http://goo.gl/5L4fi)

! Defensive copying • Може негативно да повлияе на бързината и заеманата памет, ако не се изисква

• Все пак по-добре да загубите производителност, отколкото да нарушите encapsulation-а

! Добавяне на static final модификатори • Ползвайте го заради семантичния ефект, а не като performance optimization

• По подразбиране методите са виртуални в Java и невиртуални в C#

10

Page 50: High level principles, micro-patterns and anti-patterns

Примери - micro-patterns (2)

11

Page 51: High level principles, micro-patterns and anti-patterns

Примери - micro-patterns (2)

! Short-circuit булеви оператори • mostLikelyFalse() && mostLikelyTrue()• alwaysTrue() || alwaysThrowsException()

11

Page 52: High level principles, micro-patterns and anti-patterns

Примери - micro-patterns (2)

! Short-circuit булеви оператори • mostLikelyFalse() && mostLikelyTrue()• alwaysTrue() || alwaysThrowsException()

! Избягване на null референции • CONST.equals(nullRef) и return itemArray != null ? itemArray : [];

• Може да бъде ненужно или нежелано • ако прикрива по-късен NullPointerException по време на изпълнение

• ако между null и [] има семантична разлика

11

Page 53: High level principles, micro-patterns and anti-patterns

Примери - micro-patterns (2)

! Short-circuit булеви оператори • mostLikelyFalse() && mostLikelyTrue()• alwaysTrue() || alwaysThrowsException()

! Избягване на null референции • CONST.equals(nullRef) и return itemArray != null ? itemArray : [];

• Може да бъде ненужно или нежелано • ако прикрива по-късен NullPointerException по време на изпълнение

• ако между null и [] има семантична разлика

! Достъпване и промяна на полета през методи • Почти винаги трябва да се използва

• Какво става, ако за класа Person, трябва да връщате не this.age, a this.age - 10, ако FEMALE.equals(this.sex)?

• Изключение правят чистите data обекти с ограничена (непублична) видимост

11

Page 54: High level principles, micro-patterns and anti-patterns

Anti-patterns

12

Page 55: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

12

Page 56: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

! Могат да бъдат:

12

Page 57: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

! Могат да бъдат:• Контрапродуктивни навици

12

Page 58: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

! Могат да бъдат:• Контрапродуктивни навици

• Лоши конструкции, създадени с добри намерения

12

Page 59: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

! Могат да бъдат:• Контрапродуктивни навици

• Лоши конструкции, създадени с добри намерения

• Лоши конструкции, появяващи се с течение на разработката

12

Page 60: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

! Могат да бъдат:• Контрапродуктивни навици

• Лоши конструкции, създадени с добри намерения

• Лоши конструкции, появяващи се с течение на разработката

! Code smells

12

Page 61: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

! Могат да бъдат:• Контрапродуктивни навици

• Лоши конструкции, създадени с добри намерения

• Лоши конструкции, появяващи се с течение на разработката

! Code smells• индикация или симптом за съществуването на по-сериозен проблем

12

Page 62: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

! Могат да бъдат:• Контрапродуктивни навици

• Лоши конструкции, създадени с добри намерения

• Лоши конструкции, появяващи се с течение на разработката

! Code smells• индикация или симптом за съществуването на по-сериозен проблем

• code duplication

12

Page 63: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

! Могат да бъдат:• Контрапродуктивни навици

• Лоши конструкции, създадени с добри намерения

• Лоши конструкции, появяващи се с течение на разработката

! Code smells• индикация или симптом за съществуването на по-сериозен проблем

• code duplication

• прекалено дълги методи

12

Page 64: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

! Могат да бъдат:• Контрапродуктивни навици

• Лоши конструкции, създадени с добри намерения

• Лоши конструкции, появяващи се с течение на разработката

! Code smells• индикация или симптом за съществуването на по-сериозен проблем

• code duplication

• прекалено дълги методи

• и разбира се, прекалено дълги класове

12

Page 65: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

! Могат да бъдат:• Контрапродуктивни навици

• Лоши конструкции, създадени с добри намерения

• Лоши конструкции, появяващи се с течение на разработката

! Code smells• индикация или симптом за съществуването на по-сериозен проблем

• code duplication

• прекалено дълги методи

• и разбира се, прекалено дълги класове

• код с няколко нива на conditional nesting

12

Page 66: High level principles, micro-patterns and anti-patterns

Anti-patterns

! Често срещани шаблони с идентифицирани недостатъци, за които съществува алтернативен подход.

! Могат да бъдат:• Контрапродуктивни навици

• Лоши конструкции, създадени с добри намерения

• Лоши конструкции, появяващи се с течение на разработката

! Code smells• индикация или симптом за съществуването на по-сериозен проблем

• code duplication

• прекалено дълги методи

• и разбира се, прекалено дълги класове

• код с няколко нива на conditional nesting

• методи с прекалено много аргументи

12

Page 67: High level principles, micro-patterns and anti-patterns

Design Patterns и Java 7 SE API

13

Page 68: High level principles, micro-patterns and anti-patterns

Design Patterns и Java 7 SE API

! Singleton • System.console(), Runtime.getRuntime(), Collections.EMPTY_MAP

13

Page 69: High level principles, micro-patterns and anti-patterns

Design Patterns и Java 7 SE API

! Singleton • System.console(), Runtime.getRuntime(), Collections.EMPTY_MAP

! Factory method/Factory • Boolean.valueOf(String s), Class.newInstance() (макар че Class вече е параметризиран тип, типът на създадената инстанция е конкретен)

13

Page 70: High level principles, micro-patterns and anti-patterns

Design Patterns и Java 7 SE API

! Singleton • System.console(), Runtime.getRuntime(), Collections.EMPTY_MAP

! Factory method/Factory • Boolean.valueOf(String s), Class.newInstance() (макар че Class вече е параметризиран тип, типът на създадената инстанция е конкретен)

! Abstract Factory • URL.openConnection(), Arrays.asList(T... a) (винаги връща инстанция на

ArrayList), Collections.unmodifiableList(List<? extends T> c) (винаги връща инстанция на inner class, невидим извън самия JDK)

13

Page 71: High level principles, micro-patterns and anti-patterns

Design Patterns и Java 7 SE API

! Singleton • System.console(), Runtime.getRuntime(), Collections.EMPTY_MAP

! Factory method/Factory • Boolean.valueOf(String s), Class.newInstance() (макар че Class вече е параметризиран тип, типът на създадената инстанция е конкретен)

! Abstract Factory • URL.openConnection(), Arrays.asList(T... a) (винаги връща инстанция на

ArrayList), Collections.unmodifiableList(List<? extends T> c) (винаги връща инстанция на inner class, невидим извън самия JDK)

! Prototype • Object.clone() (клонирането на обекти в Java е доста “дълбока” тема; виж

Effective Java, 2nd Edition, Item 11)

13

Page 72: High level principles, micro-patterns and anti-patterns

Design Patterns и Java 7 SE API

! Singleton • System.console(), Runtime.getRuntime(), Collections.EMPTY_MAP

! Factory method/Factory • Boolean.valueOf(String s), Class.newInstance() (макар че Class вече е параметризиран тип, типът на създадената инстанция е конкретен)

! Abstract Factory • URL.openConnection(), Arrays.asList(T... a) (винаги връща инстанция на

ArrayList), Collections.unmodifiableList(List<? extends T> c) (винаги връща инстанция на inner class, невидим извън самия JDK)

! Prototype • Object.clone() (клонирането на обекти в Java е доста “дълбока” тема; виж

Effective Java, 2nd Edition, Item 11)

! Flyweight • Boolean.valueOf(String s), Collections.emptyMap()

13

Page 73: High level principles, micro-patterns and anti-patterns

Design Patterns и Java 7 SE API (2)

14

Page 74: High level principles, micro-patterns and anti-patterns

Design Patterns и Java 7 SE API (2)

! Adapter • InputStreamReader(InputStream)

14

Page 75: High level principles, micro-patterns and anti-patterns

Design Patterns и Java 7 SE API (2)

! Adapter • InputStreamReader(InputStream)

! Composite • java.awt.Container.add(Component comp) (връща инстанция на Component)

• Collection.addAll(Collection<? extends e> c) is not Composite (добавяната колекция не бива запазена)

14

Page 76: High level principles, micro-patterns and anti-patterns

Design Patterns и Java 7 SE API (2)

! Adapter • InputStreamReader(InputStream)

! Composite • java.awt.Container.add(Component comp) (връща инстанция на Component)

• Collection.addAll(Collection<? extends e> c) is not Composite (добавяната колекция не бива запазена)

! Decorator • Collections.unmodifiableList(List<? extends T> c) (тъй като поведението се променя)

14

Page 77: High level principles, micro-patterns and anti-patterns

Design Patterns и Java 7 SE API (2)

! Adapter • InputStreamReader(InputStream)

! Composite • java.awt.Container.add(Component comp) (връща инстанция на Component)

• Collection.addAll(Collection<? extends e> c) is not Composite (добавяната колекция не бива запазена)

! Decorator • Collections.unmodifiableList(List<? extends T> c) (тъй като поведението се променя)

! Proxy • subtypes of java.lang.reflect.Proxy

• създавани чрез статичния factory method newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

14

Page 78: High level principles, micro-patterns and anti-patterns

Ресурси

15

Page 79: High level principles, micro-patterns and anti-patterns

Ресурси

!• http://c2.com/cgi/wiki?OoDesignPrinciples • http://www.slideshare.net/clintedmonson/advanced-

oop-laws-principles-idioms-presentation • http://www.oodesign.com/design-principles.html • http://sourcemaking.com/antipatterns • http://stackoverflow.com/questions/1673841/examples-

of-gof-design-patterns/ • http://msdn.microsoft.com/en-us/magazine/

cc188707.aspx (старо, но все още валидно) • Effective Java, 2nd Edition, ISBN 978-0-3213-5668-0 • The Pragmatic Programmer, ISBN 978-0-2016-1622-4

15