Optimization Performance T-Sql Query : sp_executesql

sp_executesql has the same behavior as EXECUTE with regard to batches, the scope of names, and database context. The Transact-SQL statement or batch in the sp_executesql stmt parameter is not compiled until the sp_executesql statement is executed. The contents of stmt are then compiled and executed as an execution plan separate from the execution plan of the batch that called sp_executesql. The sp_executesql batch cannot reference variables declared in the batch that calls sp_executesql. Local cursors or variables in the sp_executesql batch are not visible to the batch that calls sp_executesql. Changes in database context last only to the end of the sp_executesql statement.

sp_executesql can be used instead of stored procedures to execute a Transact-SQL statement many times when the change in parameter values to the statement is the only variation. Because the Transact-SQL statement itself remains constant and only the parameter values change, the SQL Server query optimizer is likely to reuse the execution plan it generates for the first execution.

Ex:

USE AdventureWorks;
GO
DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
DECLARE @SalesOrderNumber nvarchar(25);
DECLARE @IntVariable int;
SET @SQLString = N'SELECT @SalesOrderOUT = MAX(SalesOrderNumber)
  FROM Sales.SalesOrderHeader
  WHERE CustomerID = @CustomerID';
SET @ParmDefinition = N'@CustomerID int,
                       @SalesOrderOUT nvarchar(25) OUTPUT';
SET @IntVariable = 22276;
EXECUTE sp_executesql
  @SQLString,
  @ParmDefinition,
  @CustomerID = @IntVariable,
  @SalesOrderOUT = @SalesOrderNumber OUTPUT;
-- This SELECT statement returns the value of the OUTPUT parameter.
SELECT @SalesOrderNumber;
-- This SELECT statement uses the value of the OUTPUT parameter in
-- the WHERE clause.
SELECT OrderDate, TotalDue
FROM Sales.SalesOrderHeader
WHERE SalesOrderNumber = @SalesOrderNumber;

References: http://technet.microsoft.com/en-us/library/ms188001.aspx

Google Product Search

posted 22 Ağustos 2007 Çarşamba 19:06 gönderen MuratHAKSAL :: 0 yorum
Filed Under:

Google Product Search eticaret'in rengini değiştirecek gibi,

bir ürünün aramasını yapıyorsun onunla ilgili tüm ürünler farklı markalar veya farklı tedarikciler fiyatları ile geliyor.

Bu serbest ekonominin tam dijitaleşmesi olsa gerek :)

İşte Rekabet :)

http://www.google.com/products

incelemenizi tavsiye ederim.

 

DAL nesnelerinde Manual Caching

 

public class DALProduct

{

static DALProduct()

{

//singleton cache nesnesi

if (_ProductCache==null)

{

_ProductCache = new Dictionary<int, Product>();

}

}

private static Dictionary<int, Product> _ProductCache;

public static Product GetbyProductID(int ID)

{

if (_ProductCache.ContainsKey(ID))

{

return _ProductCache[ID];

}

else

{

/*Baglan Dbye cek product ekle dictonarye

*

* */

_ProductCache.Add(ID, _product);

}

return _ProductCache[ID];

}

}

Builder Patterni

 

Builder Pattern'i temel olarak, karmaşık constructor yapısına sahip nesnelerin ayrıştırılmasına yardımcı olan design patternlerden birisidir, nesne yaratılması sırasında aynı construction farklı kullanımlı nesne yaratılmak için kullanılır. Anlamı, nesnenin değerlerini constructor alarak nesneleri uygun olarak oluşturur. Örneğim bir pizza siparişi alan, pizzayı türüne göre üreten ve teslim edilen süreçin örneğidir.

 

namespace BuilderPattern

