Open Closed Principle (OCP) Açık Kapalı Tasarım Prensibi KurumsalJava.com

Benzer belgeler
Loose Coupling (LC) Esnek Bağ Tasarım Prensibi KurumsalJava.com

Liskov Substitution Principle (LSP) Liskov un Yerine Gecme Prensibi KurumsalJava.com

.com. Özcan Acar 2009 Kurumsal Java.com

Facade (Cephe) Tasarım Şablonu KurumsalJava.com

Tasarım Prensipleri. KurumsalJava.com. Özcan Acar Bilgisayar Mühendisi

Özcan Acar 2010 Kurumsal Java Akademisi.com

Decorator Tasarım Şablonu

Business Delegate Tasarım Şablonu KurumsalJava.com

Chain of Responsibility Tasarım Şablonu KurumsalJava.com

Intercepting Filter Tasarım Şablonu KurumsalJava.com

Adapter Tasarım Şablonu

İçindekiler. Okuma lisansı info acar, için verilmiştir. Çoğaltılması ve dağıtılması yasaktır

abstract Sınıflar 1 Sınıf sınıf1 new class Ama aşağıdaki şekilde referans alınabilir;

NESNEYE YÖNELİK PROGRAMLAMA

Java ile Tasarım Prensipleri ve Tasarım Örüntüleri

Sunum İçeriği. Programlamaya Giriş

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

BMH-405 YAZILIM MÜHENDİSLİĞİ

.com. Özcan Acar 2009 Kurumsal Java.com

Yrd. Doç. Dr. Caner ÖZCAN

Scrum1.0 & Scrum2.0 & Scrum3.0

BLM 112- Programlama Dilleri II. Hafta 5 İşaretçiler (Pointers)

İçindekiler. Okuma lisansı info acar, için verilmiştir. Çoğaltılması ve dağıtılması yasaktır.

Arş.Gör.Muhammet Çağrı Gencer Bilgisayar Mühendisliği KTO Karatay Üniversitesi 2015

Start : Bu method init methodundan hemen sonra çalışır ve applet dosyası yürütülmeye başladığında çalışmaya başlar.

Yrd. Doç. Dr. Caner ÖZCAN

YAZILIM MÜHENDİSLİĞİ Şubat 2012 Yrd.Doç.Dr. Yunus Emre SELÇUK GENEL BİLGİLER

Javascript. 1) Notepad++ aşağıdaki kodları yazıp deneme.html olarak kaydedelim. 2) Biraz önceki sayfa sadece html kodların içeriyordu.

Builder Tasarım Şablonu KurumsalJava.com

Görsel Programlama DERS 02. Görsel Programlama - Ders02/ 1

Uzaktan Eğitim Uygulama ve Araştırma Merkezi

Üst Düzey Programlama

Sınıf Diyagramları Amaç: Sınıf Diyagramları Nasıl Çizilir?

Klavyeden Basit Giriş/Çıkış İşlemleri

Önemli noktalar. Paradigma Nesnelere Giriş Mesajlar / Ara bağlantılar Bilgi Gizleme (Information Hiding ) Sınıflar(Classes) Kalıtım/Inheritance

Sistem Geliştirme Yaşam Döngüsü (The Systems Development Life Cycle) (SDLC)

Öğr. Gör. Serkan AKSU 1

TEMEL BİLGİ TEKNOLOJİLERİ KULLANIMI

VERİ TABANI UYGULAMALARI

BİLİŞİM SİSTEMLERİNİN PRENSİPLERİ

Nesneye Dayalı Programlama

Bölüm 11. Soyut veri tipleri ve kapsülleme kavramları ISBN

RSA ANAHTAR DAĞITIMI VE RSA İLE DİJİTAL İMZA OLUŞTURMA

/*Aşağıda ki kodları doğru şekilde anlar ve kullanırsanız java da sınıfları biraz da olsa anlamış olursunuz.*/

YZM 2108 Yazılım Mimarisi ve Tasarımı

BİL-141 Bilgisayar Programlama I (Java)

Yazılım Kodlama ve İ simlendirme Standartları v1.0

Önsöz. İçindekiler Algoritma Algoritma Nasıl Hazırlanır? Yazılımda Algoritma Mantığı Nedir? 1.2. Algoritma Örnekleri ve Sorular

