16 Ocak 2024 Salı

Java'da Immutability

 Java'da Immutability

Giriş

Immutability, bir nesnenin oluşturulduktan sonra durumunun değiştirilememesi durumudur. Immutable nesneler, yazılım geliştirmede birçok avantaja sahiptir. Örneğin, immutability aşağıdakileri sağlar:

  • Veri tutarlılığı: Immutable nesneler, verilerin her zaman tutarlı olmasını sağlar. Bu, özellikle çoklu iş parçacığı kullanan uygulamalarda önemlidir.
  • Kod okunabilirliği ve sürdürülebilirliği: Immutable nesneler, kodun daha okunabilir ve sürdürülebilir olmasını sağlar. Bu, çünkü immutable nesnelerin davranışları daha öngörülebilirdir.
  • Performans: Immutable nesneler, performansı artırabilir. Bu, çünkü immutable nesneler, mutable nesnelere göre daha az bellek kullanır ve daha az güncelleme gerektirir.

Java'da Immutable Nesneler

Java'da immutability, aşağıdaki kurallara uyularak sağlanır:

  • Sınıf final olmalıdır: Final sınıflar, yeni nesneler oluşturmak için kullanılamaz. Bu, immutable nesnelerin kalıtılmasını engeller.
  • Alanlar final olmalıdır: Final alanlar, yalnızca sınıfın oluşturulma aşamasında ayarlanabilir. Bu, immutable nesnelerin durumunun daha sonra değiştirilmesini engeller.
  • Alanlar private olmalıdır: Private alanlar, yalnızca sınıfın iç işleyişi tarafından erişilebilir. Bu, immutable nesnelerin durumunun yanlışlıkla değiştirilmesini engeller.

Java'da Immutable Nesne Örnekleri

Java'da, immutability sağlayan birçok yerleşik sınıf vardır. Örneğin, String sınıfı immutable'dır. String nesnesinin durumu, replace() gibi yöntemler kullanılarak değiştirilmeye çalışıldığında, yeni bir String nesnesi oluşturulur.

Java'da, immutability sağlayan kendi sınıflarımızı da oluşturabiliriz. Örneğin, aşağıdaki kodda, ImmutablePerson sınıfı immutable bir kişi nesnesi temsil eder:

public final class ImmutablePerson {

    private final String name;
    private final int age;

    public ImmutablePerson(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}
Bu sınıfta, name ve age alanları final'dır ve private'dır. Bu, bu alanların yalnızca sınıfın oluşturulma aşamasında ayarlanabileceği ve yalnızca sınıfın iç işleyişi tarafından erişilebileceği anlamına gelir.

Immutability'nın Faydaları

Immutability, yazılım geliştirmede birçok avantaj sağlar. Bu avantajlardan bazıları şunlardır:

  • Veri tutarlılığı: Immutable nesneler, verilerin her zaman tutarlı olmasını sağlar. Bu, özellikle çoklu iş parçacığı kullanan uygulamalarda önemlidir.
  • Kod okunabilirliği ve sürdürülebilirliği: Immutable nesneler, kodun daha okunabilir ve sürdürülebilir olmasını sağlar. Bu, çünkü immutable nesnelerin davranışları daha öngörülebilirdir.
  • Performans: Immutable nesneler, performansı artırabilir. Bu, çünkü immutable nesneler, mutable nesnelere göre daha az bellek kullanır ve daha az güncelleme gerektirir.
Immutability'nın Dezavantajları

Immutability'nın bazı dezavantajları da vardır. Bu dezavantajlardan bazıları şunlardır:

  • Esneklik: Immutable nesneler, mutable nesnelere göre daha az esnektir. Bu, çünkü immutable nesnelerin durumu daha sonra değiştirilemez.
  • Karmaşıklık: Immutable nesneler, mutable nesnelere göre daha karmaşık olabilir. Bu, çünkü immutable nesnelerin durumları, yeni nesneler oluşturarak değiştirilmelidir.
Immutability ve Listeler

Java'da, listeler, verileri saklamak için yaygın olarak kullanılan bir veri yapısıdır. Listeler, mutable veya immutable olabilir.

Mutable listeler, verilerin daha sonra değiştirilebilmesini sağlar. Bu, listelerin esnekliğini artırır, ancak aynı zamanda veri tutarlılığını ve performansı da azaltabilir.

Immutable listeler, verilerin değiştirilemeyeceğini garanti eder. Bu, veri tutarlılığını ve performansı artırır, ancak aynı zamanda esnekliği azaltabilir.

Java'da, immutable listeler oluşturmak için birkaç yol vardır. Bir yol, Collections.unmodifiableList() yöntemini kullanmaktır. Bu yöntem, mevcut bir mutable listeyi immutable bir listeye dönüştürür.

Bir başka yol, ImmutableList.of()

Immutability ve Recordlar

Java 16'dan itibaren, Java'da recordlar adı verilen yeni bir veri yapısı tanıtıldı. Recordlar, Immutable nesnelerdir.

Recordlar, Immutable nesnelerin oluşturulmasını kolaylaştırır. Örneğin, aşağıdaki kodda, Person recordu Immutable bir kişi nesnesi temsil eder:

record Person(String name, int age) {
}

Bu recordta, name ve age alanları final'dır ve private'dır. Bu, bu alanların yalnızca recordun oluşturulma aşamasında ayarlanabileceği ve yalnızca recordun iç işleyişi tarafından erişilebileceği anlamına gelir. Recordlar, immutable listeler oluşturmak için de kullanılabilir. Örneğin, aşağıdaki kodda, ImmutablePersons listesi Immutable bir kişi listesi temsil eder:

record ImmutablePerson(String name, int age) {
}

List ImmutablePersons = List.of(
    new ImmutablePerson("John Doe", 30),
    new ImmutablePerson("Jane Doe", 25)
);
Bu kod, List.of() yöntemini kullanarak ImmutablePerson recordlarından oluşan bir liste oluşturur.

Immutability ve Uygulamalar

Immutability, birçok farklı uygulamada kullanılabilir. Örneğin, immutability:

