RSS
 

Yapıcı Tasarım Deseni (Builder Design Pattern)

31 Jul

Tasarım desenleri hakkında giriş mahiyetindeki yazıma buradan ulaşabilirsiniz. Bu tasarım desenlerinden yaratım desenleri grubundaki ikinci desen yapıcı tasarım desenidir (Builder Design Pattern).

Yapıcı tasarım deseni, nesnelerin yapıcı metotlarını soyutlamak suretiyle gerçekleştirilmilerin farklı şekilde vekalet edilmesine sağlar. Peki bu nasıl olmaktadır, bunu bir örnekle pekiştirelim. Örneğin kahve yapıyorsunuz, kahve bildiğiniz gibi her ülkede farklı yapılır. Türkiye’de kahve küçük fincanda, genellikle şekerli olurken,- Brezilyadaki kahve aynı şekilde servis edilmez. Daha sonra yazılarımda göreceğiniz gibi Yapıcı tasarım modeli fabrika tasarım modeline benzer. Hatta soyut fabrika tasarım modeli ile de aynı şekilde yapabilirsiniz. Ancak bazı farklar vardır. Mesela yapıcı tasarım modelinde product dediğimiz nesnelerimiz soyut olmaz, bu nesnelerin farklı olmasını soyutlanmış yapıcı nesneler sağlar.
Continue reading “Yapıcı Tasarım Deseni (Builder Design Pattern)” »

 
1 Comment

Posted in Genel

 

Soyut Fabrika Tasarım Deseni (Abstract Factory)

31 Jul

Tasarım desenleri hakkında giriş mahiyetindeki yazıma buradan ulaşabilirsiniz. Bu tasarım desenlerinden ilki olan soyut fabrika tasarım deseni (Abstract Factory) bu yazımızda genel olarak göreceğiz.

Soyut fabrika tasarım deseninin amacı, farklı ürün ailelerin için uygulanması söz konusu olduğu durumlarda tercih edilir. Mesela yazdığınız uygulamanın hem macos hem de windows platformunda çalışması sözkonusu olduğu durumlarda UI nasıl oluşması gerektiğini soyutlandırarak daha hızlı adapte edebileceğiniz bir yapı geliştirebilirsiniz.

Şekilde de görebileceğiniz gibi Application, hangi platformda çalıştığını bilmez, Application sadece GUIFactory arayüzünden uygulanmış bir nesne geelcektir. Burada hem macos için hem de windows için birer tane factory ve birer tane de Button nesneleri geliştirmeniz gerekir ancak asıl Application nesneniz işletim sistemine göre dallanmayacak ve daha sade bir yapıda olacaktır.

Bunu başka bir örnekle pekiştirelim. Diyelim ki kullanıcıların adres bilgilerini tutmakta için bir sınıfınız var. Farkettiniz ki Türkiye için ülke kodu “tr_TR” kullanmanız gerekirken, ABD için “us_US” kullanmanız gerekiyor. Bunu nasıl tutardınız? Hangi koşulda Türkiye için, hangi koşulda ABD için sonuc dönmeniz gerekiyor? Bunu çözmeniz için nesneye yapıcı metoduna parametre göndrerek yapabilirsiniz.
Continue reading “Soyut Fabrika Tasarım Deseni (Abstract Factory)” »

 
1 Comment

Posted in Genel

 

Tasarım Desenleri (Design Pattern)

31 Jul

Yazılım geliştirmse süreciyle uğraşıyorsanız, özellikle nesneye dayalı programlama (Object Oriented Programming)- ile uğraşıyorsanız mutlaka görmüşsünüzdür. Peki tam olarak nedir tasarım desenleri?

Tasarım desenleri (Design Patterns), bir yazılımın değişik durumlarda nasıl davranabileceğine ışık tutan şablondur. Herhangi bir programa dili bağımlı değildir. Projenizde oluşabilecek durumlar karşısında nasıl bir çözüm bulmanız gerektiği konusunda size ışık tutar. Özellikle daha önce sizin karşılaştığınız sorunların benzerleri için geliştirildiğinden size yardımcı olacaktır. Geliştirdiğiniz uygulama nasıl bir yapıda olduğu, ileride yeni özelliklerin eklenebileceği, farklı platformlarda çalışabilmesi… gibi yeni gelecek özelliklere çok hızlı adapte olabilmek için size bazı şablonlar sunar. Bu sayede, tüm uygulamayı yeniden yazmanız gerek kalmaz.

