• Anasayfa
  • Hakkımızda
  • Etkinlikler
  • Destek Verin
  • Site Haritası
  • Giriş Yap
  • Üye Ol
  • Facebook
  • Twitter
  • RSS
Yazılım Dilleri
  • Soru - Cevap
  • EĞİTİM SETİ
  • KATEGORİ
  • DUYURU
  • TEKNOLOJİ HABERLERİ

Son Sorular

  • 8/2/2020 11:38:31 PM'Basit' Yazılım Dili
  • 6/25/2020 3:18:13 PMderleme hatası
  • 12/11/2017 4:49:15 PMWindows Hizmeti Hk.
  • 4/23/2016 12:55:33 AMC programlama 2 oyun

Popüler Sorular

  • 5/27/2012 5:49:50 AMAsp.Net ile Date time alana veri ekleyemiiyorum ?
  • 4/2/2012 12:45:18 AM.exe uzantılı dosya için dijital imza nerde nasıl alınır.
  • 5/12/2012 8:44:49 AMAcil Yardım
  • 5/27/2012 1:46:51 PMveri tabanı bağlantısı
  • .Net Framework
  • 8085 Assembly
  • Active Directory
  • ADO.NET
  • Android
  • Apple IOS
  • Arduino
  • ASP.NET
  • ASP.NET MVC
  • Blackberry
  • C#.Net
  • C++
  • CCG Framework
  • CISCO
  • CSS
  • Diğer
  • Dreamweaver
  • Entity Framework
  • Exchange Server
  • Gömülü Sistemler
  • GSM Programlama
  • Güncel
  • Güvenlik
  • HTML5
  • Java
  • Javascript / JQuery
  • Jira
  • Kariyer ve İş Yaşamı
  • LibreOffice
  • LINQ
  • Linux
  • Matlab
  • Microsoft Dynamics CRM
  • Mobil Uygulama Geliştirme
  • MySQL
  • NoSQL
  • Oracle
  • OWIN
  • PFSense
  • PHP
  • Powershell
  • Python
  • Sanallastirma
  • SAP-ABAP
  • SCOM 2012
  • SEO
  • Sharepoint 2010
  • Sharepoint 2013
  • Silverlight
  • Sistem Analiz ve Tasarımı
  • SQL Server
  • Symantec
  • TFS
  • T-SQL
  • Ubuntu
  • VB.NET
  • Veritabanı Yönetim Sistemleri
  • Visual Studio
  • VMware
  • WCF
  • Web Hosting
  • Windows 8
  • Windows Azure
  • Windows Phone 7.1
  • Windows Phone 8
  • Windows Server
  • Wordpress
  • WPF
  • Xamarin
  • XNA
  • Yazılım Mühendisliği
  • Yöneylem Araştırması
  • ASP.NET MVC
  • Entity Framework
  • Javascript / JQuery
  • LINQ
  • PHP

Son Duyurular

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

IPhone 6 ve IPhone 6 Plus Teknik Özellikleri ve Fiyatı

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

DELL'in Yeni Projesi: USB Bilgisayar (Project Ophelia)

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Windows Phone Youtube Uygulaması Google ve Microsoft ile Yeniden Yapılıyor

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Android ve Apple IOS Telefonlar için Blackberry Messenger (BBM)

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

Nokia Lumia 925 Teknik Özellikleri, Lumia 928 ve 920 ile Karşılaştırması

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

LG Optimus G Pro Özellikleri ve Gözle Video Oynatma Teknolojisi

Proxy Pattern Kullanımı ve Örnek Uygulama

Proxy Pattern Design Pattern (tasarım deseni) nasıl nasıl kullanılır, örnek uygulama üzerinde inceleyelim.

08.11.2013

Yazar: Hakan Keskin (Google+)

Kategori: Yazılım Mühendisliği

7176

PROXY PATTERN

 

Proxy pattern, kendisinden yeni bir örnek (instance) oluşturulduğunda, oluşturma ve/veya hafızada yer tutma maliyeti yüksek olan sınıfları (class), sadece o sınıf içindeki bir method çağrıldığında oluşturmak; böylece, sınıfın sisteme getireceği yükü azaltmak ve aynı method çağrıları için daha önce oluşturulmuş olan örnekleri (instance) kullanarak, bu şekilde performans artışı sağlamak amacı ile oluşturulmuş bir dersen (pattern) dir.

Bu tanımı biraz açacak olursak;

