Thursday, July 15, 2010

Programming with Java Statements(Java Programlama Ifadeleri)

.
Iyi gunlar arkadaslar bugunku yazimda Javada sikca duyulan ve kullanilan bazi ifadeleri anlatmaya calisacam Ama konuya girmeden sunu hatirlatayim ingilizce verilen isimleri yazacam ve bu anahtar sozcuklarin turkcasini pek kullanamaiyacam bunu yapmamadaki sebeb bu dili ogreneceksek bu ifadeleri cok iyi bilmaliyiz diyer bir sebebide SCJA sinavina hazirlaniyorum ve sorular genel olarak bu ifadelerden geciyor sindi konumuza basliyabiliriz ilk ifademiz


assert : Java calisma zamaninda -ea ile calistirilmasi durumunda assert ile ozel ciktilar elde edebilirsiniz assert ozel bir exception firlatarak sonuc dondurmenizi saglar. Kullanimi asagidaki gibidir.
bu sayede -ea komutu ile calistirarak java programinin ozel debug mesajlari meydana getirmesini saglar simdi bu konu ile ilgili bir ornek yapalim.
oncelikle ben bilgisayarimin c bolumnde az diye bir dosya olusturdum ve az icindede risk diye bir dosya daha olusturdum riskin icindede yeni bir notepad olusturdum ve ismini HaftaninGunleri.java dedim


public class HaftaninGunleri{
  private int gun= 0;
  public static void main(String[] arg) {
    int d = Integer.parseInt(arg[0]);
    HaftaninGunleri o = new HaftaninGunleri(d);
    System.out.print("Bugun haftanin : "+o.getDayOfWeek());
  }


    public HaftaninGunleri(int d) {
           gun = d;


   }
    public String getDayOfWeek() {
    if (gun % 7 == 0) {
       return "Pazar";
    } else if (gun % 7 == 1) {
       return "Pazartesi";
    } else if (gun % 7 == 2) {
       return "Sali";
    } else if (gun % 7 == 3) {
       return "Carsamba";
    } else if (gun % 7 == 4) {
       return "Persembe";
    } else if (gun % 7 == 5) {
       return "Cuma";
    } else {
       assert gun % 7 == 6 : gun +"  Lutfen Pozitif Bir Sayi Giriniz..." ;
       return "Cumartesi";
    }
  }
}

Sindi gelini bu yazdiklarimizi derleyip calistiralim ve assert nasil calistigini gorelim (How to Compile and Run Java Programs with "assert" Statements?)
c:\az\risk>javac HaftaninGunleri.java
diyerek derliyecez

Simdi Yukaridaki resimde derleme islemi yapildi simdi calistiralim
c:\az\risk>java -ea HaftaninGunleri 13

Burada kodumuz su sekilde calisiyor gelen sayi 13 ise onu 7 ye boluyor kalan kac ise sartlar konturol ediliyor ve ona uygun bir cevap donuyor simdide eyer sartlar uygun degil ise bizin olustirdiginiz assert hata mesajini firlatalim bunu yapmak icin -ea ifadesini kullaniyoruz bu ifade su manaya geliyor eyer bir hata olusursa benim olusturdugum mesajlari kullan



break : Donguyu aniden sonlandirmak veya donguyu kirmak icin break komutu kullanilir dongunun bitisinin nerede olacagini bilmedigimiz bir donguyu ancak break komutuyla sonlandirabiliriz Sartlar saglandiginda break komutu devreye girer ve dongu sonlanir.


case :   Bu ifadeyi daha cok switch konusunda gorecegiz bu ifadenin anlami uygun olan sarti yoklamak icin kullanilir. uygun sarti bulunca yapilmasi gereken islem devreye girer.


continue : İşlem yapmadan döngüyü devam ettirmek için ise continue komutunu kullanırız.  

