Apr 29, 2012 - C++, Uml    No Comments

The Decorator Pattern

Bu yazımızda structural bir pattern olan decorator patternini anlatacağız. Bu tasarım kalıbı bir nesneye dinamik olarak yeni sorumlulukların eklenmesi ve hatta var olanların çıkartılması amacıyla kullanılır. Bir açıdan bakıldığında nesneyi kendisinden türeyen alt sınıflar ile genişletmek yerine kullanılabilen alternatif bir yaklaşım olarak düşünülebilir. Yani bir nesneye alt sınıflar yaratılmaksızın, dinamik olarak yeni özellikler kazandırmak için kullanılır.

Şimdi gerçek hayattan bir örnekle yapacağımız işi anlatmaya çalışacağım. Örneğimizi anlatırken gerekli sınıflarımızı çıkarmaya çalışalım daha sonrada bu patterni nerelerde kullanabiliriz ona bakalım.

Starbuzz Coffee de kahve içmeye gittiğimizi düşünelim ve kahvemiz için malzemelerimizi belirliyoruz ve seçtiğimiz malzemelere göre aldığımız kahvenin fiyatı belirlenecek olsun . Doğal olarak kahvenin fiyatı, seçtiğimiz malzemelere göre değişkenlik gösterecektir.

Şimdi bu durumu modelleyelim. Hazırlanacak olan tüm kahvelerimizi kapsayacak bir interface yada abstract sınıfa ihtiyacımız olacak çünkü tüm malzemelerimizin ortak bir yanı var, oda hepsi kahve için kullanılan malzemeler ve hepsinin bir ücreti var. O zaman Beverage adını verdiğimiz bir interface yada abstract bir sınıf tanımlayalım ve bununda ücret ve aciklama adında abstract bir metodu olsun. Bu metodun kendisi ,bu sınıf yada interfaceden türemiş tüm sınıflarda ovveride edilecek ve ilgili malzemenin fiyatını verecektir. Fakat burda bir tanede ana objemiz var yani dekore edilecek objemiz oda kahveyi hazırlamamız için gerekli kahve tüm malzemelerimiz bu kahvenin üzerine eklenecek ve sonuç olarak bir fiyat belirleyeceğiz. Biz bu objemizi örneğimizde kahve olarak tanımlayacağız.

Ortak özelliklere sahip objelerimiz var ve biz ana objemizi sırasıyla istediğimiz malzemeyle dekore edeceğiz ve bu dekorasyon sonucunda ucret fonksiyonunu çagırarak işlemin sonucunu görebileceğiz

Dolayısıyla öncelikle kahve nesnesine ihtiyacımız olacak. Bu nesnemizin bir fiyatı olacağından  Beverage interfaceinden türemiş bir sınıf olacak, daha sonra ise kahvemizi dekore edecek nesnelere ihtiyacımız var ve bu objelerimizinde bir ücreti olacağından aynı interfaceden türeteceğiz fakat aynı zamanda her dekorasyonda elde edilecek ücretin bir önceki dekorasyonun üzerine eklenmesi için Beverage interfaceini bir eleman olarak dekoratorlerimizde tanımlayacağız. Öncelikle Dekorator patternimize ait tasarımı bir uml şeması üzerinde görelim.

·Component : Dinamik olarak sorumluklar eklenebilecek olan asıl nesne için sunulan arayüzdür. Interface veya abstract sınıf olarak tasarlanabilir.

·ConcreteComponent : Sorumlulukların dinamik olarak eklenebilecekleri asıl bileşen sınıflarıdır. Component arayüzünü uyarlarlar ve abstract sınıf olarak tasarlanırlar.

·Decorator : Decorator tipi hem Component arayüzünü uygular hemde kendi içerisinde Component tipinden bir nesne örneği referansını barındırır. Bu sebepten UML şemasındanda görüldüğü gibi Decorator ve Component arasında bir Aggregation ilişkisi mevcuttur.

·ConcreteDecorator: Bileşenlere yeni sorumlulukları eklemekle görevli tiptir. Ek işlevler bu tip içerisinde tanımlanan üyelerdir.

Verdiğimiz örneği düşünürsek Component yerine ucret fonksiyonunu barından Beverage interfaceini veya abstarct sınıfını kullanacağız. Component sınıfına karşılık Kahve sınıfımız olacak ve Decorator sınıfına karşılıkta malzemelerimizi tanımladığımız  yine CondimentDecorator türeyen sınıflarımız olacak şimdi uml diagramımıza bakalım ve kodlamaya geçelim.

önce ilgili sınıflarımızın türeyeceği interfaceimizi oluşturalım:

class Beverage{
public:
Beverage(){description=”Unkonown Beverage”;}
virtual string getDescription()
{return description;}
virtual double cost()=0;
protected:
string description;
};

