qt design patterns
DESCRIPTION
Design Patterns help us solve problems in tried and tested ways. Turns out they also help us understand our framework better, for framework developers also use patterns. In these slides you'll see how Design Patterns are implemented by Qt framework, to better both understand patterns and QtTRANSCRIPT
Good Code Bad Code
Sunday, May 5, 13
When OO Goes Wrong
Sunday, May 5, 13
Java Input Validation
• In the past, Java Swing provided only JTextField for input texts
• JNumericTextField quickly appeared by the community
Sunday, May 5, 13
Java Input Validation
Sunday, May 5, 13
OO Fail
• Too many classes
• Hard to maintain
• Frustrated Developers
Sunday, May 5, 13
Enter Design Patterns
• Reusable and tested solutions
• Sustainable for the long run
Sunday, May 5, 13
Enter Design Patterns
• Started by Christopher Alexander in 1977
• And he was an Architect
Sunday, May 5, 13
Example: Street Caffe“The street cafe provides a unique setting, special to cities: a place where people can sit lazily, legitimately, be on view, and watch the world go by...”
Sunday, May 5, 13
Patterns Are Not
• Not a detailed solution
• Not a guide to help you build it
Sunday, May 5, 13
Patterns Are
• Describing existing and working solutions
• Your job: Apply to your world
Sunday, May 5, 13
Patterns In Software
• Defined by GoF
• Categorized:
• Creational
• Behavioral
• Structural
Sunday, May 5, 13
Using Patterns
• Understand
• Memorize
• Apply Repeatedly
Sunday, May 5, 13
Patterns In Qt
• Plenty !
• We’ll show 2:
• Strategy
• Proxy
Sunday, May 5, 13
Strategy Pattern
Sunday, May 5, 13
The Problem
• An input text provides different validation techniques
• Only one is used at any given time
Sunday, May 5, 13
Approach #1
Sunday, May 5, 13
Why Is It Bad
• Class Explosion
• Hard to reuse validation code
Sunday, May 5, 13
The Better Way
Sunday, May 5, 13
Why Is It Awesome
• Can reuse validators code
• Reduce class explosion
Sunday, May 5, 13
The Pattern
• A validator encapsulates the validation algorithm
• The general pattern is called Strategy
Sunday, May 5, 13
Intent
• Define a family of algorithms, encapsulate each one, and make them interchangeable.
Sunday, May 5, 13
Motivation
• Client code is simpler if the algorithm is external to it
• No need to support an algorithm we don’t use
• We need to make it easy to add new algorithms
Sunday, May 5, 13
Applicability
• Configure a class with one of many behaviors
• Use different variants of an algorithm
• Eliminate Switch blocks
Sunday, May 5, 13
Structure
Sunday, May 5, 13
Participants
• Strategy
• ConcreteStrategy
• Context
Sunday, May 5, 13
Collaborations
• Strategy + Context = Algorithm
• Context forwards requests to Strategy
Sunday, May 5, 13
Consequences• Families of related algorithms
• Eliminate switch blocks
• Allow different implementations
• Strategy and Context interface can get complicated
• Increased number of objects
Sunday, May 5, 13
More Examples
• Layout management
• QAbstractNetworkCache
Sunday, May 5, 13
Keep In Mind
• A Default Strategy will make everyone happy
• Allow clients to create their own strategies and pass as parameters
Sunday, May 5, 13
Demo
Sunday, May 5, 13
Q & A
Sunday, May 5, 13
Proxy Pattern
Sunday, May 5, 13
______________ < Let's do COW > -------------- \ ^__^ \ (oo)\_______ (__)\ )\/\ ||----w | || ||
Sunday, May 5, 13
Example Code
QString s1 = getText();QString s2 = getText();QString s3 = s1;
// "Hello World" is kept in memory only once
s1.append(" And now it's copied");
Sunday, May 5, 13
The Proxy Way
• A QString is just a proxy to the data
• Implicitly shared
Sunday, May 5, 13
class MyCow {public:
MyCow &operator=(const MyCow &other) { m_data = other.m_data; } void write() { m_data = new Data( m_data ); m_data.write(); }
private: Data *m_data;};
The Proxy Way
Sunday, May 5, 13
Proxy Types
• Virtual Proxy
• Protection Proxy
• Remote Proxy
Sunday, May 5, 13
Proxy: Pattern Details
Sunday, May 5, 13
Intent
• Provide a surrogate or placeholder for another object
Sunday, May 5, 13
Motivation
• Save time by lazy loading heavy resources
• Easy Cows
Sunday, May 5, 13
Applicability
• Access remote resources
• Create resources on demand
• Enforce per-object access control
Sunday, May 5, 13
Structure
Sunday, May 5, 13
Participants
• Proxy
• Subject
• Real Subject
Sunday, May 5, 13
Collaborations
• Proxy forwards requests to Real Subject
Sunday, May 5, 13
Consequences
• Hide the fact that an object is remote
• Optimize load times (virtual proxy)
• Can use for Copy-On-Write
Sunday, May 5, 13
Qt Cow
• Not really “By The Book”
• QString has a Data struct
• Does all work by itself
Sunday, May 5, 13
Qt Patterns
• Patterns are part of any framework (Qt Included)
• Understanding patterns helps us better understand the framework
Sunday, May 5, 13
Thanks For Listening !
Slides at: http://ynonperek.com
Questions / Comments:[email protected]
Stock Photos from:http://123rf.com
Sunday, May 5, 13
Thanks For Listening
Sunday, May 5, 13