Java Günlüğüm
Yazılım, Java, BT, azıcık felsefe, biraz mizah...
  • Udemy Eğitimleri
  • Temiz Kod
  • Tasarım Kalıpları
  • Hakkımda
  • Arşiv
RSS
11 Şubat 2015

Tasarım Kalıpları: Proxy (Vekil) – III

Akin Java, Tasarım Kalıpları, Yazılım Modelleme design pattern, tasarım, tasarım desenleri, tasarım şablonu, tasarım şablonu nedir

Proxy tasarım kalıbıyla ilgili bir önceki yazıyı, “Proxy kalıbını kullanabileceğiniz ya da kullandığınız ne gibi durumlar olabilir ya da oldu?” şeklinde bir soruyla kapatmıştık. Bu kalıbın kullanılabileceği durumlara bir örnek daha verelim.

Eskiden, örneğin 80’li yıllarda ya da 90lı yılların başında, webin yeni yeni çıktığı dönemlerde kulandığımız bilgisayarlar, gateway denen ağ yapıları üzerinden internete bağlanırlar ve ihtiyacınıza göre http, ftp, telnet vb. protokolları kullanarak haberleşirlerdi. Dolayısıyla gatewaylerin arayüzlerinde, bu protokollarla ilgili istekleri karşılayan yapılar olurdu. (Bu anlamda gatewayleri, üzerinde protokollere karşılık gelen metotlara sahip sınıf olarak düşünebilirsiniz.) Bir müddet sonra bu durumun sakıncaları ortaya çıkmaya başladı ve internete çıkışın kontrol edilmesi gerekti. Örneğin belli protokolleri kullanmak, belli sitelere ulaşmak vb. konularında kısıtlamalara gidilmek istendi. Ya da yazışmaların filtrelenmesi ve belli anahtar kelimelerin olduğu yazışmaların engellenmesi gibi ihtiyaçlar ortaya çıktı. Fakat tüm bu kontrollerin var olan bilgisayarlarda, gatewaylerde ve protokollerde olabildiğince hiç bir değişikliğe gerek duyurmaması da ayrıca istendi. Aksi taktirde bu kontrollerin maliyeti çok yüksek olurdu. Örneğin makinalardaki tarayıcılar http ve https ile web ortamına ulaşıyorlarsa, bu kontrollerin olduğu durumda da aynı şekilde davranmalıydılar. Kontroller ise araya girerek çalışmalı ve duruma göre, haberleşmenin devam etmesine izin vermeliydiler. Bu şu anlama gelmekteydi: Bilgisayarlar hala sanki gateway ile haberleşiyormuş gibi davranmaya devam etmeliler ama gerçekte gateway ile değil de araya giren ve arayüzü tamamen gatewayler gibi olan ve kendilerine “proxy” denen, gerekli kontrol ve filtreleme işlerini yapan yapılar ile haberleşmeliler. Proxyler, kontrol ve filtrelerden sonra ya haberleşmeyi “buraya erişmeye yetkiniz yoktur” ya da “yasaklı site!” gibi bir uyarılarla kesmeliler ya da probem olmadığı durumlarda haberleşmeye izin vermeliler. Bu şekilde, makinalarla internet çıkışı sağlayan gatewayler arasına girerek bu tip kontroller yapan yapılara “proxy” denmesinin sebebi, bu yapıların tam da bu kalıpta olduğu gibi, “vekil” olarak davranmalarıdır. Bu tür vekillerin en temel iki özelliğini hızlıca tekrar edelim:

  • Gerçekte ulaşılmak istenen nesneyi saklamak ama bunu, saklanan nesne ile aynı arayüze sahip olarak yapmak ve bu şekilde “yokmuş gibi” davranmak. Bu durum, saklanan nesneye ulaşmak isteyen, onu bilen ve onunla haberleşebilen yapılarda (önceki örneğimizde vatandaş, bu örnekte ise bilgisayar) herhangi bir değişiklik yapmadan, araya bu tür vekiller sokmanızı sağlar. Çünkü vekiller “yokmuş gibi” (transparent) davranırlar.
  • Gerekli kontrol ve filtreleme işlerini yapmak. Vekiller bu işleri, yokmuş gibi davranarak yaparlar. Ben ilk bu tür proxylerin kullanıldığı ağ ortamların çalışmaya başladığımda, ftp, telnet, http vb. protokollerle örneğin tarayıcılar üzerinden çalışırken, daha önceki hale göre oluşan gecikmelerden, “araya proxy konmuş!”  yorumunu yapardım. Çünkü proxynin varlığını başka türlü anlamayabilirsiniz. (Gerçi sonraları tarayıcılarda proxy ayarları vb. ek işlerle proxyler hayatımızda fark edilmez olmaktan çıktılar.)