{

//Temel Pizza Nesnem

public class Pizza

{

public Pizza()

{

}

public string Hamur;

public string Sos;

public string Malzeme;

public void SetHamur(string h)

{

Hamur = h;

}

public void SetSos(string s)

{

Sos = s;

}

public void SetMalzeme(string m)

{

Malzeme = m;

}

}

//Pizza yapıcım

public abstract class PizzaBuilder

{

public PizzaBuilder()

{

}

protected Pizza _Pizza;

public Pizza GetPizza()

{

return _Pizza;

}

public void CreateNewPizza()

{

_Pizza = new Pizza();

}

public abstract void buildHamur();

public abstract void buildSos();

public abstract void buildMalzeme();

}

//Pizalarımı nasıl yapıcağım :)tarifleri

public class TurkishPizza : PizzaBuilder

{

public override void buildHamur()

{

_Pizza.SetHamur("InceHamur");

}

public override void buildSos()

{

_Pizza.SetSos("Chilli Sos");

}

public override void buildMalzeme()

{

_Pizza.SetMalzeme("Mantar+Pastırma+Mozzarella+Zeytin");

}

}

//Pizalarımı nasıl yapıcağım :)tarifleri

public class ItalianoPizza : PizzaBuilder

{

public override void buildHamur()

{

_Pizza.SetHamur("DublexHamur");

}

public override void buildSos()

{

_Pizza.SetSos("Hardal Sos");

}

public override void buildMalzeme()

{

_Pizza.SetMalzeme("Siyah Zeytin+Mozzarella+Küp Sucuk");

}

}

//Sipariş alan ve Pizzayı veren vatandaş :)

class Garson

{

private PizzaBuilder pizzaBuilder;

public void setPizzaBuilder(PizzaBuilder pb)

{

pizzaBuilder = pb;

}

public Pizza GetPizza()

{

return pizzaBuilder.GetPizza();

}

public void PizzaHazirla()

{

pizzaBuilder.CreateNewPizza();

pizzaBuilder.buildHamur();

pizzaBuilder.buildSos();

pizzaBuilder.buildMalzeme();

}

}

//Kullanımı

public class Program

{

//Sipariş 1 Turkish pizza siparişi

public static void Main(string[] args)

{

Garson g = new Garson();

PizzaBuilder turkishPizza = new TurkishPizza();

g.setPizzaBuilder(turkishPizza);

g.PizzaHazirla();

Pizza p = g.GetPizza();

Console.WriteLine(p.Malzeme + " " + p.Hamur + " "+p.Sos);

Console.Read();

}

}

}

İş Kurallarının Aspect Oriented Yaklaşım ile Çözümü

Yazmış olduğumuz entity lerin propertylerinde bir çok biz rule olabilir, boş geçilmemesi, geçilirse bunların loglanması veya hata verdirilmesi gibi, örneklendirirsek müşterimizin siparişinin kredi limitinin üzerinde olmaması yine iş kuralıdır.  Aşağıdaki kodlarda çok basit bir örnek ile property değerleri atanmadığı durumda hata fırlatılan bir örnek.

İlk Başta Attribute yazalım:

  

[AttributeUsage(AttributeTargets.Property)]

public sealed class RequiredAttribute : Attribute

{

#region Constructors

/// <summary>

/// Default constructor.

/// </summary>

//public RequiredAttribute(string propertyName, string errorMessage) : this(propertyName, errorMessage) { }

/// <summary>

/// Constructor that takes the null value as parameter.

/// </summary>

public RequiredAttribute(string propertyName, string errorMessage)

{

if (string.IsNullOrEmpty(propertyName))

{

throw new ArgumentNullException("ArgumentNullException");

}

if (string.IsNullOrEmpty(errorMessage))

{

throw new ArgumentNullException("ArgumentNullException");

}

this.propertyName = propertyName;

this.errorMessage = errorMessage;

}

#endregion Constructors

#region Fields

private string propertyName;

private string errorMessage;

private object nullValue;

#endregion Fields

#region Properties

/// <summary>

/// Hangi Property

/// </summary>

public string PropertyName

{

get { return propertyName; }

}

/// <summary>

/// Hata Mesajı

/// </summary>

public string ErrorMessage

{

get { return errorMessage; }

}

#endregion Properties

}

Bunu kontrol eden fonksiyonumuzu yazalım

public class businessRule