Test Güdümlü Yazılımın Tasarım Üzerindeki Etkileri KurumsalJava.com

HSancak Nesne Tabanlı Programlama I Ders Notları

ARDIŞIL DİYAGRAM YAPI DİYAGRAMI. Sistem Analizi ve Tasarımı Dersi

Dinamik Kodlama. [X] [X] Yeni Fonksiyon

Power BI. Neler Öğreneceksiniz?

9.DERS Yazılım Geliştirme Modelleri

YZM 2116 Veri Yapıları

BMH-405 YAZILIM MÜHENDİSLİĞİ

1.Yazılım Geliştirme Metotları 1

Ders 8 Konu Özeti ve Problemler

Giriş: Temel Adımlar YAZILIM GELİŞTİRME YAŞAM DÖNGÜSÜ. Belirtim Yöntemleri. Belirtim Yöntemleri

Varlık davranış modeli: Bu aşama her entity ye etki eden durumların tanımlandığı, modellendiği ve dokümante edildiği süreçtir.

BÖLÜM-IV ÜRÜN GELİSTİRME İŞLEMİ Genel Problem Çözme İşlemi

YAZILIM KAVRAMINA BİR BAKIŞ. Gürcan Banger Elektrik Yük. Müh. ESOGÜ - 9 Nisan 2007

Chapter 8 Yazılım Testi. Lecture 1. Chapter 8 Software testing

BİLİŞİM TEKNOLOJİLERİ WEB TASARIMI MODÜLER PROGRAMI (YETERLİĞE DAYALI)

PROGRAMLAMAYA GİRİŞ FONKSİYONLAR

Bölüm 3 Çevik (Agile) Yazılım Geliştirme. Ders 1

Yazılım Mühendisliği 1

BMS-302 İleri Web Programlama. İş Parçacığı (Thread) ve Soket (Socket) Programlama

Front Controller Tasarım Şablonu KurumsalJava.com

public class SalesLineItem // Java { private int quantity; private ProductSpecification description; public Money getsubtotal() {...

Programlama Giriş. 17 Ekim 2015 Cumartesi Yrd. Doç. Dr. Mustafa YANARTAŞ 1

Ders 8: Metotlar. barisgokce.com

MÜZİK VE GÖSTERİ SANATLARI TÜRK SANAT MÜZİĞİ BUSELİK MAKAMI VE REPERTUARI EĞİTİMİ MODÜLER PROGRAMI (YETERLİĞE DAYALI)

Yaşanmış Tecrübe Paylaşımı Önce Test Et Sonra Kodla XP Pratiği

NESNE TABANLI PROGRAMLAMA

İNŞAAT TEKNOLOJİSİ DEPREME DAYANIKLI YAPILARDA ZEMİN DENEYLERİ MODÜLER PROGRAMI (YETERLİĞE DAYALI)

BİLİŞİM TEKNOLOJİLERİ WEB PROGRAMCISI MODÜLER PROGRAMI (YETERLİĞE DAYALI)

Kalıtım (Inheritance)

Bir yazılım geliştirme metodolojisi aşağıdaki adımlardan meydana gelir; Yazılım geliştirme sürecine destek verecek araçlar, modeller ve yöntemler.

Görsel Programlama DERS 01. Görsel Programlama - Ders01/ 1

Yazılım Mühendisliği Bölüm - 3 Planlama

MAKİNE TEKNOLOJİSİ CNC FREZEDE PROGRAMLAMA - FANUC GELİŞTİRME VE UYUM EĞİTİMİ MODÜLER PROGRAMI (YETERLİĞE DAYALI)

SPORDA STRATEJİK YÖNETİM

Çizgilerin kalınlığını Dolguları Temel dönüşüm işlemlerini Bileşik nesne oluşturma işlemlerini kontrol etmemizi sağlar.

NESNEYE YÖNELİK PROGRAMLAMA Unified Modelling Language (UML) Bütünleşik Modelleme Dili

(Computer Integrated Manufacturing)

GÖRSEL PROGRALAMA HAFTA 2 PROGRAMLAMA DİLLERİNE GİRİŞ

Kavramsal Tasarım - I

Aşırı Programlama İçin Üç Yeni Pratik

