www.fatihkabakci.com

Personal Website and Computer Science TUR EN

TASARIM DESENLERI(DESIGN PATTERN)

Last update: 4/25/2015 1:15:00 PM

Yazan:Fatih KABAKCI

Yazılım sistemlerinin gelişmesi paralelinde bir takım akımlarında oluşmasına yol açmıştır. Programlama dillerinin ihtiyaca göre gelişimi ile daha büyük kodların oluşturduğu bilgisayar programlarının bakımı ve geliştirilmesi de zorlaşmaya başlamıştır. Programcılar zaman zaman aralarındaki iletişimi kuvvetlendirmek için, problemlere özgü ortak bir yazılım lehçesi aramıştır.

Özellikle Nesneye Yönelik Programlama(Object Oriented Programming - OOP) felsefesinin de etkin bir şekilde kullanılması ile, bu akım üzerinde tasarlanacak modelleri doğurmuştur. Yeni bir yazılım felsefesinin çıkıp çıkmama ihtiyacı bir kenara dursun, mevcut yazılım felsefeleri içerisinde bir takım tasarım modellerine ihtiyaç duyulduğu aşikar bir hale gelmiştir. İşte bu noktada orjinal adı Design Pattern, Türkçe Literatürümüzde ise Tasarım Desenleri, Tasarım Şablonları, Tasarım Kalıpları kavramları ile yazılımda bir standartlaşmaya doğru gitme, ortak bir yapı oluşturma fikri ve çözümü ortaya çıkmıştır.

Bu çözüm sayesinde daha esnek, bakımı ve geliştirmesi kolay programlar oluşturulması, program kodlarını yazan kişilerin dışındaki programcılarında, daha önceden doğru bir şekilde oluşturulmuş tasarım desenleri ile, zorlanmadan ilk kez gördüğü program kodlarına aşina olması, onu kolaylıkla okuması,geliştirebilmesi, yazılan program kodlarının tekrar edilmeden esnek bir şekilde kodlanması, yazılan kaynaklara kolaylıkla metot, sınıf ve arabirimler eklenebilmesi/çıkarılabilmesi hedeflenmektedir.

OOP üzerinde çalışan ve herhangi bir programlama dilinden bağımsız olan design pattern'ler, Singleton, Factory, MVC, Fecade ve daha bir çok örneği ile literatürde çok sayıda tasarım desenlerine sahiptir.

Tasarım Bozukluklarının Belirtileri

Elinizin altındaki yazılımın, etkili program kodlarından mı, yoksa çürümeye yüz tutmuş verimsiz kod tasarım parçalarından mı oluştuğunu anlamanız için yazılımda tasarım bozuklarının belirtileri incelenmektedir. Bu noktada 4 adet tasarım bozukluğu bulunmaktadır.
  1. Rigidity - Değişmezlik: Yazılımın çok zor değişmesi anlamına gelir. Bir program kodundaki değişiklik, o yazılımın bir çok yerinin değişmesine neden oluyorsa, burada problem var demektir. Örnek olarak bir süper bir sınıftaki değişiklik yüzünden, kendisine bağlı tüm alt sınıfların bu değişikliğe maruz kalarak update edilmesi verilebilir.
  2. Fragility - Kırılganlık: 1.belirti ile ilişkili olan kırılganlık, program kodundaki bir değişikliğin bir çok yere olan etkisinden bahseder. Özellikle de değişen bir alandaki kod, kendisi ile mantıksal bir ilişkisi olmayan başka bir değişen kod yüzünden etkileniyorsa, buradaki problem oldukça ciddidir ve fixlenmesi gerekmektedir. Öte yandan yapılacak her bir fix, başka bir problemide yeniden açığa çıkarma ihtimalini de yansıtmaktadır. Bu yüzden 2.prensip olan kırılganlığın yok denecek kadar az olmasına dikkat edilmelidir.
  3. Immobility - Hareketsizlik: Program kodunun bir proje içerisinde sabit bir yerden kullanılması, diğer modüller tarafından kullanılmayacak halde olması anlamına gelir. Her defasında bir kodun bir çok yerde yeniden yazılmasına neden olarak, projeyi gereksiz bir çok koddan oluşturur.
  4. Viscosity - Yapışkanlık: Program kodundaki bazı problemler çözümlenirken, yazılımın tasarımı göz ardı edilerek, tasarım dışındaki çözümlemeler yapılması anlamına gelir.

