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

29 Mayıs 2022 Pazar

Dört İşlem Matematik Oyunu

 Toplama , çıkarma, çarpma ve bölme işlemlerini oyunlaştırarak öğretme ve pratik yapmasını sağlamak için oluşturulmuştur.

Oyun içerisinde her işlem için 4 ayrı aşama bulunmaktadır. Tek basamalı işlemler, iki ve tek basamaklı işlemler , iki basamaklı işlemler ve bu üç seviyenin karışık olarak sunulduğu seviyeler bulunur.

Çarpım tablosuda bulunmaktadır.

Matematiksel düşünme becerisini geliştirmek isteyen herkese hitap etmektedir.

Sorular rastgele oluşturulur, sınırsız tekrar yapılabilir.

Türkçe ve ingilizce dil desteği bulunur.

Uygulamayı play storedan indirmek için tıklayın.



19 Ağustos 2019 Pazartesi

Kelime Dağım (Android Uygulaması)

İngilizce ve daha bir çok dili öğrenirken kelime öğrenmenize yardımcı olacak bir uygulamadır. -Kelimeler kullanıcılar tarafından girilerek bireysel uygulama deneyimi sağlanmaktadır.
-Uygulama içerisinde tüm kelimelerin listesi bulunur.
-10 soruluk kısa test bölümü bulunmaktadır.
-Ayrıca kelime öğren kısmı ile pratik kelime öğrenme amaçlanmaktadır.

Uygulamayı play storedan indirmek için tıklayın.

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ı