bÖlÜm4 tasarim kaliplari filetasarım kalıpları tasarımda yeniden kullanımı(reuse) destekler....

39
YZM311 YAZILIM YAPIMI BÖLÜM 4 TASARIM KALIPLARI Yrd. Doç. Dr. Volkan TUNALI Mühendislik ve Doğa Bilimleri Fakültesi / Maltepe Üniversitesi

Upload: others

Post on 01-Nov-2019

11 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

YZM311YAZILIM YAPIMI

BÖLÜM 4TASARIM KALIPLARIYrd. Doç. Dr. Volkan TUNALIMühendislik ve Doğa Bilimleri Fakültesi / Maltepe Üniversitesi

Page 2: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

2

Giriş

Tasarım Kalıpları (Design Patterns) Yaratımsal (Creational) Kalıplar

Singleton Factory Method

Yapısal (Structural) Kalıplar Adapter Decorator

Davranışsal (Behavioral) Kalıplar Strategy Command

Page 3: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

3

Tasarım Kalıpları

Yazılım Mühendisliğinde Tasarım Kalıpları, yazılım tasarımında sıklıkla karşılaşılan problemler için genel ve tekrarlanabilir çözümlerdir.

Bir tasarım kalıbı doğrudan koda çevrilebilecek, tamamlanmış bir tasarım değildir.

Tasarım kalıbı, bir tasarım probleminin nasıl çözülebileceğine dair bir açıklama ya da şablon niteliğindedir.

Page 4: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

4

Tasarım Kalıpları

Tasarımda yeniden kullanımı (reuse) destekler. Etkinliği kanıtlanmış kalıplara dayalı tasarlanan

yazılım sistemlerine olan güveni arttırır. Tasarımcıların yazılım tasarımına ilişkin konularda

iyi bilinen ve üzerinde uzlaşılmış isimler kullanarak iletişim kurabilmeleri için ortak bir dil ve kelime dağarcığı sağlar.

Page 5: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

5

Tasarım Kalıpları

Yaratımsal (Creational) Kalıplar Nesne yaratım süreciyle ilgili kalıplardır (class instantiation).

Yapısal (Structural) Kalıplar Temel olarak sınıfların ve nesnelerin statik bileşimi ve yapısıyla

ilgilenen kalıplardır (static composition & structure). Nesnelerin yeni işlevsellikler kazanmaları için birtakım

yöntemler sağlarlar.

Davranışsal (Behavioral) Kalıplar Sınıflar ve nesneler arasındaki dinamik etkileşim ve iletişimle

ilgilidirler (dynamic interaction & communication).

Page 6: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

6

Tasarım Kalıpları

Page 7: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

7

Yaratımsal (Creational) Kalıplar

Abstract Factory Builder Factory Method Object Pool Prototype Singleton

Page 8: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

8

Yapısal (Structural) Kalıplar

Adapter Bridge Composite Decorator Façade Flyweight Private Class Data Proxy

Page 9: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

9

Davranışsal (Behavioral) Kalıplar

Chain of Responsibility Command Interpreter Iterator Mediator Memento Null Object Observer State Strategy Template Method Visitor

Page 10: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

10

Singleton – Katalog Bilgisi

Kategori Yaratımsal (Creational)

Amaç Bir sınıfın yalnızca tek bir örneğinin (instance) olmasını ve bu

örneğe global bir erişim noktası oluşturulmasını sağlamak. “just-in-time initialization” veya “initialization on first use”

kavramlarını gerçekleştirmek. Uygulanabilirlik

Bir sınıfın yalnızca bir örneğinin yaratılabilmesinin gerekli olduğu uygulamalar.

Ayrıca, “lazy initialization” (geç ilklendirme) ve global erişimin gerekli olduğu yerler.

Page 11: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

11

Singleton – Yapı

Page 12: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

12

Singleton – Kod