Tasarım Deseni Prensipleri(Design Pattern Principles)

Yazılımların yukarıda bahsedilen bozuklardan korunması ve verimli program kodlarından oluşması için aşağıda dikkate alınması gereken bir takım prensipler açıklanmaktadır. Bu prensipler tasarım desenleri içerisinde uygulanan modellerin tümüdür. İngilizce litetatürde SOLID olarak anlatılan bu prensipler 5 adet olarak açıklanmaktadır.
  1. SRP (The Single Responsibility Principle - Tek Bir Sorumluluk Prensibi), Bir sınıfın değişmesi için yalnızca tek bir neden olması gerekir. Örneğin herhangi bir bilgi taşıyan rapor kağıdı, içeriği ve formatı nedeniyle değişebilir. Ancak bu iki değişiklik birbirinden ayrı şeylerdir ve izole edilmesi gerekir. Rapordaki değişiklik aynı anda iki değişikliği kapsamamalıdır.
  2. OCP (The Open Closed Principle - Açık Kapalı Prensibi), Bir sınıf davranışına, daha önceden yazılan kodu modifiye etmeden yeni bir özelliğin eklenmesi gerektiğini açıklar. Yazılımdaki esnekliğin bir örneğidir.
  3. LSP (The Liskov Substitution Principle - Liskov Değişiklik Prensibi), Türeyen sınıfların üst sınıfları tarafından referans verilerek kullanılmasını açıklar.Örneğin A, B sınıfının süper sınıfı iken, B nesnesi return eden bir metodun, dönüş tipinin A olarak deklare edilmesi verilebilir.
    A getObject() {
      return new B();
    }
    
  4. ISP (The Interface Segregation Principle - Arabirim Ayrıştırma Prensibi), Bu ilke arabirimleri uygulayan sınıfların gereksik metotları implement etmemesi gerektiğini açıklar. Bunun yerine iş parçacıklarının her birini arabirimlere ayırarak, sadece gerekli metotları içine alan bu arabirimlerin gerekli sınıflar tarafından implement edilmelidir.
  5. DIP (The Dependency Inversion Principle - Bağımsızlık Prensibi), Program içerisinde tanımlanan alt ve üst seviye sınıfların birbirleri üzerindeki bağımlılıklarını ayırmak için, alt sınıfların bir interface implement etmesi, ve o arabiriminde üst sınıfa bir üye değişken olarak tanımlanması gerektiğini açıklar. Böylece alt sınıflar ne kadar çok artmaya devam etse de, hepsi bir interface çatısı altında toplanacağı için, üst sınıfın bundan hiç bir şekilde etkilenmemesi hedeflenmektedir.

Örnek Tasarım Desenleri

Tasarım desenleri yapılarına göre 3 farklı kategoriye ayrılmaktadır. Aşağıdaki her bir tasarım deseni(design pattern) ayrı bir makale olarak anlatıldıkça link verilerek renklendirilecektir.


Yukarıdaki tasarım prensiplerine bağlı olarak Java Programlama Dili ile örnek bir uygulamayı inceleyelim.Örneğimizde bir Televizyon modelinin olduğunu ve kurulum teknolojilerine göre farklı tiplerde(Plasma,LCD,LED) bulunan televizyonların OOP içerisinde nasıl dağıldığını, tasarım kurallarına göre incelemeye çalışalım.

package Versions.V1;

/**
 * @author www.fatihkabakci.com
 * @summary The first Version of the class Television
 */
public abstract class Television {

   public void open() {

      System.out.println("Opened");
   }

   public void close() {

      System.out.println("Closed");
   }

   public abstract void connect();
}

class PlasmaTelevision extends Television {

   public void connect() {
      System.out.println("init A");
   }
}

class LCDTelevision extends Television {

   public void connect() {
      System.out.println("Setup B");
   }
}

class LEDTelevision extends Television {