{

public bool ValidateRequiredProperties(BusinessObjectType objectToBeSaved)

{

bool isValid = true;

//Propertileri alalım

foreach (PropertyInfo pi in objectToBeSaved.GetType().GetProperties())

{

//Kendi Attribute cekelim

if (pi.GetCustomAttributes(typeof(RequiredAttribute), true).Length > 0)

{

RequiredAttribute req = pi.GetCustomAttributes(typeof(RequiredAttribute), true)[0] as RequiredAttribute;

if (req != null)

{

object value = pi.GetValue(objectToBeSaved, null);

switch (pi.PropertyType.FullName)

{

case "System.String":

{

if (string.IsNullOrEmpty((string)value))

{

throw new Exception(" PropertyName : " +req.PropertyName + "\nError Message : " + req.ErrorMessage);

isValid = false;

}

break;

}

case "System.DateTime":

{

if (((DateTime)value) == DateTime.MinValue

&& value != null)

{

throw new Exception(" PropertyName : " + req.PropertyName + "\nError Message : " + req.ErrorMessage);

isValid = false;

}

break;

}

case "System.Int32":

if ((int)value==0)

{

throw new Exception(" PropertyName : " + req.PropertyName + "\nError Message : " + req.ErrorMessage);

isValid = false;

}

break;

default:

{

if (value == null)

{

throw new Exception(" PropertyName : " + req.PropertyName + "\nError Message : " + req.ErrorMessage);

isValid = false;

}

break;

}

}

}

}

}

return isValid;

}

}

Entity Kullanımı

 

public class BusinessObjectType

{

private string _Ad;

[Required("Ad", " Ad Alanı Boş Geçemezsin")]

public string Ad

{

get { return _Ad; }

set { _Ad = value; }

}

private DateTime _Tarih;

[Required("Tarih", "Tarihi alanı Boş Geçilemez")]

public DateTime Tarih

{

get { return _Tarih; }

set { _Tarih = value; }

}

private int myVar;

[Required("ID","ID değer alamalı")]

public int ID

{

get { return myVar; }

set { myVar = value; }

}

 

}

UI tarafı kontrol

class Program

{

static void Main(string[] args)

{

try

{

BusinessObjectType b = new BusinessObjectType();

businessRule br = new businessRule();

br.ValidateRequiredProperties(b);

Console.WriteLine(b.Ad);

Console.Read();

}

catch (Exception e)

{

Console.WriteLine(e.Message);

Console.Read();

}

}

}

 

Generic Factory Pattern

public static class EntityFactory

{

public static T CreateEntity<T>() where T : new()

{

//Nesnemizi yaratalım

T t = new T();

return t;

 

}

AdresDefteri.Entity.Kisi k = EntityFactory.CreateEntity<AdresDefteri.Entity.Kisi>();

----

public static class EntityFactory

{

public static T CreateEntity<T>() where T : new()

{

//Nesnemizi yaratalım

T t = new T();

//has ilişkili Collection ları Kontrol edelim eğer varsa onlarıda instancelayalım

Type typeData = typeof(T);

FieldInfo[] fields = typeData.GetFields(BindingFlags.Instance | BindingFlags.NonPublic);

foreach (FieldInfo field in fields)

{

if (field.FieldType.Name.Equals("IList`1"))

{

Type genericIListType = field.FieldType;

Type genericListType = typeof(List<>);

Type constructedListType = genericListType.MakeGenericType(genericIListType.GetGenericArguments());

field.SetValue(t,Activator.CreateInstance(constructedListType));

}

}

return t;

}

}

Object Cloner

internal static class ObjectCloner

{

public static object Clone(object obj)

{

using (MemoryStream buffer = new MemoryStream())

{

BinaryFormatter formatter = new BinaryFormatter();

formatter.Serialize(buffer, obj);

buffer.Position = 0;

object temp = formatter.Deserialize(buffer);

return temp;

}

}

}

OOP Principles

The Open Close Principle (OCP)

Uygulamamizin entity katmanin genişletilmeye açik ama değişikliğe ve silmeye kapali olmasi prensibidir.Bu her ne kadar da imkansiz olsa da değişiklikleri minimum düzeye indirecek önlemleri almaliyiz.

kapali tutmanin iki yolu;

1-Abstraction kullanmak. Değişiçek kisimlari soyutlayarak isole etmek

2-Data Driven yaklaşimi

 

Liskov Substitution Principle (LSP)

Base class a point eden fonksiyonlarin türeyen class lar üzerinde çalişmasini sağlama prensibidir.

Yani base class i kullanan fonksiyolarin base class yerine türetilen class i da kullanmasi sağlanmali.

Bu problemden kurtulmanin yolu da fonksiyonu detaylardan abstract etmek.

Fonksiyonun üzerinde işlem yaptiği tip olarak öncelikle üzerinde çaliştiği tipi görmeli.

 

Heuristic and Conventions

Bütün member lari private yap,encapsulation genelde sağlamak.

Global değişken kullanmaktan kaçin:Değeri her an heryerde değişebilen global değişkenler programin olmadik yerlerinde olmadik şekilde etkide bulunabilirler

 

Stability Dependencies Principle (SDP)