class Singleton {

private static Singleton instance;

// Note: Constructor is 'protected'

protected Singleton() { }

public static Singleton Instance() {

// Use 'Lazy initialization'

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

Page 13: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

13

Factory Method – Katalog Bilgisi

Kategori Yaratımsal (Creational)

Amaç Nesne yaratımı için bir arabirim tanımlamak, ancak hangi

sınıftan nesne yaratılacağına alt sınıfların karar vermesini sağlamak.

“Sanal” (virtual) bir yapıcı (constructor) tanımlamak. new operatörü zararlı kabul edilir.

Uygulanabilirlik Bir sınıf, yaratması gereken nesnelerin sınıflarını belirleyemez

durumdaysa. Bir sınıfın, yaratacağı nesnelerin belirlenmesini alt sınıflarına

ertelemesi gerektiğinde.

Page 14: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

14

Factory Method – Yapı

Page 15: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

15

Factory Method – Kod 1/2

static void Main()

{

// An array of creators

Creator[] creators = new Creator[2];

creators[0] = new ConcreteCreatorA();

creators[1] = new ConcreteCreatorB();

// Iterate over creators and create products

foreach(Creator creator in creators)

{

Product product = creator.FactoryMethod(); Console.WriteLine("Created {0}", product.GetType().Name);

}

}

Page 16: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

16

Factory Method – Kod 2/2// "Product"

abstract class Product { }

// "ConcreteProductA"

class ConcreteProductA : Product { }

// "ConcreteProductB"

class ConcreteProductB : Product { }

// "Creator"

abstract class Creator

{

public abstract ProductFactoryMethod();

}

// "ConcreteCreator"

class ConcreteCreatorA : Creator

{

public override ProductFactoryMethod()

{

return new ConcreteProductA();

}

}

// "ConcreteCreator"

class ConcreteCreatorB : Creator

{

public override ProductFactoryMethod()

{

return new ConcreteProductB();

}

}

Page 17: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

17

Adapter – Katalog Bilgisi

Kategori Yapısal (Structural)

Amaç Bir sınıfın arabirimini istemcinin (client)

beklediği başka bir arabirime dönüştürmek. Adapter, uyumsuz arabirimler nedeniyle birlikte çalışamayacak sınıfların birlikte çalışabilmesine olanak sağlar.

Mevcut bir sınıfı yeni bir arabirimle sarmalamak (wrap).

Eski bir bileşeni yeni bir sistemle uyumlu hale getirmek.

Uygulanabilirlik Mevcut bir bileşenin sunduğu cazip işlevsellik

nedeniyle kullanılmak istendiği ancak bu bileşenin “dünya görüşünün” geliştirilmekte olan sistemin mimarisiyle ve felsefesiyle uyumlu olmaması durumunda.

Page 18: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

18

Adapter – Yapı

Page 19: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

19

Adapter – Sequence Diagram

Page 20: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

20

Adapter – Kod

Bu tasarım kalıbı için örnek kodu sınıfta yazalım.

Page 21: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

21

Decorator – Katalog Bilgisi

Kategori Yapısal (Structural)

Amaç Bir nesneye dinamik olarak ek sorumluluklar eklemek.

Decorator, bir sınıfın işlevselliği genişletmek için alt sınıflar türetmeye oldukça esnek bir alternatif sunar.

Hediyeyi paketlemek, bir kutuya koymak, ve kutuyu paketlemek. Uygulanabilirlik

İstenilen nesnelere çalışma zamanında bir durum ya da davranışeklenmek istendiğinde (aynı sınıftaki diğer nesneleri etkilemeden).

Statik olması ve tüm sınıfı ilgilendirmesi nedeniyle kalıtımla alt sınıf türetmenin uygun olmadığı durumlarda (boş yere aşırısayıda alt sınıf kombinasyonu türetmek gerekeceği için).

Page 22: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

22

Decorator – Yapı

Page 23: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

23

Decorator – Kod 1/4

1. Create a “lowest common denominator” that makes classes interchangeable

2. Create a second level base class for optional functionality3. “Core” class and “Decorator” class declare an “isa” relationship4. Decorator class “hasa” instance of the “lowest common

denominator”5. Decorator class delegates to the “hasa” object6. Create a Decorator derived class for each optional embellishment7. Decorator derived classes delegate to base class AND add extra stuf8. Client has the responsibility to compose desired configurations

Page 24: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

24

Decorator – Kod 2/4

// 1. "lowest common denominator"

interface Widget { void draw(); }

// 3. "Core" class with "is a" relationship

class TextField implements Widget {

private int width, height;

public TextField( int w, int h ) {

width = w; height = h;

}

public void draw() {

System.out.println( "TextField: " + width + ", " + height );

}

}

Page 25: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

25

Decorator – Kod 3/4// 2. Second level base class with "isa" relationship

abstract class Decorator implements Widget {

private Widget wid;

// 4. "has a" relationship

public Decorator( Widget w ) { wid = w; }

// 5. Delegation

public void draw() { wid.draw(); }

}

// 6. Optional embellishment

class BorderDecorator extends Decorator {

public BorderDecorator( Widget w ) { super( w ); } public void draw() {

super.draw(); // 7. Delegate to base class and add extra stuff

System.out.println(" BorderDecorator");

}

}

Page 26: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

26

Decorator – Kod 4/4// 6. Optional embellishmentclass ScrollDecorator extends Decorator { public ScrollDecorator( Widget w ) { super( w ); } public void draw() { super.draw(); // 7. Delegate to base class and add extra stuffSystem.out.println( " ScrollDecorator" );

} }

