TASARIM ÖRÜNTÜLERİ

Adapter

Structural Patterns bir örneği olan Adapter gerçek hayatta karşılığı olan bir tasarım örüntüsüdür. Bilgisayar ve TV için bir çok adaptör bulunur çünkü üretilirken belli standartlara göre üretilen bu 2 uç aslında karşı tarafın ihtiyacı olan veriyi veya veri yapısını farklı bir formatta tutmaktadır. Adaptör bunun dönüşümünü gerçekleştirerek 2 yapının bir arada çalışabilmesini sağlar.

Onur Dayıbaşı
Design Patterns

--

Adapter Örnekleri

Bilgi Notu: Diğer tüm Tasarım Örüntüleri yazıma bu linkten ulaşabilirsiniz.

Hangi Durumda

Bu durum yazılımda sizin veri yapınızın ihtiyaçlarının veya formatının dışarıdan kullandığınız bir kütüphane, servis vb uyuşmaması durumunda ortaya çıkar.

Siz kodunuzu geliştirirken sizin kullandığınız iş bağlamında o özellikleri farklı bir isimde veya formatta tuttuyor olabilirsiniz. Ama bunu bir Rendering kütüphanesi ile kullanıyorken, I/O kütüphanesi ile vb başka bir kütüphanede kullanıyorsanız kütüphane veya servisin kendi Interface olabilir.

Sizin veri yapınız bu Interface(Arayüze) uymadığında mevcut sınıflarınızı değiştirmek yerine bu sınıfların çevresini kaplayacak(wrapping) adapter sınıflar oluşturulur. Bu sayede mevcut çalışan yapıları bozmadan diğer kütüphaneler ile çalışabilecek hale gelmiş olursunuz.

Örnek Kullanımlar

JDK Adapter Pattern Örnekleri

  • java.util.Arrays#asList()
  • java.io.InputStreamReader(InputStream) (returns a Reader)
  • java.io.OutputStreamWriter(OutputStream) (returns a Writer)
  • javax.xml.bind.annotation.adapters.XmlAdapter#marshal() and #unmarshal()

Android UI Örneği

Örneğin Android’de ListView’lerin kullandığı ArrayAdapter sınıfıda Adapter örüntüsünü kullanır. Amacı Veri Modeli ile Arayüz arasında bağlantıyı sağlayabilmektir.

Yapısı

Object Adaptor

Object adaptör Client(İstemcinin) esas çağrı yapacağı nesnenin methodA fonksiyonu olmaması nedeniyle araya koyduğumuz Adaptor bu methodA isteğini karşılar ve bunu içerisinde referansını tuttuğu nesneden çağrımlar yaparak çözer. Bu runtime referans nesnenin Adaptor geçirilerek yapılır.

Kod

Adaptor Kod ornegi from SoureMaking.com

Değişim İhtiyacını Nasıl Kontrol Altına Alacağız ?

Örnekte görüleceği gibi mevcut yapılarımızda Line ve Rectangle çizdirme kodumuz çalışıyor olsun. (Şu anda Sysout ile console yazdırıyoruz ama siz ekrana çizdirdiğinizi düşünün) Bir SceneGraph kütüphanesi iterate ederek veritabanından okuduğu şekilleri çizdirecek ve bizim sistem ile entegrasyon sağlamak istiyoruz.

Bu durumda mevcut kodumuzu değiştirmek istemiyoruz çünkü başka yapılar bizim kodumuzu önceden kullanıyordu.

  • Method değişikliği yaparsak daha önceden Rectangle sınıfını kullanan diğer sınıflarımızıda değiştirmemiz gerekir
  • Sınıfları Shape extends edersek bu sefer her böyle yeni Interface gelen metodlardan dolayı mevcut sınıfımız mantığı büyüyecek.
  • Bu durumda en iyi yöntemlerden birisi mevcut sınıfların çevresini kaplayacak wrapper eklemek. (Yeni sınıf ekliyoruz. Mevcut yapıya dokunmuyoruz)

Değişim Yapılması Adaptör Kullanmaktan Vazgeçilmesi’de Gerekebilir.

Önceden çalıştığım bir projede 2 uygulama Senaryo Editörü ve Senaryo Oynatıcısı ortak nesneleri kullanıyordu ama farklı ekipler ve farklı ihtiyaçlardan dolayı ayrı zamanlarda geliştirilmiş ve veri yapılarında farklılıklar ortaya çıkmıştı.

Bu 2 uygulamanın birlikte çalışması ve birlikte aynı yapılar içerisinde kullanılması gerekmişti. bu durumda 40–50 farklı entity nesnesinin hepsi biri diğerine benzetilmek için Adaptor sınıflar yazıldı ve beraber çalışılması sağlandı.

Sonradan analizlerimiz sonrasında mevcut entity yapılarının farklı olmadığını sistemde 50 ‘tane entity için fazladan adaptor nesnesinin olduğuna ve yeni nesneler geldikçe ekleme yaptığımız sınıf sayısının çok fazlalaştığını farketmiştik.

Ve bu işin basit bir Refactoring değil Architecture Clearance (Mimari düzeltmeler) yapmamız gerektiği ve bu entity farklılaşmasını engellememizin gelecekte işleri yönetmek açısından çok önemli olduğunu farkettik. Ve Adaptör yöntemini terk ederek işi daha temelde çözmeye yöneldik.

Referanslar

Okumaya Devam Et 😃

Bu yazının devamı veya yazı grubundaki diğer yazılara erişmek için bu linke tıklayabilirsiniz.

--

--