Örneğin, Scala programlama dili için kullanılacak bir IDE yazıyorsunuz, yazdığınız IDE nin şu an sadece linux ortamı için düşündünüz; ama çok fazla istek oldu ve bu uygulamanızı hem MACOS hem de windows platformunda implemente etmek durumunda kalırsanız, ne kadar kod yazmanız gerekiyor? Yoksa tüm uygulamayı sıfırdan yazmanız ( hatta 3 farklı proje olarak) mı gerekecek?

İşte bu ve buna benzer sorunları çözebilmeniz için, tasarım desenleri size bazı şablonlar sunar. Bu şablonlardan hangisinin sizin ihtiyacınıza göre olduğuna sizin karar vermeniz gerekecek.

Genel olarak tasarım modelleri 3 kategoride değerlendirilir:

Yaratım Desenleri:

Yapısal Desenler:

  • Uyumlayıcı(Adapter)
  • Köprü (Bridge)
  • Bileşik(Composite)
  • Dekoratör (Decorator)
  • Vitrin(Facade)
  • Sineksiklet(Flyweight)
  • Vekil(Proxy)

Davranış Desenleri:

  • Sorumluluk Zinciri (Chain of Responsibility)
  • Komut(Command)
  • Yorumlayıcı(Interpreter)
  • Yineleyeyici(Iterator)
  • Arabulucu(Mediator)
  • Yadigar(Memenoto)
  • Gözlemci(Observe)
  • Durum(State)
  • Strateji (Strategy)
  • Kalıp Yordamı (Template method)
  • Ziyaretçi(Visitor)

Bu desenleri sırasıyla yazılarımda anlatacağım.

Tasarım desenleri hakkındaki örnek uygulamaları http://github.com/rayyildiz/DesignPatterns adresinden ulaşabilirsiniz.

 
1 Comment

Posted in Genel

 

JDK6 da Dependency Injection (ServiceLoader)

12 Jul

DI ne olduğuna dair bir yazıyı buradan ulaşabilirsiniz. JDK6 da ise ServiceLoader gelmektedir. ServiceLoader sayesinde bir nevi DI sağlamış olmaktayız. Bunun nasıl yapacağımızı bir örnekle gösterelim.

Uygulamanın örnek test kodlarını github üzerinden bulabilmeniz mümkündür.

Bu örneği yapabilmek için 3 tane proje oluşturalım. Bu 3 proje ve açıklaması şu şekildedir:

UserAuth : Arayüzün yer aldığı proje.IUserAuthService diye bir arayüz yer almakta ve bu arayüz login diye bir metot tanımı içermektedir.

UserAuthImpl: Uygulamanın gerçekleştirildiği sınıf yer alır.

UserAuthTest: Main sınıfının yer aldığı örnek uygulamadır.

Arayüzün yer aldığı UserAuth projesinde farklı olarak META-INF/services klasörü- ve bu klasör içinde com.rayyildiz.userauth.IUserAuthService dosyası yer almaktadır. Bu dosya içine bakarsanız sadece bir satır yer almaktadır.

com.rayyildiz.userauth.impl.UserAuthService

ServiceLoader bu dosyalara bakarak hangi implemantosyunu yüklemesi gerektiğini anlar. UserAuth.jar implementasyonun yer aldığı UserAuthImpl.jar referans olarak bilmez. SericeLoader load sırasında bu implementasyonu arayacaktır.

Burada asıl önemli test projemize bakalım:

 

 

 

 

package com.rayyildiz.userauth;

import java.util.Iterator;
import java.util.ServiceLoader;

