3 Aralık 2020 Perşembe

Functional Programming ve Exception

Giriş
Yazıya girmeden önce şunu belirtmek lazım. Java gibi dillerde checked exception fırlatan metodlar Functional Programming ile rahatça kullanılamadığı için, bazı makalelerde exception'ları emen/gizleyen uncheckedXXX şeklinde metodların/sınıfların kullanılması öneriliyor. Bir örnek burada.
Ben bu yönteme kesinlikle karşıyım, hatta çok tehlikeli

Imperative programlama dillerinde exception hatalı durumlarda Control Flow'u değiştirmek için kullanılır. Functional programlama dillerinde ise genelde exception yoktur.

Örnek
Klasik Java'da şöyle yaparız. Burada C++, Java, C# gibi dillerdeki try/catch/finally yapısı var.
FileReadService service = new FileReadService();
try {
  String content = service.readFile("no-such-file.txt");
  return content;
} catch (BadFilenameException ex){
  System.out.println("No file found");
  return readFromCache();
}
Functional Diller Exception'lardan Nasıl Kurtuldular?
Açıklaması şöyle. Yani hatalı durumlarda bile hatayı temsil eden bir "şey" dönuyorlar.
How does a Function Programming, such as Elm, achieve "No runtime exceptions"?

That's easy. You simply don't write functions that fail.

That might sound simplistic, but that's the gist of it.
Functional Kullanım

Örnek - Sonuç Döndürmeyen Metod
Burada hayali bir dil var. someOperation() metodu bir lambda. Başarı ve hata durumları için kod yazılıyor
service.someOperation(result -> {
  if (result.succeded()){
    // do something
  } else {
    // failure
  }
});
Örnek - Sonuç Döndüren Metod
Burada hayali bir dil var ve metod çağrısı özel bir nesne döndürülüyor. Bu nesnenin hata taşıması durumunda getOrElse() metodunu çalışıyor.
FileReadService service = new FileReadService();
String content = service.readFileSafely("no-such-file.txt").getOrElse(readFromCache());

Hiç yorum yok:

Yorum Gönder