<?xml version="1.0" encoding="windows-1254"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Arda Çetinkaya &#187; Architecture</title>
	<atom:link href="http://www.minepla.net/tag/architecture/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.minepla.net</link>
	<description>Yazılım ve geri kalan her şey ile ilgili arada saçmaladıklarım...</description>
	<lastBuildDate>Fri, 09 Dec 2011 08:42:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>‘Aspect Oriented’ programlamaya başlıyoruz…Bölüm II</title>
		<link>http://www.minepla.net/2011/03/aspect-oriented-programlamaya-basliyoruz-bolum-2/</link>
		<comments>http://www.minepla.net/2011/03/aspect-oriented-programlamaya-basliyoruz-bolum-2/#comments</comments>
		<pubDate>Tue, 22 Mar 2011 00:32:00 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1600</guid>
		<description><![CDATA[Hatırlayacak olursanız son bir kaç yazıdır AOP hakkında bir şeyler paylaşıyordum. İlk iki yazı teorik, son yazı ise biraz daha uygulamaya yönelik olmuştu. Bu yazıda ise, bir önceki yazıda başlamış olduğum örneği biraz daha geliştirip, AOP&#8217;ı daha iyi anlamaya çalışacağız. Ama isterseniz önceki yazıları bir hatırlayalım… ‘Aspect Oriented’ programlama mı…Nedir ki? Peki ama neden ‘Aspect [...]]]></description>
			<content:encoded><![CDATA[<p>Hatırlayacak olursanız son bir kaç yazıdır AOP hakkında bir şeyler paylaşıyordum. İlk iki yazı teorik, son yazı ise biraz daha uygulamaya yönelik olmuştu. Bu yazıda ise, bir önceki yazıda başlamış olduğum örneği biraz daha geliştirip, AOP&#8217;ı daha iyi anlamaya çalışacağız. Ama isterseniz önceki yazıları bir hatırlayalım…</p>
<ol>
<li><a href="http://www.minepla.net/2011/03/aspect-oriented-programlama-mi-nedir-ki/"><strong>‘Aspect Oriented’ programlama mı…Nedir ki?</strong></a></li>
<li><a href="http://www.minepla.net/2011/03/peki-ama-neden-aspect-oriented-programlama/" target="_blank"><strong>Peki ama neden ‘Aspect Oriented’ programlama…</strong></a></li>
<li><strong><a href="http://www.minepla.net/2011/03/aspect-oriented-programlamaya-basliyoruz-bolum-i/" target="_blank">‘Aspect Oriented’ programlamaya başlıyoruz…Bölüm I</a></strong></li>
</ol>
<p>Bu yazıda bir önceki kod alt yapısını üzerinden giderek, <strong>AOP</strong> kavramında ki Aspect&#8217;leri yaratıyor olacağız. Özellikle <strong>&#8220;Aspect&#8221;</strong> şeklinde belirtmek istiyorum ki, yarattığımız bazı örnek sınıfları bu şekilde düşünmeye çalışmak, konunun bütününü anlamak adına yardımcı olacaktır. Hatırlarsanız bir önceki yazıda <em>Person</em> diye bir sınıf oluşturmuştuk örnek olarak ve bu sınıfı bir tane konsol uygulamasında kullanarak methodlarını çağırmadan önce nasıl araya girebileceğimize değinmiştim. Yine aynı sınıf üzerinden, onu biraz daha geliştirerek gidiyor olacağız. Bunun için sınıfımızı aşağıdaki gibi yenilememiz yeterli olacaktır şimdilik. Yeni bir özellik ve metod dışında aslında fazla bir şey de yok.</p>
<pre class="brush: csharp; title: ; notranslate">
    [Controller]
    public class Person : ContextBoundObject
    {
        private int _age = 0;
        private string _name = &quot;&quot;;

        public string Name { get { return _name; } }

        public Person(string name) : base() { _name = name; }

        public int Age
        {

            get
            {
                return _age;
            }
            set
            {
                _age = value;
            }
        }

        public string DoSomething()
        {

            string logMessage = &quot;Person sınıfının DoSomething() methodu çalıştı&quot;;
            Console.WriteLine(logMessage);

            return &quot;&quot;;
        }
        public void DoAnotherThing(int parameter1, string parameter2)
        {
            Console.WriteLine(&quot;Person sınıfının DoAnotherThing() methodu çalıştı&quot;);
        }

    }
</pre>
<p><strong>AOP</strong>, yazılımda ki kesişen ilgileri ayırmak için kullanabileceğimiz bir yöntemdi demiştik. Bu ilgiler her yazılım ürününde bir şekilde olan <strong>Logging,Exception Handling</strong> gibi kavramlar olabileceği gibi, iş kuralları ve bu kuralların işletildiği methodlar da olabilir. Ama genellikle bir biri ile çakışan ilgiler <strong>Logging,Exception Handling, Security</strong> gibi kavramlar için daha karmaşık olur. Oluşan <em>Exception</em> için uygun kaydı tutmak, ya da bir metod çalıştığında bu metodun çalışmasına dair bazı bilgileri kayıt altına alabilmek bir çok kavramın iç içe girmesine sebep olur. Bu yazıda bu ilgilere biraz daha yer vererek, bu ilgileri AOP yaklaşımı ile nasıl ayırabileceğimizi anlamaya çalışacağız.  Örnek olabilecek bir kaç ilgiyi oluşturup, bunu Person sınıfımızda kullanacağız. Bu ilgileri .NET Framework&#8217;ünde bulunan <strong>Attribute</strong>&#8216;lar ile yaratıp, nesnelerimize,metodlarımıza ve nesnelerin özelliklerine bağlayacağız. Aşağıdaki gibi bir kaç nesne, örnek olması adına yeterli olacaktır diye düşünüyorum.</p>
<p><strong><span id="more-1600"></span></strong></p>
<pre class="brush: csharp; title: ; notranslate">
    //Aspect'lerimiz için ortak bir yapı oluşturuyoruz.
    //Bu örnek için oldukça basit bir yapı oluşturmak
    //şimdilik yeterli olacaktır.
    //Attribute sınıfından türeyen bir BaseAspect sınıfı
    //oluşturuyoruz.
    public abstract class BaseAspect : Attribute
    {
        //abstract anahtar kelimesi ile tanımladığımız bu metodu
        //BaseAspect sınıfından türeyen tüm sınıflar yaratmak durumunda.
        //Bu method bu Aspect'in yapmakla yükümlü olduğu metodu simule ediyor
        //olacak...
        public abstract void Process(ref IMethodCallMessage message);
    }

    //Uygulamamızda Log'lama gerektiren yerlerde kullanabileceğimiz bir
    //ilgiyi bu şekilde tanımlayabiliriz.Bu Log'lama için ne yapılması gerekiyorsa
    //kendi içinde yapıyor olacak. BaseAspect sınıfımızdan gelen Process methodunun
    // message parametresinden istediğimiz özellikleri ihtiyacımıza göre alabiliriz.
    //Eğer kendi Log'lama için kullandığımız arayüzler varsa onları message parametresinden
    //çekip kullanmak mümkün.Bu örnekte konsola kayıt mesajı yazdıracağız.
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Method)]
    public class Logger : BaseAspect
    {
        public Logger()
        {

        }

        public override void Process(ref IMethodCallMessage message)
        {
            StringBuilder sb = new StringBuilder();
            if (message.Args != null)
            {
                //Metoddan gelen parametreleri yazdırıyoruz.
                for (int i = 0; i &lt; message.Args.Length; i++)
                {
                    sb.Append(String.Format(&quot;{0}={1}\r\n\t\t\t\t&quot;,message.GetArgName(i),message.Args[i]));
                }
            }

            Console.WriteLine(&quot;##LOG## &quot;+DateTime.Now.ToString()+&quot; - &quot;+ message.MethodName + &quot; methodu çalışacak.\r\n\t\t\t\t&quot; + sb.ToString() );
        }
    }

    //CanDrive adındaki Aspect'imiz aslında bir iş kuralını temsil ediyor
    //Aldığı parametre ile bir yaş sınırı belirlediğimiz bu ilgimiz
    //beraber kullanıldığı parametrenin yaş özelliğini kontrol ediyor.
    //Bu örnekte önemli olan nokta message parametresinden bize lazım olan bir
    //nesneyi kullanabilmemiz. Bu noktada altını çizmek isteyeceğim bir nokta var.
    //CanDrive kuralı kavram olarak hangi nesneler ile ilgili olacaksa bunların çok iyi belirlenmesi
    //gerekmekte. Buna göre içerisinde ki iş kuralı ve metodları dikkatlice yazılmalı.
    //Bu örnekte CanDrive, Person sınıfını kullanıyor. Çünkü CanDrive'ın ilgisi Person ile...
    //İlk yazımda da dediğim gibi AOP'i ilgileri ayırmak ve ayrıca yönetmek içinde kullanabiliriz.
    [AttributeUsage( AttributeTargets.Parameter)]//Sadece parametrelerde kullanabiliriz bu ilgiyi...
    public class CanDrive : BaseAspect
    {
        private int _age;

        public CanDrive(int age)
        {
            _age = age;
        }

        public override void Process(ref IMethodCallMessage message)
        {
            Person p = (Person)message.GetArg(0);
            if (p.Age &lt; _age)                 throw new Exception(String.Format(&quot;{0} araba süremez.Yaşı küçük.{1}&quot;, p.Name, p.Age));         }     }     //Bu seferde belli yaş aralığını kontrol eden ilgimiz var.     //CanDrive'a kavram olarak benziyor. Ama uygulama konusunda farklılık var.     [AttributeUsage(AttributeTargets.Property | AttributeTargets.Method)]     public class AgeValidation : BaseAspect     {         private int _age;         public AgeValidation(int age)         {             _age = age;         }         public override void Process(ref IMethodCallMessage message)         {             int ageValue = -1;             if (message.Args != null &amp;&amp; message.Args[0] != null)                 ageValue = (int)message.Args[0];             if (ageValue &gt; _age)
            {
                throw new Exception(String.Format(&quot;Yaş en çok {0} olabilir.{1} geçerli bir yaş değil.&quot;, _age, ageValue));
            }

        }
    }
</pre>
<p>Bu yaratmış olduğumuz ilgileri bir önceki yazıda oluşturduğumuz alt yapının algılayabileceği şekilde bir kaç değişiklik yapmamız gerekecek. Bunun için aşağıdaki değişikliği Control sınıfımıza eklememiz yeterli olacaktır.</p>
<pre class="brush: csharp; title: ; notranslate">
    public class Control : IMessageSink
    {

        private IMessageSink _messageSink;

        //İçeriğe dahil olan nesneler üzerinde kontroller yapabileceğimiz
        //nesneyi yaratmak için kullanacağımız yapıcı metodu,
        //alıcısını alacak şekilde tanımlıyoruz.
        public Control(IMessageSink sink)
        {
            _messageSink = sink;
        }

        //SyncProcessMessage metodu gelen alıcı mesaj aldığı zaman
        //çalışan bir metod. Bu metod ile alıcıya mesaj geldiği zaman
        //çeşitli kontrollerin yapılmasını sağlayabiliriz.
        //Burada mesaj diye tanımladığım operasyon aslında içeriğe dahil olan
        //nesnenin bir metodunun çalışması ya da bir özelliğinin çağrılması.
        //Bu örnekte şimdilik konsola bir mesaj yazdırıyor olacağız.
        public IMessage SyncProcessMessage(IMessage msg)
        {
            if (msg is IMethodCallMessage)
            {
                IMethodCallMessage preCall = (msg as IMethodCallMessage);
                this.BeforeMessageCall(ref preCall);//BeforeMessageCall diye bir metod yaratıyoruz.

            }
            return _messageSink.SyncProcessMessage(msg);
        }

        //AsyncProcessMessage metodu da SyncProcessMessage metodu ile aynı.
        //Sadece asenkron çağırımlarda çalışan versiyonu
        public IMessageCtrl AsyncProcessMessage(IMessage msg,
           IMessageSink replySink)
        {
            Console.WriteLine(&quot;Heyyy, önce bir dur bakalım...&quot;);
            return _messageSink.AsyncProcessMessage(msg, replySink);
        }

        //BeforeMessageCall metodu ile nesne yaratmadan önce,metod çağırmadan önce
        //ya da bir özelliği çağırmadan önce yapacağımız işlemleri çağırıyoruz.
        //Burada BaseAspect diye Attribute'ten türetilen kendi nesne tipimizi kontrol ediyoruz.
        //Eğer gelen mesajın özellikleri bu BaseAspect tipindense onun Process methodunu çağırıyoruz.
        //Burada hem metod hem de metod'un parametreleri var ise ve parametrelerde de BaseAspect tipi
        //olabilir mi diye kontrol ediyoruz.
        //-----------------------------------------------
        //Burada sadece method ve parametrelerini kontrol ediyoruz. Burada ki yapıyı genişleterek
        // daha güzel bir içerik yapabiliriz.
        private void BeforeMessageCall(ref IMethodCallMessage msg)
        {
            //Methodun
            BaseAspect[] attributes = msg.MethodBase.GetCustomAttributes(typeof(BaseAspect), true) as BaseAspect[];
            foreach (BaseAspect item in attributes)
            {
                item.Process(ref msg);
            }

            //Metodun parametrelerini alıyoruz.
            ParameterInfo[] parameters = msg.MethodBase.GetParameters();
            foreach (ParameterInfo item in parameters)
            {
                //Parametre değerlerinde BaseAspect'ten türeyen bir Attribute var mı kontrol ediyoruz.
                //Var ise metod çağrılmadan önce sahip olduğu Attribute çağırılıyor.
                attributes = item.GetCustomAttributes(typeof(BaseAspect), true) as BaseAspect[];
                foreach (BaseAspect parameterAttribute in attributes)
                {
                    parameterAttribute.Process(ref msg);
                }
            }

        }
   }
</pre>
<p>Bütün bunları yaptıktan sonra elimizde ne var kısaca bir özetleyelim; metodlarımızı, nesnelerimizi ve nesnelerin özelliklerini çağırmadan araya girebileceğimiz bir alt yapı, bu alt yapı içerisinde çeşitli sınıfları çalıştırmamızı sağlayacak metodlar ve çeşitli sınıflarımız(ilgilerimiz ya da &#8220;Aspect&#8221;lerimiz)</p>
<p>Şimdi bu yarattığımız ilgileri <em>Person</em> sınıfında kullanalım. Bunun için aşağıdaki gibi eklentiler yapmamız gerekmekte. Bu eklentiler aslında bir  yazılım projesinde her kısımda ortak olarak kullanılabilecek ilgileri temsil ediyor. Log&#8217;lama gibi…Ya da belli bir değerleri kontrol eden validasyonlar gibi…Aşağıdaki örnek bu iki kavram için yeterli olur umarım.</p>
<pre class="brush: csharp; title: ; notranslate">
    [Controller]
    public class Person : ContextBoundObject
    {
        private int _age = 0;
        private string _name = &quot;&quot;;

        public string Name { get { return _name; } }

        public Person(string name) : base() { _name = name; }

        public int Age
        {

            get
            {
                return _age;
            }
            [Logger]//Age özelliğine değer ataması yapmadan önce yine kayıt tutuyoruz
            [AgeValidation(150)]//Atanacak değerin kontrolünü AgeValidation ile kontrol ediyoruz
            set                 //Bu noktada bir insanın 150 yaşından büyük olamayacağını düşünüyoruz.
            {
                _age = value;
            }
        }

        //DoSomething metodu çağrılmadan önce metod ile ilgili kayıt tutuyoruz...
        [Logger]
        public string DoSomething()
        {

            string logMessage = &quot;Person sınıfının DoSomething() methodu çalıştı&quot;;
            Console.WriteLine(logMessage);

            return &quot;&quot;;
        }

        //DoAnotherthing metodu çağrılmadan önce yine kayıt tutuyoruz.
        //Bu sefer metodun 2 tane parametresi olduğuna dikkat edelim.
        [Logger]
        public void DoAnotherThing(int parameter1, string parameter2)
        {
            Console.WriteLine(&quot;Person sınıfının DoAnotherThing() methodu çalıştı&quot;);
        }

    }
</pre>
<p>Aşağıdaki gibi basit bir konsol uygulaması ile <em>Person</em> sınıfımızı kullanabiliriz. Dikkat edersiniz ki herhangi ekstra bir ilgi yok.</p>
<pre class="brush: csharp; title: ; notranslate">
    class Program
    {
        static void Main(string[] args)
        {

            Person arda = new Person(&quot;Arda Çetinkaya&quot;);
            arda.Age = 16;
            arda.DoSomething();
            arda.DoAnotherThing(5, &quot;Test parametresi&quot;);

            Console.ReadLine();

        }
    }
</pre>
<p>Çalıştırdığımız zaman bu kodu, aşağıdaki gibi bir çıktı alıyor olacağız. Çıktıyı kontrol ettiğimizde metod çağrımlarından önce ilgilerin çalıştığını göreceğiz.</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/AOP_1.jpg"><img class="size-full wp-image-1601 aligncenter" title="AOP" src="http://www.minepla.net/wp-content/uploads/AOP_1.jpg" alt="" width="754" height="234" /></a></p>
<p>Uygulamada küçük bir deşiklik yaparak, başka bir çıktıyı da görelim isterseniz. Bunun için aşağıdaki <em>Person</em> sınıfındaki <em>Age</em> özelliğine 200 yazdığımızda programın çıktısı aşağıdaki gibi olacaktır ve yarattığımız <em>AgeValidation</em> ilgisine takılıp Exception fırlatacaktır.</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/AOP_2.jpg"><img class="size-full wp-image-1602 aligncenter" title="AOP" src="http://www.minepla.net/wp-content/uploads/AOP_2.jpg" alt="" width="692" height="345" /></a></p>
<p style="text-align: center;">&nbsp;</p>
<p>Bu yoğun kodlar içerisinde umarım çok kaybolmamışınızdır ve biraz da olsa bazı şeyleri anlamaya yardımcı olmuştur umarım bu yazı…Ama henüz bitmedi…(: Bir küçük örnek ile <strong>AOP</strong> biraz daha iyi anlayacağız. Hatırlarsanız önce ki yazılarda nesnelerin bulunduğu duruma göre farklı özellikler kazanabileceğini söylemiştim. Aşağıdaki örnekte buna örnek veriyor olacağım.</p>
<pre class="brush: csharp; title: ; notranslate">
    //Car adı altında arabayı simule eden bir nesnemiz var
    //Aldığı Person tipinde ki parametre ile Drive() metodu
    //sınıfın içeriğini oluşturuyor.
    [Controller]
    public class Car : ContextBoundObject
    {
        //Dikkat ederseniz CanDrive() Aspect'i ile parametrenin
        //bu metod için uygun olup olmadığını kontrol ediyoruz.
        //18 yaşını doldurmuş olmak şeklindeki bir iş kuralını
        //bu şekilde uygulayabiliriz.
        //Ama bildiğiniz üzere bu iş kuralı çeşitli ülkelerde
        //değişik bir şekilde çalışır.Bunun için de aşağıdaki
        //sınıfa göz atmakta fayda var...
        public virtual void Drive([CanDrive(18)]Person driver)
        {

            Console.WriteLine(&quot;Bas gaza...&quot;);
        }
    }

    //Car'dan türeyen yeni bir sınıfımız var. Amerikan arabasını
    //temsil eden bu sınıf türediği sınıfın Drive() metodunu eziyor.
    public class AmericanCar : Car
    {
        //Burada dikkat edecek olursanız CanDrive() Aspect'inin aldığı
        //değer 16...Malum ABD'de araba kullanabilme yaşı 16...
        public override void Drive([CanDrive(16)]Person driver)
        {

            Console.WriteLine(&quot;Amerika'da 16 yaşında araba kullanılabiliyor...Bas gaza...&quot;);
        }
    }
</pre>
<p>Yukarıdaki nesneleri canlandırabilecek şekilde konsol uygulamamızı günceliyor ve daha sonra çalıştırıyoruz&#8230;</p>
<pre class="brush: csharp; title: ; notranslate">
    class Program
    {
        static void Main(string[] args)
        {

            Person arda = new Person(&quot;Arda Çetinkaya&quot;);
            arda.Age = 17;
            arda.DoSomething();
            arda.DoAnotherThing(5, &quot;Test parametresi&quot;);

            AmericanCar cadillac = new AmericanCar();
            cadillac.Drive(arda);

            Car anadol = new Car();
            anadol.Drive(arda);

            Console.ReadLine();

        }
    }
</pre>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/AOP_3.jpg"><img class="aligncenter size-full wp-image-1603" title="AOP" src="http://www.minepla.net/wp-content/uploads/AOP_3.jpg" alt="" width="726" height="286" /></a></p>
<p>Dikkat ederseniz anadol adındaki değişkenimizin <em>Drive()</em> metoduna kadar sorunsuz çalışacaktır. cadillac tipindeki değişkenin <em>Drive()</em> metoduna parametre olarak verdiğimiz nesnemiz, <em>Drive()</em> metodu için gerekli ön şartı sağladığından onda bir sorun olmadığının altını çizmek isterim. Bu örnekte nesnelerin bulundukları duruma göre sahip oldukları Aspect&#8217;lerin değişebileceğini gördük. 17 yaşındaki bir insan Türkiye&#8217;de araba kullanamazken, ABD&#8217;de araba kullanabilir. Ama insan özellikleri aynıdır (: Bu şekilde nesnelerin özelliklerinin değişebileceği sistemlerde AOP yaklaşımlarını kullanmak, sistem içerisinde ki karmaşıklığı minimuma indirecektir.</p>
<p>Neyse çok daha fazla saçmalamadan bitiriyorum. Umarım bazı şeyler biraz daha netleşmiştir. Biraz karmaşık bir konu ve aslında daha çok konuşacak şey var. Burada bahsetmiş olduğum kodların sadece bir örnek olduğu lütfen aklınızdan çıkarmayın. Geliştirin,hatta geliştirirken benle de paylaşırsanız sevinirim. Bir de .NET tarafında şu anda tam olarak bir AOP desteğinin olmadığı hatırlatmak isterim. Ama .NET&#8217;de AOP yaklaşımlarını uygulayabileceğiniz alt yapıyı biraz olsun yaratabileceğinizi unutmayın. Unity&#8217;i bu bağlamda kurcalamakta fayda olabilir. Tam olmasa da yaklaşımları AOP ile hemen hemen aynı&#8230;</p>
<p>Şimdilik bu kadar&#8230;Lütfen her türlü düşünce ve sorunuzu paylaşmaktan çekinmeyin&#8230;</p>
<p>&nbsp;</p>
<p>Edit: Bu yazıda geçen örnek kodları <strong><a href="http://cid-f66549bc9e13f731.office.live.com/self.aspx/Code/Program.cs" target="_blank">buradan</a></strong> indirebilirsiniz&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/03/aspect-oriented-programlamaya-basliyoruz-bolum-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8216;Aspect Oriented&#8217; programlamaya başlıyoruz&#8230;Bölüm I</title>
		<link>http://www.minepla.net/2011/03/aspect-oriented-programlamaya-basliyoruz-bolum-i/</link>
		<comments>http://www.minepla.net/2011/03/aspect-oriented-programlamaya-basliyoruz-bolum-i/#comments</comments>
		<pubDate>Sun, 13 Mar 2011 19:06:15 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1559</guid>
		<description><![CDATA[Bir önceki yazılarda hatırlarsanız, AOP’in ne olduğunu, neden gerekli olabileceğini anlatmaya çalışmıştım. Şimdi de biraz kod üzerinden giderek AOP kavramlarını anlatmaya çalışacağım. AOP için birbiri ile kesişen ilgileri ayırmak için kullanabileceğimiz bir yaklaşım demiştik hatırlarsanız. Kod üzerinden giderek bu ilgileri nasıl ayırabileceğimizi 2 kısım şeklinde olacak bir yazı dizisi ile anlatmaya çalışacağım. Bu ilk kısımda [...]]]></description>
			<content:encoded><![CDATA[<p>Bir önceki yazılarda hatırlarsanız, AOP’in ne olduğunu, neden gerekli olabileceğini anlatmaya çalışmıştım. Şimdi de biraz kod üzerinden giderek AOP kavramlarını anlatmaya çalışacağım. AOP için birbiri ile kesişen ilgileri ayırmak için kullanabileceğimiz bir yaklaşım demiştik hatırlarsanız. Kod üzerinden giderek bu ilgileri nasıl ayırabileceğimizi 2 kısım şeklinde olacak bir yazı dizisi ile anlatmaya çalışacağım. Bu ilk kısımda birbiri ile kesişen ilgileri ayırmak için bir alt yapı oluşturacağız. Daha sonra ki yazımda ise yarattığımız nesnelere yeni ilgiler vererek bu alt yapı sayesinde ilgilerin aslında hiç kesişmeden basit bir biçimde uygulandığını göreceğiz. O zaman başlayalım&#8230;</p>
<p>Bu yazı için .NET Framework içerisinde bulunan <strong>ContextBoundObject</strong> sınıfından faydalanacağız. Bu noktada .NET Framework’de direk olarak bir AOP desteği olmadığı hatırlatmak isterim. Sadece .NET Framework’ün bize sunduğu sınıf ve metodlar ile bu yaklaşımı biraz olsun oluşturmaya ve daha iyi anlamaya çalışıyor olacağız.</p>
<p>Öncelikle <strong>ContextBoundObject</strong> sınıfının ne olduğu kısaca anlatmaya çalışacağım. Biraz sonra aşağıda vereceğim örneğin daha anlaşılır olması adına gerekli olacağına inanıyorum.</p>
<p>Bir içeriğe(<strong>context</strong>) ve bu içeriğin kurallarına bağlı olan nesnelere, içeriğe bağlı nesneler deniyor, yani <strong>context-bound objects</strong>. Peki içerik ne? Belli özelliklerin ve kullanım kurallarının kullanıldığı, nesnelerin bir araya geldiği oluşumlar diyebiliriz. Yani bir nesne bir içeriğe dahil olduğu ya da bağlandığı zaman o içeriğin özelliklerini ve kurallarını uygulamak durumunda oluyor.  Bir nesne yaratılırken var olan bir içeriğe ya da meta-data’sında bulunan <strong>Attribute</strong>’lara(özelliklere) göre yaratılacak yeni bir içeriğe bağlanabilir. Burada ki özellik kavramı da <strong>ContextAttribute</strong> sınıfı ile .NET Framework içerisinde tanımlanmakta. Biraz daha geniş ve ayrıntılı bilgiyi <strong><a href="http://msdn.microsoft.com/en-us/library/system.contextboundobject.aspx" target="_blank">buradaki</a> MSDN</strong> içeriğinden öğrenebilirsiniz. Ama bizim için şimdilik bu kadarı yeterli olacak.</p>
<p>Yukarıda özetlemeye çalıştığım <strong>ContextBoundObject</strong> sınıfı ile oluşturacağımız nesnelerin bir içerik dahilinde oluşmasını sağlayacağız. Daha sonra bu içerik içerisinde ki kurallara göre kesişen ilgileri kontrollü bir şekilde yönetebileceğiz. Bunu nesneleri yaratırken, tam yaratmadan önce bazı kontrolleri yaparak, nesnenin bir metodunu çağırırken, tam çağırmadan önce bazı kontrolleri yaparak ya da nesnenin özelliklerini değiştirirken, tam değiştirme aşamasından önce yine bazı kontroller yaparak yapacağız. Burada ki kontroller de aslında birbiri ile kesişen ilgiler olacak. Biraz karışık oldu sanırım ama kod örnekleri ile daha net anlaşılacağına inanıyorum.</p>
<p>Öncelikle <strong>ContextBoundObject</strong> sınıfından türeyen bir Person sınıfı yaratalım&#8230;</p>
<pre class="brush: csharp; title: ; notranslate">
 public class Person : ContextBoundObject
 {
        private int _age = 0;
        public Person():base()
        {

        }
        public int Age
        {
            get
            {
                return _age;
            }

            set
            {
                _age = value;
            }
        }

        public string DoSomething()
        {
            return String.Format(&quot;Person sınıfının DoSomething methodu çalıştı&quot;);
        }
 }
</pre>
<p>Fark etmiş olduğunuz gibi ContextBoundObject’ten türemesine rağmen pek bir farklılığı yok. Bu nesnenin yaratıldığı içeriğin özelliklerini(Attribute) belirlememiz lazım ki, yaratıldığı zaman o özelliğin sağlayabileceği yöntemler ve özellikler ile nesnenin üzerinde kontroller yapabilelim. Bunun için aşağıdaki gibi bir kod bloğu ile <strong>ContextAttribute</strong>’dan türeyen bir Attribute yaratmamız lazım.</p>
<p><strong><span id="more-1559"></span></strong></p>
<pre class="brush: csharp; title: ; notranslate">
 [AttributeUsage(AttributeTargets.Class)]//Bu özelliğin uygulanabileceği kullanımı belirtiyoruz
 public class ControllerAttribute : ContextAttribute
 {
        //ContextAttribute'un ismini base sınıf sayesinde belirtiyoruz.
        public ControllerAttribute()
            : base(&quot;Kontrolcu&quot;)
        {
        }

        //IsContextOK metodunu yeniden tanımlayarak, içeriğime bağlanan
        //nesnelerin özelliklerini kontroller edebiliyoruz. Eğer belirttiğimiz
        //özellikleri var ise bu içeriğimiz için uygun oluyor. Ama yok ise
        //özellikleri nesnemize bağlamak gerekiyor.
        //IsContextOK metodu, nesneler yaratıldığı zaman ilk çalışan metod.
        //Bu metodun sonucuna göre GetPropertiesForNewContext çalışıyor.
        public override bool IsContextOK(Context ctx, System.Runtime.Remoting.Activation.IConstructionCallMessage ctorMsg)
        {
            ControllerProperty property = ctx.GetProperty(&quot;Kontrolcu&quot;) as ControllerProperty;
            if (property == null)
                return false;
            return true;
        }

        //GetPropertiesForNewContext metodunu yeniden tanımlayarak,
        //içeriğimize özellikler ekliyoruz.
        //Bu özellikler içeriğe bağlanan nesnelerin uygulaması gereken kurallar
        //ve kontrolleri temsil ediyor.
        public override void GetPropertiesForNewContext(System.Runtime.Remoting.Activation.IConstructionCallMessage ctorMsg)
        {
            //Burada eklediğimiz ControllerProperty'si kendi yarattığımız,
            //IContextProperty arayüzünden yaratılan bir özellik.
            //Bunun gibi bir çok özellik yaratıp,içeriğimize ekleyebiliriz.
            ctorMsg.ContextProperties.Add(new ControllerProperty());
        }
}
</pre>
<p>Bu Attribute’u yaratırken dikkat ederseniz <strong>ControllerProperty</strong> şeklinde bir sınıfı özellik olarak ekledik. Bu sınıf, bizim nesnelerimizin içerik dahilinde uygulaması gereken bir özelliği belirtiyor. <strong>IContextProperty</strong> arayüzünden türeterek istediğimiz gibi yaratabiliriz. Bu arayüzden yarattığımız zaman aşağıdaki gibi tanımlamamız gereken metodlarımız olacak tabi ki&#8230;Ben kavram olarak kontrol eden şeklinde açıklamalarda bulunduğum için adını ControllerProperty olarak tanımladım.</p>
<pre class="brush: csharp; title: ; notranslate">
public class ControllerProperty : IContextProperty
 {
        //Freeze metodu, özelliğin içeriği dondurabilmesini yönetiyor.
        //İçeriği dondurursak eğer yeni özellik eklemek ya da içerikten
        //özellik çıkarmak mümkün olmayacaktır.
        //Bu içeriklerin sınırlarını belirlemek adına kullanabileceğimiz
        //bir yaklaşım olabilir.Ama şimdiliu bu metod içerisinde
        //herhangi bir işlem yapmıyoruz.
        public void Freeze(Context newContext)
        {

        }

        //IsNewContextOK metodu bu özelliğin içerik için uygun olup olmadığını
        //kontrol eden bir metod. İçeriğe sadece kendi arayüzlerimizden oluşan
        //özellikler eklemek istediğimiz de örneğin, bu metod ile eklenen özelliğin
        // uygun olup olmadığını kontrol edebiliriz.Uygun ise true,değil ise false
        //şeklinde bir geri dönüş, bu özelliğin içeriğe eklenmesinde etki edecektir.
        public bool IsNewContextOK(Context newCtx)
        {
            return true;
        }

        //Özelliğimizin ismi.
        public string Name
        {
            get { return &quot;Kontrolcu&quot;; }
        }
 }
</pre>
<p>İçerik içerisinde ki özelliğimizi de yukarıda ki gibi tanımladıktan sonra bu özelliğin, içeriğe bağlanan nesneler tarafından uygulanabilir olmasına geldi sıra şimdi. Context’e(içerik) bağlanan nesneleri kullanırken, bu kullanımlardan önce araya girmemiz gerekmekte. Bunun için özelliklerimize mesaj alıcısı diyebileceğimiz alıcılar eklememiz lazım ki, içeriğe bağlanan nesneleri alabilen bir yapımız olsun.</p>
<p>Bunun için <strong>IContributeObjectSink</strong> arayüzünü ControllerProperty sınıfımıza eklememiz lazım. Bu arayüz .NET Framework içerisinde olan bir arayüz. Bu noktada bu sınıfın isminde geçen Sink kelimesinin lavabo olarak değil de alıcı olarak kullanıldığı hatırlatmak isterim. Çünkü birazdan benzer isimlere sahip olan sınıfları kullanıyor olacağız. (:</p>
<p>IContributeObjectSink arayüzünü sınıfımıza eklediğimiz zaman <strong>GetObjectSink()</strong> metodunu da tanımlamamız gerekiyor.</p>
<pre class="brush: csharp; first-line: 1; highlight: [31,32,33,34,35,36,37,38]; title: ; notranslate">
public class ControllerProperty : IContextProperty, IContributeObjectSink
{

        //Freeze metodu, özelliğin içeriği dondurabilmesini yönetiyor.
        //İçeriği dondurursak eğer yeni özellik eklemek ya da içerikten
        //özellik çıkarmak mümkün olmayacaktır.
        //Bu içeriklerin sınırlarını belirlemek adına kullanabileceğimiz
        //bir yaklaşım olabilir.Ama şimdiliu bu metod içerisinde
        //herhangi bir işlem yapmıyoruz.
        public void Freeze(Context newContext)
        {

        }

        //IsNewContextOK metodu bu özelliğin içerik için uygun olup olmadığını
        //kontrol eden bir metod. İçeriğe sadece kendi arayüzlerimizden oluşan
        //özellikler eklemek istediğimiz de örneğin, bu metod ile eklenen özelliğin
        // uygun olup olmadığını kontrol edebiliriz.Uygun ise true,değil ise false
        //şeklinde bir geri dönüş, bu özelliğin içeriğe eklenmesinde etki edecektir.
        public bool IsNewContextOK(Context newCtx)
        {
            return true;
        }

        //Özelliğimizin ismi.
        public string Name
        {
            get { return &quot;Kontrolcu&quot;; }
        }

        //IContributeObjectSink arayüzden gelen bu metod ile yeni bir alıcı yaratıyoruz.
        //Bu alıcı içeriğe bağlanan nesnelerin çağırımlarında çalışıyor olacak.
        //Burada Control isminde,IMessageSink(mesaj alıcısı) arayüzünden yaratılan
        //bir sınıfı metodun dönüş değeri olarak tanımlıyoruz.
        public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink nextSink)
        {
            return new Control(nextSink);
        }
}
</pre>
<p>Bu metod eklemesinde dikkatinizi çeken bir sınıf olacaktır. Control sınıfı bu örnek için yarattığım bir sınıf. <strong>IMessageSink</strong> arayüzünden yaratılan bir sınıf. Bu arayüz ile ilgili ayrıntılı bilgileri <a href="http://msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.imessagesink.aspx" target="_blank"><strong>MSDN</strong></a>’den bakabilirsiniz. Bu arayüzün zorunlu kıldığı metodları tanımlamamız gerekmekte yine.</p>
<pre class="brush: csharp; title: ; notranslate">
public class Control : IMessageSink
{

        private IMessageSink _messageSink;

        //İçeriğe dahil olan nesneler üzerinde kontroller yapabileceğimiz
        //nesneyi yaratmak için kullanacağımız yapıcı metodu,
        //alıcısını alacak şekilde tanımlıyoruz.
        public Control(IMessageSink sink)
        {
            _messageSink = sink;
        }

        //SyncProcessMessage metodu gelen alıcı mesaj aldığı zaman
        //çalışan bir metod. Bu metod ile alıcıya mesaj geldiği zaman
        //çeşitli kontrollerin yapılmasını sağlayabiliriz.
        //Burada mesaj diye tanımladığım operasyon aslında içeriğe dahil olan
        //nesnenin bir metodunun çalışması ya da bir özelliğinin çağrılması.
        //Bu örnekte şimdilik konsola bir mesaj yazdırıyor olacağız.
        public IMessage SyncProcessMessage(IMessage msg)
        {
            Console.WriteLine(&quot;Heyyy, önce bir dur bakalım...&quot;);
            return _messageSink.SyncProcessMessage(msg);
        }

        //AsyncProcessMessage metodu da SyncProcessMessage metodu ile aynı.
        //Sadece asenkron çağırımlarda çalışan versiyonu
        public IMessageCtrl AsyncProcessMessage(IMessage msg,
           IMessageSink replySink)
        {
            Console.WriteLine(&quot;Heyyy, önce bir dur bakalım...&quot;);
            return _messageSink.AsyncProcessMessage(msg, replySink);
        }

        //NextSink ile mesaj alıcımızı, içerik içerisinde ki diğer özelliklere
        //iletiyoruz. Bu sayede içerik içersinde bir sonraki özelliğe
        //geçiyoruz.
        public IMessageSink NextSink
        {
            get
            {
                return _messageSink;
            }
        }
}
</pre>
<p>Şimdi bütün bunları yaptıktan sonra ilk başta yaratmış olduğumuz Person sınıfına hangi içerik dahilinde olacağını belirtmemiz lazım. Bunun içinde ControllerAttribute’unu Person sınıfının hemen üstünde tanımlamamız gerekecek.</p>
<pre class="brush: csharp; first-line: 1; highlight: [1]; title: ; notranslate">
[Controller]
public class Person : ContextBoundObject
{
        private int _age = 0;
        public Person():base()
        {

        }
        public int Age
        {

            get
            {
                return _age;
            }

            set
            {
                _age = value;
            }
        }

        public string DoSomething()
        {
            return String.Format(&quot;Person sınıfının DoSomething methodu çalıştı&quot;);
        }
}
</pre>
<p>Bu tanımlamayı da yaptığımız zaman artık geriye bu Person sınıfımızı çağırabilecek bir basit test uygulaması yapmak kalıyor. Bunun içinde sanırım aşağıda ki gibi bir konsole uygulaması yeterli olacaktır.</p>
<pre class="brush: csharp; title: ; notranslate">
class Program
    {
        static void Main(string[] args)
        {

            Person arda = new Person();
            Console.WriteLine(&quot;--Birazdan arda.Age özelliğine değer atanacak&quot;);
            arda.Age = 100;
            Console.WriteLine(&quot;--arda.Age özelliğine değer atandı&quot;);
            Console.WriteLine(&quot;--Birazdan arda.Age özelliği konsola yazılacak&quot;);
            Console.WriteLine(arda.Age);
            Console.WriteLine(&quot;--arda.Age özelliğini konsola yazıldı&quot;);
            Console.WriteLine(&quot;--Birazdan arda.DoSomething() metodu çalışacak&quot;);
            Console.WriteLine(arda.DoSomething());
            Console.WriteLine(&quot;--arda.DoSomething() metodu çalıştı&quot;);
            Console.ReadLine();

        }
    }
</pre>
<p>Bu programı çalıştırmadan önce isterseniz kısa bir özet geçelim ve neler yaptık bir bakalım.</p>
<ul>
<li>ContextBoundObject sınıfından türeyen belli bir içeriğe bağlanacak bir sınıf yarattık.</li>
<li>Hangi içeriğe ekleneceğini ControllerAttribute şeklinde, ContextAttribute sınıfından türeyen bir sınıf yaratarak belirledik.</li>
<li>Bu ControllerAttribute ile içeriğimizin özelliklerini ekledik.</li>
<li>Özellik olarak ControllerProperty şeklinde, IContextProperty ve IContributeObjectSink arayüzlerinden yaratılan bir sınıf oluşturduk.</li>
<li>Bu özelliğin mesaj alması(nesneleri çağırma işlemi için) için IMessageSink şeklinde bir alıcı kullanmasını sağladık.</li>
<li>Control alıcısı ile nesnelerin çağırımları aşamasına müdahale etmek için gerekli metodların içini doldurduk.</li>
</ul>
<p>Bu kısa özetten sonra isterseniz uygulamamızı çalıştıralım. Çalıştırdığımız zaman aşağıdaki gibi bir çıktımız olacaktır.</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/console_result.jpg"><img class="size-full wp-image-1560 aligncenter" title="Konsolu sonucu" src="http://www.minepla.net/wp-content/uploads/console_result.jpg" alt="" width="640" height="171" /></a></p>
<p>Uygulamanın kodları ile çıktımızı karşılaştırdığımızda, bir içeriğe bağlı olan nesnemizin çeşitli özelliklerine bazı operasyonlar yapmadan önce araya girmiş olduğumuza dikkat çekmek isterim. Aynı şekilde metod çalıştırmadan öncede araya girdiğimizi söyleyebilirim.</p>
<p>Bu noktada AOP kavramını daha iyi anlayabilmek adına bir sonraki yazıda oluşturacağımız ilgileri ve “Aspect”leri(görünüş) ayırabilmek adına bir alt yapı oluşturmuş olduk. Bir sonraki yazı da Person sınıfı üzerinde kullanacağımız ilgileri(örnek:loglama,hata yakalama) yaratarak bu yapı dahilinde nasıl kullanabileceğimizi anlatmaya çalışacağım.</p>
<p>Umarım açıklayıcı ve anlaşılır bir yazı olmuştur. Her türlü düşünce ve sorunuzu lütfen paylaşmaktan çekinmeyin. Bir sonraki yazıda görüşmek üzere&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/03/aspect-oriented-programlamaya-basliyoruz-bolum-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Peki ama neden &#8216;Aspect Oriented&#8217; programlama&#8230;</title>
		<link>http://www.minepla.net/2011/03/peki-ama-neden-aspect-oriented-programlama/</link>
		<comments>http://www.minepla.net/2011/03/peki-ama-neden-aspect-oriented-programlama/#comments</comments>
		<pubDate>Sat, 12 Mar 2011 01:00:30 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1545</guid>
		<description><![CDATA[Bir önceki yazımda, AOP’in birbiri ile kesişen ilgileri ayırmak ve basitleştirmek için kullanabileceğimiz bir yaklaşım olduğunu söylemiştim hatırlarsanız. Ve hatırlarsanız bir tane de pseudo kodu ile bir insanın yaşam sürecini örneklendirmeye çalışmıştım. Yaşam döngüsünde birbiri ile kesişen iglileri görmüştük. Biraz daha anlaşılır olması adına daha sık karşımıza çıkan problemleri bu yazıda ele almaya çalışacağım.Bu sayede [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.minepla.net/wp-content/uploads/152593_Tangled-Nails1.jpg"><img class="size-full wp-image-1547 alignleft" title="Aspect Oriented Programlama" src="http://www.minepla.net/wp-content/uploads/152593_Tangled-Nails1.jpg" alt="" width="179" height="179" /></a></p>
<p><strong><a href="http://www.minepla.net/2011/03/aspect-oriented-programlama-mi-nedir-ki/">Bir önceki yazımda</a></strong>, AOP’in birbiri ile kesişen ilgileri ayırmak ve basitleştirmek için kullanabileceğimiz bir yaklaşım olduğunu söylemiştim hatırlarsanız. Ve hatırlarsanız bir tane de pseudo kodu ile bir insanın yaşam sürecini örneklendirmeye çalışmıştım. Yaşam döngüsünde birbiri ile kesişen iglileri görmüştük. Biraz daha anlaşılır olması adına daha sık karşımıza çıkan problemleri  bu yazıda ele almaya çalışacağım.Bu sayede AOP’ı ve hangi sorunlara çözüm sunduğunu anlamak daha kolay olacaktır. İlk olarak aşağıdaki metod ile başlayalım.</p>
<pre class="brush: csharp; title: ; notranslate">
public ResultSet SearchCustomer(string username, string customerName,string customerSurname)
 {
              try
            {
                if (!IsExists(username))
                    throw new DoesNotExistsException();

                if (!HasAccess(username))
                    throw new AccessDeniedException();

                Logger.Write(&quot;Search will be done with CustomerName:{0} CustomerSurname:{1}&quot;,customerName,customerSurname);

                ResultSet results = Database.Search(customerName, customerSurname);

                Logger.Write(&quot;Search is successfully done&quot;);

                return results;
            }
            catch (Exception ex)
            {

                Logger.Write(ex.Message, &quot;ERROR&quot;);
            }

            return null;
 }
</pre>
<p>Müşteri adı ve soyadına göre arama yapan, arama yaparken bazı kontrolleri gerçekleştiren bir metod var yukarıda. Arama yapan kullanıcıyı kontrol eden,daha sonra bu kullanıcının durumuna göre başka bir kontrol yapan, kayıt eden ve sonra arama operasyonunu gerçekleştiren ve bir hata olursa yine bunu kayıt altına alan bir metod dikkat ederseniz. Bir çok farklı ilgi aslında iç içe&#8230;Daha doğrusu kesişiyor. Bu tarz ilgiler aslında bir çok yazılım projesinde önemli yer kaplıyor. Bu tarz ilgilerin birden fazla metod içerisinde kullanıldığını düşünün&#8230;<em>Search()</em> metodunun içerisinde yapılan kontrollerin, aynı gereksinimlerden dolayı <em>SaveCustomer()</em> metodunda da yapılması gerektiğinde birbirini tekrarlayan, bir değişiklikte bir çok yeri etkileyen kod parçaları ortaya çıkacaktır. Bunlar zaman zaman soruna, zaman zaman da karmaşıklığa yol açar bildiğiniz üzere&#8230;Ve bu şekilde iç içe girmiş karmaşıklıkları yönetmek oldukça zor olacaktır.<br />
<strong><span id="more-1545"></span></strong><br />
Bu karmaşıklıklar, nesnelerin yazılımın yaşam süresindeki durumlarından dolayı oluşacak karmaşıklık ile iç içe girdimi tam bir çıkmaza dönüşür.Bu tarz problemleri çözmek için, mesela metodları çağırırken, nesneleri yaratırken veya değerlere atama yaparken kendi ilgilerini ayırmak kısmen de olsa yeterli olacaktır. Yukarıdaki Search metodundan önce, yani daha metod çağrımı yapılmadan kullanıcı kontrolleri yapılsa,log işlemi gerçekleşse,sonra metod çağrımı yapılsa bir şekilde ilgiler birbirinden ayrılmış olacak. Bu ilgileri ayırdığımız zaman benzer ihtiyaçları olan metodlarda da bu ilgileri kullanabilmek mümkün olacaktır. Bu ilgileri ayırabildiğimiz zaman, kesişen ilgilerden dolayı oluşabilecek problemleri yok edebiliriz.</p>
<p>Başka bir sorun ise bu ilgilerin yazılımın yaşam süresi içerisinde ortaya çıkması. Mesela aşağıdaki kod parçasına bakalım. Person diye bir sınıfımız var. CanDrive diye bir metodu yaş ve ehliyet değerlerine göre sonuç dönüyor&#8230;Person sınıfımızdan yaratılan nesnemiz, uygulama içerisinde Türkiye’de olan bir nesne şeklinde çalışıyorsa <em>CanDrive()</em> metodunda sorun olmayacaktır. Ancak Person sınıfının nesnesi ABD içeriğinde oluştuğunu düşündüğümüzde<em> CanDrive()</em> metodu yanlış çalışacaktır. Çünkü ABD’de araba kullanabilmek için 18 yaşını beklemeye gerek yok bildiğiniz üzere&#8230;</p>
<pre class="brush: csharp; title: ; notranslate">
    public class Person
    {
        public bool CanDrive()
        {
            if (_age &gt;= 18 &amp;&amp; HasLicense)
            {
                return true;
            }

            return false;
        }
    }
</pre>
<p>Burada sorun bir eylem gerçekleştirmek için kullanılan metodun içerisinde bazı kurallarında metodun içerisinde yer alması. Person sınıfdan bir nesne yaratan kişi, bu kuralları bilemeyeceği için bu nesneyi istediği gibi kullanamayacktır. Bunu çözmek için bu tarz kuralları dışarıya verebiliyor olmak sorunumuzu çözecektir.</p>
<p>Aşağıdaki gibi bir uygulama çözüm yollarından bir tanesine örnek olabilir. Bu şekilde CanDrive bilgisine ulaşmadan önce yaş kontrolünü yapmak mümkün olacaktır. Bu kontrolün nasıl yapıldığı kendi içinde saklandığından CanDrive ilgisi ile bir kesişimi kalmamış oluyor.  Asp.Net MVC’de ki <strong>Data Annotation Validators</strong> kavramını hatırlamak belki sorunu ve çözümünün anlaşılmasında biraz daha yardımcı olur. Oradaki yaklaşımda AOP yaklaşımı ile aynı&#8230;</p>
<pre class="brush: csharp; title: ; notranslate">
    public class Person
    {
        private bool _canDrive=false;
        public bool CanDrive {

            [Age(Min = 18)]
            get {
                return _canDrive;
            }
        }
    }
</pre>
<p>Bu yazımda AOP’nın neden ihtiyaç olabileceğini, hangi sorunlara çözüm sunduğunu anlatmaya çalıştım. Biraz sorunlara çözümlerinden çok ağırlık verdiğimi biliyorum&#8230;Sorunları anlamanın, çözüm üretmek adına önemli olduğunu düşündüğüm için araya böyle bir yazı daha sıkıştırdım. Ama bir sonra ki yazımda çözümlere çok daha fazla ağırlık vereceğim ve evet kod yazacağım&#8230;(:</p>
<p>AOP’nın tam olarak uygulanması için sınıfların,methodların metadata seviyesinde bazı bilgileri dışarıya vermesi ve dışarıdan da bu bilgileri dinamik olarak alabilmesi lazım. Bu bağlamda compiler(derleme) aşamasında bazı değişikliklerin olması da gerekmekte. Compile ve link aşamasına biraz müdahale edebilecek konuma geldiğimizde AOP yaklaşımını daha kolay uygulayabilir ve anlayabilir hale geleceğimizi düşünüyorum. Neyse şimdilik bu kadar&#8230;Bu konu ile ilgili bir sonra ki yazıda görüşmek üzere&#8230;<br />
Tekrardan hatırlatmak isterim ki her türlü sorunuzu ve düşüncenizi çekinmeden paylaşabilirsiniz&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/03/peki-ama-neden-aspect-oriented-programlama/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8216;Aspect Oriented&#8217; programlama mı&#8230;Nedir ki?</title>
		<link>http://www.minepla.net/2011/03/aspect-oriented-programlama-mi-nedir-ki/</link>
		<comments>http://www.minepla.net/2011/03/aspect-oriented-programlama-mi-nedir-ki/#comments</comments>
		<pubDate>Fri, 11 Mar 2011 00:10:20 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1536</guid>
		<description><![CDATA[Öncelikle &#8220;Aspect Oriented Programming&#8221;(AOP), &#8220;Object Oriented Programming&#8221;&#8216;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&#8216;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&#8217;e alternatif bir şey olmadığı şeklinde [...]]]></description>
			<content:encoded><![CDATA[<p>Öncelikle <strong>&#8220;Aspect Oriented Programming&#8221;(AOP)</strong>, <strong>&#8220;Object Oriented Programming&#8221;</strong>&#8216;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. <strong>AOP</strong>&#8216;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 <strong>AOP</strong> geçiyor gibi bir durum söz konusu değil. OOP&#8217;e alternatif bir şey olmadığı şeklinde düşünmekte, <strong>AOP</strong> anlamak için fayda var&#8230;</p>
<p>Peki nedir bu <strong>AOP</strong>? <strong>AOP</strong>&#8216;ı basitçe Türkçe&#8217;ye çevirirsek bazı şeyleri anlamak adına belki yardımcı olur…Bu bağlamda &#8220;<em>Görünüşe Yönelik Programlama</em>&#8221; benim en tercih ettiğim bir çeviri oluyor.  <strong>AOP</strong>, yazılımdaki <strong>birbiri ile kesişen ilgileri(cross-cutting concerns)</strong> ve bu ilgilerin oluşturduğu karmaşıklığı çözmek adına ortaya çıkmış bir method aslında.</p>
<p>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ı.</p>
<p style="text-align: center;"><a href="http://www.minepla.net/wp-content/uploads/the_evolution_of_man.jpg"><img class="size-full wp-image-1541 aligncenter" title="Aspect Oriented Programming" src="http://www.minepla.net/wp-content/uploads/the_evolution_of_man.jpg" alt="" width="472" height="192" /></a></p>
<p>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&#8217;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 &#8220;zaman&#8221; kelimelerinin altını çizmekte fayda var sanırım. Çünkü bu konuda AOP&#8217;ı düşünmeye sebep olan, OOP&#8217;den farklı yönlerini ortaya çıkaran kavram <strong>&#8220;zaman&#8221;</strong> 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&#8217;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&#8217;i yazımın başında <strong>&#8220;Görünüşe Yönelik Programlama&#8221;</strong> şeklinde çevirmeyi tercih etmiştim. <strong>Görünüş</strong> olarak anlamlandırdığım kavram, uygulamanın kendisinin ya da içerisinde ki nesnelerin durumları diyebilirim.</p>
<p><span id="more-1536"></span></p>
<p>Biraz örnek ile daha net bir şekilde anlaşılacağını düşünmekteyim…Mesela standart bir örnek olarak <strong>&#8220;İnsan&#8221;</strong>ı 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…</p>
<pre class="brush: csharp; title: ; notranslate">
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 &gt; 2)
            {
                Yuru();
                Konus(true);
            }

            yas++;
            if (yas &gt; 6)
            {
                OkulaGit();
                SosyalHayatOlustur();
            }

            yas++;

            if (yas &gt; 25)
            {
                IseGit();
                if (EhliyetVarMi())
                    ArabaSur();
                if (HastaMi() &amp;&amp; SigortaVarmi())
                    DoktoraGit();
            }
            ..........
            ....
            ..
            ...
        }
    }
</pre>
<p>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.</p>
<p>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&#8217;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. <strong>Attribute</strong>&#8216;ları kullanarak ya da <strong>ContextBoundObject</strong> 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&#8217;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…</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/03/aspect-oriented-programlama-mi-nedir-ki/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nesneye yönelik programlama mı, nesneye yönelik tasarım mı&#8230;</title>
		<link>http://www.minepla.net/2011/01/nesneye-yonelik-programlama-my-nesneye-yonelik-tasarym-my/</link>
		<comments>http://www.minepla.net/2011/01/nesneye-yonelik-programlama-my-nesneye-yonelik-tasarym-my/#comments</comments>
		<pubDate>Tue, 04 Jan 2011 14:56:31 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1485</guid>
		<description><![CDATA[Nesneye yönelik(Object-oriented) programlama diyince, eminim bir çok kişi “class”,”abstraction”,”encapsulation”,”inheritance”,”polymorphism” gibi janjanlı kelimeleri söyleyecektir. Kesinlikle yanlış başlıklar ya da konular değil&#8230;Nesneye yönelik programlamanın hatta temel taşları&#8230;Ama bunları bilmek, nesneye yönelik programlamayı anlamak, bilmek ve faydalanabilmek için yeterli mi?&#8230; Bu soruya benim kendi kişisel cevabım, kesinlikle hayır olacaktır. Yarattığım sınıfları başka sınıflardan türeterek, çeşitli soyutlamalar yaparak, belli [...]]]></description>
			<content:encoded><![CDATA[<div>Nesneye yönelik(Object-oriented) programlama diyince, eminim bir çok kişi <strong>“class”</strong>,<strong>”abstraction”</strong>,<strong>”encapsulation”</strong>,<strong>”inheritance”</strong>,<strong>”polymorphism”</strong> gibi janjanlı kelimeleri söyleyecektir. Kesinlikle yanlış başlıklar ya da konular değil&#8230;Nesneye yönelik programlamanın hatta temel taşları&#8230;Ama bunları bilmek, nesneye yönelik programlamayı anlamak, bilmek ve faydalanabilmek için yeterli mi?&#8230;</div>
<p><img class="size-full wp-image-1486 alignright" title="Nesneye Yönelik Tasarım" src="http://www.minepla.net/wp-content/uploads/gig-swiss-knife.jpg" alt="" width="329" height="233" /></p>
<div>Bu soruya benim kendi kişisel cevabım, kesinlikle hayır olacaktır. Yarattığım sınıfları başka sınıflardan türeterek, çeşitli soyutlamalar yaparak, belli metodları ya da sınıfın özelliklerini saklayarak nesneye yönelik programlama yapabilirim ama bu gerçekten nesneye yönelik programlamanın amacına yönelik bir şey mi olur&#8230;</div>
<div>Bu sorunun cevabını verebilmek içinde nesneye yönelik tasarımı irdelemeye çalışmak, nesneye yönelik programlama ve nesneye yönelik tasarım arasında ki ilişkiyi anlamak yeterli olacaktır.</div>
<div>Nesneye yönelik tasarım, bir sistemi oluştururken, sistemin parçalarını, nesneler ve bu nesnelerin metodları ve özellikleri ile, birbirleri arasında ilişki sağlayabilmek şeklinde özetlenebilir. Bu noktada<strong> SOLID</strong> diye kısaltabileceğimiz 5 kavram karşımıza çıkıyor. Bunları ilke ve belki de kural şeklinde de ele alabiliriz, ki bence nesneye yönelik tasarımı daha iyi anlamak adına bu şekilde düşünmekte fayda var.</div>
<div></div>
<div></div>
<div>
<p><strong>“Single responsibility”(ayrı sorumluluklar), “Open-closed”(Açık-kapalı),” Liskov substitution”(yerine konulabilirkik), “Interface segregation”(arayüzlerle ayırma)</strong> ve <strong>“Dependency inversion”(bağımlılıkları ters çevirme)</strong> kavramlarının kısaltması olan SOLID, nesneye yönelik tasarımın en temel olmazsa olmaz 5 ilkesidir. Ve nesneye yönelik programlama kavramlarının da aslında ortaya çıktığı noktalardır.</p>
<p><strong>Single Responsibility</strong>: Bu ilke, her nesnenin kendine ait bir sorumluluğu olmasını söyler. Nesnelerin sorumlulukları dışına çıkması, tasarımı ve geliştirmeyi zorlayacak bir unsur olacağından, bu ilke nesneye yönelik tasarımın 5 ilkesinden en önemli olanıdır diyebilirim. Bu yüzden tasarım esnasında mimari bileşenlerinizin nesne modellerini iyice biçim tartmak gerekecektir. Oluşturacağınız nesnelerin özellikleri, metodları ve başka nesneler ile olan iletişimlerinin nasıl olacağı gibi konular nesnenin kendine ait bir sorumluluğu olması açısından önemle ele alınmalıdır. Ama tabi geliştirme ve tasarım süreçlerinin aynı ilerlediği(olmaz demeyin, gayette olur, çok da anormal bir durum değildir aslında) uygulama geliştirme durumlarında bu ilke başka nedenlerden dolayıda çok ihlal edilir&#8230;Hele ipin ucu kaçtı mı, bir çok şeyden sorumlu nesneler ve hiç bir sorumluluğu olmayan nesneler sistemde dolaşır&#8230;</p>
<p><strong>Open-Closed</strong>: Bu ilke, nesnelerin değişikliğe kapalı(Closed), ama genişletmeye açık(Open) olmasını söyler. Bir nesnenin kendi özelliklerinin değişmesinden çok, bu değişiklikleri genişletme bakış açısından ele alıp, nesneyi genişletmek, nesnenin yavaş sürecinin sağlıklı kalmasını sağlayacaktır. Bir metodun değiştiğini düşünün, bu metodu kullanan diğer bileşenlerin de mevcut değişikliğe ayak uydurması gerekecektir. Bu bileşen çalışan bir sistem içerisindeki bir bileşense bu değişikliğe ayak uydurmak biraz zor olacak ve hatta çalışma süresine etki edecektir. Bundan dolayı nesneleri değiştirmek yerine genişletmek daha doğru olacaktır. Nesneleri “inheritance” kavramını uygulayarak yeni nesneler yaratacak şekilde genişletmek, ya da belirli “interface”(arayüz) ya da “abstract”(soyut) sınıfları uygulayacak şekilde genişletmek bu ilkenin doğru işletilmesi adına doğru bir yaklaşım olacaktır.</p>
<p><strong>Liskov substitution</strong>: Bu ilke, X tipinden türeyen Y tipinde ki bir nesnenin, X tipinden türeyen herhangi bir tip ile değiştirebileceğini söyler. Burada önemli olan bu değişikliği yaparken, bu nesneleri kullanan sistemde bir değişiklik yapılmaması gerekliliği&#8230;Yani İnsan sınıfından türeyen Erkek sınıfı ve Kadın sınıfı, İnsan sınıfının özelliklerini, metodlarını kullanan bir sistem içerisinde değiştirilebilmelidir. (Ama tabi ayrımcılıkta yapmamak lazım <img src='http://www.minepla.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  )<br />
Bu ilkenin amacı yapılan tasarımın belli kontratlara göre yapılmasını sağlamaktır. Bu sayede geliştirilen sistem kendi içinde istikrarlı ve kurallı olacaktır. Aynı zamanda bu kontratlara uyan başka nesneler ile de sistemin genişletilmesi mümkün olur. WCF deki “Data Contract” kavramının da temelinde bu ilke vardır. Aynı şekilde .NET Framework 4.0 ile beraber gelen “Contracts” kavramını da bu ilkeye örnek olarak gösterebilirz.</p>
<p><strong>Interface segregation</strong>: Bu ilke, bir “interface”(arayüz)  aracılığıyla yaratılan nesnelerin gerektiğinde başka arayüzlere ayrılması gerektiğini söyler. Aslında amaç olarak Single Responsibility’e benzer, çünkü bu sayede her nesnenin sorumluluğu kadar arayüzü olmasını söyler. Bütün nesneleri bir arayüzden türetmek, bazı yaratılan nesnelerin o arayüz methodlarına ihtiyacı olmamasına rağmen kullanmasını zorunlu kılar. Ama bu çok doğru ve istenen bir kullanım olmamalıdır. Çünkü nesnelerin karmaşıklığını artırır&#8230;Bu yüzden nesneleri farklı arayüzlere ayırmak karmaşıklığı azaltır.</p>
<p><strong>Dependency inversion</strong>: Bu ilke, nesnelerin soyutlaştırılmasını ve nesnelerin başka nesnelere bağlılığından çok, soyut nesnelere bağlı olmasını söyler. Bu sayede nesnelerin birbirlerine bağımlılıkları azalacaktır. Farklı ihtiyaçlara hitap eden nesnelerin birbirine bağımlılığı, yine nesneleri karmaşıklaştıracaktır. Nesnelerin birbirlerine bağlı olma şekli önemli ama nasıl bağlandığı önemli olmamalıdır. Bu detayların her nesne(leri)nin kendi içinde yönetilmesi daha doğru bir yaklaşım olacaktır. Genellikle bu ilkeyi nesneye yönelik tasarımda uygulamak oldukça zor olabiliyor, en azından benim gözlemlediğim süreçler bu yönde. Ancak bu ilke başarılı bir şekilde uygulandığı takdirde sağlıklı tasarımlar yapmak daha kolay olacaktır.</p>
<p>Nesneye yönelik programlama ve nesneye yönelik tasarım kavramlarını bir birinden ayırabilmek çok önemlidir. Bundan dolayı kendimce, çat bat ikisi arasında ki ilişkiyi biraz özetlemeye çalıştım. Umarım faydalı olur&#8230;</p>
<p>Neyse şimdilik bu kadar&#8230;Bu ve benzeri konularda biriken yazacak çok şey var&#8230;Yazma konusunda ki tembelliğimi yendiğim an onları da burada bulabileceksiniz&#8230;</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2011/01/nesneye-yonelik-programlama-my-nesneye-yonelik-tasarym-my/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Microsoft Enterprise Library 5.0 versiyonu yayınlandı&#8230;</title>
		<link>http://www.minepla.net/2010/04/microsoft-enterprise-library-5-yayynland/</link>
		<comments>http://www.minepla.net/2010/04/microsoft-enterprise-library-5-yayynland/#comments</comments>
		<pubDate>Wed, 21 Apr 2010 17:14:26 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Architecture]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1138</guid>
		<description><![CDATA[patterns &#38; practices ekibinden uzun süredir beklenen haber geldi. Microsoft Enterprise Library 5.0 versiyonu son halini alıp yayınlandı.  Bu adresten kütüphanenin kurulum dosyalarını ve kaynak kodlarını indirip, kendi geliştirmekte olduğunuz uygulamalarda kullanabilirsiniz. Ayrıca ayrıntılı bilgi ve dökümantasyon için de MSDN sayfasına göz atmanızı tavsiye ederim.]]></description>
			<content:encoded><![CDATA[<p>patterns &amp; practices ekibinden uzun süredir beklenen haber geldi. Microsoft Enterprise Library 5.0 versiyonu son halini alıp yayınlandı.  <a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=bcb166f7-dd16-448b-a152-9845760d9b4c&amp;displaylang=en" target="_blank"><strong>Bu adresten</strong></a> kütüphanenin kurulum dosyalarını ve kaynak kodlarını indirip, kendi geliştirmekte olduğunuz uygulamalarda kullanabilirsiniz.</p>
<p>Ayrıca ayrıntılı bilgi ve dökümantasyon için de <a href="http://msdn.microsoft.com/en-us/library/ff632023.aspx" target="_blank"><strong>MSDN sayfasına</strong></a> göz atmanızı tavsiye ederim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2010/04/microsoft-enterprise-library-5-yayynland/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Yazılım karmaşık bir kavram&#8230;mı acaba?&#8230;</title>
		<link>http://www.minepla.net/2010/04/yazylym-karmathyk-bir-kavram-my-acaba/</link>
		<comments>http://www.minepla.net/2010/04/yazylym-karmathyk-bir-kavram-my-acaba/#comments</comments>
		<pubDate>Mon, 12 Apr 2010 11:31:45 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=1086</guid>
		<description><![CDATA[Yazılım karmaşık(kompleks) bir kavram mıdır? Aslında evet ya da hayır şeklinde cevabı olan bir soru değil bu. Ya da bu şekilde cevaplanması gereken bir soru değil. Bu sorunun cevabını irdelemeden önce, neden böyle bir soru sorup, ortamı geriyoruz önce bunu anlayalım&#8230; Bu soruyu sormamızın amacı, önümüze çıkacak olan karmaşık problemleri çözmek için nasıl bir yol [...]]]></description>
			<content:encoded><![CDATA[<p>Yazılım karmaşık(kompleks) bir kavram mıdır?</p>
<p>Aslında evet ya da hayır şeklinde cevabı olan bir soru değil bu. Ya da bu şekilde cevaplanması gereken bir soru değil. Bu sorunun cevabını irdelemeden önce, neden böyle bir soru sorup, ortamı geriyoruz önce bunu anlayalım&#8230;<br />
Bu soruyu sormamızın amacı, önümüze çıkacak olan karmaşık problemleri çözmek için nasıl bir yol izleyeceğimizi kestirebilmek. Bir yazılımın karmaşıklığını düşünmek, geliştirme sürecinde ortaya çıkabilecek, planda olmayan engelleri ortaya çıkarmak adına oldukça faydalıdır.</p>
<p><a href="http://www.minepla.net/wp-content/uploads/complex.jpg"><img class="size-full wp-image-1088 alignleft" title="complex" src="http://www.minepla.net/wp-content/uploads/complex.jpg" alt="" width="360" height="252" /></a>Neden bu soruya cevap aradımızı anladıktan sonra, cevabını bulmak daha kolay olacaktır. Yazılım kavramı, yeri geldiğinde oldukça karmaşık, içinden çıkması zor, bir o kadar da sıkıntılı olabilir. Ama aynı şekilde çok kolay da olabilir. Bunların bir kaç nedeni var. Birazdan bu nedenlere geçiyor olacağım.</p>
<p>Yazılımda karmaşıklık dendiğinde genelde, sistemi oluşturan bileşenlerin bir birleri olan ilişkileri ya da bileşenlerin kendi içerisinde çağırdıkları diğer alt bileşenlerin sayısı gibi şeyler hesaplanır. Bunun için çeşitli formüller ve yaklaşımlar var, aslında tamamen ayrı bir başlık altında incelenmesi daha doğrudur. Ama biraz daha yukarıdan bakıp karmaşıklığı daha net görmeye çalışacağız.</p>
<p>Yazılım da karmaşıklığa neden olabilecek faktörler “Gereksinimler”,”Teknoloji” ve “İnsan” olarak 3 ayrı başlıkta toplanabilir.</p>
<p><strong>Gereksinimler</strong></p>
<p>Karmaşıklığa yol açabilecek en büyük etken, yazılıma ihtiyaç duyulan, yazılımın yaşamsal döngüsünü başlatan “Gereksinimler”dir.  Gereksinimlerden dolayı, teknik anlamda oldukça kolay bir operasyon, oldukça karmaşık bir hal alabilir. Aslında bu karmaşıklık bazen kaçınılmaz olup, diğer başka faktörler ile minimum seviye indirilebilir.<br />
Mesela bir sisteme kayıt olma işlemini örnek olarak alalım. Sistem için ad,soyad,TC Kimlik No. ve e-mail anlamlı olsun diyelim. Oldukça basit bir şekilde sisteme bu bilgileri alan bir arayüz yapıp, bu bilgileri sistem altına kayıt edebiliriz. Şimdi çeşitli ihtiyaçlardan dolayı, sistemi tekrar ele alalım&#8230;Kayıt işlemi sırasında TC Kimlik No. geçerli bir numara olduğundan emin olmamız gerekmekte. Ayrıca e-mail adresinin formatının geçerli bir e-mail adresi olduğunun da kontrolü gerekmekte. Ek olarak, e-mail adresinin gerçekten karşılığının olduğunu kayıt sırasında teyit etmemiz gerekmekte. Görmüş olduğunuz gibi bir kaç basit gereksinimden dolayı, ilk baştaki kayıt işlemi biraz daha karmaşıklaştı. Aynı anda 500.000 kişinin veri girişi yapabileceği bir gereksinim oluştu diyelim sonra da&#8230;Bir de farklı arayüz ortamlarında(mobil,web&#8230;vs.) giriş işleminin yapılması gerektiğini de düşünelim. İlk baştaki kayıt işlemi, son haline göre oldukça karmaşık bir hal aldı.</p>
<p><strong>Teknoloji</strong></p>
<p>Teknoloji kavramı, yazılımın yaşam sürecinde beyin görevini gören bir kavramdır. İnsanoğlu beynin karmaşıklığını çözememişken, teknoloji de yazılımın karmaşıklığına büyük etken sağlar aslında. Kullanılan teknoloji, yazılımın karmaşıklığına ayrıca yol da verir. Yani X teknolojisi ile başladığınız bir yazılım, gereksinimlerden dolayı Y teknolojisinden de az biraz kullanmanızı gerektirebilir. Bundan dolayı, yazılımınızın karmaşıklığı doğal olarak artmış olur. Yukarıda bahsetmiş olduğum kayıt örneğini bu açıdan yine ele alalım. İlk başta basit bir masaüstü uygulaması ile .NET Framework kullanarak kolayca kayıt işlemini yapabiliyorkan, aynı uygulamayı kiosk tarzı ya da belli bir amaç için çalışan cihaz üzerinde çalıştırmak istediğimizde C++ ile çok daha kolay yapabiliyor olabiliriz. Ya da milyonlarca kişinin sahip olduğu cep telefonlarında Java ile cep telefonlarına uygulama yazmak işimizi daha kolaylaştıracaktır. Bundan dolayı yazılım geliştirme sürecinde kullanılacak teknoloji, karmaşıklık adına oldukça önemlidir.</p>
<p><strong><a href="http://www.minepla.net/wp-content/uploads/esher-300x282.jpg"><img class="size-full wp-image-1087 alignright" title="esher" src="http://www.minepla.net/wp-content/uploads/esher-300x282.jpg" alt="" width="300" height="282" /></a>İnsan</strong></p>
<p>Yazılımı kullanıcak ve geliştirecek kişi yazılımın yaşam sürecine direk olarak etki eder. Bu da zaman içerisinde yazılımın karmaşıklığını etkileri. Önce kullanıcı açısından bakalım. Yazılımı kullanacak olan kullanıcı belli ihtiyaçlarını karşılamak için yazılıma ihtiyaç duymuştur mutlaka. Genellikle bu ihtiyaçlarını önceden bir şekilde karşılayabildiği için, belli alışkanlıkları vardır. İşte bu alışkanlıklar, kullanıcının ne istediğinde önemli etken olabilmektedir. Birden fazla kullanıcı olduğundan dolayı da bu etki oldukça büyük olacaktır. Geliştirici açısından ele aldığımızda, karmaşıklık kat sayısı oldukça artabiliyor. Geliştirme sürecinde yer alacak kişilerin bilgi birikimleri, hakim oldukları  teknoloji ve tecrübeleri, yazılımı ister istemez karmaşıklaştıracaktır. Bir yazılımcı, tecrübelerinden dolayı, X işini oldukça kolay yabiliyorken, aynı işi başka bir yazılımcı daha zor ama daha etkili bir şekilde yapabilir. Bu tarz yaklaşım farkları, yazılımın karmaşıklığında büyük etki yapabilir.</p>
<p>Başka faktörler de yazılımın karmaşıklığında etken olabilir tabi ki. Ama bu 3 kavramın en önemli ve etken olduğu kanısındayım. Ayrıca yazılımlar, doğası itibari ile mutlaka karmaşık olacaktır. Önemli olan bu karmaşıklığa yol açabilecek şeylerin farkında olup, karmaşıklığı minimuma indirmek. Neyse çok karıştırmadan,bitiriyorum bende&#8230;:) Şimdilik bu kadar&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2010/04/yazylym-karmathyk-bir-kavram-my-acaba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Nesne&#8221; tasarımı bu,başka bir şeye benzemez&#8230;</title>
		<link>http://www.minepla.net/2010/03/nesne-tasarymy-bubathka-bir-theye-benzemez/</link>
		<comments>http://www.minepla.net/2010/03/nesne-tasarymy-bubathka-bir-theye-benzemez/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 18:44:47 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=995</guid>
		<description><![CDATA[Bir yazılım projesinde yazılım tasarımına başlarken, kafamızda ilk yaptığımız şey genellikle direk projenin nesne modelini çıkarmaya çalışmak oluyor. Yanlış bir şey olmasa da öncesinde yapılması gereken başka şeyler olduğundan ortaya çıkan nesne modeli ne kadar sağlıklı oluyor tartışılır. Kendi tecrübelerim ve gözlemlerime göre genellikle nesnelerin bir birleri ile ilişkilendirilmeleri konusunda hatalar yapabiliyoruz. Aslında hata demek [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.minepla.net/wp-content/uploads/object.jpg"><img class="size-full wp-image-996 alignright" title="Nesne modeli" src="http://www.minepla.net/wp-content/uploads/object.jpg" alt="" width="344" height="258" /></a>Bir yazılım projesinde yazılım tasarımına başlarken, kafamızda ilk yaptığımız şey genellikle direk projenin <strong>nesne modelini</strong> çıkarmaya çalışmak oluyor. Yanlış bir şey olmasa da öncesinde yapılması gereken başka şeyler olduğundan ortaya çıkan nesne modeli ne kadar sağlıklı oluyor tartışılır. Kendi tecrübelerim ve gözlemlerime göre genellikle nesnelerin bir birleri ile ilişkilendirilmeleri konusunda hatalar yapabiliyoruz. Aslında hata demek doğru olmaz. Bazı noktaları düşünmeden, bazı şeyleri göz ardı ederek nesne modellerini oluşturuyoruz ve bunlar yazılım tasarımının ilerleyen aşamalarında sorun olarak karşımıza çıkmasa da, geliştirme sürecinde mutlaka karşımıza çıkıyor. Nesnelerin bir birleri ile olan ilişikileri ile bir sonraki yazımda daha çok ilgileniyor olacağım. Ama önce nesnelerimizi tasarlarken göz ardı edildiğini düşündüğüm bir kaç noktaya değinmek istiyorum.</p>
<h2><strong>Bir nesnenin var oluş sebebi&#8230;</strong></h2>
<p>
Her hangi bir kavramın nesne modelini oluştururken, o kavramın ne amaçla var olduğunu asla unutmamak gerekir. Gerçekleştireceği operasyonların, o kavram dahilinde olduğunu kesinleştirmek nesne modelini ve ilgilerini oluşturmakta daha kolaylık sağlayacaktır. Matemetikte ki 4 işlemi soyutlayan bir nesneye, belli bir süre için faiz hesaplayan bir metodu da 4 işlem dahilinde olduğunu düşünerek eklemek o nesnenin karmaşıklığını artıracaktır. Farklı yerlerde farklı şekillerde var olabileceğinden tasarımsal olarak soruna yol açacaktır. Dolayısıyla nesnelerin görevlerinin çok net bir şekilde tanımlanıyor olması gerekmekte.</p>
<h2><strong>Bir nesnenin yaşam süresi&#8230;</strong></h2>
<p>
Nesnelerin, bütün içerisinde ki yaşam süresini yönetebiliyor olmak çok önemlidir. Gelişen &#8220;<strong>geliştirme teknolojileri&#8221;</strong> bu sürenin yönetimini biraz olsun geliştiriciden alıyor olsa da, en azından nesnelerin yaşam sürelerinin farkında olmak bizim için çok önemli. &#8220;<strong>Object reference not set to an instance of an object&#8221;</strong>(sanırım en çok alınan hatadır) hatasını alıyor olmamız, bir bakıma da nesnelerimizin nerede, ne zaman, nasıl yaşadığının farkında olmamamızdan kaynaklanıyor diyebilirim. Nesnelerimizin, nerede, ne şekilde, ne kadar yaşayacağını ya da var olacağını çok iyi belirlememiz gerekiyor.</p>
<h2><strong>Bir nesnenin ilişkileri&#8230;</strong></h2>
<p>
Nesnelerin bir birleri ile olan ilişkilerini ortaya net bir şekilde çıkarmak çok önemlidir. Bu noktada &#8220;<strong>Composition(part-of)&#8221;</strong>(Bileşim),<strong>&#8220;Aggregation(has-a)&#8221;</strong>(Kümelenme,bir araya gelme) ve <strong>&#8220;Inheritance(is-a)&#8221;</strong>(Kalıtım) kavramlarını anlıyor olmak çok önemlidir. Teorik olarak kavramlara hakim olsak bile, nesne tasarımlarında bunları uygulama konusunda zaman zaman sıkıntı çekilebiliyor. Nesneler arasında ki ilişikleri, hangi nesnenin hangi nesneye bağlı olduğunu ya da olacağını ilk başlarda kestirebiliyor olmak çok zor olsada,  bu zorluğa katlanıp çözme çabası olumlu sonuçları beraberinde getirecektir. Bu aşamada <strong>&#8220;Dependency injection&#8221;, &#8220;Inversion of control&#8221;</strong> kavramlarını da çok iyi anlıyor olmamız gerekmekte&#8230;<br />
Bu üç başlığın yazılım tasarımı konusunda, özellikle nesne modeli oluştururken çok önemli olduğunu düşünüyorum. Şimdilik bu kadar&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2010/03/nesne-tasarymy-bubathka-bir-theye-benzemez/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>İnşaatta hazır beton kullanıyoruz,yazılımda da kum&#8230;</title>
		<link>http://www.minepla.net/2010/02/insaatta-hazir-beton-kullaniyoruz-yazilimda-da-kum/</link>
		<comments>http://www.minepla.net/2010/02/insaatta-hazir-beton-kullaniyoruz-yazilimda-da-kum/#comments</comments>
		<pubDate>Tue, 16 Feb 2010 20:45:47 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=965</guid>
		<description><![CDATA[Bir çok yerde “Architecture and Design Patterns”(Mimari ve Tasarım Kalıpları) başlığına benzer başlıklar altında çeşitli yazılar okuyoruz. Ve çoğunun içeriği Gof(gang of four)’un ön ayak olduğu tasarım kalıpları ile ilgili&#8230;İyi,güzel ama peki bunların “mimari” kelimesi ile alakası ne&#8230;Direkt olarak pek yok&#8230;Evet, gerçekten pek yok&#8230; Belki benden tecrübeli meslektaşlarım biraz kızacak ve hatta ne saçmalıyorsun falan [...]]]></description>
			<content:encoded><![CDATA[<p>Bir çok yerde “Architecture and Design Patterns”(Mimari ve Tasarım Kalıpları) başlığına benzer başlıklar altında çeşitli yazılar okuyoruz. Ve çoğunun içeriği Gof(gang of four)’un ön ayak olduğu tasarım kalıpları ile ilgili&#8230;İyi,güzel ama peki bunların “mimari” kelimesi ile alakası ne&#8230;Direkt olarak pek yok&#8230;Evet, gerçekten pek yok&#8230;</p>
<p>Belki benden tecrübeli meslektaşlarım biraz kızacak ve hatta ne saçmalıyorsun falan diyecektir. Ama açıkcası “Design Patterns”(Tasarım kalıplarının) direk olarak mimari yaklaşımlar ile alakalı olduğunu düşünmüyorum, aslında düşünmediğim gibi, kendi tecrübelerimden,okuduklarımdan, öğrendiklerimden görüyorum da&#8230;</p>
<p><a href="http://www.minepla.net/wp-content/uploads/concrete.jpg"><img class="size-full wp-image-966 alignleft" title="concrete" src="http://www.minepla.net/wp-content/uploads/concrete.jpg" alt="" width="224" height="195" /></a>“Design Patterns”(Tasarım kalıpları) hakkında internette bir çok kaynak var. Çoğunda belli kod parçacıkları ile örnekler ile ne amaçla kullanacağımızı falan anlatılıyor.Süper, mükemmel&#8230;Ama erken&#8230;Daha kod yazmaya başlamadık ki&#8230;</p>
<p>Madem böyle kalıp falan başladık bahsetmeye, bu yazının amaçı olan “Architecture Patterns(Sytles)”’e(Mimari Kalıplara) geçelim.Çeşitli kaynaklarda mimari sitiller, bazılarında da mimari kalıplar şeklinde geçer, ama yazılımcıların bakış açısından daha kolay anlaşılacağını düşündüğüm için bende kalıp olarak kullanacağım. Önceki yazılarda da bahsettiğim ihtiyaçlar doğrultusunda şekillenecek(şekillenmesi gereken) mimarimizi, belli tecrübelerden, teknolojik açılardan ve belli limitlerden dolayı belli kalıplar dahilinde şekillendirmemiz bize yardımcı olabilir. Kurabiye yaparken kullanılan kalıplar ya da kumdan kaleler yaparken kullandığımız kovalar gibi&#8230;</p>
<p>Bu bağlamda, ne olduklarının çok farkında olmadığımız ama sık sık kullandığımız kavramlar ortaya çıkıyor. Mimari kalıplar&#8230;</p>
<p><a href="http://www.minepla.net/wp-content/uploads/Concrete1.jpg"><img class="alignright size-full wp-image-967" title="Concrete1" src="http://www.minepla.net/wp-content/uploads/Concrete1.jpg" alt="" width="210" height="223" /></a>Mimari kalıplar, geliştireceğimiz sistemlerin ya da yazılımların ihtiyaçlarımız doğrultusunda çok daha etkili çalışabilmesini sağlayacak  ve mimarimizi geliştirirken bize yol gösterecek kalıplardır. Çok daha iyi anlaşılması adına aşağıdaki gibi bir liste yaparsam daha iyi olur sanırım.</p>
<ul>
<li> Bileşen tabanlı mimari</li>
<li> Katmanlı mimari</li>
<li> P2P mimari</li>
<li> UI tabalı mimari</li>
<li> Mesaj bazlı mimari</li>
<li> Servis tabanlı mimari</li>
<li> Event tabanlı mimari</li>
</ul>
<p>Yukarıda bazı popüler mimari kalıplardan örnekler var. Daha çeşitlenebilir tabi ki. Bunları tek tek şuan için açıklamayı düşünmüyorum. Bu noktada mimari kalıpların neden önemli olduğunu anlatmak istiyorum. Mimari kalıplar, ihtiyaçlarımızı daha net bir şekilde karşılamamızda bize yol gösterir. Ayrıca ihtiyaçlarımızı karşılarken, hangi yöntemleri kullanabiliriz bunları sunar. Bu kalıpları ayrı ayrı düşünüyor olmak biraz hatalı olabilir. Direk olarak kesiştirmek de hatalı olur. Mimari tasarımı yaparken, ihtiyaçlarımızı bu kalıplar doğrultusunda çerçeveleyip tasarımımızı yapmak çok daha sağlıklı sonuçlar getirecektir. Ayrıca bu kalıpların kendi içlerindeki kanıtlanmış yöntemler, sizi bir çok şeyden kurtarıyor da olacaktır.</p>
<p>Son olarak tekrardan “Design Patterns”-tasarım kalıplarının, mimari tasarımla direk alakası olmadığını söylemek istiyorum. Bu karıştırmadan dolayı kavramların da karıştığını görüyorum. İlerleyen yazılarda yine bu konulardan bahsediyor olacağım&#8230;Şimdilik bu kadar&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2010/02/insaatta-hazir-beton-kullaniyoruz-yazilimda-da-kum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>İnşaat mı tasarlarız, yoksa mimarisini mi&#8230;</title>
		<link>http://www.minepla.net/2010/02/insaat-mi-tasarlariz-yoksa-mimarisini-mi/</link>
		<comments>http://www.minepla.net/2010/02/insaat-mi-tasarlariz-yoksa-mimarisini-mi/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 18:05:54 +0000</pubDate>
		<dc:creator>Arda</dc:creator>
				<category><![CDATA[Miyop]]></category>
		<category><![CDATA[Architecture]]></category>

		<guid isPermaLink="false">http://www.minepla.net/?p=961</guid>
		<description><![CDATA[“Yazılım mı tasarlarız, yoksa yazılım mimarisini mi?” şeklinde yukarıdaki soruyu geliştirdiğimiz yazılımlar için de sorabiliriz. Hem yazılımın kendini, hem de yazılım mimarisini  tasarlamayı aynı kelime ile tanımladığımız için bu kavramlarda karışıyor. “Tasarım”&#8230; “Software Design” ve “Software Architecture Design” iki farklı kavram aslında. Bu iki kavramın karıştırılıyor olması, mimari kavramların kaybolmasına neden oluyor ne yazık ki. [...]]]></description>
			<content:encoded><![CDATA[<p>“Yazılım mı tasarlarız, yoksa yazılım mimarisini mi?” şeklinde yukarıdaki soruyu geliştirdiğimiz yazılımlar için de sorabiliriz. Hem yazılımın kendini, hem de yazılım mimarisini  tasarlamayı aynı kelime ile tanımladığımız için bu kavramlarda karışıyor. “Tasarım”&#8230;</p>
<p><a href="http://www.minepla.net/wp-content/uploads/design.jpg"><img class="size-full wp-image-962 alignleft" title="design" src="http://www.minepla.net/wp-content/uploads/design.jpg" alt="" width="242" height="324" /></a>“Software Design” ve “Software Architecture Design” iki farklı kavram aslında. Bu iki kavramın karıştırılıyor olması, mimari kavramların kaybolmasına neden oluyor ne yazık ki. Bundan dolayı “Tasarım”(Design) ve “Mimari”(Architecture) kavramlarının arasındaki sınırı çok iyi anlamamız gerekmekte. Tüm mimari yaklaşımlar aslında bir tasarımdır. Ama bu tasarım, “Yazılım Tasarımı”(Software Design) daki tasarım değil. Mimari olarak yaklaştığımız zaman, “tasarım” kavramı çok daha yukarıdan bakmamızı gerektiren bir kelime olarak karşımıza çıkıyor. Bir yazılım ya da sistemdeki bileşenlerin nasıl organize olduğu ve ilişkilendirildiği, o sisteme ya da yazılıma “Mimari” açıdan yaklaşımı gösterir. Bu bileşenlerin nasıl sınıflandırıldığı ve ayrıştığı ise “Tasarımı” olarak açıklanabilir. Biraz daha basite indirgememiz gerekirse, yazılım geliştirirken bileşenlerimizi  “sınıf”(class)’lara ayırmamız, bu “sınıf”lar arasında ilişkileri belirlememiz “tasarım” kavramının konusu. Ama bileşenlerimizin(component) nasıl ilişkilendirileceği de “mimari” kavramının konusu.</p>
<p>Açıkcası kendi geliştirdiğim yazılımlarda, bu iki kavramın ayrımını fark ediyor olmak geliştirme sürecini daha sağlıklı hale getiriyor.Bir yazılım geliştirmeden önce hepimizin yapmış olduğu bir tasarım mutlaka vardır. İşte bu tasarım süreci  mimari tasarıma denk geliyor aslında. Ve yazılım geliştirme sürecinde herkesinde bildiği gibi çok önemli bir yer kaplıyor. Bu süreçte dikkat edilmesi gereken bir çok önemli nokta var.Bunlardan bence en önemlilerini kendimce anlatmaya çalışacağım;</p>
<ul>
<li><strong>Sınırlar:</strong> Tasarım sürecinde, geliştirmemiz gereken yazılımın ya da sistemin ihtiyaçları ve neden gerekli olduklarını kesinlikle unutmamak lazım. Ve ihtiyaçtan fazlasını düşünmememiz lazım. Açıkcası bunu sürekli yaşıyorum. İster istemez yazılımın olabildiğince geniş bir kapsamı olması, ya da “genişletilebilir” kalite özelliğinin hem tasarım hemde geliştirme sürecinde öne çıkması kötü tasarımlara yol açıyor. İş gereksinimleri dışında, tasarımı karmaşıklaştıracak etkenleri tasarıma sokmamak ve ihtiyaçlarımız doğrultusunda sınırlarımızı aşmamak lazım.<a href="http://www.minepla.net/wp-content/uploads/design1.jpg"><img class="size-full wp-image-963 alignright" title="design1" src="http://www.minepla.net/wp-content/uploads/design1.jpg" alt="" width="248" height="297" /></a></li>
<li><strong>Bileşenlerin Ayrılması: </strong>Tasarımı yaparken, bir birinden farklı tüm fonksiyonel özellikleri belli bileşenler olarak ayırmak tasarımın karmaşıklığını önleyecektir, ayrıca ihtiyaçların gerçekten karşılanabiliyor olmasının gözlemlenmesine ve bileşenlerin tek başlarına ne işe yaradıklarını da anlamaya yardımcı olacaktır.Literatürde “Separation of Concerns” olarak yer alan bu kavram, geliştirme sürecindeki tasarım kalıpları ile ne kadar önemli olduğunu zaten belli edecektir.  Dolayısıyla geliştirme sürecinde sonradan fark etmek yerine, başlangıçta bu yaklaşıma göre yapılacak tasarımlar faydalı olacaktır.</li>
<li><strong>Bileşim(Composition) ve Kalıtım(Inheritance): </strong>Bu iki kavramın çok iyi anlaşılıyor olması gerekmekte. Çünkü geliştirilecek sistemin ya da yazılımın bileşenleri üzerinde bu iki kavramın çok büyük etkisi olacaktır. İhtiyaca göre bu iki yaklaşım doğru çizilmelidir.”Kalıtım”(Inheritance) bileşenler üzerinde bağımlılığı artıracağından, hangi bileşenlerin bir birleri ile alakalı olacağı ilişkisinin çok iyi tanımlanması gerekmekte. Öte yandan “Bileşim”(Composition) bileşen kavramını daha netleştirecektir.</li>
<li><strong>Katmanlar(Layers):</strong> Geliştirilen sistem ya da yazılım da, bileşenler arasındaki ilişikileri görmek ve yönetmek adına sistemi ya da yazılımı katmanlara ayırmak tasarımı kolaylaştıracak ve temelini güçlendirecektir. Bu şekilde katmanlara ayırmak sistemdeki akışın yolunuda görmenize yardımcı olacaktır.</li>
</ul>
<p>Mimari tasarımı yaparken bu tarz şeylere dikkat ediyor olmak, cidden bazı şeyleri çok daha net ortaya çıkarıyor ve sağlıklı bir geliştirme sürecinin ilk ışıklarını gösteriyor. En azından kendi tecrübelerime dayanarak bunu söyleyebilirim.Kendi tecrübelerim ve bilgilerim dahilinde “Mimari Tasarım” ve “Yazılım Tasarımı” arasındaki farkı anlatmaya çalıştım. Hatta biraz da “Mimari Tasarım”a daldım&#8230;Umarım faydalı olmuştur.İlerleyen zamanlarda bu konular hakkında daha çok yazıyor olacağım. Her türlü eleştiriniz ve düşüncenizi lütfen paylaşmaktan çekinmeyin. Bu kavramlar böyle böyle ortaya çıkıyor ve gelişiyor&#8230;Haydi görüşmek üzere&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.minepla.net/2010/02/insaat-mi-tasarlariz-yoksa-mimarisini-mi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

