Qt Design Patterns

Preview:

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 Qt

Citation preview

C++/Qt Design Patterns

Ynon Perekynon@ynonperek.comhttp://ynonperek.com

Sunday, May 5, 13

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:ynon@ynonperek.com

Stock Photos from:http://123rf.com

Sunday, May 5, 13

Thanks For Listening

Sunday, May 5, 13

Recommended