»
Y
A
N
M
E
N
Ü
«
Operator Overloading kod okunurluğunu düşürür mü?
ibrahim dursun @ 11 Ekim 2007 23:39

Javada operator overloading yok. Baya bir süre neden koymuyorlar diye merak etmiştim, hatta bir yerde operator overloading’in kodun okunurluğunu azaltacağı için Sun’ın bu özelliği eklemeye sıcak bakmadığını okumuştum. O zaman da saçma gelmişti, şimdi de. Ne yani? Bir yerimizi keseriz diye evde hiç bıçak bulundurmayalım mı?

Elbette fütursuzca kullanıldığında kodun okunurluğunu düşürür fakat inanılmaz derecede arttıracağı yerler de yok değil.

.Net için Entity Spaces adında veritabanı katmanı var. NHibernate‘in aksine bu katman hiç reflection kullanmıyor, onun yerine veritabanı şablonuna göre kod oluşturuyor. Böylece xml ayar dosyalarıyla uğraşmıyorsunuz ve oldukça iyi performans elde ediyorsunuz. İşin en güzel yanı ise kod içindeki sorgular aynen bir SQL sorgusu gibi görünüyor ve okunurluğu arttırıyor. Peki bunu nasıl yapıyor? Operator Overloading ile… Devam…

String de null kontrolü
ibrahim dursun @ 16 Temmuz 2007 20:42

C# ve Java gibi dillerde string genelde bir sınıf ile temsil edilir. Dolayısıyla null olma durumu mevcuttur. Null kontrolünü

if (name != null && name == "t-hex") {
...}

yazmak yerine kısaca

if ("t-hex".equals(name)) {
...}

yazmak daha bir afilli durur(muş).

hbm2ddl
ibrahim dursun @ 21 Nisan 2006 15:18

Ant Script içinde taskdef ile yeni bir görev olarak belittiğiniz hibernatetool taginin içersinde kullanabileceğiniz altgörevlerden birinin adı hbm2ddl. Adı ise ne yaptığını açıklamaya yetiyor: HBM dosyalarını kullanarak bir DDL script oluşturmak.

build.xml scriptine aşağıdaki eklemeyi yapıp

<hibernatetool destdir="src">
   <configuration configurationfile="src/hibernate.cfg.xml">
     <fileset dir="src">
    <include name="*.hbm.xml"/>
 </fileset>
   </configuration>
   <hbm2ddl 
      create="true" 
      update="true" 
      format="true" 
      outputfilename="ddl.sql" 
      delimiter=";" />
</hibernatetool>

çalıştırdığımızda console’da şöyle bir sonuç almamız lazım.

Buildfile: C:\eclipse32\workspace\HibernateTest\build.xml
default:
[hibernatetool] Executing Hibernate Tool with a Standard Configuration
[hibernatetool] 1. task: hbm2ddl (Generates database schema)
[hibernatetool] create table Musteri (ID integer not null, AD varchar(20), SOYAD varchar(20), YAS integer, primary key (ID))
BUILD SUCCESSFUL
Total time: 4 seconds

Gördüğünüz gibi, Musteri tablosunun DDL bizim için hazırlandı.

Ant Script
ibrahim dursun @ 21 Nisan 2006 15:11

Eclipse içinde zaten Ant Script editörü mevcut. Tek yapmanız gereken build.xml adıyla bir dosya oluşturmak ve içeriğini şu şekilde belirlemek:

<?xml version="1.0"?>
<project name="project" default="default">
    <property name="hibernate.path" location="c:/eclipse32/hibernate"/>
    <property name="jaybird.path" location="c:/eclipse32/jaybird"/>
    <taskdef 
        name="hibernatetool" 
        classname="org.hibernate.tool.ant.HibernateToolTask">
        <classpath>
            <fileset dir="${hibernate.path}">
                <include name="*.jar"/>
                    <include name="lib/*.jar"/>
                    <include name="tools/*.jar"/>
            </fileset>
            <fileset dir="${jaybird.path}">
                <include name="*.jar"/>
            </fileset>
        </classpath>
    </taskdef>
    <target name="default" description="açıklama">
        <hibernatetool destdir="src">
            <configuration configurationfile="src/hibernate.cfg.xml">
                <fileset dir="src">
                    <include name="*.hbm.xml"/>
                </fileset>
            </configuration>
        </hibernatetool>
    </target>
