Kotlin Language Features Related to Null Handling

Any software engineer with a Java background would find the null handling features in the Kotlin language interesting. Let's summarize this topic with some examples. Nullable types: In Kotlin, types are non-nullable by default. If you want a variable to be able to hold a null value, you need to explicitly declare its type as nullable using the Type? syntax. For example, String? denotes a nullable string, while String represents a non-nullable string. Safe calls (?.): Kotlin introduces the safe call operator (?.) for handling nullable types. It allows you to safely invoke a method or access a property on a nullable object. If the object is null, the expression returns null instead of throwing a NullPointerException. Example: data class Person(val name: String, val age: Int, val address: String?) fun main() {     // Create a person with a nullable address     val person1 = Person("John Doe", 25, "123 Main Street")     val person2 = Person("Jane Doe", 30,...

Servis sınıfları ile "Transaction" yönetimi

Kurumsal uygulamalarda en önemli konulardan birisi de birbirinden ayrılamaz veritabanı işlemlerinin bir "transaction" içerisinde yapılmasının sağlanmasıdır. Çok katmanlı (layer) uygulamamızda bu işin yapılmasından hangi katman sorumlu olmalıdır? Diğer katmanların durumu nedir?

Yaygın olarak kullanılan "veri erişim nesnesi" (DAO) kalıbını kullandığımızı düşünelim. Bunların yer aldığı veri erişimi katmanı, transaction yönetiminden sorumlu olabilir. Fakat en çok kabul görmüş yöntemlerden birisi, transaction kontrolünün "service layer" denilen bir katmanda yapılmasıdır. Böyle bir yapıda gerçekleşen olaylar şöyle özetlenebilir:

1- Kullanıcı arayüzü katmanına ilişkin "controller" kodu, bir servis metodunu çağırır. Örnek:

class StudentController...

{
//...
studentService.addRegistration(...);

}

Görüldüğü gibi burada kullanıcı arayüzü kodu, sadece tek bir servis metodunu çağırmakta ve gerisine karışmamaktadır. Transaction kontrolünden sorumlu değildir.

2- Servis metodu, yapılacak işlemlerin bir transaction içerisinde atomik olarak yapılmasını sağlar. Bunu yaparken elbette kullanılan platformun transaction kontrolü mekanizmalarından faydalanır. Örneğin Spring çatısının transaction kontrol metotlarını kullanıyorsak:

class StudentService...

{
getTransactionTemplate().execute(new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult(TransactionStatus status) {
//...
getTransactionDao().makePersistent(transaction);

//...
}
});
}


Burada servis metodunun yaptığı şey, yapılan işlemi bir transaction içerisine almaktır. Kırmızı ile boyanmış kodda da gördüğümüz gibi burada veri erişim katmanına ait olan bir DAO sınıfının metodu çağrılıyor. Bu DAO sınıfının kodlarını incelediğimizde, transaction konusundan bihaber olduğunu görürüz. Yani DAO sınıfları veritabanı işlemlerini gerçekleştirirken, transaction içerisinde olunup olunmadığı ile ilgilenmiyorlar.

Çeşitli geliştirme çatılarının sunduğu transaction kontrolü seçeneklerini 2 gruba ayırabiliriz:
1- Programlama yoluyla (programmatic)
2- Bildirimsel olarak (declarative)

Bunlardan hangisini tercih ettiğimiz o kadar önemli değil. Asıl önemli olan, tüm uygulama kodlarının uyduğu bir transaction kontrol kuralının (veya tasarım kalıbının) benimsenmiş olmasıdır. Örneğin yukarıda anlattığımız yöntemde servis metotları sorumluluk almış. Böyle bir tasarım kalıbına "Servis tarafından sahiplenilmiş Transaction (Service Owned Transaction)" ismi verilebilir.

Comments

Popular posts from this blog

Trie Data Structure and Finding Patterns in a Collection of Words

Virtual Memory

NOTES ON COMPUTER ARCHITECTURE: Some important concepts in computer architecture