  • Veri tutarlılığını artırabilir. Immutable nesneler, verilerin her zaman tutarlı olmasını sağlar. Bu, özellikle çoklu iş parçacığı kullanan uygulamalarda önemlidir.
  • Kod okunabilirliğini ve sürdürülebilirliğini artırabilir. Immutable nesneler, kodun daha okunabilir ve sürdürülebilir olmasını sağlar. Bu, çünkü immutable nesnelerin davranışları daha öngörülebilirdir.
  • Performansı artırabilir. Immutable nesneler, performansı artırabilir. Bu, çünkü immutable nesneler, mutable nesnelere göre daha az bellek kullanır ve daha az güncelleme gerektirir.
Sonuç

Immutability, yazılım geliştirmede birçok avantaj sağlayan bir kavramdır. Immutable nesneler, veri tutarlılığını, kod okunabilirliğini ve performansı artırabilir.

Generated By Google Bard

7 Temmuz 2019 Pazar

HTTP METHODS

GET: Bu metod sunucudan veri almak için kullanılır.  GET kullanan istekler yalnızca veri almalı ve veriler üzerinde başka bir etkisi olmamalıdır.

GET metodu ile sorgu metinleri URL içinde gönderilebilir. Bunun en önemli faydası kullanıcıların bookmark edebilmeleri ve aynı sorguyu içeren istekleri daha sonra gönderebilmelerini sağlaması ve tarayıcıda önceki sorguların “geri” tuşu ile veya tarayıcı geçmişinden çağrılarak aynı sayfalara ulaşabilmeleridir.

POST: Bu metod ile sunucuya veri yazdırabilirsiniz. HTML formlarını kullanarak, örneğin müşteri bilgileri, dosya yükleme vb. gibi verileri sunucuya göndermek için kullanılır.

PUT: Bu metod ile servis sağlayıcı üzerindeki bir kaynağı güncelleyebilirsiniz. Hangi kaynağı güncelleyecekseniz o kaynağın id’sini göndermek zorunludur.

HEAD: GET metoduyla benzer işleve sahiptir ancak geri dönen yanıtta mesaj gövdesi bulunmaz (yani başlıklar ve içerikleri GET metoduyla aynıdır). Bu nedenle GET mesajı gönderilmeden önce bir kaynağın var olup olmadığını kontrol etmek için kullanılabilir.

DELETE: Bu metod ile sunucudaki herhangi bir veriyi silebilirsiniz.

CONNECT: Bir proxy sunucu üzerinden başka bir sunucuya bağlanmak ve proxy sunucuyu bir tünel gibi kullanmak için kullanılır.

OPTIONS: Çağrılan adres (kaynak) ile ilgili desteklenen method'lar alınır.

TRACE: Sucuya yapılan isteği aynen geri almak için yapılır. Sunucuyu test etme ve inceleme amacıyla yapılır. Bu yöntemle sunucu ile istemci arasında bir vekil sunucu varsa bu sunucunun ve yaptığı değişikliklerin tespiti mümkün olabilir.

PATCH: Bu metod bir kaynağa istediğiniz küçük çaplı değişimi yapmanızı sağlar.

SEARCH: Bir dizinin altındaki kaynakları sorgulamak için kullanılır.

21 Haziran 2019 Cuma

REST mi? WEBSOCKET mi?

Rest vs Websockets


Bu yazımda istemci-sunucu iletişiminin temellerini inceleyeceğiz.Rest ve Websocket'i
projelerimizde kullanmak için hangisini ne zaman seçmemiz doğru olur bu konuda fikir edineceğiz.


Ağ iletişimi için oluşturulmuş OSI modeli bulunmaktadır.
Bu model 7 katmandan oluşmaktadır.
    1.Physical (Fiziksel Katman)
    2.Data Link (Veri Bağlantı Katmanı)
    3.Network (Ağ Katmanı)
    4.Transport (Taşıma Katmanı)
    5.Session (Oturum Katmanı)
    6.Presentation (Sunu Katmanı)
    7.Application (Uygulama Katmanı)

Uygulama katmanı son kullanıcıya en yakın olandır ve iletişime katılan uygulamalarla etkileşime girmekten sorumludur. FTP, SMTP, SNMP,HTTP ve WebSocket gibi bu katmanda kullanılan birkaç popüler protokol vardır.

WebSocket kalıcı bir TCP bağlantısı üzerinden çift yönlü, tam çift yönlü iletişimi sağlayan bir iletişim protokolüdür.WebSocket, 2011 yılında IETF tarafından RFC 6455 olarak bir iletişim protokolü olarak standartlaştırılmıştır. Günümüzde çoğu modern web tarayıcıları, WebSocket protokolünü desteklemektedir.

İnternetteki her yerde bulunmasından dolayı hepimiz HTTP'nin farkında olsak da, aynı zamanda bir uygulama katmanı iletişim protokolüdür. HTTP, istek yanıtına dayalı bir protokoldür.
REST (Temsili Durum Aktarımı), web hizmetleri oluşturmak için HTTP'ye bir dizi kısıtlama getiren mimari bir stildir.

WebSocket, istemci ve sunucu arasında iki yönlü iletişim için bir protokol tanımlarken, değiş tokuş edilecek mesaja herhangi bir koşul getirmez. Bu, iletişimdeki tarafların alt protokol müzakeresinin bir parçası olarak kabul etmeleri için açık bırakılmıştır.Önemsiz uygulamalar için bir alt protokol geliştirmek uygun değildir. Neyse ki, STOMP gibi kullanıma hazır birçok popüler alt protokol var.
STOMP, Basit Metin Yönelimli Mesajlaşma Protokolü anlamına gelir ve WebSocket üzerinden çalışır.

HTTP ve WebSocket'ı, her ikisi de uygulama katmanı protokolleri olduğu gibi doğrudan karşılaştırabilsek de, REST'i WebSocket ile karşılaştırmanın doğal olmadığını unutmayın.Daha önce gördüğümüz gibi REST, iletişim için HTTP'yi kullanan mimari bir stildir.Dolayısıyla, WebSocket ile karşılaştırmamız çoğunlukla HTTP'deki yetenekler veya eksiklikler ile ilgili olacaktır.

Handshake (El sıkışma), iletişim kuran taraflar arasında otomatik olarak iletişim protokolü müzakere yöntemini ifade eder. HTTP, durumsuz bir protokoldür ve bir istek-yanıt mekanizmasında çalışır. Her HTTP isteğinde, sunucuyla soket üzerinden bir TCP bağlantısı kurulur.İstemci daha sonra sunucu kaynakla veya bir hatayla yanıt verene kadar bekler. İstemciden gelen sonraki istek, önceki istek hiç olmamış gibi tekrar eder.

WebSocket, HTTP ile karşılaştırıldığında çok farklı çalışır ve gerçek iletişimden önce bir Handshake
(el sıkışma) ile başlar.WebSocket durumunda, istemci HTTP'de bir Protokol Handshake(El Sıkışma) isteği başlatır ve ardından sunucu HTTP'den WebSocket'a yükseltme kabul etmeye yanıt verene kadar bekler.Tabi ki, Protokol Handshake( El Sıkışma) HTTP üzerinden gerçekleştiğinden, önceki şemadan gelen sırayı izler. Ancak bağlantı kurulduktan sonra, oradan istemci ve sunucu daha fazla iletişim için WebSocket'e geçer.

WebSocket ve HTTP arasındaki temel fark, WebSocket’ın kalıcı bir TCP bağlantısı üzerinde çalışırken, HTTP her istek için yeni bir TCP bağlantısı oluşturmasıdır.Şimdi açıkçası, her istek için yeni TCP bağlantısı oluşturmak çok başarılı değil ve HTTP bunun farkında değil. Aslında, HTTP / 1.1'in bir parçası olarak, HTTP'nin bu eksikliğini gidermek için kalıcı bağlantılar tanıtıldı.
Bununla birlikte, WebSocket, kalıcı TCP bağlantılarıyla çalışmak için sıfırdan tasarlanmıştır.

Kalıcı TCP iletişimi üzerinde çalışan WebSocket ile, hem sunucu hem de istemcinin birbirinden bağımsız ve aslında birçok iletişim kurucu tarafa veri göndermesi mümkündür.Buna iki yönlü iletişim denir.

WebSocket iletişiminin bir başka ilginç özelliği de tam çift yönlü olmasıdır. Şimdi bu terim ilginç gelebilirken; bu sadece sunucunun ve istemcinin aynı anda veri gönderebileceği anlamına gelir.Bunu, sunucunun verileri yanıtlayabilmesi için isteği tam olarak alana kadar beklemesi gereken HTTP'de olanlarla karşılaştırın.

Hem HTTP hem de WebSocket, TLS'nin güvenlik avantajlarından yararlanır. HTTP, bunu kullanmak için URL şemalarının bir parçası olarak https sunarken, WebSocket, aynı etki için URL şemalarının bir parçası olarak wss'ye sahiptir.Bir RESTful servisini veya bir WebSocket iletişimini güvenceye almak çok derin bir konudur ve burada ele alınamaz. Şimdilik, her ikisinin de bu konuda yeterince desteklendiğini varsayalım.

Sonuç

WebSocket’ın HTTP’deki eksikliklerden ortaya çıkmasına rağmen, aslında bir HTTP’nin yerine geçmediğini unutmamak önemlidir. Bu yüzden ikisinin de yeri ve kullanımları var. Nasıl karar verebileceğimizi  anlayalım.

Bir çalışanın kaydını almak gibi sunucu ile zaman zaman iletişimin gerekli olduğu senaryoların çoğu için, HTTP / S üzerinden REST hizmetini kullanmak hala mantıklı. Ancak, sunucudan gerçek zamanlı güncellemeler gerektiren bir hisse senedi fiyatı uygulaması gibi daha yeni istemci tarafı uygulamalar için WebSocket’tan yararlanmak çok kolaydır.

Genelleme, WebSocket, push tabanlı ve gerçek zamanlı iletişimin gereksinimi daha uygun şekilde tanımladığı durumlar için daha uygundur. Ek olarak, WebSocket, bir mesajın aynı anda birden fazla müşteriye gönderilmesi gereken senaryolar için iyi çalışır. Bunlar, RESTful hizmetleri üzerinden istemci ve sunucu iletişiminin yasaklayıcı olmasa zor geleceği durumlardır.


Alıntı

18 Ekim 2017 Çarşamba

Heroku

Heroku nedir?
Heroku, Ruby, Node.js, Java, Python, Clojure, Scala, Go ve PHP ile yazılmış uygulamaları dağıtmanıza, çalıştırmanıza ve yönetmenize izin verir. Kısaca bulut uygulama platformudur.

Heroku Kullanımı
-Kullanmaya başlamadan önce heroku.com bağlantısından üyelik kaydımızı yaptırıyoruz.
-Daha sonra set-up bağlantısından Heroku CLI aracını işletim sistemimize uygun olanı indirip kurulumunu yapıyoruz.
-İşlemlerimizi komut satırı üzerinden gerçekleştireceğiz. (Git versiyon kontrol sistemini kullanmayıda bilmelisiniz.)
-Komut satırında $ heroku login yazıyoruz ve üye olurken kullandığımız e-posta adresini ve parolamızı yazarak giriş yapıyoruz.

$ heroku login
Enter your Heroku credentials.
Email: java@example.com
Password:

-Eğer githubda bulunan projeyi kullanmak istiyorsak öncelikle projeyi bilgisayarımıza indiriyoruz.

$ git clone https://github.com/heroku/myApp.git

-Eğer bilgisayarımızda yeni bir projeyi kullanmak istiyorsak öncelikle git ile projemizi sürüm kontrolü altına alıyoruz.
Komut satırında proje dizinimizi açıyoruz!

$ git init
Initialized empty Git repository in .git/
$ git add .
$ git commit -am "First commit"

-Projemizi herokuya(localde) ekliyoruz.
Komut satırında proje dizinimizdeyken!

$ heroku create myApp

-Herokuya eklediğimiz projemizi uzak sunucuya yolluyoruz.
Komut satırında proje dizinimizdeyken!

$ git push heroku master

-Uygulamanın en az bir örneğinin çalıştığından emin olmak için

$ heroku ps:scale web=1

-Eğer uygulamamızı açmak istersek

$ heroku open

*- $ heroku keys:add komutunu girerek heroku public key ortak kullanılmasını sağlıyoruz.
*- $ heroku logs --tail  komutu ile heroku üzerinde yapılan aktiviteleri görüntüleriz.
*- Uygulamanızı başlatmak için hangi komutun çalıştırılacağını açıkça bildirmek için uygulamanızın kök dizininde bir metin dosyası olan bir Procfile kullanın. Procfile içerisine web: java -jar target/myApp-1.0.jar projemizin jarını belirtiyoruz.


26 Mayıs 2017 Cuma

Sosyal Haber Platformu

Spring Hibernate Thymeleaf Bootstrap JQuery
Bu proje bitirme tezim için yazdığım bir haber paylaşım projesidir.
Projeninin kısımları;
-Haber işlemleri
-Takip işlemleri
-Arama işlemleri
-Yorum işlemleri
-Haber pinleme işlemleri
-Haber rezerve etme işlemleri
Not:Kalan kısımları için proje raporunu inceleyebilirsiniz. Not:Proje geliştirilmeye açıktır. İşinize yarıyorsa istediğiniz gibi alıp kullanabilirsiniz.Eklediğiniz yeni özellikleri commit ederseniz projeyi daha güzel bir hale dönüştürebiliriz. Özellikle yeni bir java developer olarak öğrendiklerim kadarıyla standartlara uymaya çalışsamda hatalarım olmuş olabilir.Hatalarımı düzeltmem ve doğrularını öğrenebilmem için yardımlarınızı bekliyor olacağım.
Kodlara github adresinden ulaşabilirsiniz.

5 Mart 2016 Cumartesi

Kurtul Oyunu (Html5)