Şöyle bir soru sorulabilir: Neden kontrolleri gatewaylere koymuyoruz ki? Bu soru ile önceki yazıda ele aldığımız vatandaş-başbakan örneğindeki “neden bu kontrolleri başbakana koymuyoruz” sorusunun cevabı aynıdır: “Çünkü bu tür kontroller onların görevleri değil ki!” Düşünün bazı büyük markalar yogun ağ trafiğini etkin bir şekilde yönetmek için çok yetkin router, gateway vs. gibi, uzmanı olmadığım, tonla ağ yapısını hem donanım hem yazılım olarak yöneten yapılar üretiliyorlar. Bu yapıların temel görevi, http, ftp, telnet vb. protokolları gerçekleştirmek. Bu protokollarla ilgili, performans, ölçeklenirlik, uyumluluk vb. konularda envai çeşit detay var ve sonuçta zaten çok karmaşık yapılar ortaya çıkıyor. Bu yapılara, güvenlik kontrolleri ve filtreleme gibi farklı konularla ilgili yine son derece karmaşık ve özellikle de sıklıkla değişme eğiliminde olan yetkinlikleri koymak çok da tercihe dilecek bir durum değildir. Aynı şekide bu iki sorumluluk alanını birleştirmek, başbakanın önüne görüşülecek binelrce vatandaş listesini koymaktan farklı bir durum değildir. Fiziksel dünyada bu gibi durumlarda daima sorumlulukları ayırmayı tercihe diyorsak, “separation of concern” ya da “single responsibility” gibi prensipleri uyguluyorsak, soyut ve bundan dolayı anlaşılması ve yönetilmesi daha zor olan yazılım yapılarında bu prensipleri haydi haydi uygulamalıyız. Aki taktirde ne karmaşıklığı ne de değişimi yönetebiliriz. Aksi taktirde yazdığımız sınıflar da metotlar da devasa olur ve iki günde yazdığımız kodu değiştirmek bir haftayı alır. İşte bu yüzden tasarım kalıplarını bilmek ve uygulamak bize çok güzel bir sorumlulukları ayırma ve değişimi yönetecek şekilde nesnelere atama yeteneği kazandırır.

Tekrar esas problemimize dönersek, gateway, proxy ve bilgisayar arasındaki ilişkiyi proxy tasarım kalıbıyla modellersek örnek olarak şöyle bir yapıya ulaşabiliriz:

Network, internete açılacak yapıların arayüzüdür:

package org.javaturk.dp.pattern.gof.structural.proxy.network;

public interface Network {
	public void telnet(String ip, String targetIp) throws YasakKardesimException;
	public void ftp(String ip, String targetIp) throws YasakKardesimException;
}

Gateway, gerekte internet bağlantısı yapan yapıdır. Koddan da görüldüğü gibi Gateway, bir Network‘tür ve singletondır.

package org.javaturk.dp.pattern.gof.structural.proxy.network;

public class Gateway implements Network {
	private static Gateway gateway = new Gateway();

	public void ftp(String ip, String targetIp) {
		System.out.println(ip + " makes an ftp to " + targetIp + "\n");
	}

	public void telnet(String ip, String targetIp) {
		System.out.println(ip + " makes a telnet to " + targetIp + "\n");
	}
	
	public static Gateway getInstance(){
		return gateway;
	}
}

 

ProxyServer ise, bilgisayar ya da bu örnekte NetworkClient ile Gateway arasına giren proxy yani vekil nesnesidir. Bu yüzden ProxyServer, bir Network‘tür ve internete gerçek çıkışı sağlayan Gateway‘in tek olan nesnesine sahiptir:

package org.javaturk.dp.pattern.gof.structural.proxy.network;

public class ProxyServer implements Network {
	
	private Gateway gateway;
	
	public ProxyServer(){
		gateway = Gateway.getInstance();
	}
	
	public void ftp(String ip, String targetIp) throws YasakKardesimException{
		Logger.log(ip + ", " + targetIp + " adresine ftp yapmak istiyor");
		
		if(targetIp.startsWith("192"))
			throw new YasakKardesimException(targetIp + " adresine ftp yapmaniz yasaktir!");
		
		gateway.ftp(ip, targetIp);
	}

	public void telnet(String ip, String targetIp) throws YasakKardesimException{
		Logger.log(ip + ", " + targetIp + " adresine telnet yapmak istiyor");
		
		if(targetIp.startsWith("192"))
			throw new YasakKardesimException(targetIp + " adresine telnet yapmaniz yasaktir!");
		
		gateway.telnet(ip, targetIp);
	}
}

 

ProxyServer‘ın kullandığı Logger ise basit loglama yapan bir sınıftır:

package org.javaturk.dp.pattern.gof.structural.proxy.network;

import java.util.Date;

public class Logger {
	public static void log(String message){
		System.out.println(new Date() + ": " + message);
	}
}

 

NetworkServer ise bilgiayarları (ya da Network Client), ağ altyapısına bağlayan sınıftır:

package org.javaturk.dp.pattern.gof.structural.proxy.network;

public class NetworkServer {
	
	private static NetworkServer ns = new NetworkServer();
	private Network network;
	
	private NetworkServer(){
		network = new ProxyServer();
	}
	
	public Network getNetwork(){
		return network;
	}
	
	public static NetworkServer getInstance(){
		return ns;
	}
}

 

Pek tabi ki kodumuzun tam olması için YasakKardesimException isimli sıra dışı durum sınıfına da ihtiyacımız vardır:

package org.javaturk.dp.pattern.gof.structural.proxy.network;

public class YasakKardesimException extends Exception{
	
	public YasakKardesimException(String message){
		super(message);
	}
}

 

Bilgisayar gibi ağ hizmetlerini tüketen nesne ise bu örnekte NetworkClient‘dır. Bu sınfı aynı zamanda main metoda da sahiptir.

package org.javaturk.dp.pattern.gof.structural.proxy.network;

public class NetworkClient {

	public static void main(String[] args) {
		NetworkServer networkServer = NetworkServer.getInstance();
		
		Network network = networkServer.getNetwork();

		String myIp = "10.0.0.2";
		try {
			network.telnet(myIp, "88.168.2.200");
		} catch (YasakKardesimException e) {
			System.out.println(e.getMessage());
		}

		try {
			network.ftp(myIp, "192.168.2.200");
		} catch (YasakKardesimException e) {
			System.out.println(e.getMessage());
		}
	}
}

 

NetworkClient sınıfını çalıştırdığımzıda şı çıktıyı elde ederiz:

Wed Feb 11 14:01:23 EET 2015: 10.0.0.2, 88.168.2.200 adresine telnet yapmak istiyor
10.0.0.2 makes a telnet to 88.168.2.200

Wed Feb 11 14:01:23 EET 2015: 10.0.0.2, 192.168.2.200 adresine ftp yapmak istiyor
192.168.2.200 adresine ftp yapmanız yasaktır!

 

Bu yazıda hem  proxy kalıbının güzel bir örneğini gördük hem de hem genelde tasarım kalıplarının hem de özelde proxy kalıbının, sorumlulukları doğru nesnelere atamakta ve aralarını değişimi gözeterek ayırmakta bize nasıl yardımcı olduklarını gözlemledik.

 

Toplam görüntülenme sayısı: 1871

8 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
10 Şubat 2015

Tasarım Kalıpları: Proxy (Vekil) – II

Akin Java, Tasarım Kalıpları, Yazılım Modelleme tasarım, tasarım deseni, tasarım şablonu, tasarım şablonu nedir

Bir önceki yazıda proxy ya da vekil tasarım kalıbını anlatmıştık. Şimdi ele aldığımız ve bu kalıp ile kavramsal olarak çözdüğümüz problemin kodunu verip tartışmaya devam edelim.