oluşturduğumuz interfaceden türemiş ana objemizi oluşturalım ve Beverage metodlarını implemente edelim:

class CondimentDecorator:public Beverage{
public:
virtual string getDescription()=0;
};

Abstract sınıftan türeteceğimiz kahve çeşitlerini ve metotlarını türetelim:

class Expresso:public Beverage{
public:
Expresso(){description=”Expresso”;}
double cost(){return 1.99;}
};

class HouseBlend:public Beverage{
public:
HouseBlend(){description=”House Blend Coffee”;}
double cost(){return .89;}
};

class DarkRoast:public Beverage{
public:
DarkRoast(){description=”Dark Roast Coffee”;}
double cost(){return .99;}
};

class Decaf:public Beverage{
public:
Decaf(){description=”Decaf Coffee”;}
double cost(){return 1.05;}
};

Şimdi’de malzemelerimizi oluşturmaya başlayabiliriz.Tüm malzemeler Beverage intefacesinden bir örneği içerecek ve malzemelerin hepsi CondimentDecorator sınıfından türeyecektir.

class SteamedMilk:public CondimentDecorator{
public:
SteamedMilk(Beverage *beverage)
{this->beverage=beverage;}
string getDescription()
{return beverage->getDescription()+”, Steamed Milk”;}
double cost()
{return .10+beverage->cost();}
private:
Beverage *beverage;
};

class Mocha:public CondimentDecorator{
public:
Mocha(Beverage *beverage)
{this->beverage=beverage;}
string getDescription()
{return beverage->getDescription()+”, Mocha”;}
double cost()
{return .20+beverage->cost();}
private:
Beverage *beverage;
};

class Soy:public CondimentDecorator{
public:
Soy(Beverage *beverage)
{this->beverage=beverage;}
string getDescription()
{return beverage->getDescription()+”, Soy”;}
double cost()
{return .15+beverage->cost();}
private:
Beverage *beverage;
};

class Whip:public CondimentDecorator{
public:
Whip(Beverage *beverage)
{this->beverage=beverage;}
string getDescription()
{return beverage->getDescription()+”, Whip”;}
double cost()
{return .10+beverage->cost();}
private:
Beverage *beverage;
};

gödüğünüz gibi yeni bir malzeme eklemek istediğimiz zaman CondimentDecorator interfaceinden türeyen ve bu interface i içeren bir sınıf eklememiz yeterli olacaktır. Yazdığımız modeli şekillerle göstermek gerekirse

yukardaki şekilde en dıştaki ücret fonksiyonunu çağırdığımız zaman en içteki ücret fonksiyonuna kadar tüm ücret fonksiyonları birbirini çagıracak ve karşımıza toplam sonuç gelecektir şimdi tüm bu tasarımın sonuçlarını görelim.

int main(){

Beverage *beverage=new Expresso;
cout<<beverage->getDescription()+” $”<<beverage->cost()<<endl;

Beverage *beverage2=new DarkRoast;
beverage2=new Mocha(beverage2);
beverage2=new Mocha(beverage2);
beverage2=new Whip(beverage2);
cout<<beverage2->getDescription()+” $”<<beverage2->cost()<<endl;

Beverage *beverage3=new HouseBlend;
beverage3=new Soy(beverage3);
beverage3=new Mocha(beverage3);
beverage3=new Whip(beverage3);
cout<<beverage3->getDescription()+” $”<<beverage3->cost()<<endl;

return 0;
}

StarBuzzCoffe.cpp yi indirmek için tıkla!

Apr 29, 2012 - Uml    No Comments

The Design Patterns (Tasarım Deseni)

Tasarım Deseni ilk duyulduğu zaman pek bir anlam ifade etmeyen bir tanımlama gibi gelse de, aslında tamamen nesne yönelimli programlama kullanılarak hazırlanan kodların projeler ve yazılım ekibi arasında tekrar kullanılabilirliğini sağlamak amacı ile tasarlanmıştır. Tasarım Desenlerinin arkasındaki fikir oldukça basitdir. Projede sıklıkla kullanılan nesnelerin birbirleri arasındaki etkileşimlerini mantıklı bir yapıda kataloglamak.

Tasarım Desenileri , herhangi bir programlama dilinden bağımsız olarak tasarlanan ve sıkça görülen nesne yönelimli programlama problemlerini ortadan kaldırmak için geliştirilmiş taktiklerdir. Tasarım Desenlerini öğrenmek ve kullanmak, yazılım ekibindeki geliştiriciler arasındaki iletişimi de maksimum seviyeye getirir ve proje geliştirme süreci sağlıklı bir şekilde işler.

