Previous
Next

Service Oriented Architecture (SOA)

by Cem Kefeli 6. Ekim 2013 14:29

Service Oriented Architecture (SOA)Müşterilere verilen hizmetlerin birer servis olarak düşünülmeye başlamasını ve SOA (Service Oriented Architecture) yaklaşımını birbirlerini tamamlayan, bir elmanın iki parçası gibi düşünebiliriz. Bu bir dönüşüm... Uygulama/sistem temelli bir yaklaşım yerine servis kavramı üzerine inşa edilen bu konseptin çok anlamlı bir gerekçesi de var aslında. Bu gerekçeyi basit anlamda ele alalım;

Müşteriler almış oldukları hizmetin hangi uygulamadan hangi sistemden sağlandığını ve bu hizmetin teknolojideki karşılığını tabiki bilmiyorlar. Ama biliyor oldukları en önemli veri, örneğin telekomünikasyon sektörü için ‘Telefon numarası yönlendirme hizmeti’ aldıkları ya da örneğin bankacılık sektörü için ‘Vadeli hesap oluşturma’ hizmeti aldıkları diyebiliriz. Sunulan çeşitli hizmetlerin teknolojik karşılığı olarak bu işi gerçekleştiren uygulamalar dünyasına şimdi tekrar dönelim. Müşterinin almış olduğu bu hizmetlerin her birinin karşısında bir IT/NW servisi bulunuyor. Bu servisler de farklı farklı uygulamalar, farklı farklı sistemler üzerine dağıtılmış halde bulunabiliyor. Yani müşteriye verilen bir hizmetin mutlaka tek bir uygulama üzerinden sunulması gibi bir zorlama yok. Hatta tam tersine günümüzde işler kompleks bir hal aldığı ve her hizmeti tek bir uygulama üzerinde toplamanın imkan dahilinde olmadığı bir noktaya geldiğimiz için bir servisi verebilmek amacıyla birden çok uygulama/sistem/servis senkron ya da asenkron bir şekilde iş yapmak durumunda kalıyor. Dolayısıyla en başa dönecek olursak, bugünün koşullarının ve iş gereksinimlerinin getirmiş olduğu doğal bir sonuçtur aslında SOA yaklaşımının oluşması. Madem müşteri servis temelli hizmet alıyor, aldığı hizmet kompleks ve iş ihtiyaçlarına göre değişiyor o halde bu hizmetin karşılığındaki teknolojik yapının da servis temelli bir yaklaşım üzerine temellenmesi daha sağlıklı olacaktır. Sonuç olarak bir tanım ortaya koymamız gekirse;

SOA, iş gereksinimlerini esnek bir şekilde karşılayabilmek amacıyla her birisi kendi işinde özelleşmiş, tanımları da net bir şekilde ortaya koyulmuş servislerin birbiri ile uyum içinde çalışmasını sağlayan bir orkestrasyondur.

Dilimiz döndüğünce bir tanım ortaya koyduğumuza göre artık bu tanımın içerdiği söyleme biraz daha yakından bakabiliriz;

İş gereksinimleri
SOA, günün birinde teknoloji ile ilgilenen birkaç mühendisin çay sohbetinde ‘Hadi bizim şu mimarimizi bir değiştirilim!’ düşüncesiyle ortaya çıkan bir konsept olarak düşünülmemelidir. Bu noktaya gelinmesini sağlayan yegane etmen yine iş gereksinimleridir. Yani bu düşünce "Yapılan işi nasıl daha düzenli, esnek ve yüksek çıktı alacak şekilde tasarlayabiliriz?" sorusuna cevap olarak doğmuştur.

Esnek
SOA, yinelenen yapıları pek sevmez. Bir servis, birden fazla servis tarafından kullanılabilir. Yani bir servis, yalnızca tek bir başka servis tarafından kullanılması amacıyla yazılmıyor. Süreçler de zaten bu felsefeye göre tasarlanırlar ki bir iş isteği sonucunda yapılacak değişiklik kolayca tüm servislerde aktif olabilisin. Dolayısıyla irili ufaklı birçok servisin varlığı, değişiklik yapılması ve süreçlerin güncellenmesi aşamasında esneklik sağlamaktadır. SOA, iş yapma, iş değiştirme becerisine hız kazandırmaktadır. Fazlası...

JAVA - Nested (Gömülü), Inner (Dahili), Local (Lokal) ve Anonymous (İsimsiz) sınıflar

by Cem Kefeli 1. Kasım 2012 13:35

Tüm java makalelerime buradan ulaşabilirsiniz...Java

Java'da her şey sınıflardan oluşuyor demiştim.Sınıf tanımlamak kolay, sınıfların örneklerinden nesneler oluşturmak da kolay. Fakat işin özüne inecek ulursanız bazı trig'ler ile karşılaşmaya başlayacaksınız. Bu yazının başlığında geçen sınıf türleri de işte bu tirg'lere birer örnek. Olmasalar ne olurdu? Çok net bir şekilde, İsimsiz Sınıflar hariç hiç bir şey olmazdı diyebilirim aslında. Dedim ya birkaç trig. Dilin esnekliği ve sunduğu olanaklar ile ilgili tamamen. Zaten bu kavramlar Java'ya özgü birşey de değiller. OOP dilleri için genel bir konsepttir. Türkçe'ye çevrilmiş halleri ise bana hep oldukça karışık gelir, ama yazı boyunca aşağıdaki anlamları ifade ettiğini bilerek okuyunuz lütfen, her ne kadar ben hep Türkçe isimleri kullanacak olsam da;