</project>

Bu script dosyasını çalıştırmak için üzerine tıklayın Run As > Ant Build... seçeneğini veya editör açıkken Alt+Shift+X,Q kısayol tuşlarını kullanabilirsiniz.

Hibernate Tools ile ilgili detaylı açıklama ve bir el kitabı hibernate.org adresinde mevcut. O yüzden detaylara girmeyeceğim şimdilik.

Kurulum
ibrahim dursun @ 21 Nisan 2006 15:11

Hibernate Tools, eclipse’e plugin olarak hazırlanmış olarak dağıtılıyor. Yani zip dosyası içindeki klasörleri eclipse’in içine kopyaladığınız zaman bu pluginleri kullanmaya başlayabilirsiniz. Ben Ant Script yoluyla bu araçları kullanmayı daha pratik buluyorum o yüzden bir build.xml dosyası hazırlamamız gerekecek. Bunu yapmadan önce indirdiğiniz zip doyasının içinde bulunan plugins\org.hibernate.eclipse_3.1.0.beta4\lib\tools\ klasörünün içindeki tüm jar dosyalarını hibernate’i kurduğunuz klasörün içine tools diye bir klasör altına kopyalayın.

Hibernate Tools
ibrahim dursun @ 21 Nisan 2006 14:15

Şu ana kadar bir java sınıfı, bir veritabanı tablosu ve bir de bunları eşleyen Mapping Doyası (*.hbm.xml) dosyası oluşturduk. Tanım modelimizi (Domain model) geliştirdikçe veya değiştirdikçe tek tek bütün bu dosyalara uygulamamız gerekecek. Bu işlem çok vakit alır ve zaman kaybına neden olur.

Hibernate için hazırladığımız eşleme dosyaları tamamen java sınıfı odaklıdır. Yani bu dosyaları tasarlarken hep java tarafından düşünmeliyiz. Veri tabanı ise sadece bunları saklamak için gerekli ve yeni bir model hazırlarken önemli değildir. İşte bu noktada Hibernate bize Hibernate Tools adıyla bir takım araçlar sunuyor. Bu araçları kullanarak eşleme dosyalarından DDL ve Java sınıflarını otomatik olarak oluşturabilirsiniz.

Kayıtları listelemek
ibrahim dursun @ 20 Nisan 2006 11:15

Kod yazarak kayıtları listelemek istiyorsanız: Session sınıfının createQuery metodunu kullanmanız gerekir. Aşağıdaki örneği inceleyin.

import java.util.Iterator;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;</code>

public class Test1 
{
  public static void main(String[] args) 
  {
    Configuration conf = new Configuration();
    conf.addResource("Musteri.hbm.xml");
    SessionFactory sessionFactory = conf.configure().buildSessionFactory();
    Session session = sessionFactory.openSession();
    List list = session.createQuery("from Musteri").list();
    for (Iterator iter = list.iterator(); iter.hasNext();) 
    {
      Musteri musteri = (Musteri) iter.next();
      System.out.print(musteri.getId()+" ");
      System.out.print(musteri.getAd()+" ");
      System.out.print(musteri.getSoyad()+" ");
      System.out.println(musteri.getYas()+" ");
    }
    session.close();
  }
}

Dikkat ettiyseniz createQuery metodundan sonra list metodunu çağırıyoruz ve sonuç olarak da bize bir List arayüzü (interface) döndürülüyor. Tercihinize göre array(), iterator() metodlarını da kullanabilirsiniz. Eğer dönen kayıtlar üzerinde bir ileri bir geri gidebilmek istiyorsanız scroll() metodunu kullanın.