Flyweight (Sinek Siklet) Tasarım Şablonu KurumsalJava.com

Bil101 Bilgisayar Yazılımı I. M. Erdem ÇORAPÇIOĞLU Bilgisayar Yüksek Mühendisi

VERİ YAPILARI VE PROGRAMLAMA (BTP104)

Android Ders Notları

Yazılım Çeşitleri. Uygulama Yazılımları. İşletim Sistemleri. Donanım

SİSTEM VE YAZILIM. o Bilgisayar sistemleri donanım, yazılım ve bunları işletmek üzere gerekli işlemlerden oluşur.

NESNEYE YÖNELİK PROGRAMLAMA. Yrd.Doç.Dr. Zeynep ORMAN

PYTHON PROGRAMLAMA DİLİ

BLM-112 PROGRAMLAMA DİLLERİ II. Ders-3 İşaretçiler (Pointer) (Kısım-2)

4. ÜRÜN GELİSTİRME İŞLEMİ

BİLİŞİM TEKNOLOJİLERİ GÖRSEL PROGRAMLAMA MODÜLER PROGRAMI (YETERLİĞE DAYALI)

Transkript:

Open Closed Principle (OCP) Açık Kapalı Tasarım Prensibi KurumsalJava.com Özcan Acar Bilgisayar Mühendisi http://www.ozcanacar.com

Yazılım disiplininde değişmeyen birşey varsa o da değişikliğin kendisidir. Birçok program müşteri gereksinimleri doğrultusunda ilk sürümden sonra değişikliğe uğrar. Bu doğal bir süreçtir ve müşteri programı kullandıkça ya yeni gereksinimlerini yada mevcut fonksiyonlar üzerinde adaptasyonları gerekçe göstererek programın değiştirilmesini talep edecektir. Tanınmış yazılım ustalarından Ivar Jacobson 1 bu konuda şöyle bir açıklamada bulunmuştur: All systems change during their life cycles. This must be born in mind when developing systems are excepted to last longer than the first version. Şu şekilde tercüme edilebilir: Her program görev süresince değişikliğe uğrar. Bu ilk sürümden ötesi düşünülen programların yazılımında göz önünde bulundurulmalıdır. Değişiklik kaçınılmaz olduğuna göre, bir programı gelecekte yapılması gereken tüm değişiklikleri göz önünde bulundurarak, şimdiden buna hazır bir şekilde geliştirmek mümkün müdür? Öncelikle şunu belirtelim ki gelecekte meydana gelecek değişikliklerin hepsini kestirmemiz mümkün değildir. Ayrıca çevik süreçlerde ilerde belki kullanılabileceğini düşündüğümüz fonksiyonların implementasyonu kesinlikle tabudur (istenilmeyen bir durum anlamında). Bu durum bizi programcı olarak gelecekteki değişiklikleri göz önünde bulundurarak, bir nevi hazırlık yapmamızı engeller. Çevik süreç sadece müşteri tarafından dile getirilmiş, kullanıcı hikayesi haline dönüştürülmüş ve müşteri tarafından öncelik sırası belirlenmiş gereksinimleri göz önünde bulundurur ve implemente eder. Kısacası çevik süreç geleceği düşünmez ve şimdi kendisinden beklenenleri yerine getirir. Böylece müşteri tarafından kabul görmeyecek bir sistemin oluşması engellenmiş olur. Çevik süreç büyük çapta bir tasarım hazırlığı ile start almaz. Daha ziyade mümkün olan en basit şekilde yazılıma başlanır. Her iterasyon başlangıcında implemente edilmesi gereken kullanıcı hikayeleri seçildikten sonra, mevcut yapının yeni gereksinimlere cevap verip, veremeyeceği incelenir. Büyük bir ihtimalle mevcut yapı yeni kullanıcı hikayelerinin implementasyonu için yeterli olmayacaktır. Bu durumda programcı ekip refactoring yöntemleriyle programın yapısını yeni gereksinimleri kabul edecek şekilde modifike eder. Bu esnada tasarım yapısal değişikliğe uğrar. Bu gerekli bir işlemdir ve yapılmak zorundadır, aksi taktirde bir sonraki iterasyon beraberinde getirdiği değişikliklerle programcı ekibini yazılım esnasında zorlayacaktır. Çevik süreç gelecekte olabilecek değişikleri göz önünde bulundurmadığına göre, programı bu değişikliklerin olumsuz yan etkilerine karşı nasıl koruyabiliriz? Bunun yolu her zaman olduğu gibi yazılım esnasında uygun tasarım prensiplerini uygulamaktan geçmektedir. Eğer çevik süreç bize gelecekte olabilecek değişikliklere karşı destek sağlamıyorsa, bizimde tedbir alarak çevik süreci, çevik prensiplere ters düşmeden takviye etmemiz gerekiyor. Çevik süreci, çevik tasarım prensiplerini kullanarak istediğimiz bir yapıda, bakımı ve geliştirilmesi kolay program yazılımına destek verecek şekilde takviye edebiliriz. Tekrar bölüm başında sorduğum soruya dönelim ve sorunun cevabını bulmaya çalışalım. Şu şekilde bir soru sormuştum: Değişiklik kaçınılmaz olduğuna göre, bir programı gelecekte yapılması gereken tüm değişiklikleri göz önünde bulundurarak, şimdiden buna hazır bir şekilde geliştirmek mümkün müdür? Bu mümkün değil demiştik. Lakin esnek bir tasarım 1 Bakınız: http://en.wikipedia.org/wiki/ivar_jacobson