Başbakan arayüzü:

package org.javaturk.dp.pattern.gof.structural.proxy.basbakan;

public interface Basbakan {
	
	public void dertDinle(String dert);
	
	public void isBul(String yakinim);

}

 

GerçekBaşbakan sınıfı, Başbakan arayüzünü gerçekleştirmektedir:

package org.javaturk.dp.pattern.gof.structural.proxy.basbakan;

public class GercekBasbakan implements Basbakan {

	@Override
	public void dertDinle(String dert) {
		System.out.println("Basbakan: Dinliyorum.");
	}

	@Override
	public void isBul(String yakinim) {
		System.out.println("Basbakan: Bana boyle isteklerle gelmeyin.");
	}
}

 

VekilBaşbakan sınıfı da Başbakan arayüzünü gerçekleştirmektedir, dahası GerçekBaşbakan sınıfının nesnesini bilmektedir. VekilBaşbakan sınıfının iki temel görevi vardır: İlki, Başbakan olarak görünmek, bunu bu arayüzü gerçekleştirerek elde ediyoruz. Bunun sebebi açıktır, Vatandaş daima Başbakan ile konuşmalıdır. Diğeri ise vekillik yapmak, yani gerekli kontrolleri yaptıktan sonra kendisine gelen istekleri GerçekBaşbakan‘a iletmek. Bu yüzden bu sınıf, GerçekBaşbakan sınıfının nesnesini , nesne değişkeni olarak almıştır ve tipik olarak bu sınıftaki metotlar GerçekBaşbakan‘daki aynı metotlara ulaşır. Bu sınıftaki “isBul()” metoduna baktığınızda göreceksiniz ki iş istekleri GerçekBaşbakan‘a iletilmiyor. Bu durumun sebebi GerçekBaşbakan‘ın “bana iş istekleriyle gelmeyin” demesidir 🙂 .

package org.javaturk.dp.pattern.gof.structural.proxy.basbakan;

public class VekilBasbakan implements Basbakan {
	
	private Basbakan gercekBasbakan = new GercekBasbakan();

	@Override
	public void dertDinle(String dert) {
		System.out.println("Vekil: Derdinizi dinliyorum.");
		
//		if(......)  // Bütün kontroller burada!
		gercekBasbakan.dertDinle(dert);
	}

	@Override
	public void isBul(String yakinim) {
		System.out.println("Vekil: Isteginizi dinliyorum.");
	}
}

 

BaşbakanlıkKalemi sınıfı ise aslen bir factory ayni üretici sınıftır ve üzerinde “banaBasbakaniVer()” metodu çağrıldığında sahip olduğu VekilBaşbakan nesnesini geri döndürmektedir. Lakin her VekilBaşbakan nesnesi aynı zamanda bir Başbakan nesnesi olduğundan, bu metodu çağıran Vatandaş için bir problem yoktur.

package org.javaturk.dp.pattern.gof.structural.proxy.basbakan;

public class BasbakanlikKalemi {
	
	private Basbakan basbakan;
	
	public BasbakanlikKalemi(){
		basbakan = new VekilBasbakan();
	}

	public Basbakan banaBasbakaniVer(){
		System.out.println("Basbakanlık Kalemi: Tabi efendim");
		return basbakan;
	}
}

 

Vatandaş sınıfı, BaşbakanlıkKalemi’nden aldığı Başbakan nesnesiyle konuşmakta ve derdini anlatıp, oğluna iş istemekte ve mutlu bir şekilde işini bitirmektedir.

package org.javaturk.dp.pattern.gof.structural.proxy.basbakan;

public class Vatandas {
	private Basbakan basbakan;
	
	public Vatandas(BasbakanlikKalemi kalem){
		basbakan = kalem.banaBasbakaniVer();
	}

	public String derdiniAnlat(){
		basbakan.dertDinle("Bir derdim var...");
		return "Yasasiiinnn!!!";
	}
	
	
	public String isIste(){
		basbakan.isBul("Oglum");
		return "Yasasiiinnn!!!";
	}
}

 