Parametreli sorgular da hazırlamanız mümkün. Örneğin:

List list = session.createQuery("from Musteri where yas &gt; :yas")
.setInteger("yas", 25)
.list();
Kayıt girmek
ibrahim dursun @ 19 Nisan 2006 15:06

Hibernate mapping açıklamalarına ve örneklerine girmeden hibernate’in neler yapabileceğine dair küçük bir fikriniz olması için küçük bir örnek yazalım.

Öncelikle, yapılandırmada belirttiğimiz veritabanına bağlanıp bir tablo oluşturalım.

create table MUSTERI (
   id integer not null primary key,
   ad varchar(20),
   soyad varchar(20),
   yas smallint 
);

Tablomuzdaki her kayıt bir java sınıfına denk geleceği için Musteri adıyla bir java sınıfı oluşturmamız gerekiyor. Daha sonra bu tablo ile bu sınıfı eşleyeceğiz. Devam…

Yapılandırma (Konfigürasyon)
ibrahim dursun @ 19 Nisan 2006 15:00

Firebird + Hibernate kütüphanelerinin Eclipse’e nasıl ekleneceğini anlatalım:

Eclipse’e alışkın olmayanlar için adım adım neler yapılması gerektiğinden bahsedeceğim. İlk aşamada yapacaklarımız Hibernate ve Jaybird için gerekli JAR dosyalarını Kullanıcı Kütüphanesi (User Library) olarak Eclipse’e eklemek. Devam…

Hibernate
ibrahim dursun @ 19 Nisan 2006 14:59

Hibernate, Java ile yazılmış ve özellikleri itibariyle de Java camiasında kabul görmüş ORM (Object Relation Mapping) katmanıdır. Hibernate, birçok veritabanıyla çalışabilir. Şu an için söyleyebileceklerim Hibernate’in yazılımcı için en büyük avantajı Domain Modelin (Tanım Modelinin) veritabanından soyutlanarak yazılmasına imkan tanımasıdır.

Adım adım Hibernate ile neler yapılabileceğini açıklamaya çalışacağım. Örnekleri denemek ve çalıştırmak için Eclipse kullanın. Konu başlıkları ise aşağıdaki gibi:

Henüz tamamlanmadı ve eklemeler devam edecek (02.03.2008: Eklemeler devam etmeyecek :) )

Designer Savaşları
ibrahim dursun @ 10 Mart 2006 09:30

Java ve .Net IDE’leri designer bakımından nerdeyse birbirinin aynı olmak üzere!


Netbeans IDE’nin Matisse designerı


Eclipse’in bol pluginli ve 30$ ücretli derlemesi olan MyEclipse, Matisse’i Eclipse’e uydurmayı başarmış


.NET’in designer’ı da Control Alignment yetilerine kavuşturulmuş.

Eclipse nedir?
ibrahim dursun @ 2 Ocak 2006 11:19

Eclipse hakkında yüzeysel bilgisi olan birisine “Eclipse nedir?” diye bir soru sorsanız büyük ihtimalle Java ile yazılım geliştirme aracı diyecektir. Aslında eclipse bundan daha fazlasıdır. Eclipse IBM’in tüm yazılım geliştirme araçlarını tek bir çatı altında toplama isteğinin ürünüdür. Proje açık kodludur ve tamamen java ile geliştirilmiştir. Eclipse, eklentiler (extensions) ile genişletilebilir bir mimari gözetilerek geliştirilmiştir. Devam…

SWT ve JFace
ibrahim dursun @ 21 Kasım 2005 15:22

IBM, eclipse projesine başladığında Swing kütüphanesinin performans açısından düşündükleri tarzda bir IDE oluşturmak için yeterli olmadığına karar verdi. Bu yüzden yeni bir GUI kütüphanesi yazdılar(SWT). Bu yeni kütüphanede çalışan kod yerel kod olduğu için performans açısından büyük bir kazanım oldu. Her işletim sistemi için SWT’nin özelleştirilmesi ile de platformdan bağımsızlık sağlandı. Drag&Drop gibi işletim sistemine özgü yeteneklerden direk yararlanma imkanı doğdu.