 Yapilar arasindaki ilişkiler bu yapilarin stabilitesini bozmamali.Yapilar kendilerinden daha kararli olan yapilarla ilişkilenmeli.

 

The Stable Abstractions Principle (SAP)

Stabilite si fazla olan yapilarin abstraction i da fazla olmali.

 

Common Reuse Principle (CRP)

Bir yapi içindeki bütün class lari tekrar  kullanilabilir halde olmali ki herhangi bir class ta yapilan değişiklik yapinin yeni bir versiyonunu oluşturmuş olur.

 

The Reuse/Release Equivalance Principle (REP)

Bu prensip genelde bir uygulama üzerinde birden fazla takim çalişiyorsa kullanilir. System yoluyla released edilmiş componentler efektif şekilde kullanilabilir.

 

Common Closure Principle (CCP)

Yapi içindeki class larin değişikliklerden etkilenmesini önlemek gerekir.Çünkü yapi üzerindeki değişiklik içindeki class lar da etkileyebilir.

 

The Acyclic Dependencies Principle (ADP)

Eğer birbirleriyle ilişkili yapilari olduğu gibi kullacaksa dependency ler en üstten yani roottan en alt kadameye kadar ayarlanmali.

 

The Interface Segregation Principle (ISP)

Kullanilacak memberlar (metotlar property ler  vs) gruplanarak yari ayri interface lere bölünmeli.Böylece class in kullanmadiği member lar implement edilmek zorunda kalinmaz.

 

Polyad  vs Monad

Objelerin Monad olarak (property ler grouplanarak içinde bulunduğu obje) fonksiyonda paramatre olarak verilmesi işlemidir.Objelerin Polyad(daha küçük yapilar olarak) fonksiyonlara parametre olarak verilmesidir.Böylece dependency ler de daha küçük ve daha kolay yapi korunumu sağlar.

 

 

Teknolojiyi üretmek kadar, ne için üretiğin de önemli

Google'dan reklamda yeni hizmet
 
İnternetin arama devi Google firması, yeni geliştirdiği "Reklam baskı programı" ile ABD'deki 225 gazeteye ilan almaya başladıklarını açıkladı.

Yaptığı çıkışlarla sektöründe öncü hale gelen Google firması, şimdi de ABD genelindeki 225 gazeteye ilan vermeyi elektronik ortama taşıdı. "Reklam baskı" programı ile Amerika'daki yaklaşık 30 milyon gazete okuyucusuna ulaşmayı hedefleyen Google, Kasım ayında başlattığı söz konusu çalışmayı geliştirerek toplam 225 gazeteye ilan almaya başladı.

Aralarında dünyaca ünlü The New York Times, Washington Post, Chicago Tribune, Atlanta Journal-Constitution, Seattle Times ve San Jose Mercury News gibi Amerikan gazetelerinin de bulunduğu 225 gazetenin çoğu ABD'nin en büyük metropolitanlarında yayınlanıyor.

Google'in geliştirdiği reklam satış yazılımı sayesinde bir santimetrekareden tam sayfaya kadar yerel veya ulusal gazetelere ilan verilebiliyor.

"Reklam baskı" programının müdürü Smita Hashim, internet sitelerine reklam verenleri gazete reklamlarına yönlendirmek amacı ile programın oluşturulduğunu belirtti.

Söz konusu program ile ilgili detaylara http://www.google.com/adwords/printads/ adresli web sitesinden ulaşılabileceğini ifade eden Google yetkilileri, reklâm verenlerin programları sayesinde zamandan ve bürokrasiden kurtulacaklarını dile getirdi.

Fiyat aralığı, ulaşılacak okuyucu sayısı, reklamın yayınlanmasının istendiği sayfa ve reklamın çıkacağı bölge gibi bir çok seçeneğin sunulduğu Google "Reklam baskı" programı, ayrıca farklı gazetelerde çıkacak reklamlar için tek fatura imkanı da sağlayarak bürokrasinin önüne geçiyor.

(CHA)

Design Pattern nedir?

Design pattern, yazılım dünyasında OOP temeline dayanarak, var olan ortak problemlere uygulanan çözümlerdir.  Basit bir örnek ile açıklarsak, bir nesnenin sadece tek bir instance oluşmasını istiyorsak(mdi form gibi), Singleton patterni bu probleme bir çözüm getirmiştir. Yazılım dünyasında logical çözüm geliştirmeden; çok tasarım tabanlı çözüm geliştirmeye amaç edinmesidir. Geliştirilen uygulamanın esnekliğine(flexible), tekrar kullanabilirliliğine (reusability) odaklanmasıdır. Dolayısı ile geliştirilen çözümü, tekrardan geliştirme, iyileştirme(improvement),versiyonlama süreçlerinde büyük avantaj sağlamaktadır. Yazılım süreçlerinde mimari açıdan büyük önem taşımaktadır. Geliştirilen uygulama bir takım tarafından geliştiriliyorsa, uygulama geliştiriciler tarafından da rahatlıkla konuşmayı ve anlaşmayı destekler. Biraz da araştırma sonucu design pattern tanımlarına bakalım.

Ekşisozluk:

nesneye yonelik programlamada ** sik sik karsilasilan program dizayn problemlerini tanimlayip, herhangi bir programlama dilinden bagimsiz olarak bu problemlerin cozumunu class,interface, subclass,method gibi temel oop elemanlari ve bu elemanlarin iliskileri cercevesinde ifade etmekte kullanilir design pattern'lar. software engineering'in heyecan verici konularindan biri olup, dogru durust anlasilirsa, programcinin isini oldukca kolaylastirir, yazilan kodun tekrar tekrar kullanilmasina* imkan saglayarak. ama bu konudaki kitaplarin, ozellikle de konunun islendigi en onemli kitap sayilan, gang of four'un yazdigi 'design patterns elements of reusable object oriented software' adli kitabin soyutlugu da meshurdur.

1.(willy van der kerkhoff, 14.04.2002 06:29 ~ 07.03.2006 21:11)

IBM T J Research / James W Cooper:

·         “Design patterns are recurring solutions to design problems you see

over and over.” (The Smalltalk Companion)

“Design patterns constitute a set of rules describing how to accomplish

certain tasks in the realm of software development.” (Pree 1994)

·         “Design patterns focus more on reuse of recurring architectural design

themes, while frameworks focus on detailed design and

implementation.” (Coplien and Schmidt 1995)

·         “A pattern addresses a recurring design problem that arises in specific

design situations and presents a solution to it.” (Buschmann et al.

1996)

·         “Patterns identify and specify abstractions that are above the level of

single classes and instances, or of components.” (Gamma et al., 1993)

But while it is helpful to draw analogies to architecture, cabinet making,

and logic, design patterns are not just about the design of objects but about

the interaction between objects. One possible view of some of these

patterns is to consider them as communication patterns.

 

Christopher Alexander:

 

"Each pattern describes a problem which occurs over and over again in our

environment, and then describes the core of the solution to that problem, in such a way that you can use this

solution a million times over, without ever doing it the same way twice"

 

Bir patterni oluşturan dört temel esas vardır; pattern ismi, problem, çözüm ve sonuç. Bu dört unsur, var olan problemler karşısında mantıksal çözümlerden ziyade tasarımsal esnekliği ve tekrar kullanımı yüksek çözümü yüksek olan patterni sunar.

Design Pattern temel yaklaşım olarak 3 ayrılır: creational(oluştursal ),structural(yapısal) ve behavioral (davranışal) patterns olarak.

a.       Creational(oluştursal) pattern: Doğrudan instance almaktan, herhangi bir method veya bir durum ile ilinti instance alınmasıdır. Hangi nesnenin varolan durum için oluşturulması gerektiğine karar vermede daha fazla esneklik kazandıran patternlerdir.