Bir methodumuz olduğunu ve bu method içinde pek çok işlemin yapıldığını düşünelim. Yapılan işlemlerden birisi de, resim yükleme işemi yapan bir methodun çağırılması olsun. Bu işemi yapan methodun çağrılabilmesi için, öncelikle ilgili sınıftan (class) bir örnek (instance) oluşturulması gerekir. Bu işlemin ardından da bazı başka işlemler yaptığımızı ve resim oluşturma methodunu çağırmadan hemen önce, methodumuz içinde bir hata aldığımızı düşünelim. Bu durumda, resim oluşturma methodu çalıştırılamamış olacak, ama o methodun içinde bulunduğu sınıf, önceden oluşturulmuş ve RAM’e yüklenmişi olacaktır. Ancak, oluşurken sisteme yük getiren bu sınıf, malesef kullanılamamış ve boşuna yüklenmiş olacaktır. Oysa, bu sınıf sadece ilgili method çağırıldığında yüklenmiş olsa, gereksiz örnek oluşturma durumlarından kurtulmuş ve kodumuzu daha performanslı çalıştırmış olacağız.

Ayrıca bu modelde, işlemin başlangıcında hazırlanmış olan nesneyi, her sorgulamada tekrar tekrar oluşturmak zorunda kalmadan, hazırda var olan nesneyi kullanarak istenen işlemi gerçekleştirebiliyoruz.

Bu patern özellikle, büyük veri akışları sözkonusu olduğunda, kodumuzun performansına önemli katkı yapan bir pattern’dir.

Proxy patern’i kod örneği ile de görelim şimdi.

Proxy Pattern Interface

Şekil 1

Öncelikle, yukarıda şekil 1’de görüldüğü gibi, IImage isimli bir interface oluşturuyoruz ve bu interface içine “ShowImage()” isimli bir method prototipi ekliyoruz.

 
  Proxy Pattern Load Image Class

 

Şekil 2

Daha sonra; resim yükleme işlemini yapan bir sınıf oluşturuyoruz ve bu sınıfımızı IImage interface’inden türetiyoruz (inherit ediyoruz). Dikkat ederseniz, sınıfa resimin yolunu (path’i) string olarak alan bir yapıcı (constructor) method eklenmiştir. Bu şekilde sınıftan bir örenek oluşturulurken, yüklenmesi istenen resmin yolu da aynı anda verilebilir.

Daha sonra, resim gösterme işlemini yapacak olan “ShowImage()”  isimli method yazılıyor.

Şimdi sıra, istemci ile asıl işi yapacak olan sınıf arasındaki iletişimi sağlayacak olan vekil (proxy) sınıfımızı oluşturmakta. Böyle bir sınıf altta şekil 3 ile gösterilmiştir.

Proxy Pattern Image Proxy Class

Şekil 3

Bu sınıf da, IImage interface’inden türetilmiş, resimin yolunu (path) string olarak alan bir yapıcı (constructor) methoda ve ShowImage()  isimli methoda sahiptir.  Yani “ShowImage()”  isimli methodun içindeki kod farklılığı haricinde, daha önce, asıl işlemi yapması için oluşturmuş olduğumuz sınıfın aynısı. (Bir de “private IImage proxyFieldImage;” satırı eklenmiştir.)

 

Proxy Pattern Örnek Uygulama

Şekil 4

Main methodu içinde, asıl işi yapan LoadImage isimli sınıfdan birer örnek (instance) oluşturmak yerine; görüldüğü gibi, LoadImage sınıfı ile aynı özelliklere sahip, vekil (proxy) sınıf olan ImageProxy isimli sınıftan birer örnek (instance) oluşturulmuştur. Çünkü, bu sınıfın oluşturulma maliyeti, asıl işimizi yapacak olan LoadImage isimli sınıfı oluşturmaktan çok daha azdır. Şuanda, LoadImage sınıfı içinde, gerçekten resim yükleme işlemi yapmadığımız için, oldukça sadec bir sınıf. Ama, burada gerçek kodlarımız olsaydı, oldukça karmaşık ve büyük bir sınıf olacaktı.

Daha sonra, vekil (proxy) sınıftan oluşturulan nesler aracılığı ile, gene vekil sınıf içindeki, vekil durumunda olan “ShowImage()” isimli method çağırılıyor. Vekil method içinde IImage tipinde proxyFieldImage isimli değişkenin değerinin null olup olmadığı kontrol ediliyor, null ise LoadImage sınıfından bir örenk oluşturuluyor, null değilse, var olan örnek (instance) kullanılarak, LoadImage sınıfındaki “ShowImage()” isimli method çağırılıyor.