Son olarak da bu sistemi çalıştıran ve main metoda sahip olan Test sınıfı da şöyledir:

package org.javaturk.dp.pattern.gof.structural.proxy.basbakan;

public class Test {

	public static void main(String[] args) {
		BasbakanlikKalemi kalem = new BasbakanlikKalemi();
		Vatandas riza = new Vatandas(kalem);
		riza.derdiniAnlat();
		riza.isIste();
	}
}

 

Test sınıfını çalıştırdığımızda çıktımız da şöyle olur:

Başbakanlık Kalemi: Tabi efendim
Vekil: Derdinizi dinliyorum.
Basbakan: Dinliyorum.
Vekil: Isteginizi dinliyorum.

 

Bu kodlar ile Proxy kalıbının tipik bir uygulamasını görmüş olduk. Bu kalıp ile şunları sağladık:

  • Düzgün bir görev dağılımı: Herkes kendi işini yapıyor ve diğerleriyle haberleşiyor.
  • Gerçek başbakanı koruma: Hiç bir vatandaş doğrudan başbakana ulaşamıyor ama bundan haberi de yok, ulaştığını düşünüyor. Başbakana sadece vekil ulaşıyor çünkü vekilden eminiz, onun görevi bellidir.
  • Vatandaşın derdini başbakana anlatması.
  • Başbakanın ya da kontrol kurallarının değişmesinden vatandaş etkilenmemesi. Çünkü Vatandaş, arayüze güveniyor, onun gerçekleştirmesine değil: Program to an interface, not an implementation.

Bu yapıyla ilgili duruma göre şöyle değişiklikler de yapılabilir:

  • GerçekBaşbakan, singleton olabilir. Bu durumda başka hiç kimse GerçekBaşbakan‘ın nesnesini oluşturamaz.
  • VekilBaşbakan‘ın birden fazla nesnesi olabilir. Yani eğer Vatandaş sayısı fazla ise bu durumda vatandaşları sırada bekletmemek için VekilBaşbakan‘ın nesnelerinden oluşan bir havuz kurgulanabilir. Bu durumda her Vatandaş nesnesi farklı bir VekilBaşbakan nesnesiyle konuşacaktır. Bu şekilde aynı anda pek çok Vatandaş nesnesine hizmet verilebilecektir. Bu durumun tek problemi, bir çok VekilBaşbakan nesnelerinin ellerindeki dertleri GerçekBaşbakan‘a nasıl iletecekleridir. Çünkü bu durumda bir planlama gereklidir. VekilBaşbakan nesneleri eğer birer kanal (thread) olursa, bu durumda GerçekBaşbakan‘a ulaşmalarının kontrollü yani synchronized olması gerekecektir.

Şimdi size bir soru ile bu yazıyı bitirelim: Proxy kalıbını kullanabileceğiniz ya da kullandığınız ne gibi durumlar olabilir ya da oldu? Bu kalıbı probleminizi çözmede nasıl kullanırsınız ya da kullandınız? Temel nesneler neler olabilir ya da nelerdi?

 

Toplam görüntülenme sayısı: 1473

7 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
10 Şubat 2015

“Java Kodunuzun Nesne Merkezli Olmadıgının 10 İşareti” Seminerinin Videosu

Akin Java, Kültür, Bilgi ve Düşünce, Yazılım Modelleme design pattern, Kalıp, tasarım, tasarım şablonları

24 Ekim 2014’de Netaş’ta verdiğim “Java Kodunuzun Nesne Merkezli Olmadıgının 10 İşareti” seminerinin amatörce çektiğim videosuna buradan ulaşabilirsiniz. Bu seminerin sunumuna da buradan ulaşabilirsiniz. Beğenmenizi umuyor, yorumlarınızı da bekliyorum..

Malum ben bu türden seminerleri davet üzerine ve bedelsiz olarak veriyorum. 2 saati geçmeyecek şekilde, hem bilgilendirici hem de eğlendirici tarzda hazırlayıp verdiğim bu seminerlerle ilgili bilgilere blogumdaki “Seminerler” sayfasından ulaşabilirsiniz.

İyi seyirler.

Toplam görüntülenme sayısı: 692

6 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
10 Şubat 2015