SWT sayesinde elde edilenler:

  • Performans: Çalışan uygulamalar sanki çalıştırıldığı işletim sistemi için hazırlanmış gibi hızlı çalışabildiler.
  • Uyumluluk: SWT ile hazırlanmış uygulamalar herhangi bir eklemeye gerek duymadan işletim sisteminin görünümü alabileceklerdi. Swing uygulamaları da Look&Feel desteği içermekte ama bu görünümler önceden hazırlanmış kütüpheneler halinde. Eğer kullanıcı WindowBlind gibi üçüncü parti yazılımlarla işletim sisteminin görünümünü değiştirirse, swing uygulamaları buna tepki veremez ama SWT uygulamaları bu değişikliği anında yansıtır.

Swing’in en beğenilen tarafı ise MVC (Model-View-Controller) tasarım şablona bağlı kalınarak hazırlanmış olmasıydı. SWT ise Olay tabanlı (Event based) bir kütüphane olmuştu. Oluşturulan nesneler sistem kaynaklarını kullanıyor bu yüzden yok edildiklerinde ise dispose metodu ile bu kaynakların işletim sistemine geri verilmesi gerekiyordu. Basit bir pencere açmak için bir ton kod yazmak gerekiyor,
Swingde Garbage collector’un yaptığı işler ise programlayana bırakılıyordu.

import org.eclipse.swt.widgets.*;

public class MainWindow {
    public MainWindow() {
        final Display display = new Display();
        Shell shell = new Shell(display);
        shell.setText("Main Window");
        shell.setBounds(100,100,400,400);
        shell.open();
        // Even Loop - Olay döngüsü
        while(!shell.isDisposed()) {
            display.readAndDispatch();
        }
        display.dispose(); // iş bittikten sonra yoket
    }

    public static void main(String[] args) {
        MainWindow mw = new MainWindow();
    }
}

Bu noktada programcılara yardımcı olması ve Eclipse geliştirilken oluşabilecek bir kaosu önlemek için yardımcı bir kütüphane oluşturuldu (JFace)

JFace, MVC ayrımını yapan bir çok sınıftan oluşturulmuş bir kütüphanedir.

Yukarıdaki örneği JFace kullanarak şu şekilde yazmak mümkün:

import org.eclipse.jface.window.ApplicationWindow;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class MainWindow2 extends ApplicationWindow {
    public MainWindow2() {
        super(null);
    }

    @Override
    protected void configureShell(Shell shell) {
        super.configureShell(shell);
        shell.setText("Main Window 2");
    }

    @Override
    protected Point getInitialLocation(Point initialSize) {
        return new Point(100,100);
    }

    @Override
    protected Point getInitialSize() {
        return new Point(400,400);
    }

    public static void main(String[] args) {
        MainWindow2 mw2 = new MainWindow2();
        mw2.setBlockOnOpen(true);
        mw2.open();
        Display.getCurrent().dispose();
    }
}

JFace’in belli başlı kazanımları

  • Action ve Contribution: Kullanıcı ile iletişim sağlanması sırasında aynı kodun tekrar tekrar yazılması yerine merkezi bir kontrol tabakası oluşturmak için gerekli sınıflar. Mesela kullanıcının, bir menü öğesini seçmesi veya bir düğmeye tıklaması gibi işlemler ilişkilendirilmiş Action sınıfa yönlendiriliyor.
  • Dialog ve Wizard Pencereleri: Uygulamalarda çok kullanılan belli tip pencereler sınıflar haline getirildi. TitleAreaDialog, MessageDialog, ErrorDialog vb..
  • Viewerlar: TreeView ve Table gibi widgetlar için Model oluşturulmasına olanak tanıyan sınıflar eklendi. TreeViewer, TableViewer vb.

»  Substance: WordPress   »  Style: Ahren Ahimsa