Post on 01-Nov-2019
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