BÖLÜM4 TASARIM KALIPLARI fileTasarım Kalıpları Tasarımda yeniden kullanımı(reuse) destekler....

Preview:

Citation preview

YZM311YAZILIM YAPIMI

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

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

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.

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.

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).

6

Tasarım Kalıpları

7

Yaratımsal (Creational) Kalıplar

Abstract Factory Builder Factory Method Object Pool Prototype Singleton

8

Yapısal (Structural) Kalıplar

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

9

Davranışsal (Behavioral) Kalıplar

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

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.

11

Singleton – Yapı

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;

}

}

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.

14

Factory Method – Yapı

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);

}

}

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();

}

}

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.

18

Adapter – Yapı

19

Adapter – Sequence Diagram

20

Adapter – Kod

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

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).

22

Decorator – Yapı

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

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 );

}

}

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");

}

}

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(); }

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)))

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.

29

Strategy – Yapı

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();

}

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 ");

}

}

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);

}

}

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.

34

Command – Yapı

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();

}

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(); }

}

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();

}

}

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.

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

Recommended