oluşturarak önü açık ve gelecek korkusu olmayan bir program yapısı oluşturabiliriz. Bunu gerçekleştirmek için kullanabileceğimiz prensiplerin başında Open Closed Açık Kapalı prensibi (OCP) gelmektedir. Bertrand Meyer 2 tarafından geliştirilen bu prensip kısaca şöyle açıklanabilir: Programlar geliştirilmeye açık ama değiştirilmeye kapalı olmalıdır. Programı geliştirmek, programa yeni bir davranış biçimi eklemek anlamına gelmektedir. OCP ye göre programlar geliştirmeye açık olmalıdır, yani programı oluşturan modüller yeni davranış biçimlerini sergileyecek şekilde genişletilebilmelidirler. Bir modüle yeni bir davranış biçimi kazandırılarak düşünülen değişiklik sağlanır. Bu yeni kod yazılarak gerçekleştirilir ( bu yüzden bu işleme değiştirme değil, genişletme denir), mevcut kodu değiştirerek değil! Eğer kendinizi bir müşteri gereksinimini mevcut kod üzerinde değişiklik yaparken bulursanız, biliniz ki OCP prensibine ters düşüyorsunuz. Kod üzerinde yapılan değişiklik, bir sonraki gereksinimlerinde ayni şekilde implemente edilmesini zorunlu kılacaktır. Bu durum, kodun zaman içinde içinden çıkılmaz ve çok karmaşık bir yapıya dönüşmesini çabuklaştırır. OCP prensibinin nasıl uygulanabileceğini bir önceki bölümde yer alan RemoteControl TV örneği üzerinde inceleyelim. Resim 1 de görüldüğü gibi RemoteControl sınıfı TV sınıfını kullanarak işlevini yerine getirmektedir. Eğer RemoteControl sınıfını TV haricinde başka bir aleti kontrol etmek için kullanmak istersek, örneğin CDPlayer Resim 2 deki gibi değişiklik yapmamız gerekebilir. Bu noktada esnek bağ prensibini unutarak, resim 2 de yer alan çözümün bizim için yeterli olduğunu düşünelim. 2 Bakınız: http://en.wikipedia.org/wiki/bertrand_meyer

Kod 1 RemoteControl.java package org.cevikjava.design.ocp; TV ve CDPlayer sınıflarından nesneleri kontrol eder. @author Oezcan Acar public class RemoteControl Aleti acmak için kullanilan metot. public void on(object obj) if(obj instanceof TV) ((TV)obj).tvOn(); else if(obj instanceof CDPlayer) ((CDPlayer)obj).cdOn(); Aleti kapatmak için kullanilan metot. public void off(object obj) if(obj instanceof TV) ((TV)obj).tvOff(); else if(obj instanceof CDPlayer) ((CDPlayer)obj).cdOff(); Bu şekilde oluşturulan bir tasarım OCP prensibine ters düşmektedir, çünkü her yeni eklenen alet için on() ve off() metotlarında değişiklik yapmamız gerekmektedir. OCP böyle bir modifikasyonu kabul etmez. OCP ye göre mevcut çalışır kod kesinlikle değiştirilmemelidir. Onlarca aletin bulunduğu bir sistemde on() ve off() metotlarının ne kadar kontrol edilemez ve bakımı zor bir yapıya bürüneceği çok net olarak bu örnekte görülmektedir.

