Fonksiyonel Programlama Nedir
Fonksiyonel programlama, gerçek hayattaki problemlere bakış açımızı değiştiren bir yaklaşımdır.
Fonksiyonel yaklaşım için en temel gereksinimler:
- Fonksiyonların değişkenler gibi tanımlanabilmesi
- Fonksiyonların, fonksiyon döndürebilmesi
- Fonksiyonların, diğer fonksiyonlara parametre olarak geçilebilmesi
- Fonksiyonların birbiri ile etkileşime girebilmesi 1 2
gereklidir.
Delegeleri Tanıyalım
delegate
türü, fonksiyonları kapsayan ve temsil edebilen türlerdir.
Fonksiyonları değişken ve parametreler olarak ele alabilmek için delegeleri yoğun
şekilde kullanacağız.
Örnek:
System.Console
içinde yer alan
1public static void WriteLine (string value);
konsol fonksiyonumuz için bir delege tanımlayalım ve bu fonksiyonu çağırmak için tanımlayacağımız delegeyi kullanalım.
1 public delegate void Writer(string message);
2
3 void Main()
4 {
5 Writer consoleWriter = Console.WriteLine;
6 consoleWriter("Hello");
7 }
Başta kafa karıştırıcı gelebilir. var a = Console.WriteLine
gibi bir atama
yapmamız mümkün değilken Console.WriteLine
fonksiyonunu bir değişkene
atayabiliyoruz.
Bir fonksiyonu, bir delegeye atayabilmek için parametre ve dönüş tiplerinin örtüşmesi gereklidir.
Console.WriteLine
fonksiyonunun birden fazla overload türü olduğu için
derleyici bizim yerimize uygun olanı seçti.
Action
, Func
Delege Türleri ve Türevleri
Action
, Func
, Func<T1, …>
, Action<T1, …>
şeklindeki delegeler,
yukarıda Writer
şeklinde yaptığımız tanımdan hiçbir farkı olmayan, .NET ile
beraber gelen delege türleridir.
Action ve Func arasındaki tek ve önemli fark, Action
adındaki delegelerin
void
tipi dönen fonksiyonları temsil edebilmesidir.
Kendi frameworkünüzü yazmak veya CLR kullanmadan uygulama geliştirmek gibi özel
sebepleriniz yoksa Func
ve Action
türlerindeki delegeleri kullanmalısınız.
Güncelleme Microsoft da bizimle aynı fikirdeymiş ve kendi delege türlerinizi yazmanızı tavsiye etmiyormuş.
✔️ DO use the new
Func<...>
,Action<...>
, orExpression<...>
types instead of custom delegates, when defining APIs with callbacks. 3
Fonksiyon Döndüren Fonksiyon
Yukarıda yaptığımız örneği bir adım ileri götürelim:
1 public delegate void Write(string message);
2
3 void Main()
4 {
5 Write writer1 = WriterFactory();
6 Write writer2 = WriterFactory();
7 writer1("via Writer#1");
8 writer2("via Writer#2");
9 }
10
11 Write WriterFactory () {
12 Write writer = Console.WriteLine;
13 return writer;
14 }
WriterFactory
fonksiyonundan Console.WriteLine
fonksiyonunu döndürdük.
Sonuç
Örneğimizde bir WriterFactory
fonksiyonundan void Write(string message)
delegesine uyumlu bir fonksiyon döndürerek aynı zamanda bir soyutlama yapmış
olduk.
Bir sonraki fonksiyonel programlama yazımız, delegelerde jenerik türlerin kullanımı üzerine olabilir. Daha sonra ise kala iki madde hakkında kısa ve öğretici uygulamalar yapmayı planlıyoruz.
Fonksiyonların değişkenler gibi tanımlanabilmesiFonksiyonların, fonksiyon döndürebilmesi- Fonksiyonların, diğer fonksiyonlara parametre olarak geçilebilmesi
- Fonksiyonların birbiri ile etkileşime girebilmesi
☕
writer1
ve writer2
delegeleri C:\fn.log
dosyasına ekleme yapacak şekilde
WriterFactory
fonksiyonunu güncelleyin.
Serinin Devamı 🔥
C# İle Fonksiyonel Programlama - Fonksiyon Delegeleri