stoop ed-some principles

21
S.Ducasse 1 QuickTime™ TIFF (Uncompr are needed t Stéphane Ducasse [email protected] http://www.listic.univ-savoie.f r/~ducasse/ Some Principles Stéphane Ducasse --- 2005

Upload: the-world-of-smalltalk

Post on 08-May-2015

670 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Stoop ed-some principles

S.Ducasse 1

QuickTime™ and aTIFF (Uncompressed) decompressorare needed to see this picture.

Stéphane [email protected]://www.listic.univ-savoie.fr/~ducasse/

Some Principles

Stéphane Ducasse --- 2005

Page 2: Stoop ed-some principles

S.Ducasse 2

License: CC-Attribution-ShareAlike 2.0http://creativecommons.org/licenses/by-sa/2.0/

Page 3: Stoop ed-some principles

S.Ducasse 3

Open-Close

•Software entities (classes, •modules, functions, etc.) should •be open for extension, but closed• for modification.

Page 4: Stoop ed-some principles

S.Ducasse 4

The open-closed principle•Software entities (classes, modules,

functions, etc.) should be open for extension, but closed for modification.

•Existing code should not be changed – new features can be added using inheritance or composition.

Page 5: Stoop ed-some principles

S.Ducasse 5

One kind of applicationenum ShapeType {circle,

square};struct Shape { ShapeType _type;};struct Circle {

ShapeType _type;double _radius;Point _center;

};

struct Square {ShapeType _type;double _side;Point _topLeft;

};void DrawSquare(struct

Square*)void DrawCircle(struct

Circle*);

Page 6: Stoop ed-some principles

S.Ducasse 6

Example (II)void DrawAllShapes(struct Shape* list[], int n) {

int i;for (i=0; i<n; i++) {

struct Shape* s = list[i];switch (s->_type) {case square: DrawSquare((struct Square*)s); break;case circle: DrawCircle((struct Circle*)s); break;

} }}Adding a new shape requires adding new code to this method.

Page 7: Stoop ed-some principles

S.Ducasse 7

Correct Formclass Shape { public: virtual void Draw() const = 0;};class Square : public Shape { public: virtual void Draw() const;};class Circle : public Shape { public: virtual void Draw() const;};void DrawAllShapes(Set<Shape*>& list) {

for (Iterator<Shape*>i(list); i; i++)(*i)->Draw();

Page 8: Stoop ed-some principles

S.Ducasse 8

Some Principles

•Dependency Inversion Principle• Interface Segregation Principle• The Acyclic Dependencies Principle

Page 9: Stoop ed-some principles

S.Ducasse 9

Dependency Inversion Principle

•High level modules should not depend upon low level modules. Both should depend upon abstractions.

•Abstractions should not depend upon details. Details should depend upon abstractions.

Page 10: Stoop ed-some principles

S.Ducasse 10

Examplevoid Copy() {int c;while ((c = ReadKeyboard()) != EOF)

WritePrinter(c);}

Page 11: Stoop ed-some principles

S.Ducasse 11

Cont...Now we have a second writing device – disk

enum OutputDevice {printer, disk};

void Copy(outputDevice dev) {int c;while ((c = ReadKeyboard()) != EOF)

if (dev == printer)WritePrinter(c);

elseWriteDisk(c);

}

Page 12: Stoop ed-some principles

S.Ducasse 12

Solutionclass Reader { public: virtual int Read() = 0;};class Writer { public: virtual void Write(char)=0;};void Copy(Reader& r, Writer& w) { int c; while((c=r.Read()) != EOF) w.Write(c);}

Page 13: Stoop ed-some principles

S.Ducasse 13

Some Principle

Page 14: Stoop ed-some principles

S.Ducasse 14

Interface Segregation Principle• The dependency of one class to another

one should depend on the smallest possible interface.

•Avoid “fat” interfaces

Page 15: Stoop ed-some principles

S.Ducasse 15

Examples

Page 16: Stoop ed-some principles

S.Ducasse 16

Solutions•One class one responsibility•Composition?

•Design is not simple

Page 17: Stoop ed-some principles

S.Ducasse 17

The Acyclic Dependency Principle• The dependency structure between

packages must not contain cyclic dependencies.

Page 18: Stoop ed-some principles

S.Ducasse 18

Example...Ez

Page 19: Stoop ed-some principles

S.Ducasse 19

Solutions• Layering?•Separation of domain/applicatin/UI

Page 20: Stoop ed-some principles

S.Ducasse 20

Packages, Modules and other• The Common Closure Principle

• Classes within a released component should share common closure. That is, if one needs to be changed, they all are likely to need to be changed.

• The Common Reuse Principle• The classes in a package are reused together.

If you reuse one of the classes in a package, you reuse them all.

Page 21: Stoop ed-some principles

S.Ducasse 21

SummaryBuild your own tasteAnalyze what you write and how?