public class Main {
  public static void main(String[] args) {
    ServiceLoader<IUserAuthService> serviceLoader = ServiceLoader.load(IUserAuthService.class);
    Iterator<IUserAuthService> iterator = serviceLoader.iterator();-
    while(iterator!= null && iterator.hasNext()){
      IUserAuthService userAuthService = iterator.next();
      boolean login = userAuthService.login("demo", "password");
      System.out.println("Login for username: demo and password:password is " + login);
   }
}

Gördüğünüz gibi test uygulaması implementasyon nesnesini görmez. ServiceLoader META-INF/services içinde yer alan dosyalara bakarak implementasyon nesnelerini örnek projenin olduğu klasörde ve CLASSPATH de arar.

 

Android Platformunda Tablı Ekranlar

12 Jun

Android ekranları tasarlarken Tab kullanmak güzel bir artı katmakta, Activity ler arasında dolaşmaktan daha avantajlı bir yapı sunmaktadır. Android de tab kullanmak için “TabActivity” yararlanacağız. Bunun için ihtiyacımız olan layout xml şu şekilde bir yapıda olmalı.


Göreceğiniz gibi ana layout TabHost’dur. Gördüğünüz bir tane FrameLayout yer almaktadır. Biz code içinde Tab ları ekleyeceğimiz için layout base bir yapıdadır. Tüm Activity leri “AndroidManifest.xml” içinde tanımlamalısınız.

Tabları host edecek olan nesnemiz ise şu şekildedir:

public class ApplicationActivity extends TabActivity {
  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    Resources res = getResources();
    TabHost tabHost = getTabHost();
    TabHost.TabSpec spec;
    Intent intent;
    intent = new Intent().setClass(this, DashboardActivity.class);
    spec = tabHost.newTabSpec("home").setIndicator("Home",
         res.getDrawable (R.drawable.ic_tab_dashboard)).setContent(intent);
    tabHost.addTab(spec);
    intent = new Intent().setClass(this, CreditCardActivity.class);
    spec = tabHost.newTabSpec("sample1").setIndicator("Sample Tab",
         res.getDrawable (R.drawable.ic_tab_sample1)).setContent(intent);
    tabHost.addTab(spec);
    intent = new Intent().setClass(this, SettingActivity.class);
    spec = tabHost.newTabSpec("sample2").setIndicator("Sample Tab 2",
        res.getDrawable (R.drawable.ic_tab_sample2)).setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, AboutActivity.class);
    spec = tabHost.newTabSpec("about").setIndicator("Sample Tab 3",
        res.getDrawable (R.drawable.ic_tab_about)).setContent(intent);
    tabHost.addTab(spec);
    tabHost.setCurrentTab(0);
  }
}

Ben burada daha şık olması amacıyla Tab seçili iken farklı bir ikon görünmesi amacıyla “ic_tab_xxx” dosyalarını kullandım. Bunlar şuna benzer bir yapıdadır:


Uygulamamızı çalıştırdığımızda ekran görünütüsü buna benzer olmaktadır.

Daha sonra daha detaylı bilgi paylaşıyor olacağım, şimdilik hoşcakalın.

 

Android Uygulamalarında Veritabanı İşlemleri

12 Jun

Bir uygulama geliştirirken verilerin saklanması ihtiyacı doğmakta ve verilerin uygulamadan ayrı bir yapı olarak durması maksadıyla veritabını kullanılmaktadır. Android bir uygulama geliştirirken, aynı nedenden dolayı verilerin saklanması ihtiyacınız olacaktır. Micro device için uygulama geliştirmek, desktop bir bilgisayar için uygulama geliştirmekten daha zordur. Memory ve harddisk’inizin kısıtlı olması, işlemcinin gücü, multitask uygulama geliştirme sıkıntısı başlıcalarındandır. Android de ise yerleşik sqlite veritabanının yer alması ise Android’e önemli bir artı sunmaktadır.

Sqlite, oldukça önemli projelerde kullanılmış (Firefox,Skype, Mcfee, iPhone,…) ve de oldukçe iyi test edilmiş bir veritabanıdır. 4K stack ve 100K ise heap için yeterlidir. Android içinde ise gelen sqlite, bir android uygulamasının ihtiyac duyduğu veritabanı işlemlerini karşılayacak düzeydedir.

Bu giriş bilgilerinden sonra örnek bir uygulama geliştirelim. Uygulamamız, ad, soyad ve telefon numarası kayıt edeceğimiz bir “customer” tablosu olsun. Linux ‘ta sqliteman gibi bir uygulama ile veritabanınızı oluştururun. Örneğimizde kullanacağımız tablonun scripti şu şekildedir:
Continue reading “Android Uygulamalarında Veritabanı İşlemleri” »

 

Android için Uygulama Geliştirme

