Data Vinci 18 : Loosely coupled

Tahmini Okuma Süresi: 10 dakika

Bugün geçen yazılarımda değinmiş olduğum “high cohesion” kavramının ekürisi olan “loosely coupled” kavramına değineceğim. Yazdığımız programların “object oriented programming” prensiplere uydurulması noktasında dikkate alınması gereken bir diğer güzide kavram “loosely coupled“. “Gevşek bağ” olarak Türkçe’ye çevirebileceğimiz bu vatandaş tasarladığımız bileşenlerin birbirleriyle olan ilişkilerin en aza indirilmesine dayanır.

60288347.jpg

Günlük hayattan bir örnek vermek gerekirse, en göze çarpan örnek Apple ailesi ürünlerinde karşımıza çıkmaktadır. Bu noktada herhangi bir eleştiri yapmak adına değil durumun anlaşılması adına bu örneği veriyorum. Apple Fanboy’lar az ötede oynayın… Örneğin bir Iphone telefonunuz var ve bir şekilde bataryası ile ilgili sorun yaşadı ve bataryası kullanılmaz hale geldi. Siz son kullanıcı olarak ne yapabilirsiniz? Servise götürürsünüz. Başka bir çare yok. Apple ailesi ürünlerinde bataryalar cihaza entegre olduğu için bataryada çıkacak bir sıkıntı tüm cihazı kullanılmaz hale getirmektedir. Oysa batarya harici bir bileşen olarak sunulsa idi bataryadan kaynaklanan bir sıkıntı batarya değişimi ile kolayca giderilebilirdi. Bu noktada cihaz ile batarya arasındaki “gevşek olmayan bağ” yüzünden sıkıntı büyüdü.

Yazdığımız kodlarda birbirleriyle ne kadar sıkı bir bağa sahipse, karşılaşılan problemlerin giderilmesi de o kadar zorlaşacaktır. Bu noktada şunu ayırt etmek gerekir. “Tight coupling” problemi aslında kod yazarken yaşanılan bir problem değil, kodun tasarlanması aşamasında oluşan bir problemdir.

Loosely coupled bir yaklaşım için kullanabileceğimiz objelerden birisi interface‘dir. Bu soyut objeler sayesinde, kullanılan sınıflar arasındaki bağ azaltılabilir. Her ne kadar örneklemeler kodlar kullanılarak yapılıyor olsa da aslında bu yaklaşım kodlama ile olmayıp daha çok tasarımı ilgilendirir. Fakat illa ki fakir bedenimiz kod ile izah arıyor ise aşağıdaki kodların üzerinden karşılaştırma yapabiliriz.

Sıkı bağlı tasarım: (Tightly Coupled):

Sıkı bağlı tasarımda objelerin işlemleri birbirlerine bağımlı hâldedir.

Örnek şu şekilde; Vatandaşımız fakir ruhunu bir kitap ile beslemek adına kitap okumak istiyor. İlgili örnekte bir adet Person sınıfı ve bir adet Book sınıfı yer almakta. Bu iki obje ile kitap okuma metotunu çalıştırmak istiyoruz.

Bu sınıfların etkileşimleri ise şu şekilde olacaktır.

Buraya kadar hiç bir sıkıntı yok. Program basit. Bir kişi bir kitap okumak istiyor. Bunun için Read methodu var, kitap yapıcı metota veriliyor. Basıyor kırbacı başlıyor kitabını okumaya. Böylece vatandaş cahil kalmıyor. Buradaki sıkı bağ kitap ile kişi arasında fakat bu ihtiyaç değişmediği sürece sıkıntı yok. Fakat kişi kitabı klasik basılı kitap değil de elektronik bir ortamda okumak istese? İşte bu durumda kitap ve kişi arasında bağ programcının da “ayak bağı”. Tam bayrakları asacaktık. Patladık. Programda bu tarz bir genişlemeye olanak sağlayacak yapı mevcut değil. O yüzden “bizamla değilsin programcı” otur sıfır.

Gevşek bağlı tasarım: (Loosely Coupled):

Şimdi aynı örneği başka bir basit bir yaklaşım ile tekrar örnekleyelim.

Person sınıfı için tek değişiklik yapıcı metotun aldığı book argümanının tipi. IBook tipinde bir parametre ile çalışacak. Böylelikle book tipini genişletebilir bir yapıda kullanacaktır.

IBook arayüzü book özelliği gösteren tüm sınıflara bir taslak sağlayacak soyut bir yapı. IBook tipinden türeyen tüm objeler bu özellikleri kullanabilir.

Book sınıfı IBook tipini miras almakta, böylelikle IBook sınıfının sunduğu özellikleri kullanabilecek.

Benzer şekilde Ebook sınıfı da   IBook  arayüzünü miras alıyor.

Program artık farklı tiplerde kitapları da destekleyebilir hâle kavuştu. Fakat buradaki tasarımda hâlâ bir takım eksikler var. Çünkü yapıcı metota vermiş olduğum tip hangi tip ise vatandaş o tipte kitap okuyabiliyor. Fularlı bir vatandaş çıkıp kardeşim ben hem ebook hem de book okumak istiyorum derse, önce hortumla dövülür sonra program buna destek verememekte denir. Yeterince gevşek değil demektir. Bunu sağlamak için metota parametre geçilebilir.

Gördüğünüz gibi bir fularlıyı ayazda bırakacak değiliz. Şartları fulara uygun hale getirmek boyun borcumuz.

Bu basit örnek ile Gevşek bağlılık kavramını anlatmaya çalıştım. Bilenler tekrar etmiş, bilmeyenler ise fularlılık dünyasına bir adım daha yaklaşmış oldu.

Bu yazıda geçen kodlara github hesabımdan ulaşabilirsiniz: Loose Coupling

TL;DR

Bu yazıda yazılım geliştirme konseptlerinden Loosely Coupled başlığına değinmeye çalıştım. Bu tarz konulara aşina olmak, mümkün mertebe bu tarz prensipleri uygulamak önemli. Hayallar gevşek bağlı kodlar, hayatlar “if if if for for for” olmaması  dileklerimle.

Derin okuma isteyenler: Martin Fowler dayımızın şu yazısını inceleyebilirler.

Umarım faydalı bir yazı olmuştur.

keep_calm

Leave a Reply

Your email address will not be published. Required fields are marked *