                                        i.            Factory Method

                                      ii.            Abstract Factory

                                     iii.            Builder

                                     iv.            Protoype

                                      v.            Singleton

b.       Structural(yapısal) pattern: hesap verileri yada karmaşık kullanıcı arayüzleri gibi durumlarda, nesne gruplarını daha geniş yapılar içerisinde düzenlememize yardımcı olan patterndir.

                                        i.            Adapter

                                      ii.            Bridge

                                     iii.            Composite

                                     iv.            Facade

                                      v.            Proxy

c.        Behavioral(Davranışsal) pattern: modeliniz içerisindeki nesneler arasındaki iletişimi ve akışın, karmaşık bir yapıdan kontrol edilebilir tanımlamanıza yardımcı olan patterndir.

                                        i.            Interpreter

                                      ii.            Template Method

                                     iii.            Chain of Responsibility

                                     iv.            Command

                                      v.            Iterator

                                     vi.            Mediator

                                   vii.            Memento

                                  viii.            Flyweight

                                     ix.            Observer

                                      x.            State

                                     xi.            Strategy

                                   xii.            Visitor

 Bundan sonraki yazılarımda bu patternleri teker teker inceleyerek, örnekleri ile sizler ile paylaşamayı planlıyorum.

Flags Enum

posted 18 Mart 2007 Pazar 12:14 gönderen MuratHAKSAL :: 1 yorum
Filed Under:
Attachment(s): flagEnum.JPG

 

class Program

{

static void Main(string[] args)

{

//Csharp + VBNET + JAVA => 1 + 2 +4

Language EnumToEnum = Language.CSharp | Language.VBNET | Language.JAVA;

//7

int EnumToInt32 = (int)EnumToEnum;

//Language.CSharp | Language.VBNET | Language.JAVA

Language Int32ToEnum = (Language)7;

}

}

[Flags]

enum Language

{

CSharp=1,

VBNET=2,

JAVA=4,

PERL=8,

PHYTON=16

}

 

What is the Design Pattern??

Design patterns are all about good OO design templates that are formulated to COPE WITH CHANGE: Handling the complexities of change is the number one priority in a large scale software development. The amount of dependency in a large scale application can be enormous: Hundreds of classes with dependencies and interactions. How does a change in any one of these classes affect the client code? The goal of design patterns is to design the API so that future change is delegated to the implementation code, not to the API, not to the client code, but solely to the implementation code

Decorator Pattern

starbuzz cafee içinde, ürünlerin hepsi temel olarak kahveden türemektedir. Mocha, cafee late, espresso, americano... Bu durumda bir abstract class yazarak, ürünlerin hepsini burdan türetmek mümkün gibi. bir espresso,americano,cafelate alan adamın hesabı:)

