Sayfalar

10 Şubat 2015 Salı

Tasarım Desenleri-2

Tasarım Desenleri-2 (Collection Pattern)

Bu desen benim tarafımdan geliştirildi. Eğer bir nesnenin özelliği (örnekte özellik "id") kolleksiyondaki nesnelerden yatay (aynı listede) ve dikey (chield-parent ilişkisi) etkileniyorsa bu desen kullanılabilir. Bunun dışında "Parent-Chield" ilişkisi olan modellerde bu ilişkinin doğal yoldan oluşmasını sağlayabilirsiniz yani nesnenin ParentObject veya ChieldObject diye bir parametresi varsa bunları belirtmenizi gereksiz kılar.(Nesne eklenme esnasında bu belirtimleri kendisi yapar.) Hiyerarşik controllerde id tanımlamasında güçlük çekilebilmektedir. Bu örnekte "id" ataması kontrolün eklenmesi ile oluşturuluyor.

using System;
using System.Collections.Generic;

namespace ConsoleApplication1.CreationalPatterns
{
    class MainProgram
    {
        public static void Main()
        {

            FormControl AnaForm = new FormControl() { Id = "AnaForm" };
            FormControl AraForm = new FormControl();
            AnaForm.Controls.Add(AraForm);

            AraForm.Controls.Add(new Button() { Text = "Btn1" });
            AraForm.Controls.Add(new Button() { Text = "Btn2" });

            Console.WriteLine("Ana form kontrolleri");
            AnaForm.Controls.ForEach(x => Console.WriteLine(x.Id));

            Console.WriteLine("Ara form kontrolleri");
            AraForm.Controls.ForEach(x => Console.WriteLine(x.Id));

            Console.ReadKey();
        }
    }
    public class Field
    {
        public object Id { get; set; }
        public string Name { get; set; }
    }
    public class BaseControl : Field
    {
        public BaseControl(){}
        public IdMode IdMode { get; set; }
    }
    public enum IdMode { Dynamic, Static }

    public class ControlCollection : List<BaseControl>
    {
        public FormControl control;
        public ControlCollection(FormControl control)
        {
            this.control = control;
        }
        public ControlCollection() { }
        public new void Add(BaseControl dtn)
        {
            if (dtn.IdMode == IdMode.Dynamic)
            {
                dtn.Id = control.Id + "_" + this.Count;
                dtn.IdMode = IdMode.Static;
            }
            base.Add(dtn);
        }
    }
    public class FormControl : BaseControl
    {
        public int DynamicTemplateId { get; set; }
        public FormControl()
        {
            Controls = new ControlCollection(this);
        }
        public ControlCollection Controls { get; protected set; }
    }
    public class Button : BaseControl
    {
        public Button(){       }
        public string Text { get; set; }
    }
}



Tasarım Desenleri

Tasarım Desenlerine Giriş-1 (AbstractFactory)

Nesne yönelimli proglamlama yaparken bir takım desenleri bilmemiz bizim uygun modellemeyi yapabilmemizi hızlandıracaktır. Bu blogta bir takım problemlere çözümler getiren modelleri paylaşacağım. Uluslar arası kabul görmüş bu yapılarla nesne yönelimli programlama tekniğinizi geliştirebilirsiniz.

