24 Mart 2008 Pazartesi

Template Method Pattern

Template Method Örüntüsünü(Pattern) bildigim kadarı ile örnekleyerek açıklayacam.
VT bağımsızlığını ele alan bir framework geliştireceğimi varsayımı altında , yapının Oracle, MS SQL ve diğer VT lerini destekleyeceğini dusunelim. Yapmamız gerekenler...
1. sürücüleri yükleme
2. iletişimi sağlama (send connection)
3. sorguyu çalıştırmak
4. dataset i oluşturma

Amaç,
1) alt sınıflara süper sınıfın davranışlarını aktarmak
2) duplication kodu engellemek
3) alt sınıfın davranışını kontrol etmek

Buradaki asıl özgürlük abstract metodu override eden subclass ların bu metodları implement ediş biçimidir, yani aynı işi farklı farklı yöntemlerle çözümü mevcut örneğin bu örneği düşünürsek her VT nin sorguları optimize etme şekli farklıdır. Bizi ilgilendiren nasıl yaptığı değil nasıl kullanacağımızdır. Özgürlükten bahsettik işte bu özgürlük büyük güç katmaktadır.

public abstract class CommanVT {
protected Connection connection;

abstract void driverYukle();
abstract Connection getConnection(String url, String userId, String password);
abstract Object executeQuery(String query);

final void doQuery(String url, String userId, String password, String query,
Object obj){
driverYukle();
setConnection(url, userId, password);
//Query’i SQL’e donusturmek ve optimize etmek için yazılan kod
//Gerekli kodlamalar burda yapılmakta Query baska bir
//syntax la yazılmış varsayımı altında...
obj = executeQuery(query);
}

}

public class Oracle extends CommanVT{
@Override
void driverYukle() {
System.out.println("Oracle Driver Load");
}
@Override
void setConnection(String url, String userId, String password) {
System.out.println("Oracle connection");
}
@Override
Object executeQuery(String query) {
System.out.println("Oracle execute Query");
}
}

public class PostgreSQL extends CommanVT{
@Override
void driverYukle() {
System.out.println("PostgreSQL load");
}
@Override
void setConnection(String url, String userId, String password) {
System.out.println("PostgreSQL connection");
}
@Override
Object executeQuery(String query) {
System.out.println("PostgreSQL execute");
}

}

JavaScript

JavaScript gerçek adıyla LiveScript, Netscape mühendislerinden Brenden Eich tarafında 1995 yılında geliştirilmiştir.Birden çok platformda ve donanım bağımsız çalışmaktadır. HTML’ ye entegre edilmekte ve statik yapıyı dinamiğe dönüştürmeye yardımcı olmaktadır.

JavaScript’in adında da geçen Java kelimesine aldanmamak gerekir, JavaScript Java degildir. Java Sun Microsystems tarafından geliştirildi, JavaScript ise Netscape tarafından geliştirildi. JavaScript web sayfalarına gömülmektedir ve web browser’da çalışmalıdır. Java kodları derlenmektedir aksine Javascript kodları JavaScript engine’i tarafından yorumlanmaktadır.

JavaScript dili nesne tabanlıdır ama kesin olarak nesne ilişkili değildir, yani miras (inheritance), sınıf (class) kavramları yoktur. JavaScript uygulamalara gömülen tek script dili degildir, örneğin VBScript, Microsoft tarafından geliştirilen JavaScript gibi bir script dilidir fakat sadece Microsoft Internet Explorer tarafından çalıştırılmaktadır.

JavaScript’in temel kavramlarını anlatmadan biraz daha ileri seviyede geliştirilen aşağıdaki kodu incelemeniz JavaScriptle neler yapabileceginizi daha net gorebilmenize yardımcı olacağı kanısındayım. Aşağıda yazılan kodu JavaScript olmadan da, HTML dili ile de kodlayabilirsiniz ama sayfanızda dinamik olarak bir table’e satır ve eklenen satıra sütün eklemek, eklenen sütünlara textfield, button, checkbox yerleştirmek için JavaScript’e ihtiyaç duyacaksınız yani geliştirilen örnek size yardımcı olacaktır.

//maalesef blog html tag lerine izin vermemektedir, kodu oldugu gibi bırakamadım
//html ve body tag ı açılacak
//script tag ı açılacak
function controlSelect(kaynak, hedef){
if(kaynak.checked == true){
hedef.style.visibility = 'visible';
}
else if(kaynak.checked == false){
hedef.style.visibility = 'hidden';
}
}
function doIt(obj){
label.value = obj.value;
}
function changeImage(obj,url){
obj.src = url;
}

//script tag ı kapatılacak
//id si 'deneme' olan bir table açılacak
//script açılacak

var table2 = document.getElementById('deneme');
table2.style.cssText = "cellspacing: 0; cellpadding : 0 ; border:2; width: 400; height: 200";

var tableRow = table2.insertRow(0);
tableRow.style.cssText = 'background-color:red; width:200px; height:200px';

var tableRow2 = table2.insertRow(1);
tableRow2.style.cssText = 'background-color:blue; width:200px; height:200px';

var rowTd = document.createElement('TD');
var rowTd2 = document.createElement('TD');