namespace StarbuzzCofee

{

class Program

{

static void Main(string[] args)

{

Service s = new Service();

s.ServiceAdd(new Espresso());

s.ServiceAdd(new Americano());

s.ServiceAdd(new CafeLate());

s.ServiceAdd(new Espresso());

s.PaymentToServicedCost();

}

}

public abstract class Beverages

{

public Beverages()

{

description = "Bilinmeyen İçecek";

}

public string description;

public string getDescription()

{

return description;

}

public abstract double Cost();

}

//Temel kahve

public class Espresso : Beverages

{

public Espresso()

{

description = "Espresso";

}

public override double Cost()

{

return 3D;

}

}

//Espresodan türeyen kahveler su ve espresso

public class Americano : Espresso

{

public Americano()

{

base.description = base.getDescription() + " to Americano";

}

public override double Cost()

{

return base.Cost() + 2;

}

}

//Espressodan türeyen late süt ve espresso

public class CafeLate : Espresso

{

public CafeLate()

{

base.description = base.getDescription() + " to CafeLate";

}

public override double Cost()

{

      return base.Cost() + 3.5D;

}

}

public class Service

{

private System.Collections.ArrayList Serviced;

public Service()

{

   Serviced = new System.Collections.ArrayList();

}

public void ServiceAdd(Beverages bv)

{

   Serviced.Add(bv);

}

public void PaymentToServicedCost()

{

double totalcost = 0;

foreach (Beverages bv in Serviced)

{

Console.WriteLine(bv.getDescription());

Console.WriteLine(bv.Cost());

totalcost += bv.Cost();

Console.WriteLine("--:--");

Console.WriteLine(totalcost);

}

Console.WriteLine("---------------");

Console.WriteLine("Total Cost :" + totalcost);

Console.ReadLine();

}

}

}