AbstractFactory
Bu tasarım deseninde bir sınıf oluşturulmadan önce aldığı parametre ile istenen işlemleri yapacak sınıfların oluşturulması ve bu sayede çalıştırılacak olan methodların yapılacak işe göre şekillenmesi sağlanmış olur. Örneğin müşterinin bizden istediği ürüne göre (constructure parametresi) bizim cihaz üretmemizi düşünelim. Öncelikle bu cihazı üretecek aletleri temin ederiz (nesneleri oluştururuz.) . Daha sonra işlemleri yaparız( methodları çağırırız). Örnek vererek konu daha net anlaşılacaktır. Bir fabrikada opel astra ve opel vectra yapıldığını düşünelim. Fakat bu fabrikada opel astranında farklı modelleri  yapılabilmekte o zaman fabrikayı özelleştirmemiz gerekiyor. Fabrikadan miras alıp nihayi ürünü çıkaracak ufak atölyeler yapmamız gerekiyor. Sonuçta bu atölyeden farklı model arabalar çıkacaktır. Opel astra 2001 veya 2005 gibi.

        class MainProgram
    {

        public static void Main()
        {
           
            OpelFabrikasi factory1 = new Model2001Atolyesi();
            Araba client1 = new Araba(factory1);
            client1.Run();
        
            OpelFabrikasi factory2 = new Model2005Atolyesi();
            Araba client2 = new Araba(factory2);
            client2.Run();

            Console.ReadKey();
        }
    }
    abstract class OpelFabrikasi
    {
        public abstract OpelAstra OpelAstraUret();
        public abstract OpelVectra OpelVectraUret();
    }
    class Model2001Atolyesi : OpelFabrikasi
    {
        public override OpelAstra OpelAstraUret()
        {
            return new OpelAstra2001();
        }
        public override OpelVectra OpelVectraUret()
        {
            return new OpelVectra2001();
        }
    }
    class Model2005Atolyesi : OpelFabrikasi
    {
        public override OpelAstra OpelAstraUret()
        {
            return new OpelAstra2005();
        }
        public override OpelVectra OpelVectraUret()
        {
            return new OpelVectra2005();
        }
    }
    abstract class OpelAstra
    {
    }

    abstract class OpelVectra
    {
        public abstract void Interact(OpelAstra a);
    }

    class OpelAstra2001 : OpelAstra
    {

    }
    class OpelVectra2001 : OpelVectra
    {
        public override void Interact(OpelAstra a)
        {
            Console.WriteLine(this.GetType().Name +
              "==> " + a.GetType().Name);
        }
    }

    class OpelAstra2005 : OpelAstra
    {
    }

    class OpelVectra2005 : OpelVectra
    {
        public override void Interact(OpelAstra a)
        {
            Console.WriteLine(this.GetType().Name +
              " ==> " + a.GetType().Name);
        }
    }

    class Araba
    {
        private OpelAstra opelAstra;
        private OpelVectra opelVectra;

        public Araba(OpelFabrikasi factory)
        {
            opelVectra = factory.OpelVectraUret();
            opelAstra = factory.OpelAstraUret();
        }

        public void Run()
        {
            opelVectra.Interact(opelAstra);
        }
    }

2 Şubat 2015 Pazartesi

C# Tips

I will give a few c# tips.

1) You can form objects via casting

class Tip1
    {
        public void Method1()
        {
            var entity = new Entity() { Name = "Mehmet", SureName = "Yoldaş" };
            var formedEntity = (FormedEntity)entity;
        }
    }
    public class FormedEntity
    {
        public string FullName { get; set; }
        public static explicit operator FormedEntity(Entity entity)
        {
            return new FormedEntity() { FullName = entity.Name + " " + entity.SureName };
        }
    }
    public class Entity
    {
        public string Name { get; set; }
        public string SureName { get; set; }


    }

2)  There is no nessesary null check operation when calling handler method. You could set empty delegate  to handler method.

    public delegate void MyEventHandler(object sender, int value);
        public event MyEventHandler Handle = delegate { };

        public void Method1() //use this method instead of Method2
        {
            Handle(this, -1);
        }

        public void Method2()
        {
       
            MyEventHandler handle = Handle;
            if (handle != null)
            {
                handle(this, -1);
            }

        }
3) If you do not use event args and sender information you should use directly method same as code below.

 public void method()
        {
            Button btn = new Button();
            btn.Click += btn_Click; //bad
            btn.Click += (o, a) => Save();//good
        }
        void Save()
        {

        }
        void btn_Click(object sender, EventArgs e)
        {
            Save();
        }