Not: Herhangi bir sınıftan oluşturulan bir örnek (instance), o sınıfın miras aldığı sınıf tipindeki değişkene atanabilir. Bizim öreneğimizdeki tüm sınıflar, IImage interface’inden miras aldığı için, sınıflardan oluşturulacak örnek (instance), bu interface tipindeki değişkene atanabilir.

Main methodu içndeki işleyişe bakacak olursak;

“image1.ShowImage();” isimli method çağrısında, ImageProxy isimli sınıf içinde blunan proxyFieldImage isimli değişkenin değerinin null olduğunu ve bu nedenle, LoadImage isimli sınıfdan birer örnek (instance) oluşturulduğunu görürüz. Aynı şey ikinci method çağrısında da olacaktır. Ancak, üçüncü çağrıda gene “image1” değişkeni kullanıldığından ve bu değişken için daha önce LoadImage isimli sınıfdan bir örnek oluşturulmuş olduğundan, yeni bir örnek oluşturulmayacak, var olan örnek kullanılacaktır. Yani, daha önce method çağrısı yapıldığı için oluşturulan bir sınıf örneği, aynı method çağrısı daha sonra başka bir parametre ile yapıldığında yeniden kullanılacaktır.

Bu pattern’de, hem sadece method çağrısı yapıldığı zaman ilgili sınıftan bir örnek (instance) oluşturulması, hem de aynı method çağrıları için, ilgili sınıfın daha önce oluşturulmuş olan bir örneğinin kullanılması, bize önemli derecede performans kazandıracaktır.

Yazar Hakkında

Hakan Keskin

Hakan Keskin

www.yazilimdilleri.net

1997 yılında Elektrik-Elektronik Mühendisliği bölümünden mezun oldu. 2002 yılından beri profesyonel olarak yazılım geliştiriyor. Çeşitli firmalarda; araç takip, personel devam kontrol, otopark otomasyonu, çevre güvenlik, telemetrik kontrol, hemşire çağrı, Gsm-Gprs haberleşme, alarm kontrol sistemleri ve e-devlet projeleri geliştirdi. 2009 yılından buyana, e-devlet projelerinde, yazılım altyapısı (framework) çalışmalarında bulunmaktadır.

Sosyal Medya

ORANLAR

  • 7176izleme

Arkadaşlarınla Paylaş

  • Tweet

0 Yorum

Yorum Yaz / Soru Sor

Lütfen yorum yazmak veya soru sormak için üye girişi yapınız.

Son Yorumlar

  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Böyle bir sayfalama ağ trafiğini hafifleti...
  • Merhaba, ellerinize sağlık çok yardımcı ol...
  • Merhaba Bu uygulama örneğinden ASP.net ...
  • Hocam Link başka sayfaya yönlendiriyor.

En Güncel Sorular

  • Bilgilendirme maili (C#.Net)
  • Power Pivot (Sharepoint 2010)
  • BigInteger, BigDecimal (Asp.Net ve Asp.Net MVC)
  • visual C# ile asp nette veritabanı islemleri (Asp.Net ve Asp.Net MVC)
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ? (Sharepoint 2010)

En Son Cevap Verilen Sorular

  • Bilgilendirme maili
  • BigInteger, BigDecimal
  • visual C# ile asp nette veritabanı islemleri
  • Share Point ile Dosya Arşiv Yönetim Sistemi yapılabilir mi ?
  • txt dosyasına veri yazma

Twitter

Takip et: @yazilim_dilleri

En Çok Okunanlar

Elif BAYRAKDAR

C# ile SQL Server Bağlantısı, Insert, Update ve Delete Sorguları

23.05.2013

  • 123776
  • 0
Hakan Keskin

C# ile Windows Service Projesi Oluşturma, Debug Etme ve Setup Hazırlama

17.12.2013

  • 70839
  • 0
batuhan avlayan

Php - Mail Gönderme (İletişim Formu)

02.09.2013

  • 51496
  • 0

Sponsorlar

KODLAB
Pluralsight
Exchange server is
Office 365
YAZILIM DİLLERİ
Yukarı Çık
  • Hakkımızda
  • Facebook
  • Twitter
  • RSS

© Yazılım Dillerinin Buluşma Noktası | Kaynak belirtildiği sürece makaleler kopyalanabilir.
YazilimDilleri.Net sitesinde yer alan kullanıcıların oluşturduğu tüm içeriklerin yayınlanması ile ilgili yasal yükümlülükler içeriği oluşturan kullanıcıya aittir, YazilimDilleri.Net hiçbir şekilde sorumlu değildir.

Kapat

Giriş Yap

Kullanıcı Adı

Şifre

Şifremi Unuttum

KULLANICI GİRİŞİ