Tasarım Kalıpları: Proxy (Vekil) – I

Akin Java, Tasarım Kalıpları, Yazılım Modelleme Desen, Kalıp, pattern, Şablon, tasarım, tasarım desenleri, tasarım şablonları

Tasarım kalıpları üzerine olan ilk yazıda şöyle demiştik: “Tasarım kalıpları, temel nesne-merkezli prensipleri kullanarak doğru sorumlulukları bulmamıza (finding responsibilities), değişimi göz önüne alarak bu sorumlulukları nesnelere dağıtmamıza (highly-cohesive objects) ve nesneleri, aralarında az bağımlılık olacak şekilde (lowly-coupled objects) kurgulamamıza yardımcı olur. Bir başka deyişle tasarım kalıpları, yüksek birliktelikli ve düşük bağımlılıklı yapıları nasıl kurgulayacağımızı, sıklıkla karşılaşılan problemler bağlamında, model olarak ortaya koyar.”

Şimdi de bu cümleyi daha iyi hazmetmek için, Proxy ya da Vekil kalıbımızı ele alalım. Malum “proxy” İngilizce’de vekil demek. Burada da vekalet kavramı üzerine kurgulanan bir yapı söz konusu. Vekil kalıbı ile yapmak istediğimiz şey, “herhangi bir sebepten dolayı bir nesneye olan erişimi kontrol etmektir”. Nitekim GoF’da da bu kalıbın amacı şöyle ifade ediliyor:

“Provide a surrogate or placeholder for another object to control access to it.”

Yani

“Kendisine erişimi kontrol etmek için bir nesneye geçiş sağla”.

Burada elimizde, kendisine erişimi, herhangi bir sebepten dolayı kontrol etmek istediğimiz bir nesne söz konusudur. Bu nesne çok değerli ya da çok tehlikeli olduğu için kendisine ulaşımı kontrol etmek isteyebiliriz. Yani kimse bu nesneye doğrudan ulaşmasın, arada ulaşımı sağlayan bir elçi, geçiş sağlayan nesne olsun isteriz. Ya da GoF’da anlatıldığı gibi bellek ve CPU açısından pahalı olan bir nesnenin oluşturulmasını, gerçekten o nesneye ihtiyaç duyuncaya kadar geciktirmek ama aynı zamanda sistemin sanki bu nesne zaten varmış gibi davranmasını isteyebiliriz. Örneğin, uygulamalarınızın “Help” dokümanlarını düşünün. Sistem ayağa kalkarken bu dokümanın da yüklenmesini istemezsiniz ama sistemin bundan haberdar olmamasını ve sanki bu doküman varmış yani yüklenmiş gibi davranmasını istersiniz. Tüm bu gibi durumlar, esas nesneye erişimi kontrol etmek için farklı sebepler demektir.

Şimdi bu kalıbı daha iyi anlayabilmek için, ihtiyacımızın ortaya çıktığı bir durumu anlatalım:

Malum, demokrasilerde halklar kendilerini, seçtikleri vekiller yardımıyla yönetirler. Dolayısıyla vatandaşın, kendisini yönetenlere erişme hakkı vardır. Erişilecek en tepe seçilmiş yönetici ise başbakandır. Yani vatandaşların başbakana erişimleri olmalıdır, bu onların hakkı, başbakanın ise sorumluluğudur. Buraya kadar tamam ama her önüne gelenin doğrudan başbakana erişebilir durumda olması çok da arzu edilen bir durum değildir. Örneğin böyle bir durum başbakan açısından güvenlik problemi oluşturduğu gibi, örneğin ülkemizde milyonlarca vatandaşın olduğu göz önüne, alınırsa pratik de değildir. Bu durumda başbakana erişimi kontrol etmemiz gereklidir fakat bunu yaparken vatandaşların rahatsız olmasını da engellememiz önemlidir.

Yukarıdaki problemde başbakan nesnesine erişimi, bu nesnenin hem değerli olmasından hem de erişecek nesnelerin sayıca çok olmasından dolayı, kontrol etmek istiyoruz. Dolayısıyla bu problemi vekil kalıbı yardımıyla çözmek için sorumluluklardan başlayarak ilerleyelim. Sorumluluklar nelerdir?

  • Başbakan, vatandaşın derdini dinlemek ve ona iş bulmak (:) ) gibi iki sorumluluğa sahip olsun.
  • Vatandaş da başbakana derdini anlatmak ve ondan iş istemek gibi iki sorumluluğa sahip olsun.