Nested Classes <--> Gömülü (İç içe geçmiş) sınıflar
Inner Classes <--> Dahili sınıflar

"Peki işe yararlar?" sorusuna gelirsek, Gömülü Sınıflar benzer görevi yapan sınfları daha okunaklı ve anlamlı bir şekilde kullanılabilir hale getirmek için uygundurlar mesela. 'Biz bu işi zaten paketler (packages) ile yapmıyor muyduk?' derseniz hiç bir şey diyemem, çünkü aynen öyle. Dahili Sınıf dediğimiz ise Gömülü Sınıfın bir türüdür. Statik olarak tanımlanmayan Gömülü Sınıfa, Dahili Sınıf denir. Statik olarak tanımlanan Gömülü Sınıflara ise Statik Gömülü Sınıflar denir. Yani aslında Gömülü Sınıf dedigimiz şey yalnızca özel bir isimlendirmedir. Çorba oldu değil mi? Yok yok çok karışık degil, örnek yapalim...

Nested Classes example  |  Gizle  |  Göster
class HerhangiBirSinif {
    ...
    class GomuluSinif {
        ...
    }
}
class HerhangiBirSinif {
    class DahiliSinif {
        void Yaziyaz(){
            System.out.println("HerhangiBirSinif.DahiliSinif");
        }
    }
    static class StatikGomuluSinif {
        void Yaziyaz(){
            System.out.println("HerhangiBirSinif.StatikGomuluSinif");
        }        
    }
}

Fakat her kadar 'Dahili Sınıf ve Statik Gömülü Sınıf aslında Gömülü Sınıfların türleridir.' desek de bu türlerden oluşturulan nesne örneklerinin oluşturulma şekillleri farklıdır. Statik Gömülü Sınıflardan nesne örneği oluştururken önce kendilerini çevreleyen sınıfların nesne örneği oluşturulmaz (Satır-3). Fakat Dahili sınıfların nesne örneklerini oluştururken mutlaka ve mutlaka ilk önce kendilerini çevreleyen nesnelerin birer nesne örneğinin oluşturulması gereklidir (Satır-6). Fazlası...

JAVA - Hidden Inheritance (Gizli Kalıtım)

by Cem Kefeli 31. Ekim 2012 01:34

JavaAslında buradaki linki takip ederseniz birkaç başlık halinde Java'da kalıtımı ilgilendiren birçok bilgiye ulaşabilirsiniz. Gizli kalıtım da bu yazıların birisi içerisinde yer bulabilirdi fakat hem zamanında yazmayı atlamışım hem de sonradan bu konuyu farklı bir başlık olarak ele almanın daha uygun olacağını düşündüm.

Gizli kalıtım, hem kalıtımla ilgili tabiki hem de aslında Java'da sınıflar ve nesnelerin doğal işleyişi ve dil yapısı ile ilgili de mantıksal bilgiler veriyor. Nasıl?

Hidden inheritance example  |  Gizle  |  Göster
public class HiddenEx {
    // Hic bir sey yok!
}
public static void main(String[] args) {
    HiddenEx Class1 = new HiddenEx(); 
    HiddenEx Class2 = new HiddenEx(); 
    HiddenEx Class3 = Class2;
    System.out.println("Class1.toString(): " + Class1);
    System.out.println("Class2.equals(Class1): "+Class2.equals(Class1));
    System.out.println("Class2.equals(Class3): "+Class2.equals(Class3));
    System.out.println("Class2.hashCode(): " + Class1.hashCode());
}
Class1.toString(): HiddenEx@addbf1
Class2.equals(Class1): false
Class2.equals(Class3): true
Class2.hashCode(): 11394033

Şimdi bu örneğe bakınca ilk önce şu soruları sormanız gerekir. "İyi de ben HiddenEx isimli sınıfta ne toString isminde bir method tanımladım ne equals ne de hashCode? Nereden geldi peki bu methodlar? Tanımlamadığım bir methodu nasıl kullanabildim?"

Hidden inheritance (Object class)  |  Gizle  |  Göster
public class HiddenEx extends Object {
    // Hic bir sey yok!
}

Bu soruların tümünün cevabı da yukarıdaki bir numaralı boyalı satırda saklı. Çünkü Java'da tüm nesneler gizli olarak Object sınıfından türer. Object tüm sınıfların atasıdır diyebiliriz, bu Java'nın sınıf yapısının kurgusudur. Siz bir sınıf oluşturduğunuzda bu sınıf aslında gizli bir şekilde Object sınıfından extend edilir. Dolayısı ile yukarıdaki saydığım üç adet method zaten Object sınıfının içerisinde tanımlı olduğu için HiddenEx sınıfı içerisinde kullanılabildi. Yalnızca bu üç method değil başka methodlar da var bu şekilde... İşte gizli kalıtım bu şekilde ifade edilebiliyor...

