Şimdi bu data ve metot tanımlama mevzusuna dalacağız ama sanki ilk defa duyuyormuşuz gibi bir giriş yapalım. Malum, bazen en basit şeyler bile en karmaşık hale gelebiliyor, hani böyle en çok bildiğimiz şeyi anlatırken takılıp kalırız ya, işte tam olarak öyle bir an bu.
Programlama dünyasında işler genelde bir problemle başlar, değil mi? İşte o problemi çözmek için kolları sıvarız. Bu süreçte karşımıza çıkan en temel yapı taşlarından ikisi de ‘data’ yani verilerimiz ve bu verileri işleyen ‘metotlar’ yani fonksiyonlarımız oluyor.
Veri dediğimiz şey aslında bizim için bir şeyler ifade eden, bir anlamı olan değerler bütünü. Sayılar, metinler, tarihler, hatta resimler bile birer veri. Ama bu verileri tek başına tutmak pek işe yaramaz, değil mi? İşte tam bu noktada metotlar devreye giriyor. Metotlar, bu verileri alıp, onlarla bir şeyler yapan, yani onları dönüştüren, işleyen veya bir sonuç üreten sihirli değnekler gibi düşünebilirsiniz.
Mesela, diyelim ki elimizde bir sürü öğrenci ismi ve notu var. Bu verileri bir yerde saklamamız lazım. İşte bu ‘data’ oluyor. Sonra bu öğrencilerin not ortalamasını hesaplamak istiyoruz. İşte bu ortalamayı hesaplayan işlem de bir ‘metot’. Ne güzel değil mi? Birbirini tamamlayan iki parça.
Bu ikili, yani data ve metotlar, her programın temelini oluşturuyor. Web sitelerinden mobil uygulamalara, masaüstü programlarından oyunlara kadar her yerde karşımıza çıkıyorlar. Hani derler ya, ‘her şeyin özü bu’, işte tam olarak öyle. Ama tabii bu işin de incelikleri var.
Konuya şöyle bir giriş yapayım; ben C# ile uğraşırken, özellikle verileri depolamak ve bu veriler üzerinde işlemler yapmak için ilk aklıma gelenlerden biri ‘sınıflar’ oluyor. Sınıflar, hem verileri (alanlar veya özellikler) hem de bu verileri işleyen metotları bir arada tutan yapılardır. Yani bir nevi ‘tasarım şablonu’ gibi düşünebilirsiniz. Bir araba tasarlayacaksınız diyelim, arabanın rengi, modeli, motor gücü gibi özellikleri olur, bunlar sınıfın ‘data’larıdır. Sonra bu arabanın hızlanması, fren yapması, korna çalması gibi eylemleri de metotlarıdır. Bir sınıf tanımladığınızda, o sınıftan istediğiniz kadar ‘nesne’ üretebilirsiniz. Mesela ‘Araba’ sınıfından ‘ BenimArabam’, ‘SeninArabın’ gibi.
Bu sınıfların içindeki metotları tanımlarken dikkat etmemiz gereken birkaç şey var. İlk olarak, metot ne iş yapacak? Bunu net bir şekilde belirlemek lazım. Sonra, bu metot bir değer döndürecek mi, yoksa sadece bir işlem mi yapacak? Döndürecekse ne tür bir değer döndürecek? Bunları belirlemek için metot tanımına ‘return type’ yani geri dönüş türünü yazıyoruz. Eğer bir değer döndürmeyecekse, ‘void’ anahtar kelimesini kullanıyoruz. Mesela ortalama hesaplayan metot bir sayı döndüreceği için ‘double’ veya ‘float’ gibi bir tip kullanırız.
Bu arada, metotların bazıları statik olabilir. Statik metotlar, o sınıfın bir nesnesi oluşturulmadan da çağrılabilir. Mesela matematiksel işlemler yapan bazı yardımcı metotlar (Math.Abs, Math.Round gibi) genelde statik olur. Çünkü bu metotların çalışması için o sınıfın bir nesnesine ihtiyaç duymazsınız, sadece sınıf adını kullanarak çağırabilirsiniz. Bu da kodu daha temiz hale getiriyor sanırım.
Şimdi gelelim, bu işleri nasıl yapacağımıza dair küçük bir kod örneğine. Diyelim ki bir ‘HesapMakinesi’ sınıfımız var ve bununla toplama, çıkarma gibi işlemler yapacağız. Önce sınıfı tanımlayalım, sonra metotları ekleyelim.
Öncelikle, çok basit bir toplama metodu yazalım. Bu metodumuz iki tane tam sayı alacak ve bu iki sayının toplamını geri döndürecek. Kodu şu şekilde:
public class HesapMakinesi { // Bu metot iki tam sayıyı toplar ve sonucu döndürür. public int Topla(int sayi1, int sayi2) { int sonuc = sayi1 + sayi2; return sonuc; } // Bu metot ise bir sayıyı 2 ile çarpar ve sonucu döndürür. public int Carp(int sayi) { int sonuc = sayi * 2; return sonuc; } }
Şimdi bu sınıfı nasıl kullanacağız peki? Programımızın başka bir yerinde, mesela ‘Main’ metodunda, bu sınıftan bir nesne oluşturup metotları çağıracağız. Şöyle bir şey:
Önce ‘HesapMakinesi’ sınıfından bir ‘makine’ nesnesi oluşturuyoruz. Sonra bu ‘makine’ nesnesi üzerinden ‘Topla’ metodunu çağırıp sonuçları bir değişkene atayabiliriz. Mesela 5 ve 3’ü toplattık, sonuç 8 olmalı. Sonra da bu ‘carp’ metodunu kullanarak 5’i 2 ile çarptırırız, sonuç 10 olur.
Peki, bu işi daha basit yapabilir miydik? Mesela statik metot kullanarak? Evet, tabii ki yapabilirdik. Eğer toplama ve çıkarma gibi işlemler için her seferinde bir ‘HesapMakinesi’ nesnesi oluşturmak istemiyorsak, metotları ‘static’ olarak tanımlayabiliriz. Bu durumda, metodu çağırmak için nesneye ihtiyacımız kalmaz, doğrudan sınıf adıyla çağırırız. Şu şekilde:
public static class YardimciHesaplayici { // Statik metot olduğu için 'static' anahtar kelimesini kullanıyoruz. public static int Topla(int sayi1, int sayi2) { return sayi1 + sayi2; } public static int Carp(int sayi) { return sayi * 2; } }
Bu statik metotları kullanmak da gayet basit. Doğrudan sınıf adını yazıp metodu çağırıyoruz. Mesela:
int toplam = YardimciHesaplayici.Topla(10, 20); // sonuç 30 olur.
int carpim = YardimciHesaplayici.Carp(7); // sonuç 14 olur.
Ne güzel değil mi? Kodumuz hem daha kısa hem de daha anlaşılır oldu. Tabii bu statik metodları kullanırken dikkat etmek lazım, her metot statik olmaya uygun olmayabilir. Özellikle de nesneye özgü bir durumu değiştiren metotlar statik olmamalı. Mesela bir kullanıcının profil bilgilerini güncelleyen bir metot statik olmamalı, çünkü o metot hangi kullanıcıya aitse o nesneyle çalışmalı.
Bu arada, data ve metot tanımlama konusuna girmişken, bazen metotlara parametre göndermezsek ne olur diye düşünürüm. Parametre almayan metotlar da olabilir tabii. Mesela, sadece “Merhaba Dünya!” yazdıran bir metot parametre almaz. Ya da bir sayaç metodu, her çağrıldığında kendi içindeki bir değeri bir artırır ama dışarıdan bir şey almaz. Bunlar da gayet normal kullanım senaryoları.
Sonuç olarak, data ve metotlar programlamanın temel yapı taşları. Bu ikisini doğru anlayıp, doğru şekilde tanımlayarak hem kodumuzu daha anlaşılır hale getirebiliriz hem de daha verimli yazılımlar üretebiliriz. Başlangıç için bu kadar bilgi sanırım yeterli olacaktır. Gerisi pratikle gelir diye düşünüyorum, ne de olsa bol bol kod yazıp denemek lazım.