05 Jun

Android ile uygulama geliştirmeye başlamak için Android SDK indirmeniz gerekiyor. İşletim sisteminize göre bir sürümü indirip açtıktan sonra , windows için Setup.exe kullanadarak linux için ise tools klasörü altında yer alan ./android komutuyla android platform indirmeniz gerekiyor.

Şu anda en son sürüm 2.2 (Android 8) dilerseniz tüm platformları dilerseniz sadece ihtiyacınız olan platformu indirebilirsiniz. Platformu indirmek biraz zaman alabilir.

Bu sırada size tafsiyem UI tasarlayabileniz için droiddraw adındaki bir uygulamayı indirmenizdir. Her ne kadar da eclipse için ADT paketi yer alsa da ben droiddraw ı daha çok beğendim. Ayrıca biz örneği netbeans ile geliştireceğiz. Bu yüzden droiddraw ı indirmenizde yarar var. Ayrıca netbeans için geliştirilmiş NBAndroid eklentisini- bu adresten yardım alarak veya ÔªøÔªø http://kenai.com/downloads/nbandroid/updates.xml update adresiyle kurabilirsiniz. Yapmanız gereken netbeans de Tools->Plugins oradan da Settings de “Add” butonuna tıklayarak bu plugini eklemek ve Available Plugins tabında Android diye aratıp bu plugin i kurmaktır.

Daha sonra linux için terminalden aşağıdaki komutu- çalıştırıp DroidDraw ı açın. Windows da eğer Java6 kuruluysa, droiddraw ın içindeki droiddraw.jar ı tıklamanız yeterlidir.

rayyildiz@iceface:~/Downloads/developer/droiddraw-r1b14$ sh droiddraw.sh &amp;

Droiddraw ile widgets tab ındaki Button u sürükleyip yandaki alana bırakınız. Daha sonra Button’a tıklayıp Properties tabı na tıklayınız.Burada şu bilgileri değiştirin:

id——– : @+id/btnSample

Width : 100px

Text—- : Hi

Bunları değiştirip Apply düğmensine basın. Sizde diğer özellikleri bakabilirsiniz. Burada sadece şu aklınızda olsun; Width, height, left margin değerleri gibi yerlerde mutlaka px ekleyin. Yani 100 değil 100px olmalı. Bu işlemleri tamamlayıp Generete tıklanız. Output ekranında aşağıdakine benzer bir xml üretecek. Bu xml sizin UI nı oluşturacaktır.

&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;AbsoluteLayout
android:id="@+id/widget0"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
&gt;
&lt;Button
android:id="@+id/btnSample"
android:layout_width="100px"
android:layout_height="wrap_content"
android:text="Hi"
android:layout_x="90px"
android:layout_y="32px"
&gt;
&lt;/Button&gt;
&lt;/AbsoluteLayout&gt;

Netbeans de yeni bir proje açalım. NBAdroid eklentisini kurduysanız, yeni bir proje eklerken Android diye bir kısım yer alacaktır. Daha sorna yandaki gibi proje adı, paket adı, activity adı gibi alanları doldurmanız gerekiyor. İlk kez acıyosanız, Manageplatformu tıklayarak kurulum yaptığınız android klasörünü göstermeniz gerekiyor.

İlk kez projeyi actığınızda, Shift + F10 ile projeyi çalıştırabilirsiniz. Burada android emulator acılıp projenizi yükleyecektir ve ekrana klasik “Hello World” yazacaktır.

Şimdi uygulamaya geri dönüp Resources/layouts altında yer alan main.xml- i droiddraw ile üretttiğimiz xml i kopyalayıp yağıştıralım. Bunu yaptıktan sonra uygulamayı bir kere build etmenizde yarar var. Bu işlem sonuda otomatik üretilen R.java dosyasında aşağıaki gibi değişiklikler olacaktır.


public final class R {
   public static final class attr { }

   public static final class id {
      public static final int btnSample=0x7f040001;
      public static final int widget0=0x7f040000;
  }

  public static final class layout {
     public static final int main=0x7f020000;
  }

  public static final class string {
     public static final int app_name=0x7f030000;
  }
}

Daha sonra aşağıdaki kodu MainActivity.java içine yazınız.