Program to an interface, not to an implementation

Program to an interface, not to an implementation, esnek (flexible), genişletilebilir (extensible) ve idare edilebilir (maintainable) yazılım yazmayı kolayylaştıran en önemli ilke olarak göze çarpıyor.

Duck örneği, bir oyun tasarlaması olarak ördek yazıdığımızı varsayalım. ve 9 davranışı farklı ördek olsun, genel davranışları ötmesi ve ucması. sözkonusu ördek için bir superclass yazıp her bir cesit içinde davranışları override etme işin için cıkılmaz ve zor bir yapıya götürüyor. ancak her bir davranışı(algoritmasını) bir interface ile classlara implement ederek tasarlarsak dizayn çok kullanışlı ve anlamlı olmaya başlıyor. Aşağıdaki örnek gibi


RedDuck x = new RedDuck();

x.otusu();

x.ucusu();

Console.ReadLine();

 

 

public interface FlyAble

{

void fly();

}

public interface QuackAble

{

void Quack();

}

public class FlyWithRocket : FlyAble

{

#region FlyAble Members

public void fly()

{

Console.WriteLine("Roket Hızı ile ucuyorum");

}

#endregion

}

public class NoFly : FlyAble

{

#region FlyAble Members

public void fly()

{

Console.WriteLine("Ucamıyorum");

}

#endregion

}

public class FlyForNormal : FlyAble

{

#region FlyAble Members

public void fly()

{

Console.WriteLine("Normal Ucuyor");

}

#endregion

}

public class quackOver : QuackAble

{

#region QuackAble Members

public void Quack()

{

Console.WriteLine("Vack Vırak");

}

#endregion

}

public class quackMute : QuackAble

{

#region QuackAble Members

public void Quack()

{

Console.WriteLine("Ötemiyorum pıt pıt ");

}

#endregion

}

public class RedDuck

{

FlyAble ucması;

QuackAble otmesi;

public void ucusu()

{

ucması = new FlyWithRocket();

ucması.fly();

}

public void otusu()

{

otmesi = new quackOver();

otmesi.Quack();

}

}

Factory Pattern

Factory patterni ile, söz konusu kullanılacak classların instancelarını methodlar araçılığı ile alıyoruz. Pizzacı pizza satar, söz konusu pizza çeşidi satış sırasında gerçekleşir, instance almadan bu çeşide göre yapılarak, poliformik olarak atanır.


namespace Pizza

{

class Program

{

static void Main(string[] args)

{

Pizza p = orderUseFactoryPattern.orderPizza("Cheese");

Console.WriteLine(p);

}

}

public abstract class Pizza

{

public void prepare()

{ }

public void bake()

{ }

public void cut()

{ }

public void box()

{ }

}

public class CheesePizza : Pizza

{

}

public class TurkishPizza : Pizza

{ }

public class MexiconPizza : Pizza

{ }

public class order

{

Pizza pizza;

//burada factory patterni kullanalım, bu kullanım yanlış

public Pizza orderPizza(string type)

{

if (type.Equals("Cheese"))

{

pizza = new CheesePizza();

}

else if (type.Equals("Turkish"))

{

pizza = new TurkishPizza();

}

else if (type.Equals("Mexicon"))

{

pizza = new MexiconPizza();

}

pizza.prepare();

pizza.bake();

pizza.cut();

pizza.box();

return pizza;

}

}

public class pizzaFactory

{

public static Pizza CreatePizza(string type)

{

Pizza pizza = null;

if (type.Equals("Cheese"))

{

pizza = new CheesePizza();

}

else if (type.Equals("Turkish"))

{

pizza = new TurkishPizza();

}

else if (type.Equals("Mexicon"))

{

pizza = new MexiconPizza();

}

return pizza;

}

}

//Doğru Kullanım

public class orderUseFactoryPattern

{

public static Pizza orderPizza(string type)

{

Pizza pizza = pizzaFactory.CreatePizza(type);

pizza.prepare();

pizza.bake();

pizza.cut();

pizza.box();

return pizza;

}

}

}

Daha fazla mesaj... Sonraki sayfa »