public static void main( String[] args ) { // 8. Client has the responsibility to compose desired configurations

Widget aWidget = new BorderDecorator( new BorderDecorator(

new ScrollDecorator(new TextField( 80, 24 ))));

aWidget.draw(); }

Page 27: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

27

Decorator

Java I/O framework’ü Decorator kalıbına çok güzel bir örnektir.

Temel byte-tabanlı I/O yetenekleri InputStream & OutputStream sınıflarıyla sağlanmaktadır.

Çeşitli karakter-tabanlı okuma & yazma yetenekleri aynıframework içindeki decorator sınıflarca sağlanmaktadır: InputStreamReader/Writer FileReader/Writer BufferedReader/Writer

BufferedReader rdr = new BufferedReader(new InputStreamReader(

new FileInputStream(fileName)))

Page 28: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

28

Strategy – Katalog Bilgisi

Kategori Davranışsal (Behavioral)

Amaç Birbirinin yerine kullanılabilecek algoritmalardan oluşan bir

algoritma ailesi tanımlamak ve her bir algoritmayı enkapsüleetmek. Strategy sayesinde algoritmaların onları kullanan istemciden (client) bağımsız olarak değişebilmesi sağlanır.

Soyutlamayı bir arabirimde yakalamak ve implementasyondetaylarını türetilmiş sınıflara saklamak.

Uygulanabilirlik Algoritmanın sıklıkla değiştirilebilir olmasını sağlar ve aynı

zamanda alt sınıf türetmeye iyi bir alternatiftir.

Page 29: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

29

Strategy – Yapı

Page 30: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

30

Strategy – Kod 1/3static void Main()

{

// Context following different strategies

SortedList studentRecords = new SortedList();

studentRecords.Add("Samual"); studentRecords.Add("Jimmy");

studentRecords.Add("Sandra"); studentRecords.Add("Vivek");

studentRecords.Add("Anna");

studentRecords.SetSortStrategy(new QuickSort());

studentRecords.Sort();

studentRecords.SetSortStrategy(new ShellSort());

studentRecords.Sort();

studentRecords.SetSortStrategy(new MergeSort());

studentRecords.Sort();

}

Page 31: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

31

Strategy – Kod 2/3abstract class SortStrategy {

public abstract void Sort(List<string> list);

}

class QuickSort : SortStrategy {

public override void Sort(List<string> list) {

list.Sort(); // Default is Quicksort

Console.WriteLine("QuickSorted list ");

}

}