Peki Bir sınıf daha düşünün bu sınıf da HiddenEx sınıfından türesin ve adı da HiddenEx2 olsun. HiddenEx2 hem Object hem de HiddenEx sınıflarından aynı anda mı türeyecektir? Cevap hayır... Çünkü Java'da multiple inheritance (Çoklu kalıtım) yoktur. HiddenEx2 sınıfı HiddenEx sınıfından türer, HiddenEx ise Object sınıfından türer.

JAVA - Multiple Inheritance (Çoklu Kalıtım)

by Cem Kefeli 30. Ekim 2012 05:39

Daha önce Inheritance(Kalıtım) nedir?Diamond Problem of Multiple Inheritance adresindeki yazımda ve Interfaces(Arayüzler) adresindeki yazımda 'Kalıtım' ve 'Arayüzler' konularından bahsetmiştim. Çoklu kalıtım (Multiple Inheritance) diyorsak arayüzlerden bahsetmemek olmaz tabi. Kalıtım olmadan da 'çoklu' su olmayacağına göre eğer eksikler varsa ilk önce bu iki yazıyı okumanızı öneririm.

Gelelim asıl konuya, Java'da çoklu kalıtım mevzusuna. Aslında daha uzatmadan Java'da çoklu kalıtım yoktur deyip yazıyı bitirebiliriz ama gelin bakalım neden yoktur. Var olanlarda neden ve nasıl vardır?

Sol tarafta bu konu ile ilgili basit ama güzel bir UML diagram var. Class B ve Class C, Class A'dan türeyen yavru sınıflar. Türemenin doğal özelliğini kullanarak doWork isimli metodu da overwrite etmişler. Ne kadar güzel! İşte kalıtım... Fakat bir de Class D var... Olmaz ama diyelim ki Class D öyle birşey yapmış ki hem Class B'den hem de Class C'den türemiş. Yani çoklu kalıtım uygulanmış, türedikten sonra bir de üstüne üstlük doWork method'unu override etmemiş, ki etme zorunluluğu da yok burada. Şimdi ne olacak? doWork methodu son durumda nasıl oluşur? Class B'deki gibi mi yoksa Class C'deki gibi mi? İşte bu bir paradoks, kalıtımda diamond problemi olarak isimlendiriliyor.

C++'da bu işler oluyor ama hangi sınıfın hangi method'unu çağırmak istediğinizi bizzat kendiniz vermeniz gerekmekte. C++ çoklu kalıtıma bu şekilde bir çözüm bulmuş.

C++ Multiple Inheritance  |  Gizle  |  Göster
#include 
using std::cout;
using std::endl;

class ClassA { public: virtual void print() const = 0; // pure virtual }; class ClassB : public ClassA { public: void print() const { cout << "ClassB\n"; } }; class ClassC : public ClassA { public: void print() const { cout << "ClassC\n"; } }; class ClassD : public ClassB , public ClassC { public: void print() const { ClassB::print(); } }; int main() { ClassD Class_D; ClassB Class_B; ClassC Class_C; ClassA *array[3]; array[0] = &Class_D; // ERROR array[1] = &Class_B; array[2] = &Class_C; for( int i=0 ; i<3 ; i++ ) array[i] -> print(); return 0; }

Tekrar Java'ya geri dönecek olursak. C++'da var da neden Java'da bu iş yok diye düşünebilirsiniz ama bu tamamen dilin dizayn aşaması ile ilgili bir durum. Çok kullanılmaması ve yanlış sonuçlara yol açabilmesi, ayrıca tam anlamıyla hiçbir zaman çoklu kalıtım diye birşeyin olmayacak olması Java'yı geliştirenleri böyle bir duruma yöneltmiş. Sonuç olarak Java'da çoklu kalıtımı bir nebze olsun arayüzler ile sağlayabiliyoruz.

Hakkımda...

Cem KEFELİ

Electronics and
Telecommunication Eng.
devamı...


Son yapılan yorumlar...

Comment RSS

Yasal bir uyarı...

Disclaimer"Bu web sitesinde görmüş olduğunuz bilgilerin, dokümanların ve diğer materyallerin kullanılmasından doğabilecek hiç bir sorumluluktan site sahibi sorumlu tutulamaz. Web sitesi içerisinde yer alan yazılar, yorumlar, resimler ve diğer tüm içerikler yalnızca sahibinin görüşünü yansıtmakta olup içeriğin sahibi kişilerin çalıştığı kurumları bağlayıcı hiç bir nitelik taşımamaktadır. Yapılan tüm alıntılar mutlaka kaynak gösterilerek verilmeye çalışılmaktadır. Web sitesi içerisinde bulunan ilgili materyaller, ilgili yasal kurumlar tarafından uygun görülmemesi durumda kaldırılacaktır."
General