tasarım desenleri genel olarak 3 ana grup altında incelenir. Bu gruplar ve herbir gruptaki tasarım desenlerinin isimleri aşağıda verilmiştir.

1 – Creatinal Patterns Bu desenler bir yada daha fazla nesnenin oluşturulması ve yönetilmesi ile ilgilidir. Bu gruptaki diğer desenler

Abstract Factory
Builder
Factory Method
Prototype

olarak bilinmektedir. Bu desenlerin bir çoğunu ilerleyen yazılarımda ele alacağım. Şimdilik sadece bir giriş yapıyoruz.

2 - Behavioral Patterns Bu gruptaki desenlerin amacı belirli bir işi yerine getirmek için çeşitli sınıfların nasıl birlikte davranabileceğinin belirlenmesidir.  Bu gruptaki desenler ise aşağıdaki gibidir.

Chain of responsibility
Command
Interpreter
Iterator
Mediator
Memento
Observer
State
Strategy
Template method
Visitor

3 - Structural Patterns Bu gruptaki desenler ise çeşitli nesnelerin birbirleri ile olan ilişkileri temel alınarak tasarlanmıştır. Bu gruptaki tasarım desenleri ise şunlardır:
Adapter
Bridge
Composite
Decorator
Façade
Flyweight
Proxy

 

Apr 29, 2012 - Uml    No Comments

UML NEDİR?

UML, bir programlama dili olmayıp karmaşık yazılım projelerinin programlama dillerinden bağımsız, daha basit bir şekilde ifade eden görsel modelleme dilidir.

UML tasarımı, elemanlar ve bunların oluşturduğu diyagramlardan oluşur. Elemanlar, nesnelere ait özellikleri, işlevleri ve nesneler arasındaki yapısal ilişkiyi temsil eder. Diyagramlar ise, sistemin farklı süreçlerdeki yapısını ve davranışını temsil eder. UML tasarımında 9 temel diyagram kullanılır.

UML tasarımı için birçok araç bulunmaktadır; araç seçiminde dikkat edilmesi gereken unsur onun VS.NET ile bütünleşik çalışıyor olmasıdır; kod üretimine sahip olması ve mümkünse .NET Framework dillerine destek vermesidir. Ayrıca kullanıcı dostu ekranlara da sahip olması tercih nedeni olabilir.

.NET Framework ve karşılık düşen UML elementleri:

İsim-uzayı (Namespace): İsim-uzayının UML tarafındaki karşılığı package elementidir.
Sınıf (Class): Sınıfın UML tarafındaki karşılığı class elementidir; new, internal gibi sınıfı yapıcıları UML tarafında desteklenmez.
Arabirim (Interface): Arabirimin UML tarafındaki karşılığı interface elementidir.
Numaralandırma türü (Enumerated type): Numaralandırma türünün UML karşılığı <<enum>> şablonunu (stereotype) kullanan data type elementidir. Stereotype ifadeleri mevcut UML modelini genişletmek amacıyla modele yeni özellik ve element eklemek için kullanılır.
Yapı (Struct): Yapının UML karşılığı <<struct>> şablonunu kullanan data type elementidir.
Özellik (Property) ve Yordam (Method): Özellik ve yordamların UML dilindeki karşılığı operation kavramıdır. Yordam parametreleri UML parameter kavramıyla karşılanır.
Delege/Temsilce (Delegate): Temsilcinin UML karşılığı <<delegate>> şablonunu kullanan data type elementidir.
Sabit (Constant) ve Değişken (Variable): Sabit ve değişkenlerin UML dilindeki karşılığı attribute kavramıdır.

Jan 25, 2012 - C++    No Comments

Find the Same, Get the Fame

Find  the Same ,  Get  the  Fame

Osmangazi Üniversitesi Object Oriented Programming dersi için yaptığım proje.

Proje için gerekli olanları aşağıdaki gibi hoca bize verdi.Kodlamaya proposals kısmının altından devam edeceğim.

 

 

 

 

 

Bu Kısım fazla önemli değil ingilizce zaten fazla bir şey anladığım da yok.