  Bu yazımda pekiştirmek ve pratik yapmak için yazdığım ikinci oyunumu tanıtacağım.Bu oyunun yapımında da html5-JavaScript-JQuery kodlarını kullandım. Kısaca karakterimiz olan bir top nesnesi ile üzerimize gelen basamaklar dediğim çubuklardan kurtularak oyun alanının üzerine çıkmaya çalışıyoruz.

  Oyunumuzun görüntüsü şu şekildedir.

  Bu oyunları yazmamım en büyük nedenleri analitik düşünme ve algoritma kurma becerilerimi geliştirmektir. Topun duvarlar ile çarpışması veya basamaklar ile çarpışmaları olsun , basamakların uzunlukları ve çıktıkları konumları olsun bunların ayarlanması gerçekten ufkunuzu açıyor.

Örneğin basamakların ilk oluşturulduğu kod parçası şu şekildedir.

function basamaklariOlustur() {
    var indis;
    var x, en;
    var y = 0;
    for (indis = 0; indis <= basamakSayisi; indis++) {

        do {
            x = 10 + Math.random() * 300;
            en = 75 + Math.random() * 200;
        } while (x + en > alanG - 10);// konumu + eni sağdan fazla olmamasını sağlıyoruz

        //2 ve 3 katlarında köşelerden çıkmayı garanti ediyoruz
        if ((indis % 2) == 0 && !(x > 10 && x < karakterBoyutu - 2)) {
            do {
                x = 10 + Math.random() * 300;
            } while (!(10 < x && x < karakterBoyutu - 2));// 

        } else if ((indis % 3) == 0 && !(x + en > alanG - karakterBoyutu - 8 && x + en < alanG - 10)) {
            do {
                x = 10 + Math.random() * 300;
                en = 75 + Math.random() * 200;
            } while (!(x + en > alanG - karakterBoyutu - 8 && x + en < alanG - 10));// 

        }

        y -= 70;//her basamak arasına uzaklık koyuyoruz
        basamaklar[indis] = new BasamakNesnesi(x, y, en, basamakBoyu);
    }
}

Karakterimizin hareket kodları şu şekildedir.


function karakterHareket() {
    if (btnSol) {
        karakter.x += -karakterHareketpx;
    } else if (btnSag) {
        karakter.x += +karakterHareketpx;
    }
    // soldan çıkmaz
    if (karakter.x < 10 && btnSol) {
        karakter.x = 10;
    }// sağdan çıkmaz
    else if (karakter.x > alanG - 10 - karakterBoyutu && btnSag) {
        karakter.x = alanG - 10 - karakterBoyutu;
    }
    carpismaKontrol();

}

Kodlara ulaşmak için github adresine gidin.

3 Mart 2016 Perşembe

Masa Hokey Oyunu (Html5)

