Slide 1

Slide 1 text

Złożone wzorce projektowe MVC, KVO, ORM. Z czym to się je?

Slide 2

Slide 2 text

Marek Stępniowski http://stepniowski.com @mstepniowski

Slide 3

Slide 3 text

Gamma, et al. Design Patterns Time Hunt, Thomas The Pragmatic Programmer Martin Fowler Patterns of Enterprise Application Architecture Cormen, et al. Introduction to Algorithms Kent Beck Test-Driven Development Python Abelson, Sussman Structure and Interpretation of Computer Programs Chris Okasaki Purely Functional Data Structures My first language Stages of a programmer Level 9000 0

Slide 4

Slide 4 text

Gamma, et al. Design Patterns Hunt, Thomas The Pragmatic Programmer Cormen, et al. Introduction to Algorithms thon

Slide 5

Slide 5 text

t al. erns as atic er Martin Fowler Patterns of Enterprise Application Architecture Test-Driven Development Abelson, Sussman Structure and Interpretation of Computer Programs

Slide 6

Slide 6 text

Wzorce projektowe Architektura dużych aplikacji w Pythonie last year

Slide 7

Slide 7 text

Design pattern def. General reusable solution to a commonly occurring problem within a given context in software design. A design pattern is a description or template for how to solve a problem that can be used in many different situations. last year

Slide 8

Slide 8 text

Alan Shallowey James R. Trott last year

Slide 9

Slide 9 text

Abstract Factory Factory Method Builder Prototype Singleton Adapter Bridge Composite Decorator Facade Flyweight Proxy Chain of Reponsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method Visitor DP last year

Slide 10

Slide 10 text

Adapter Bridge Composite Decorator Facade Flyweight Proxy Memento Observer State Strategy Template Method Visitor Multiton Object Pool RAII Front Controller Null Object Publish/Subscribe Blackboard Servant Specification CC last year

Slide 11

Slide 11 text

Foreign Key Mapping Association Table Mapping Dependent Mapping Embedded Value Serialized LOB Single Table Inheritance Class Table Inheritance Concrete Table Inheritance Inheritance Mappers Metadata Mapping Database Session State Gateway Mapper Layer Subtype Separated Interface Registry Value Object Money Special Case Plugin Service Stub Record Set PoEAA last year

Slide 12

Slide 12 text

Embedded Value Serialized LOB Single Table Inheritance Class Table Inheritance Concrete Table Inheritance Inheritance Mappers Metadata Mapping Separated Interface Registry Value Object Money Special Case Plugin Service Stub Record Set Model Template View Model View Presenter Model View ViewModel Layers KVO KVC inne last year

Slide 13

Slide 13 text

hipotetyczna firma last year

Slide 14

Slide 14 text

Adapter Abstract Factory Method Factory Template Method Null Object Plugin Strategy Observer State 9 last year 9/86

Slide 15

Slide 15 text

My God! It’s full of patterns! last year

Slide 16

Slide 16 text

A B last year

Slide 17

Slide 17 text

A B last year

Slide 18

Slide 18 text

A B C last year

Slide 19

Slide 19 text

A B C last year

Slide 20

Slide 20 text

A B C last year

Slide 21

Slide 21 text

Patternitis last year

Slide 22

Slide 22 text

No silver bullet! last year

Slide 23

Slide 23 text

MVC ORM bindings KVO KVC delegate responder chain run loop observer unit of work data mapper identity map active record

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

MVC Model View Controller

Slide 26

Slide 26 text

Controller Model View MVC

Slide 27

Slide 27 text

Controller Model View MVC

Slide 28

Slide 28 text

Controller Model View MVC

Slide 29

Slide 29 text

+notify(*) Observer +notify(*) ObserverA +notify(*) ObserverB notifyObservers(*) for observer in observerCollection: observer.notify(*) +registerObserver(1) +unregisterObserver(1) +notifyObservers(*) observerCollection Observable Observer

Slide 30

Slide 30 text

View Model Model 1

Slide 31

Slide 31 text

Front Controller View Model Model 1

Slide 32

Slide 32 text

Front Controller View Model Model 2 Template

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

MVC Controller View Model

Slide 36

Slide 36 text

MVC Controller View Model Subview1 Subview2

Slide 37

Slide 37 text

MVC Controller View Model Subview1 Subview2 Subcont1 Subcont2

Slide 38

Slide 38 text

MVC Controller View Model Subview1 Subview2 Subcont1 Subcont2

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

MVC Controller View Model Subview1 Subview2 Subcont1 Subcont2

Slide 41

Slide 41 text

MVC Controller View Model Subview1 Subview2 Subcont1 Subcont2 responder chain

Slide 42

Slide 42 text

MVC Controller View Model Subview1 Subview2 Subcont1 Subcont2 first responder

Slide 43

Slide 43 text

MVP Controller View Model Subview1 Subview2

Slide 44

Slide 44 text

MVP Controller View Model Subview1 Subview2

Slide 45

Slide 45 text

MVP Controller View Model Widget1 Widget2 View Widget Presenter

Slide 46

Slide 46 text

KVC Key-Value Coding

Slide 47

Slide 47 text

KVC Model Widget1 Widget2 View Presenter Widget widget

Slide 48

Slide 48 text

KVC Model Widget1 Widget2 View Presenter Widget widget.widget2

Slide 49

Slide 49 text

KVC Model Widget1 Widget2 View Presenter Widget widget.widget2.attr attr @avg @count @min @sum @distinctUnionOfSets

Slide 50

Slide 50 text

KVO Key-Value Observing

Slide 51

Slide 51 text

setName @property changed:name

Slide 52

Slide 52 text

bindings

Slide 53

Slide 53 text

run loop

Slide 54

Slide 54 text

ember • MVC • Templates • KVC/KVO • MVP • Templates • KVC/KVO • bindings • run loop

Slide 55

Slide 55 text

Person = Ember.Object.extend({ firstName: null, lastName: null, fullName: Ember.computed(function(key, value) { // getter if (arguments.length === 1) { var firstName = this.get('firstName'); var lastName = this.get('lastName'); return firstName + ' ' + lastName; // setter } else { var name = value.split(" "); this.set('firstName', name[0]); this.set('lastName', name[1]); return value; } }).property('firstName', 'lastName') }); var person = Person.create(); person.set('fullName', "Peter Wagenet"); person.get('firstName') // Peter person.get('lastName') // Wagenet

Slide 56

Slide 56 text

ORM Object-relational mapping

Slide 57

Slide 57 text

ORM Active Record Data Mapper Unit of Work

Slide 58

Slide 58 text

Active Record

Slide 59

Slide 59 text

class Person(Entity): name = Field(String(128)) addresses = OneToMany('Address') class Address(Entity): email = Field(Unicode(128)) owner = ManyToOne('Person')

Slide 60

Slide 60 text

Data Mapper

Slide 61

Slide 61 text

Unit of Work

Slide 62

Slide 62 text

Identity Map

Slide 63

Slide 63 text

Lazy Load

Slide 64

Slide 64 text

ORM Active Record Data Mapper Unit of Work

Slide 65

Slide 65 text

ORM Active Record Data Mapper Unit of Work

Slide 66

Slide 66 text

Marek Stępniowski http://stepniowski.com @mstepniowski

Slide 67

Slide 67 text

http://stepniowski.com/p/patterns