Buraya kadar kolay. Yukarıdaki sorumluluklardan Başbakan ve Vatandaş isimli iki nesneye ihtiyacımız olduğunu çıkarabiliriz. Yani şöyle bir sınıf diyagramına sahibiz:

Proxy0

Bu yapıdaki problem, Başbakan‘ın korunmuyor olmasıdır. Bu “korunmama” durumundan dolayı, Vatandaş, örneğin pek çok Başbakan nesnesi oluşturabilir. Başbakan‘ı singleton yaparak bunun önüne geçebiliriz ama aynı anda binlerce, milyonlarca Vatandaş nesnesinin Başbakan‘a gelişi güzel erişmesini engelleyemeyiz. Burada bir engelleyici, daha doğru ifadeyle kontrol edici, filtreleyici bir yapıya ihtiyaç vardır öyle ki Başbakan‘ın kimle hangi şartlar altında konuşacağı belirlenebilsin. Örneğin, Başbakan nesnesinin, her gün aksam saat 10:00 ile 12:00 arasında Vatandaş‘ların derdini dinlemek istemesi ama herhangi bir iş isteğini dinlemek istememesini nasıl bu yapıyla halledebiliriz? Eğer düzgün bir nesne kültürümüz yok ise, bu tür kontrolleri ya Vatandaş ya da Başbakan nesnesine, muhtemelen Başbakan‘a koyma eğiliminde oluruz. Bu ise problemli bir durumdur çünkü bu sorumluluk ikisinin de sorumluluğu değildir. Aşağıda resmedilen bu durumda Başbakan’ın koduna sıklıkla müdahele edilmesi gerekecektir. Her halükarda bu yapı, ne sorumlulukları ayırmakta ne de değişimi yönetmektedir.

Proxy1

Bu durumla ilgili bir başka problem hem Başbakan‘ın hem de kontrol yapısının zaman zaman değişeceği gerçeğidir. Yani örneğin Başbakan bir yurt dışı gezi yapacağı hafta rahatlıkla, “bu hafta dert dinleyemeyeceğim” diyebilir. Dolayısıyla bu yapıda en sık değişecek kısım bu kontrol mekanizmasıdır. Bu durumda kontrol sorumluluklarını arada bir nesneye yükleyip, bu nesnenin Vatandaş ile Başbakan arasında bir tampon oluşturması makul görünebilir. Bu durumda şöyle bir yapıya ulaşırız:

Proxy2

Bu yapının en büyük problemi ise, bu kalıbın amacına tamamen ters düzen bir durum: Vatandaş, Başbakan ile konuşmuyor, Vekil ile konuşuyor ve bu durum problemde bahsettiğimiz demokrasinin en temel şartını ihlal ediyor.

Açıkçası olması gereken durumda, Vatandaş, Başbakan ile konuştuğunu düşünmeli ama biz hala Başbakan‘ı korumalıyız. Bu duruma ancak Başbakan ile Vekil‘in aynı görünmelerini sağlayarak ulaşabiliriz. İki nesnenin aynı görünmesi ise arayüzlerinin aynı olması ve polymorphism sayesinde birbirleri yerine geçebilmeleriyle mümkün olur. Yani Vekil ve Başbakan, aynı arayüzü devralmalıdırlar. Yani, aşağıdaki gibi bir yapıya sahip olmalıyız.

Proxy3