   public void connect() {
      System.out.println("Construct C");
   }
}
İlk örnekte, Plazma, LCD ve LED teknolojilerini kullanan farklı farklı televizyon sınıflarının soyut Televizyon sınıfından türetildiği yukarıda gösterilmektedir. Bu örnek Nesneye Yönelik Programlamanın(Object Oriented Programming - OOP) en ilkel kurgularından biridir.Televizyon sınıfı içerisinde tanımlanmış soyut connect() metodu, türeyen her bir sınıf için ayrı ayrı tanımlanmaktadır. Bunun en büyük dezavantajı, Televizyon sınıfı içerisinde yapılacak soyut bir değişiklik tüm alt televizyon sınıfları tarafından uygulanmak zorunda olduğudur. Örneğin Televizyon sınıfı içerisine abstract disconnect() metodu eklendiğinde, bu metodu tüm alt sınıflar kendi içerisinde yeniden tanımlaması gerekecektir. Bu tasarım değerlerine aykırıdır.

Aşağıdaki ikinci versiyonda ise, modelin soyut sınıftan ziyade arabirimlere dayandırıldığı bir başka örnek gösterilmektedir. Buradaki fiziksel olarak tek fark tv kurulum ayarlarının farklı bir arabirim tarafından inşa edildiğidir.Tasarım prensiplerine bağlı olarak ISP prensibi uygulansada tek başına yeterli olmamakla beraber, birinci versiyondaki bozukluk hala geçerlidir. Arabirimde yapılacak bir değişiklik onu implemente eden tüm sınıflardaki etkisi olacaktır. Bu tasarım değerlerine aykırıdır.
package Versions.V2;

/**
 * @author www.fatihkabakci.com
 * @summary The Second Version of the class Television
 */

interface TVConnection {
   
   public void connect();
}

public abstract class Television {

   public void open() {

      System.out.println("Opened");
   }

   public void close() {

      System.out.println("Closed");
   }
}

class PlasmaTelevision extends Television implements TVConnection {

   public void connect() {
      System.out.println("init A");
   }
}

class LCDTelevision extends Television implements TVConnection {

   public void connect() {
      System.out.println("Setup B");
   }
}

class LEDTelevision extends Television implements TVConnection {

   public void connect() {
      System.out.println("Construct C");
   }
}
Televizyon modelinin aşağıdaki son versiyonunda ise tasarım prensiplerinin uygulandığı model gösterilmektedir. Bu model Kompozisyon tekniği ile kullanılmıştır. İlk olarak TvConnection adında bir interface oluşturulmuştur. connect() metodu ise bu arabirim içerisinde tanımlanmıştır. Buradaki en dikkat çekici davranış ise, TvConnection arabirimi, Television sınıfı içerisinde bir üye member olarak deklare edilmesidir. Buna komposizyon adı verilir. Komposizyonun bir diğer avantajıda, yapısal olarak bir sınıfın başka bir sınıftan türeme zorunluluğunu sırf özel bir iş için ortadan kaldırmasıdır.

Artık tv kurulumu Television sınıfı içerisinde tanımlanan TvConnection referansı tarafından idare edilecektir. Buradaki setConnect() metodu hangi tip televizyon tarafından kullanılacaksa, ona ait setlemeyi yapmaktadır. Dikkat çekici bir diğer nokta ise, oluşturulan TvConnection arabirimini implement eden ayrı bir HDMICable sınıfının oluşturulmasıdır. Bu sınıf, HDMI kablo kullanan tüm televizyon türleri için bir emsal teşkil edecektir. TvConnection arabiriminde yapılacak bir değişiklik sadece HDMICable sınıfında yansıyacaktır. Böylelikle onu komposizyon olarak kullanan diğer alt sınıflar ondaki değişiklikten tamamen soyutlanmış olacaktır.
package Versions.V3;

/**
 * @author www.fatihkabakci.com
 * @summary The Last Version of the class Television
 */
abstract class Television {

   private TVConnection connector;

   public void open() {

      System.out.println("Opened");
   }

   public void close() {

      System.out.println("Closed");
   }

   public void connect() {

      connector.connect();
   }

   public void setConnect(TVConnection cable) {
      connector = cable;
   }
}

/*
 * TvConnection Interface
 */
interface TVConnection {

   public void connect();
}

