Tweet

Nesnesel Tasarım(Örnek)


Bu makalede nesnesel tasarima örnek olmasi bakimindan bir sorun tanimlayip bunun tasarimini yapip
koda dökelim.Bu gün yazacagimiz kod sayesinde javada random (rast gele) sayi üretimine de deginelim. Bunun yani sira javada vazgeçilmez bir veri yapisi olan ArrayList kavramini anlatacagim.Kisaca deginecek olursak eger öyle bir array(dizi) düsünün ki limiti olmasin.Bildigimiz üzere eger bir dizi tanimlayacak isek bunun üst sinirini belirlememiz gerekmektedir.Ama Java 1.5 den sonrasinda bu kosul ortadan kaldirilmistir.[...]

Öncelikle sorunumuzu tanimlayalim;

Bu gün bizden istenen [0,1] arasini kullanicidan alacagimiz sayi kadar araliga bölecegiz.Daha sonra
yine kullanicidan alcagimiz sayaç(counter) kadar dögü yapip her döngüde 0-1 arasi bir sayi üretip üretilen sayinin hangi araliga düstügünü belirleyecegiz.Son kisimda ise araliklari ve bu araliga rast gele üretilen sayilardan kaç tane düstügünü ekrana yazdiracagiz.

============================================================
Simdi biraz soruyu analiz edelim.Soruyu inceleyecek olursak eger,elimizde bir aralik(Interval) sinifinin olmasi gerekmektedir.Bu sinifin sahip olacagi özelliklere (attribute) gelecek olursak eger soruda bahsettigim gibi 0-1 arasi belli bir sayiya bölünecektir.Yani her araligin bir alt siniri , bir üst siniri ve bu araliga her sayi düstügünde (random olarak üretilen) yani bu araliga kaç sefer ugradigimizi bilmek için bir sayaç(counter) tutacagiz.Simdi sizlere bahsettigim tasarimin kodunu vereyim,kod asagidaki gibi olacaktir.
CODE:
package interval;

public class Interval {


private double lowerBound;
private double upperBound;
private int count;

public Interval(){

}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public double getLowerBound() {
return lowerBound;
}
public void setLowerBound(double lowerBound) {
this.lowerBound = lowerBound;
}
public double getUpperBound() {
return upperBound;
}
public void setUpperBound(double upperBound) {
this.upperBound = upperBound;
}
public void IncrementCount(){
count++;
}
public String toString(){
return "THe lower bound of Interval is "+lowerBound+
"nThe upper bound of Interval is "+upperBound+
"nTHe count that comes from loop is "+count;
}
}



Kodu biraz açiklayacak olursam eger yyine ayni yazim tasarimi kullanilmistir.Bu araliga her ugradigimizda sayaci(counter) arttirmak için IncremenCount denen bir method tanimlanmistir.
===========================================================
Şimdi soruda da bahsettiğim gibi [0,1] arası belli bir aralığa bölünecektir.Ama biz kaç aralığa böleceğimizi bilmiyoruz.Öyle bir veri yapısı kullanmalıyız ki dinamik olarak artabilmeli.Bu da yukarıda bahsettiğim ArrayList kavramını ortaya çıkarmıştır.Bunu açaçak olursam eğer ArrayList sıkça kullnılan bir veri yapısıdır.Kendi içinde ekleme silme içerme methodları olup yazılımcı arkadaşlara kolaylık sağlamaktadır.Sözü fazla uzatmayıp koda geçelim;

CODE:
package interval;

import java.util.ArrayList;

public class IntervalList {

private java.util.ArrayList<Interval> list;

public IntervalList(){
list = new ArrayList<Interval>();
}

public java.util.ArrayList<Interval> getList() {
return list;
}

public void setList(java.util.ArrayList<Interval> list) {
this.list = list;
}
public void createInterval(int size){
double temp = 0.0;
for(int i = 0; i < size;i++){
Interval interval = new Interval();
interval.setLowerBound(temp);
interval.setUpperBound(temp + (1 * 1.0 / size));
temp = interval.getUpperBound();
list.add(interval);
}
}
public void searchIncrement(double key){
for(int i = 0; i < list.size();i++){
Interval temp = list.get(i);
if(key < temp.getUpperBound() && key > temp.getLowerBound())
temp.IncrementCount();
}
}
public void display(){
for(int i = 0; i < list.size();i++){
System.out.println(list.get(i).toString());
}
}

}


Burda dikkat etmemiz gereken şey ArrayList de bir sınıftır.Bu sınıfa mutlaka yer açmalı (new operatörü) ve bu sınıftan oluşturduğumuz nesneyi kullnmalıyız.Kısaca kodu anlatacak olursam
eğer ;

createInterval : void olarak tanımlanan bu method gelen size a göre 0-1 aralığını bölüp her arakığın
alt ve üst sınırını belirlemektedir.Aralıklar tanımlandıktan sonra veri yapısı olan list(ArrayList) de
bunları tutmaktadır.

searchIncrement : void olarak tanımlanan bu method ise parametre olarak verilen key'in hangi aralığa düştüğünü bulup o aralığa ait count değerini 1 arttırmaktadır.

display : bu method ise listenin tüm elemanlarını gezip her indexteki elemanın bilgilerini ekrana yazmaktadır.
=============================================================
Şimdi sıra geldi yazdığımız bu sınıfları test etme kısmına.Bunun için TestInterval sınıfı oluşturup gerekli inputları verelim.Farzedelim ki [0,1] aralığı 15 parçaya bölünmüş olsun.Döngümüz de 9 sefer dönsün ve her döndünde Math.random() kullanarak double bir sayı üretsin.En son kısımda ise tüm bilgileri ekrana yazalım.Lafı fazla uzatmayıp main kodunu verelim;

CODE:
package interval;

public class TestInterval {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

IntervalList list = new IntervalList();

list.createInterval(15);

int m = 9;
while(m > 0){
double key = (double)(Math.random());
list.searchIncrement(key);
m--;
}
list.display();

}

}



=============================================================
Şimdiye kadar nesnesel tasarım ve nesnesel yaklaşım adına bir çok örnek analiz ettik.Umarım siz arkadaşlar için yararlı çalışmalar olmuştur.Zaman buldukça karşılaştığım güzel örnek problemleri analiz etmeye devam edeceğiz.


seyhan

1 Ocak 2008 12:34

İlgili Olabilecek Makaleler


Yorumlar (0)




Ziyaretçi olarak yorum yazamazsınız. Üye olmak için tıklayın Üye iseniz giriş yapın.



MENÜ » FORUM
Menü » Takip et
RSS Facebook Twitter Friendfeed
Sık Kullanılanlar Google Yahoo Live
Menü » Paylaş
E-Posta ile gönder Twitter Facebook Friendfeed
Buzz Stumbleupon Delicious Digg