Bu sınıf diyagramına göre, Vatandaş, Başbakan arayüzünü bilmekte ve onun bir nesnesiyle konuşmaktadır. Lakin, BaşbakanlıkVekili, Vatandaş‘a konuşması için GerçekBaşbakan‘ın bir nesnesini değil, VekilBaşbakan‘ın nesnesini geçmektedir. Bu durum, bize hem Vatandaş‘ın Başbakan‘la konuşmuş olmasını sağlayacak hem de GerçekBaşbakan‘ı korumamıza imkan verecektir çünkü Vatandaş, gerçekte VekilBaşbakan‘la konuşmaktadır. Bu yapıda VekilBaşbakan da yukarıda bahsettiğimiz, kontrol sorumluluklarını yerine getirecektir. Yani aslında GerçekBaşbakan‘ın neyi ne zaman dinleyeceğini belirleyen nesne VekilBaşbakan‘dır. Bu yüzden VekilBaşbakan, GerçekBaşbakan’ın nesnesine sahiptir ve kontrol kuralları çerçevesinde Vatandaş‘tan kendisine gelen istekleri, GerçekBaşbakan‘a iletecektir.

Bir sonraki yazıda bu çözümün kodlarına bakalım.

 

Toplam görüntülenme sayısı: 2256

10 Bunu beğendim 🙂
Tweet
Follow me
Tweet to @kaldiroglu
«< 23 24 25 26 27 >»

Günlüğüme Hoşgeldiniz

Bu günlükte, Yazılım Mühendisliği, Bilgi Teknolojileri, Java, kişisel gelişim ve zaman zaman da diğer konulardaki düşüncelerimi sizlerle paylaşacağım. Umarım beğenir ve hoşça vakit geçirirsiniz.

Her türlü düşüncenizi, yorum olsun, beğeni ya da eleştiri olsun, bana iletmenizi rica ediyorum sizden. Ayrıca bana akin@javaturk.org adresinden ya da Twitter'dan ulaşabilirsiniz. Videolarıma da buradan ulaşabilirsiniz.

Teşekkür ederim.

Akın Kaldıroğlu

Rahat Okumak İçin

A Decrease font size. A Reset font size. A Increase font size.

Sosyal Medya

  • Twitter
  • Facebook
  • LinkedIn
  • Youtube

Son Twitlerim

→ Takip Etmek İçin

Abone Olun

Emalinizi girerek yazılardan haberdar olun.
Loading

Son Yazılarım

  • Udemy Eğitimlerim Üzerine
  • (başlıksız)
  • Clean Code / Temiz Kod Eğitimi Udemy’de
  • Java ile Nesne-Merkezli Programlamaya Giriş Eğitimi Udemy’de
  • Selsoft Video Eğitimleri
  • Spring ile Kurumsal Yazılım Geliştirme
  • Corona Günlerinde Design Patterns
  • Corona Günlerinde Java
  • JDK 10 ve “var” Özelliği
  • Onur Özcan
  • Analist ve İş Bilgisi
  • Farklı Dillerin Bakış Açısıyla Nesne-Merkezli Programlama
  • Java Nedir?
  • Bilgi Teknolojilerinde Yetenek Yönetimi – II: Tanımlar ve Eleştiriler – I
  • Alelade Hikayeler – II: Bir Başka Performans Problemi

Yazı Kategorileri

Yazı Takvimi

Mart 2026
P S Ç P C C P
 1
2345678
9101112131415
16171819202122
23242526272829
3031  
« May    

Yazı Arşivi

Blogroll

  • Binnur Kurt'un Günlüğü
  • Ender'in Java Blogu
  • Erdem Seherler
  • Kızımın Günlüğü
  • Kurumsal Java
  • Levent Karagöl
  • Levent'in Java Blogu
  • Mert Can Akkan’s java tips,options, news…
  • Yaşar Safkan
  • Yasin Saygılı
  • Yazı Dünyası

Yazı Etiketleri

analiz Bilmek C Desen design pattern EJB Eğitim Fortran Hibernate Java Java'ya nasil baslarim Java dersleri Java EE Java Persistence API Java SE Java Sertifika Java Öğren Java öğreniyorum Java öğrenmek JPA Kalıp Kurumsal Java nesne nesne-merkezli No Silver Bullet object object-oriented Oracle Java Certifications pattern performans programlama programlama dilleri programlama nedir sertifika singleton tasarım tasarım deseni tasarım desenleri tasarım şablonu yazılım yazılım geliştirme Yazılım Mühendisliği yazılımın doğası yazılımın zorlukları Şablon

↑

© Java Günlüğüm 2026
Powered by WordPress • Themify WordPress Themes
 

Yorumlar Yükleniyor...