  Devamı gelirmi bilmiyorum ama bu yazımda Html5 Css3 JavaScript JQuery öğrendikten sonra pratik yapmak için yazdığım masa hokeyi oyununu tanıtacağım.
  Oyunum görüntüsü şu şekildedir.
  Bu oyunu geliştirirken html5'in canvas elemanını kullandım. JQuery metodlarını kullandım.Oyunun içindeki bileşenler top nesnesi hariç canvasın kendi grafik elamanlarıdır. Top nesnesi ise 50x50 png formatında resimdir.

Örneğin sol taraftaki kale nesnesinin kodları şu şekildedir.

  BobContext.beginPath();
  BobContext.fillStyle = 'red';  
  BobContext.rect(0, 100,5,200);   
  BobContext.fill();
  BobContext.lineWidth = 1;
  BobContext.stroke();
  BobContext.closePath();

Örneğin ortadaki yeşil yuvarlağın kodları şu şekildedir.

  BobContext.beginPath();
  BobContext.arc(BobContext.canvas.width/2, BobContext.canvas.height/2, BobContext.canvas.width/20, 0, 2 * Math.PI, false);
  BobContext.fillStyle = 'green';
  BobContext.fill();
  BobContext.lineWidth = 2;
  BobContext.stroke();
  BobContext.closePath();

Örneğin kalelerin kenarları ile çarpışma kodları şu şekildedir.

 //kale 1 üst çarpişma
 if(objBob.x == 0 && (objBob.y<100)){
 objBob.dx = -objBob.dx ;
 }//kale1 alt çarpişma
 if(objBob.x == 0 && (objBob.y > 300)){
 objBob.dx = -objBob.dx ;
 }//kale 2 üst çarpişma
 if(objBob.x == areaW-5 &&  (objBob.y<100)){
 objBob.dx = -objBob.dx ;
 }//kale 2 alt çarpişma
 if(objBob.x == areaW-5 && (objBob.y > 300 )){
 objBob.dx = -objBob.dx ;
 }
Kodlara ulaşmak için github adresine gidin.