Öncelikle “Aspect Oriented Programming”(AOP), “Object Oriented Programming”‘in bir sonra ki aşaması değil. Bazı kavramların ortak olmasından dolayı ilk akla gelen soru işaretleri bu yönde oluyor. AOP‘de, yazılımın karmaşıklığını gidermek adına gerekebilecek bir programlama yöntemi. Tıpki OOP gibi. Yani OOP ölüyor, yerine AOP geçiyor gibi bir durum söz konusu değil. OOP’e alternatif bir şey olmadığı şeklinde düşünmekte, AOP anlamak için fayda var…

Peki nedir bu AOP? AOP‘ı basitçe Türkçe’ye çevirirsek bazı şeyleri anlamak adına belki yardımcı olur…Bu bağlamda “Görünüşe Yönelik Programlama” benim en tercih ettiğim bir çeviri oluyor. AOP, yazılımdaki birbiri ile kesişen ilgileri(cross-cutting concerns) ve bu ilgilerin oluşturduğu karmaşıklığı çözmek adına ortaya çıkmış bir method aslında.

Yazılım geliştirken, en zorlayıcı kısım genellikle birbiri ile kesişen ilgileri basitleştirmektir. Neden böyle bir basitleştirme içerisinde olmaya gerek var ki şeklinde bir soru sorabilirsiniz… Geliştirdiğimiz uygulamaların yaşam süresinde oluşabilecek, yeni gereksinimleri, sorunları daha kolay yönetebilmek adına birbiri ile kesişen ilgileri en basit halde ele almamız gerekir…Haa yok ben bir kere yazacağım,çalışacak, sonra bir daha dokunmayacağım şeklinde bir uygulama geliştirmekteyseniz bunlara çok da kafa yormaya gerek yok açıkcası.

AOP, az önce bahsettiğim birbiri ile kesişen ilgileri basitleştirmek ve hatta ayırmak adına kullanılabilecek bir yöntem. Hemen bu noktada da OOP’de de bu tarz şeyleri yapabileceğimiz yöntemler var şeklinde düşünebilirsiniz…Doğrudur,var…Ancak zaman zaman yeterli olamıyor ne yazık ki…Ya da bazı şeyleri daha karmaşıklaştırıyor…Bu noktada “zaman” kelimelerinin altını çizmekte fayda var sanırım. Çünkü bu konuda AOP’ı düşünmeye sebep olan, OOP’den farklı yönlerini ortaya çıkaran kavram “zaman” kavramı…AOP, yazılımın yaşam süresi boyunca oluşabilecek ilgilerin bir biri ile kesişmesini ve karmaşıklığa yol açmasını engellemek adına OOP’den farklılaşıyor. Biraz daha teknik olarak açıklamak gerekirse, bir uygulamanın run-time süresinde ortaya çıkabilecek ilgileri ayırmak açısından farklılaşıyor diyebiliriz. AOP’i yazımın başında “Görünüşe Yönelik Programlama” şeklinde çevirmeyi tercih etmiştim. Görünüş olarak anlamlandırdığım kavram, uygulamanın kendisinin ya da içerisinde ki nesnelerin durumları diyebilirim.

Biraz örnek ile daha net bir şekilde anlaşılacağını düşünmekteyim…Mesela standart bir örnek olarak “İnsan”ı ele alalım yapmaya. Çok tozla gaz bulutu kısmına gitmeden, her insanın ilk başta bir bebek olduğu döneme gidelim. Yani insanın görünümün bir bebek olduğu zamana…Bir bebek yürüme eyleminin yerine emekler, konuşamaz, garip sesler çıkarır…Zamanla insanın durumu değişir…Büyür,konuşmaya başlar, yürür…Görünüşü değişir…Daha sonra biraz daha büyür…Okula başlar,sosyal hayatı oluşur…Lise,üniversite derken iş hayatı…Bütün bu farklı dönemlerde, farklı görünüşlerde olur. Bu görünüşlerin sağladığı ya da sebep olduğu yeni,farklı ama bir biri ile kesişebilen ilgileri ortaya çıkar. Mesela liseye giden bir öğrenci, aynı zamanda basketbol kursuna gider. İş hayatı olduğu döneme geldiğimizde, iş yerinin vermiş olduğu görevlerden sorumluyken aynı zamanda sosyal hayatında ki ilişkilerden sorumludur.Haftada 3 kere arkadaşlarıyla buluşur,3 kere spor yapar falan filan…Biraz daha yaşlanınca, görünümü yine değişir…Farklı ilgiler ortaya çıkar…Ama yine insandır…Ehliyet kimliği ile şöför olur, TC kimliği ile hastanede hasta olur…Ama hep insandır…Şimdi bunun basitçe bir kodunu yazmaya çalışalım…

public class Insan
    {
        int yas = 0;
        public Insan()
        {
            if (yas == 0)
            {
                Emekle();
                Konus(false);
            }

            yas++;
            //Bir sürü başka şey olabilir zamanla...
            //..
            //.
            yas++;
            if (yas > 2)
            {
                Yuru();
                Konus(true);
            }

            yas++;
            if (yas > 6)
            {
                OkulaGit();
                SosyalHayatOlustur();
            }

            yas++;

            if (yas > 25)
            {
                IseGit();
                if (EhliyetVarMi())
                    ArabaSur();
                if (HastaMi() && SigortaVarmi())
                    DoktoraGit();
            }
            ..........
            ....
            ..
            ...
        }
    }

Fark edeceğiniz gibi bu basir pseudo kodunda bile bir çok karışıklık, birbiri içersine geçmiş ilgi mevcut. Bu nesnenin yaşam süresi boyunca bunlar gibi bir şey farklı ilgi ortaya çıkabilir ve birbirlerini etkileyebilir. İşte bu ilgileri ayırabilmek adına AOP methodları karşımıza çıkıyor.

Bu tarz birbiri ile kesişen ilgileri ayırmak mevcut compiler yaklaşımı ile biraz zor aslında. Çünkü zaman içerisinde ortaya çıkabilecek bu ilgileri dinamik olarak birbirleri ile ilişkilendirmek ya da ayırmak biraz zor. Ama gelişen yazılım geliştirme metodları ve derleyiciler ile bu tarz yaklaşımları daha kolay uygulayabilir hale geleceğiz. Bu noktada AOP geliştirmesi yapamıyoruz gibi bir şey anlaşılmasın ama…OOP yaklaşımı ile de AOP’in çözmeye çalıştığı sorunları, AOP yaklaşımı ile çözmek mümkün. .NET tarafında olsun, Java tarafında olsun ve hatta C++ tarafında olsun AOP yöntemlerini uygulamak mümkün. .NET tarafında AOP yaklaşımı uygulayabileceğimiz yöntemler ve çeşitli sınıflar mevcut. Attribute‘ları kullanarak ya da ContextBoundObject sınıfını kullanarak benzer yaklaşımları yapmak mümkün. İlerleyen yazılarımda nasıl yapacağımız konusunda daha geniş örnekler vermeye çalışacağım. Umarım AOP’in ne olduğu ve niçin ihtiyaç duyabileceğimiz sorularına biraz olsun cevap verebilmişimdir. Her türlü soru ve düşüncelerinizi çekinmeden paylaşabilirsiniz…Bir sonraki yazıda görüşmek üzere…