var img = document.createElement('img');
img.src = 'folder.gif';
img.onmouseover = function() {changeImage(img,"base.gif")};
img.onmouseout = function() {changeImage(img, "folder.gif")};

var textEx = document.createElement('INPUT');
textEx.type = 'TEXT';
textEx.name = 'name';
textEx.size = '15';

var buttonEx = document.createElement('INPUT');
buttonEx.type = 'BUTTON';
buttonEx.value = 'Goster'
buttonEx.size = '5';
buttonEx.onclick = function() {doIt(textEx)};

var label = document.createElement('INPUT');
label.readOnly = 'true';
label.style.cssText = 'background-color:red';

var selectEx = document.createElement('SELECT');
selectEx.name = 'select';
selectEx.options.add(new Option('asin','1'));
selectEx.options.add(new Option('ersin','2'));
selectEx.options.add(new Option('dery','3'));
selectEx.style.visibility = 'hidden';

var checkEx = document.createElement('INPUT');
checkEx.type = 'CHECKBOX';
checkEx.name = 'check';
checkEx.onclick = function() {controlSelect(checkEx,selectEx)};

rowTd.appendChild(img);
rowTd.appendChild(textEx);
rowTd.appendChild(buttonEx);
rowTd.appendChild(label);
rowTd2.appendChild(checkEx);
rowTd2.appendChild(selectEx);

tableRow.appendChild(rowTd);
tableRow2.appendChild(rowTd2);

//script tag'ı kapatılacak
//table,body html tag'ı kapatılacak

20 Mart 2008 Perşembe

Prototype Pattern

Bir sınıftan birden fazla nesne yaratma ihtiyacı duyarız fakat bu işlem hız ve bellek yönetimi açısından maliyetli bir iştir. Bunun yerine o nesnenin orjinal kopyasını yapmak bize önemli ölçüde kazanç sağlayacaktır. Burada “new” operatörü yerine clone() methodu kullanılır. Bu metodu kullanırken dikkat etmemiz gereken hususlar ya da avantajları ve dezavantajlarını da belirtelim.

1) private alanlar direkt olarak atanmaz yani setter ve getter alanlara ihtiyaç duymaktadır, bu da fazla kod maliyeti olarak görülmektedir.//Dezavantaj
2) clone() metodu nesnenin bellekteki alanını bir işlemde kopyalamaktadır. Bu da nesneyi yaratmaya gore çok daha hızlıdır.

x.clone() != x // bu ifade doğru; aynı referans id lerine sahip değiller.
x.clone().getClass() == x.getClass() // bu ifade doğru; aynı sınıfın farklı id lerde.

Person adında bir sınıfımız olsun, bu sınıfın adı, soyadı alanları olsun. Person sınıfını yaratalım ve alanlarına atama yapalım.

Person person = new Person();
person.setName(“Asin”);
person.setSurname(“Akdeniz”);

yaratıp atamaları yaptıktan sonra clone lama işlemine geçelim.

Person person2 = person.clone();

System.out.println(“Name:”+person2.getName());
System.out.println(“Surname:”+person2.getSurname());

Beklenen Çıktı,
Name : Asin
Surname: Akdeniz

Devam edelim,
person2.setName(“Ersin”);

System.out.println(“Name:”+person2.getName());
System.out.println(“Name:”+person.getName());
Beklenen Çıktı,
Name: Ersin
Name : Asin

Sonuç olarak clone() lama ile referans atamıyoruz, bunu clone() lanmış nesnemizin alanlarını değiştirince orjinal nesnemizin durumuna yansımaması ile daha net gorebiliyoruz. Aşağıdaki ifadeyi incelerseniz arasındaki farkı daha net gorebilirsiniz.

Person person = new Person();
Person person2 = person;

Yukarıdaki ifadede ilk satırda bir Person sınıfına ait bir nesne yaratılmıştır.İkinci satırda ise oluşturmuş olduğumuz bu nesneye bir referans vardır yani oluşturulan bu nesneye ulaşırken person2 ya da person yazarak ulaşabiliriz.

clone() metodunun kullanılması için
• Clonable interface nin implement edilmesi lazım.
• Nesne clone’lanmayınca CloneNotSupported Exception fırlatır.

public class Person implements Cloneable{
private String name;

public void setName(String name) {
this.name = name;
}

public String getName() {
return name;
}

public static Person getPerson(Person person){
try {
return (Person) person.clone();
} catch (CloneNotSupportedException ex) {
Logger.getLogger(Person.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
}

public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setName("Asin");

Person perClone = Person.getPerson(person);
System.out.println("Name:"+perClone.getName());
perClone.setName("Ersin");
System.out.println("Person Name:"+person.getName());
System.out.println("Person (Clone) Name:"+perClone.getName());
System.out.println(perClone);
System.out.println(person);
}

}
Beklenen Çıktılar...
Name:Asin
Person Name:Asin
Person Clone Name:Ersin
clonejavs.Person@12dacd1
clonejavs.Person@1ad086a

14 Mart 2008 Cuma

J2ME

J2ME programlama dili ile ilgili giriş düzeyinde faydalı olacağına inandığım kendi yazdığım yazının linki

http://belgeler.cs.hacettepe.edu.tr/yayinlar/eski/J2ME.pdf