public class MainContinue {
    public static void main(String[] args) {
        for (int i = 0; i < 6; i++) {
            if (i == 2) {
                continue;
            }

            System.out.println(i+" .  Sayi");
        }
    }

continue sayesinde i sayısı 2 ye eşit olmadığından kodun çıkışında 2 yi atlayıp döngüyü 3 e geçirip devam ettirir.Ama continue kullanılmamış olunsaydı 0(0 'da dahil) dan 5 e kadar olan bütün değerler kodun çıkışında çıkacaktır.



empty :  Tek basina kullanilan noktali virgül anlamina gelen bir ifadedir. Bir kodun sonlandigini bildir.

Bu konu hakinda guzel bir yazi bu linkten bakabilirsiniz http://hubpages.com/hub/Java-Debugging-Tip-The-Empty-Statement


public class MainEmpty{
    public static void main(String args[]){
        for(int i=0;i<5;i++);  // Bu dongu burada bittigini bildiriyor.
        {
            System.out.println("Hos Geldiniz...");
        }
    }
}




expression :  Tek degerdem ibaret kod parcasidir. Islemleri yapmak icin kullanilir. a+b, a-b,a=5, a*b ,++a, --a,a++,a-- vs.....

 labeled : iki nokta ust uste manasina gelir. Ornek olarak switch olustururken her bir case icin ":" isratei kullanilir.


synchronized :  Bu konu ile ilgili cok guzel bir yazi hazirlami  Şadi Evren ŞEKER hocam bu yazini ustune birseyler yazilmaz. Link : http://www.bilgisayarkavramlari.com/2009/10/09/eslemeli-metotlar-synchronized-methods/

Yazan : Şadi Evren ŞEKER

JAVA, C++ veya C# gibi nesne yönelimli programlama dillerinde kullanılan bir terimdir. Basitçe, aynı anda çalışan birden fazla lifin (thread) veya işlemin (process) sıralı olmasını ve birbiri ile iletişim halinde çalışmasını sağlar.

Nesne yönelimli programlama ortamında iki farklı kavram birbirine sıkça karışmaktadır. Aslında anlam olarak birbirine yakın olan synchronized methods (eşlemeli metotlar, synchronous method) ve synchronized statements (eşlemeli satırlar) kullanımda ufak farklılıklara sahiptir.

Bir metodun eşlemeli olması durumunda metottaki bütün işlemler, bu metodu çağıran lifler (threads) tarafından sırayla yapılır. Yani bir lif (thread) bu metodu çalıştırırken bir diğeri beklemek zorundadır.

Benzer şekilde eşlemeli satırlarda ise kritik alan (critical section) ismi verilen bir veya daha fazla satırdan oluşan bir blok olur. Bu blok eşlemeli metotlarda olduğu gibi liflerin (threads) sırayla buradaki komutları çalıştırmasını gerektirir.

Öncelikle JAVA dilinde metotların nasıl eşlemli (synchronized) yapıldığına bakalım:
public class Sayac {
    private int c = 0;
    public void arttir() {
        c++;
    }
    public void azalt() {
        c--;
    }
    public int deger() {
        return c;
    }
}

Yukarıdaki kodda bir sınıf tanımlanmış ve c isminde bir int değişken bu sınıf (class) içerisinde bir sınıf değişkeni (class variable) olarak tanımlanmıştır. Yukarıdaki bu sınıfı kullanan bütün lifler (threads) bu değişkene erişme ve değiştirme hakkına sahiptir. Örneğin iki farklı lif (thread) aynı anda arttir() metodunu çağırırsa ve c değişkeninin ilk değeri 0 ise, değişken iki kere arttırılarak 2 olabilir veya iki lif (thread) tarafından da birer kere arttırılarak 1 olabilir.

Yani iki lif (thread) de aynı anda değişkenin değerini aldılar (0 olarak) arttırdılar (1 oldu) ve aynı anda değişkenin içine yazdılar. Dolayısıyla değişken iki farklı lif (thread) tarafından arttırılmasına rağmen 1 değerine sahip olmuş olabilir. Bu problem bilgisayar bilimlerinde sıkça karşılaşılan get and set (alma ve koyma) problemidir ve bu iki işlemin bölünemez (atomic) olmamasından kaynaklanır.

Bu yazı şadi evren şeker tarafından yazılmış ve bilgisayarkavramlari.com sitesinde yayınlanmıştır. Bu içeriğin kopyalanması veya farklı bir sitede yayınlanması hırsızlıktır ve telif hakları yasası gereği suçtur.

Yukarıdaki bu klasik problemin çözümü fonksiyona bir lif (thread) erişirken başka birisinin erişmemesidir. Böylelikle fonksiyona erişen her lif (thread) mutlaka değeri bir arttıracak ve sonuç olarak c değişkeninin değeri tam olarak bilinebilecektir.

Yukarıdaki bu eşlemeli erişimi sağlamak için kodun aşağıdaki şekilde değiştirilmesi gerekir:
public class synchronizedSayac {
    private int c = 0;
    public void synchronized arttir() {
        c++;
    }
    public void synchronized azalt() {
        c--;
    }
    public int deger() {
        return c;
    }
}

Yukarıdaki yeni kodda dikkat edileceği üzere metotlar synchronized kelimesi ile başlamakta ve dolayısıyla erişim anlık olarak tek life (thread) izin vermektedir.

Yukarıdaki kodda deger() fonkisyonu synchronized yapılmamıştır. İlk bakışta bu durum doğru gibi gelir. Genelde şu hatalı kanı yaygındır: Bunun sebebi bu fonksiyonun içeriğinde karışıklık sebebi olacak bir iş yapılmamasıdır. Yani anlık olarak değişkenin değerinin okunması mümkündür ve bu okuma işlemi diğer liflerde (threads) bir probleme yol açmaz.

Bu kanı doğrudur ve gerçektende diğer liflerde (threads) bir soruna yol açmaz ancak deger() metodunu çağıran lif(thread) için sorun vardır. Yani o anda bir lifin (thread) arttir() fonksiyonuna eriştiğini ve bizim de deger() fonksiyonuna eriştiğimizi düşünelim. Acaba deger() fonksiyonu arttırılmadan önceki değerimi arttırıldıktan sonraki değerimi döndürecek?

İşte bu yüzden bu fonksiyonu da eşlemeli yapmak gerekir ve kodun doğru hali aşağıdaki şekildedir:
public class synchronizedSayac {
    private int c = 0;
    public void synchronized arttir() {
        c++;
    }
    public void synchronized azalt() {
        c--;
    }
    public int synchronized deger() {
        return c;
    }
}

Yapıcılar (constructors) eşlemeli olamaz. Yani bir yapıcı fonksiyonunun (constructor) başına synchronized kelimesi yazılması hatadır. Bu gayet açıktır çünkü zaten bir yapıcıya (constructor) anlık olarak tek lif (thread) erişebilmektedir.

C# dilinde senkron metotlar için sadece yazılış farklılığı vardır. Örneğin yukarıdaki JAVA koduyla aynı işi yapan csharp kodu aşağıdaki şekildedir:
using    System;
using    System.Runtime.CompilerServices;
public class synchronizedSayac {
    private int c = 0;
[MethodImpl(MethodImplOptions.Synchronized)]
 public void arttir() {
        c++;
    }
[MethodImpl(MethodImplOptions.Synchronized)]
 public void azalt() {
        c--;
    }
[MethodImpl(MethodImplOptions.Synchronized)]
 public int deger() {
        return c;
    }
}

Görüldüğü üzere metodun başındaki synchronized terimi yerine [MethodImpl(MethodImplOptions.Synchronized)] gelmekte ve ilave olarak System.Runtime.CompilerServices paketi programa dahil edilmelidir.

Eşlemeli satırlar

Programlama dillerinde bazen bir metodun tamamına değil de sadece bir veya birkaç satırı içeren bir bloğa anlık olarak tek bir lifin (thread) girmesi istenebilir. Bu durumda ilgili bu satırların eşlemeli (synchronized) yapılması yeterlidir. Bunun için JAVA dilinde, aşağıdakine benzer bir kodlama gerekir:
public void isimEkle(String isim) {
    synchronized(this) {
          sayac++;
    }
    isimListesi.add(isim);
}

Yukarıdaki kodda görüldüğü üzere isimListesi isimli bir listeye yada vektöre (vector) isim eklenmektedir. Bu işlemin sıralı olması gerekmez. Yani listeye her lif(thread) değişik zamanlarda ekleme yapabilir. Ancak eklenen isimlerin sayısının doğru tutulması açısından sayacın arttırılma işlemine erişen liflerin (thread) aynı anda değiştirme yapmaması gerekir. Bunun için sadece bu satırı eşlemeli (synchronized) yapan kod eklenmiştir.

Aynı kod C# için aşağıdaki şekilde yazılabilir:
public void isimEkle(String isim) {
    lock(this) {
          sayac++;
    }
    isimListesi.add(isim);
}

Görüldüğü üzere iki dil arasındaki tek fark, synchronized terimi yerine lock teriminin kullanılmasıdır.



 
 Understanding Fundamental Statements(Temel Ifadeler)
  1.  Assignment
  2. Conditional
  3. Iteration  
1 .  Assignment Statement : Assignment statements genel kullanimi   
                                 variable = value;

int variableName; // Declaration of an integer
variableName = 100; // Assignment expression statement


int fishInTank = 100; int fishInCooler = 50;
int totalFish = fishInTank + fishInCooler;

 1 .  Conditional Statement :  


 1 .  Iteration  Statement :

No comments:

Post a Comment