class ShellSort : SortStrategy {

public override void Sort(List<string> list) {

//list.ShellSort(); not-implemented

Console.WriteLine("ShellSorted list ");

}

}

Page 32: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

32

Strategy – Kod 3/3class MergeSort : SortStrategy {

public override void Sort(List<string> list) {

//list.MergeSort(); not-implemented

Console.WriteLine("MergeSorted list ");

}

}

class SortedList {

private List<string> _list = new List<string>();

private SortStrategy _sortstrategy;

public void SetSortStrategy(SortStrategy sortstrategy) {

this._sortstrategy = sortstrategy;

}

public void Add(string name) {

_list.Add(name);

}

public void Sort() {

_sortstrategy.Sort(_list);

}

}

Page 33: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

33

Command – Katalog Bilgisi

Kategori Davranışsal (Behavioral)

Amaç İstekleri (request) birer nesne olarak enkapsüle etmek ve böylece

istemcilerin farklı istekleri parametre olarak kullanabilmesine, sıraya sokmasına ve log’lamasına olanak sağlamak.

Geri alınabilir (undoable) işlemleri desteklemek. “Object-oriented callback” oluşturmak.

“Action” olarak da bilinir. Uygulanabilirlik

Talep edilen işlemle ilgili ya da talebin alıcısıyla ilgili özel herhangi bir bilgi sahibi olmaya gerek olmak nesnelere istekte bulunabilmeningerekli olduğu durumlarda.

Page 34: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

34

Command – Yapı

Page 35: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

35

Command – Kod 1/3

static void Main() {

// Create receiver, command, and invoker

Receiver receiver = new Receiver();

Command command = new ConcreteCommand(receiver);

Invoker invoker = new Invoker();

// Set and execute command

invoker.SetCommand(command);

invoker.ExecuteCommand();

}

Page 36: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

36

Command – Kod 2/3

abstract class Command {

protected Receiver receiver;

// Constructor

public Command(Receiver receiver) { this.receiver = receiver; }

public abstract void Execute();

}

class ConcreteCommand : Command {

// Constructor

public ConcreteCommand(Receiver receiver) : base(receiver) { }

public override void Execute() { receiver.Action(); }

}

Page 37: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

37

Command – Kod 3/3

class Receiver {

public void Action() {

Console.WriteLine("Called Receiver.Action()");

}

}

class Invoker {

private Command command;

public void SetCommand(Command command) {

this.command = command;

}

public void ExecuteCommand() {

command.Execute();

}

}

Page 38: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

38

Özet

Tasarım kalıpları, test edilmiş ve kendini ispatlamış geliştirme paradigmaları sunarak yazılım geliştirme sürecinin hızlandırılmasına katkıda bulunabilirler.

Etkili yazılım tasarımı, kodlama aşamasına kadar ortaya çıkmayabilecek sorunların da hesaba katılmasını gerektirir. Tasarım kalıplarının kullanılması ileride büyük sorunlara yol açabilecek küçük ama önemli noktaların önlenmesine ve ayrıca bu kalıplara aşina tasarımcı ve programcılar için kod okunabilirliğinin iyileştirilmesine yardımcı olur.

Kalıplar sayesinde, yazılım etkileşimi için iyi bilinen ve üzerinde uzlaşılmış isimler kullanılarak, geliştiriciler arasındaki iletişimi arttırmak mümkün olur.

Bu bölümde önemli tasarım kalıplarının sadece birkaç tanesine değinilmiştir. Diğer tasarım kalıpları ve daha fazla ayrıntı için Okuma Önerisindeki kaynaklara başvurabilirsiniz.

Page 39: BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler. Etkinliği kanıtlanmışkalıplara dayalıtasarlanan yazılım sistemlerine olan

39

Okuma Önerisi

Design Patterns, Erich Gamma, Richard Helm, Ralph Johnson, & John Vlissides, Addison-Wesley, 1995

Object-Oriented Software Development UsingJava, 2nd Ed., Xiaoping Jia, Addison-Wesley, 2003

http://sourcemaking.com/design_patterns