@Override
public void onCreate(Bundle icicle) {
   super.onCreate(icicle);
   setContentView(R.layout.main);
   final Button button = (Button) findViewById(R.id.btnSample);
   button.setOnClickListener(new View.OnClickListener() {
      public void onClick(View v) {
         alert("Hello world");
      }
   });
}

private void alert(String message){
   new AlertDialog.Builder(this).setTitle("rayyildiz.com").setMessage(message).setNeutralButton("Ok",
      new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog,int which) { }
      }).show();
}

Uygulamayı çalıştırdığınızda şöylşe çalışacaktır:


Uygulamanın kaynak kodunu şu adresten indirebilirsiniz.http://github.com/downloads/rayyildiz/TestProject/AndroidSample1-v1_0.tar.gz

 
 

NoSQL Giriş ve MongoDB

08 May

NoSQL, isminden de anlaşılabileceği gibi SQL kullanılmadığı veritabanlarına verilen genel bir isimdir. Genelde ORM ile karıştırılmaktadır. NoSQL, işişkisel veritabanlarına (RDMS) alternatif bir tekniktir.

ilişkisel bir veritabanında (RDMS), tablolar oluşturur, tabloları birbirleriyle ilişki kurarak, join, kartezyen gibi SQL cümlecikleriyle kullanırız. Bunun birçok faydası vardır. Hatta yazılım geliştirirken, SQL den kaçınmak maksadıyla, ORM aracları geliştirilmiştir. Bu sayede, veritabanında yer alan tablolara, nesne gözüyle bakılabilmiş, OOP mantığıyla üzerinde işlem yapılabilmiştir.

NoSQL ise böyle birşey değildir. ORM araçları, sizin bir nesneye set ettiğiniz değerleri, SQL cevirerek, sizin SQL ile uğraşmanızı engellemiş olurlar. NoSQL veritabanları dağıtık bir mimari ile oluşturulmuş olup, yarının teknolojisi olarak görülmektedirler. Google’ın BigTable, Amazon’un Dynamo, Facebook’un Cassandra bu tür birer veritabanlarıdır.Bu üç veritabanı da PB boyutunda veri tutmak için geliştirilmiştir. Ben bunlardan konfigurasyon acısından daha kolay yapılan döküman tabanlı bir veritabanı hakkında bilgi vereceğim: MongoDB.

Continue reading “NoSQL Giriş ve MongoDB” »

 
4 Comments

Posted in Genel

 

Git-scm ve GitHub

04 May

Github, git-scm ile opensource veya kendi projelerinizin kaynak kodlarını yönetmek için bir uygulama. SVN üzerinde yer alan kaynak kodları çok kolay bir şekilde, import edebiliyorsunuz. √úcretsiz sürümü private proje açmanıza izin vermezken, sayısız public proje açabilirsiniz.

Twitter, facebook başta olmak üzere birçok önemli proje şu anda github üzerinde durmakta. Twitter’ın scala ile geliştirdiği gizzard projesi github üzerinden erişmeniz mümkün.

Git-Scm

Linux Torwalds tarafından geliştirilen kaynak kod paylaşım aracıdır. Özellikle dağıtım kod yönetim sistemi olmasından ve hızlı çalışmasından dolayı gün geçtikçe populer bir hale gelmeye başladı. SVN den farklı olarak merkezi değil, dağıtık bir kod yönetimine sahiptir. Bu ise linux kernel’ın geliştirilmesi sürecinde ihtiyac haline gelen ve gene Linux Torwalds tarafından yazılan bir araç.

Continue reading “Git-scm ve GitHub” »

 
2 Comments

Posted in Genel

 

Netbeans 6.9

03 May

Netbeans 6.9 beta sürümü yayınlandı. Netbeans 6.9 adresinden detaylarına bakabilir ve indirebilirsiniz.

Netbeans 6.9 da benim uzun süredir beklediğim Spring 3.0 desteği en sonunda gelmiş oldu. Daha önceki sürümlerinde netbeans Spring 2.5 desteği sunuyordu. Özellikle spring 3.0 ile gelen özellikleri kullanabileceğiz. Netbeans 6.9, 9 haziranda release olacak.

Google App Engine için geliştirilmiş plugin de mevcuttur.

Continue reading “Netbeans 6.9” »

 
1 Comment

Posted in Genel