Bunun yanı sıra RemoteControl sınıfı TV ve CDPlayer gibi sınıflara bağımlı kalacak ve başka bir alanda kullanılması mümkün olmayacaktır. TV ve CDPlayer sınıflar üzerinde yapılan tüm değişiklikler RemoteControl sınıfını doğrudan etkileyecek ve yapısal değişikliğe sebep olacaktır. Resim 3 de yer alan çözüm OCP ye uygun yapıdadır, çünkü kod üzerinde değişiklik yapmadan programa yeni davranışlar eklemek mümkündür. OCP prensibi, esnek bağ prensibi kullanılarak uygulanabilir. OCP ye uygun RemoteControl sınıfının yapısı şu şekilde olmalıdır: Kod 2 RemoteControl.java package org.cevikjava.design.loosecoupling.design; RemotControlInterface sınıfını implemente eden sınıfları kontrol edebilen sınıf. @author Oezcan Acar public class RemoteControl Delegasyon islemi için RemoteControlInterface tipinde bir sınıf degiskeni tanimliyoruz. Tüm islemler bu nesnenin metodlarina delege edilir. private RemoteControlInterface remote; Sinif konstuktörü. Bir nesne oluşturma islemi esnasında kullanilacak RemoteControlInterface implementasyonu parametre olarak verilir.

@param _remote RemoteControlInterface public RemoteControl(RemoteControlInterface _remote) this.remote = _remote; Aleti acmak için kullanilan metot. public void on() remote.on(); Aleti kapatmak için kullanilan metot. public void off() remote.off(); on() ve off() metotları sadece RemoteControlInterface tipinde olan bir sınıf değişkeni üzerinde işlem yapmaktadır. Bu sayede if/else yapısı kullanmadan RemoteControlInterface sınıfını implemente etmiş herhangi bir alet üzerinde gerekli işlem yapılabilmektedir. Bu örnekte on() ve off() metotları değişikliğe kapalı ve tüm program geliştirmeye açıktır, çünkü RemoteControlInterface interface sınıfını implemente ederek sisteme yeni aletleri eklemek mümkündür. Sisteme eklediğimiz her alet için on() ve off() metotları üzerinde değişiklik yapmak zorunluluğu ortadan kalkmaktadır. Uygulanan OCP ve esnek bağ prensibi ile RemoteControl başka bir alanda her tip aleti kontrol edebilecek şekilde kullanılır hale gelmiştir. Stratejik Kapama (Strategic Closure) Ne yazık ki bir yazılım sistemini OCP prensibini uygulayarak %100 değişikliklere karşı korumamız imkansızdır. OCP ye uygun olan bir metot müşterinin yeni istekleri doğrultusunda OCP ye uygun olmayan bir hale gelebilir. Programcı metodu ilk implemente ettiği zaman, gelecekte olabilecek değişiklikler hakkında fikir sahibi olmayabilir. Metot OCP uyumlu implemente edilmiş olsa bile, bu metodun her zaman OCP uyumlu kalabileceği anlamına gelmez. Eğer kapama tam sağlanamıyorsa, kapamanın stratejik olarak implemente edilmesi gerekir. Programcı implementasyon öncesi meydana gelebilecek değişiklikleri kestirerek, implemente ettiği metotların kapalılık oranını yükseltmelidir. Bu tecrübe gerektiren stratejik bir karardır.

Programcı her zaman ne gibi değişikliklerin olabileceğini kestiremeyebilir. Bu durumda konu hakkında araştırma yaparak, oluşabilecek değişiklikleri tespit edebilir. Eğer olabilecek değişikliklerin tespiti mümkün değilse, beklenen değişiklikler meydana gelene kadar beklenir ve implementasyon yeni değişiklikleri de yansıtacak şekilde OCP uyumlu hale getirilir. EOF (End Of Fun) Özcan Acar