class HDMICable implements TVConnection {

   public void connect() {

      System.out.println("init A");
   }
}

class PlasmaTelevision extends Television {

}

class LCDTelevision extends Television {

}

class LEDTelevision extends Television {

}

public class TvTest {
   public static void main(String args[]) {

      Television plasmaTv = new PlasmaTelevision();
      plasmaTv.setConnect(new HDMICable());
   }
}

main() metodu içerisindeki uygulamada ise, yeni bir Plasma Televizyon oluşturulmaktadır.plasmaTv adı verilen bu nesneye, HDMICable özelliği verilmektedir. Bu sayede sadece TvConnection ve onu uygulayan HDMICable ve uygulayacak diğer tipte kablo sınıfları arasında etkileşim olacaktır. Son versiyondaki bu örnek, tasarım prensiplerinin tümünü şu şekilde içermektedir.

  1. SRP - TvConnection değişirse sadece kurulum nedeniyle değişir.
  2. OCP - HDMICable sınıfına eklenecek bir metot, ekstradan hiç bir değişikliğe neden olmayacaktır.
  3. LSP - Television plasmaTv = new PlasmaTelevision(); ifadesi ile plasmaTv nesnesinin bir Televizyon nesnesi olarak Plazma Televizyon olduğunu gösterir.
  4. ISP - Tv kurulum modelini TVConnection ve HDMICable arabirimlerine ayrılmıştır. Böylelikle yapısal olmayan miras zorunluğu ortadan kalkmıştır.
  5. DIP - Televizyon sınıfı içerisine eklenen connector kompositörü ile alt sınıflardaki değişiklik Television sınıfını etkilemeyecektir.

Özet olarak tasarım prensiplerindeki kurallar, programınız içerisinde değişebilecek modülleri belirleyip, bu modülleri esnek bir yapı ile tasarlayarak onları 'değişmez' hale getirmektir. Burada değişmezlik program kodunun bütünü için değil, alt yapısı, structure' ı içindir. Kodların değişmesi değil gelişmesi birincil amaçtır. Bir sınıfa yeni bir metot, yeni bir özellik eklendiğinde veya çıkarıldığında, bunun mümkün mertebe de en az sınıf veya kod tarafından etkilenmesini hedeflenmektedir. Kod içerisinde yapılacak bir değişiklik olabildiğinde tek bir yerden yapılıp, değişiklik yapılan nokta ile bağımlılığı(dependency) bulunan diğer kodların tek tek update edilmesinden kaçınılmalıdır. Kısacası temel amaç işlevsel olarak merkezi minimum kod değişikliğidir.
There has been no comment yet

Name:


Question/Comment
   Please verify the image




The Topics in Computer Science

Search this site for





 

Software & Algorithms

icon

In mathematics and computer science, an algorithm is a step-by-step procedure for calculations. Algorithms are used for calculation, data processing, and automated reasoning.

Programming Languages

icon

A programming language is a formal constructed language designed to communicate instructions to a machine, particularly a computer. It can be used to create programs to control the behavior of a machine. Java,C, C++,C#

Database

icon

A database is an organized collection of data. The data are typically organized to model aspects of reality in a way that supports processes requiring information.

Hardware

icon

Computer hardware is the collection of physical elements that constitutes a computer system. Computer hardware refers to the physical parts or components of a computer such as the monitor, memory, cpu.

Web Technologies

icon

Web development is a broad term for the work involved in developing a web site for the Internet or an intranet. Html,Css,JavaScript,ASP.Net,PHP are one of the most popular technologies. J2EE,Servlet, JSP,JSF, ASP

Mobile Technologies

icon

Mobile application development is the process by which application software is developed for low-power handheld devices, such as personal digital assistants, enterprise digital assistants or mobile phones. J2ME

Network

icon

A computer network or data network is a telecommunications network that allows computers to exchange data. In computer networks, networked computing devices pass data to each other along data connections.

Operating Systems

icon

An operating system is software that manages computer hardware and software resources and provides common services for computer programs. The OS is an essential component of the system software in a computer system. Linux,Windows

Computer Science

icon

Computer science is the scientific and practical approach to computation and its applications.A computer scientist specializes in the theory of computation and the design of computational systems.