Specification:
This is a board game. A sample user interface is given in Fig. 1.
Fig. 1. Sample user interface of the Find the Same, Get the Fame…
The game has the following rules:
• The game board contains 5×5 columns of letters where each column consists of 10 letters. The
columns will be formed with the letters (A – Z), randomly. The player only sees the top of these
columns. The top items will be closed by default.
• The player plays by entering the coordinates of two columns. This means that the player requests
comparison of the letters at the top of these columns. These two letters will be shown to the player
for a short time and will be closed again, if they are not the same. Otherwise, these two letters will
be removed from the top of the columns and the player will gain 5 points.
• The game will continue until all the letters are removed or more importantly, if no two of the
remaining top letters are the same, i.e., there is no possible improvement. In the second case, all
columns will be filled with new random letters from scratch.
• The player can request to terminate the game by pressing ‘Q’.
• There will be a “Top Ten High Scores” file which holds the points and duration information of the
highest scores where the score is computed by dividing points to duration. When the game ends,
the score of the player will be checked with the scores in this file and inserted if deserved.
• The game can be played by one or two players. When the program starts, single/multiplayer game
choice should be presented to the user. In a multiplayer game, when one player enters her/his
guess for the same cards and s/he is successful, her/his turn will continue, otherwise the next
player will do the guessing. The durations and the points of the players should be counted
separately.
Requirements:
At least, the following classes will be used in the project:
• Stack
• Controller/Manager
• Player
The Stack class should have the default stack implementation without any extra variable or function
definitions. The Player class will be responsible for user input controls with error checks.
The Controller class should control the game rules, manage the screen output and scores.

 

Proje 5-6 gün ve her gün 4-5 saatlik bir çalışma sonucu ortaya çıktı.Kodlama yaparken neyin lazım olacağını hangi fonksiyonların kullanılacağını bir kağıda sırası ile yazdım. Öncelikle bir plan oluşturmak neyi nerde nasıl yapabileceğimizin fizibilite çalişması yaparak not etmek bize çok fayda sağlayacagı için bu şekilde başlamayı tercih ettim.Bir söz vardır:”Planlamaya ayrilan bir dakika, Uygulamada bir saat kazandirir.“.Mantık bu :) . Read more »

Jan 25, 2012 - Irrelevant, Uncategorized    No Comments

www.erengencturk.com.tr QR Kodu

QR Kodu adını ingilizce Çabuk Tepki (Quick Response) kelimelerinin baş harflerinden alır. Mobil cihazların kameralarından okutulabilen özel matriks barkod (veya iki boyutlu barkod) türüdür. 1994 yılında geliştiren Japon Denso firmasına patentlidir.

www.qrhacker.com sitesinden kendi siteniz , yazınız veya telefon numaranız için  qr kodu üretebilirsiniz.

Dec 8, 2011 - Database Management    No Comments

SQL Server: A network-related or instance-specific Hatası

SQL Server: A network-related or instance-specific Hatası

Sql Server 2008′i kurduktan sonra server’a bağlanırken karşımıza çıkan “A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: Named Pipes Provider, error: 40 – Could not open a connection to SQL Server) (Microsoft SQL Server, Error: 2)” sorununun çözümü gayet basitmiş.

Yapılması gereken sadece server name kısmına <COMPUTERNAME>\SQLEXPRESS veya .\SQLEXPRESS” yazılması.Olay Bukadar.

 


Nov 7, 2011 - Irrelevant, Uncategorized    No Comments

Google chrome eklenti geliştirme

Eklentinin geliştirilme kısmına geçmeden önce , eklentinin işlevinin ne olacağına kısaca değineyim.Bu yazımı yeni başlayanlar için yazacağımdan dolayı , programcılık örf ve adetlerinden   vazgeçmeyerek bir “HELLO WORLD” eklentisi geliştireceğiz.

Chrome’a yüklediğimiz bu eklentiyi çalıştırdığımıza tarayıcından bir pop-up çıkıp bize Hello World selamı verecek.

Şimdi  basit bir chrome uygulamasını geliştirmek için nelere ihtiyaç duyarız adım adım değinelim.

1. Eklenti Bilgilerini Oluşturma ve Chrome’a tanıtma

  • İlk olarak istediğiniz bir isimde  klasör oluşturun bu klasör eklenti dosyalarını içerecek ve bu klasörün dışında olan hiçbir öğeyi chrome tanımayacaktır.Bu yüzden eklentiyle ilgili yazılan kod parçacığı ,ikon veya medya dosyaları bu klasörün içinde olmak zorundadır.
  • İkinci adımda oluşturduğunuz klasörün içerisine  manifest adinda bir text dosyasi oluşturun ve uzantisini  json olarak değiştirin.Yani manifest.txt olan metin dosya tam ismini manifest.json olduğuna emin olun. Manifest.json ‘u herhangi bir text editor ile açarak aşağıdaki kodu içerisine yazın.
1.{
2."name": "ilk chrome eklentim",
3."version": "1.0",
4."description": "bu eklenti hello world yazisini popup halinde gosterir.",
5."browser_action": {
6."default_icon": "icon.png"
7.}
8.}
  • Chrome uygulamalari kendi içerisinde gösterebilmesi için bir ikona ihtiyaç duyar.Bu yüzden yukarıdaki kodda belirtilen ikonu indirin veya ayni isimli png formatinda 19×19 pixel olan bir ikonu çalışma klasörünüzün içine atın. Read more »
Pages:12345678»