5
Oca'15

Bonus: C# ile Delegate ve Event Kavramları (.NET, C#, C# ile OOP)

Delegeler(delegates) ve olaylar(events), bir durumun gerçekleştiği zamanda bir şeyler yapabilmemize imkan sağlarlar. Bu, her zaman örnek verilen butona tıklanması veya bir propertynin değerinin değişmesi, yeni bir nesne yaratılması gibi her türlü durum olabilir.

 

Kod normal akışında satır satır işlenir. Biz ise, delegate veya event kullanarak programın çalışma anında bu akışa ortak olan kod blokları oluşturabilmekteyiz. Event, delegelerin özelleşmiş bir halidir.

 

Delegeleri açıklamaya çalışarak devam edelim.

Delegates

Delegeler, bir veya birden fazla fonksiyonu işaret eden işaretçilerdir. Tanımlarında, işaret edebilecekleri fonksiyonların yapılarını barındırırlar.

public delegate int SomeDelegate(string someString);

Yukarıdaki tanımdan “delegate” anahtar kelimesini çıkardığımızda bir fonksiyon tanımından farkı olmadığını görebilirsiniz. Bu delege için public erişim belirleyicisi kullandık. Biliyoruz ki erişim belirleyiciyi burada belirtmeseydik varsayılan olarak private olacaktı.

 

Yine bu yukarıdaki tanım bize, SomeDelegate isimli delegenin, integer tipinden değer döndüren ve parametre olarak bir adet string alan fonksiyonları işaret edebileceğini söylüyor. Madem delegemiz böyle fonksiyonları işaret edebiliyor o zaman biz de böyle bir fonksiyon tanımlayıp nasıl işaret edebileceğine bakalım.

public int SomeFunction(string someString)
{
    ...
}

Delegemizin bu fonksiyonu işaret etmesi için ise aşağıdaki kodu yazmamız gerekiyor:

SomeDelegate someDelegate = new SomeDelegate(SomeFunction);

Tanımladığımız delege tipinden, SomeFunction fonksiyonunu işaret eden bir delege belleğe çıkardık. Bu kod satırından sonra bu delege bellekte yaşadığı sürece ona yeni fonksiyonları da işaret ettirebiliriz. Böylece bu delege birden fazla fonksiyonu işaret etmiş olur.

someDelegate += new SomeDelegate(OtherFunction);

Buradaki OtherFunction fonksiyonunun da interger tipte değer döndürüp bir adet string parametre alan bir fonksiyon olmak zorunda olduğunu unutmayalım.

 

Dikkatinizi “+=” operatörü çekmiş olmalı. Bu operatör ile delegenin daha önceden işaret ettiği fonksiyonları çıkarmadan yeni bir fonksiyonu da işaret etmesini sağladık. “+=” haricinde “-=”, “=” operatörleri de kullanılabilir.

23
Nis'14

OOP 10: Interface Kavramı (C# ile OOP)

Bundan önceki yazımda abstract sınıflardan bahsetmiştim. Şimdi ise abstract sınıfların yakından akrabası olan interfacelerden bahsetmeye çalışacağım. Okuldan mezun olduğumda iş görüşmelerinde karşıma sıkça şu soru çıktı: “Abstract class nedir? Interface nedir? Bu ikisi arasındaki farklar ya da benzerlikler nelerdir?” Bu sorunun ardından biraz boğazımı hafif öksürüklerle konuşmaya hazır hale getirdikten sonra “bildiğim kadarıyla” açıklamaya çalıştım hep. Gelin şimdi o zamanlar bildiğim kadarından biraz daha ileriye gidelim ve boğazımızı ufak öksürüklerle temizleyerek zaman kazanmak yerine, nedir ne değildir anlatalım anlayalım.

 

Interface kelime manası olarak arayüz demektir. Bir arayüzden beklentilerimiz, tabiri caizse asıl yüzeye bir referans sağlamasıdır. Burada asıl yüzeyi class olarak düşünebiliriz. Bir classın bu arayüzü yardımıyla biz o classın yetkinliklerinden kesin olarak haberdar olabilmekteyiz. Nasıl mı? Kural basit. Eğer bir class bir interface tarafından extend edilmiş ise o interface’in zorunlu kıldığı yetkinliklere de sahip olmuş demektir. Mesela foreach ile elemanları arasında bir döngü yapabildiğimiz tüm tipler, IEnumerable interface’inden extend edilmiş olmak zorundalardır. Şimdi daha fazla buraları kurcalamaya gerek yok. Sadece interface isimlendirmesinin “I” ile başladığına dikkat edin. Bu zorunlu olmasa da anlaşılabilirlik açısından güzel bir ayrıntıdır ve interfaceler için genel isimlendirme bu şekildedir.

 

Birkaç kural daha:

– Interfaceler, metod, property, event ve indeksleyiciler barındırabilirler.

– Sadece bir arayüz olduklarından da anlayabileceğimiz gibi, interfaceler elemanlarının gövdelerini barındırmazlar. Sadece tanımları vardır.

– Bir sınıf bir interface tarafından extend edildiğinde o interface’in tüm kurallarına uymak zorundadır. Yani tüm elemanlarını implemente etmek zorundadır.

– Sınıflarda olduğu gibi interfaceler için de tüm erişim belirleyicileri kullanabiliriz.

– Fakat interface elemanları için default erişim belirleyici public’tir. Kendimiz belirlemek istesek de derleyici hata verecektir.

 

Syntax aşağıdaki gibidir:

interface IOrnekInterface
{
    // Metod
    void OrnekMetod();
    // Property
    int OrnekPropery { get; set; }
    // Event
    event EventHandler OrnekEvent;
    // Indexer
    string this[int index]{ get; set; }
}
29
Mar'14

OOP 9: Abstract Kavramı ve Abstract Class (C# ile OOP)

Bu yazımda abstract(sanal) kavramına ve abstract sınıflara değinmeye çalışacağım.

 

Tabiki her şeyden önce böyle bir kavrama neden ihtiyaç duyduğumuzu araştırmak gerekir. Bunun için şimdiye kadar anlattıklarımdan fazlasını içermeyen bir yapı kuralım. Mesela elektronik eşya sınıfı ve bu sınıftan türemiş telefon ve bilgisayar adında iki adet sınıf olsun. İlk ihtiyacımız da bu eşyaların fiyatlarının hesaplanması olsun. Sınıfların içine bu fiyat hesaplama metodlarını da kodlayalım. Sonra ihtiyaçlarımızı biraz daha şekillendireceğiz. Anlatmaya çalıştığım yapının kodları aşağıdaki gibi olacaktır:

class ElektronikEsya
{
    public decimal Alisfiyati { get; set; }
    public decimal KarYuzdesi { get; set; }

    public decimal FiyatHesapla()
    {
        return Alisfiyati + (KarYuzdesi * Alisfiyati);
    }
}

class Telefon: ElektronikEsya { }

class Bilgisayar: ElektronikEsya { }

Main içerisini ise aşağıdaki şekilde kodlayarak telefon ve bilgisayar için fiyat hesaplaması yaptıralım.

static void Main(string[] args)
{
    Telefon telefon = new Telefon() 
    { 
        Alisfiyati = 1100, 
        KarYuzdesi = (decimal)20/100 
    };
    Console.WriteLine("Telefon fiyat: {0}", telefon.FiyatHesapla());

    Bilgisayar bilgisayar = new Bilgisayar() 
    { 
        Alisfiyati = 2000, 
        KarYuzdesi = (decimal)25/100 
    };
    Console.WriteLine("Bilgisayar fiyat: {0}", bilgisayar.FiyatHesapla());
}

Programı çalıştırdığımızda çıktı aşağıdaki gibi olacaktır.

oop9ilkFiyat
Fiyat hesaplama yapabilmek için base classtaki ortak bir metodu kullandık. Her ürün için aynı fiyat hesaplama yöntemi varsa bu iyi bir yol olabilir fakat ürünler için farklı farklı fiyat hesaplama yöntemlerine ihtiyaç duyabiliriz ve tüm ürünler için fiyat hesaplama metodu bir zorunluluk olabilir. Bu durumda base class’taki metodu virtual yapıp child class’ta override edebiliriz ama override etmeme lüksüne de sahibiz:) İstediğimiz, child class’ın bu metodu kullanmaya zorunlu olması. İhtiyacımızı karşılayan anahtar kelime abstract anahtar kelimesidir.

 

Biraz abstract anahtar kelimesinden bahsettikten sonra örneğe devam edebiliriz. Maddeler halinde sıralarsak:

 

– Abstract anahtar kelimesi hem metodlar için hem de classlar için kullanılabilir.

– Bir metodun abstract olarak işaretlenebilmesi için sınıfının da abstract olarak işaretlenmiş olması gerekmektedir.

– Abstract bir sınıf, hem abstract hem de abstract olmayan üyeler içerebilir.

– Abstract metodların gövdeleri ancak child sınıflarda kodlanabilir. Metodların gövdeleri abstract olarak işaretlendikleri abstract sınıflarda kodlanamazlar.

20
Şub'14

OOP 8: Base Ctor Çağırımları, Base Ctor’a Parametre Geçirme, Base, Override, New Anahtar Kelimeleri (C# ile OOP)

Bu yazımda kalıtıma kısa bir giriş yaparak, kalıtım uygulanmış bir yapıda ctor çağırımlarının hangi sırada gerçekleştiğini, base ctor’a nasıl parametre gönderildiğini, bazı anahtar kelimelerin(base, override, new) ne işe yaradıklarını ve kullanımlarını açıklamaya çalışacağım.

 

Kalıtım hakkında bilgi sahibi olmak için bir önceki yazım olan OOP 7‘yi okuyabilirsiniz. Eğer hazırsak kalıtıma kısa bir giriş ile başlayalım.

 

Girişte bahsettiğim konulara açıklık getirebilmek için elbette kalıtım uygulanmış bir yapıya ihtiyacım var. Eşya sınıfından türetilmiş elektronik eşya sınfı ve elektronik eşya sınıfından türetilen iki adet sınıfımız(telefon, bilgisayar) olsun.

Class View

Kalıtım Uygulanmış Sınıflarda Ctor Çağrım Sırası

Bu sınıfların her biri içerisine bir ctor kodlayalım ve her ctor, çağırıldığında kim olduğunu bize söylüyor olsun. Son durumda kodladığımız sınıfların içerisi şu şekildedir:

class Esya
{
    public Esya()
    {
        Console.WriteLine("Eşya sınıfının yapıcı fonksiyonu çağırıldı.");
    }
}

class ElektronikEsya : Esya
{
    public ElektronikEsya()
    {
        Console.WriteLine("ElektronikEsya sınıfının yapıcı fonksiyonu çağırıldı.");
    }
}

class Telefon : ElektronikEsya
{
    public Telefon()
    {
        Console.WriteLine("Telefon sınıfının yapıcı fonksiyonu çağırıldı.");
    }   
}

class Bilgisayar : ElektronikEsya
{
    public Bilgisayar()
    {
        Console.WriteLine("Bilgisayar sınıfının yapıcı fonksiyonu çağırıldı.");
    }
}

Main class içerisinde de Telefon sınıfından bir nesne yaratarak ctor çağırımlarının sırasını inceleyelim.

static void Main(string[] args)
{
    Telefon telefon = new Telefon();
}

Program çalıştırıldığında aşağıdaki çıktı alınır.

CtorCagirimiSirasi

Gördüğünüz gibi ilk önce kalıtım ağacının en tepesindeki sınıfın yapıcı fonksiyonu çağrıldı. Ardından sırayla child class’lara doğru inilerek base class yapıcı fonksiyonları sıra ile çağrıldı.

Base Ctor’a Parametre Gönderilmesi

Base ctor’a parametre göndermek için base anahtar kelimesi kullanılır. Bu anahtar kelimeyi sınıfımızın ctor tanımının yanına “:” koyarak yazarız ve parantezler arasına base sınıfa göndereceğimiz parametleri belirtiriz.

class BaseClassName
{
    public BaseClassName(int parametre1)
    {

    }
}

// Base class ctor'u integer bir parametre alıyor.
class ChildClassName : BaseClassName
{
    public ChildClassName (int parametre1, string parametre2)
        : base(parametre1) // parametre1 base ctor'a gönderildi.
    {

    }
}

Bu konuya açıklık getirebilmek için ilk örnek üzerinden sınıfların ctor yönlendirmelerini yaparak devam edelim.

class Esya
{
    public Esya(string esyaAdi)
    {
        Console.WriteLine(esyaAdi);
    }
}

class ElektronikEsya : Esya
{
    public ElektronikEsya(int voltaj, string esyaAdi)
        :base(esyaAdi)
    {
        Console.WriteLine(voltaj);
    }
}

class Bilgisayar : ElektronikEsya
{
    public Bilgisayar(string ekranKartiMarkasi, int voltaj, string esyaAdi)
        :base(voltaj,esyaAdi)
    {
        Console.WriteLine(ekranKartiMarkasi);
    }
}

Bir bilgisayar nesnesi yaratarak ctor yönlendirmelerinin doğru şekilde çalışıp çalışmadığına bakalım.

static void Main(string[] args)
{
    Bilgisayar bilgisayar = new Bilgisayar("NVIDIA", 18, "Bilgisyar");
}

Ekran görüntüsü aşağıdaki gibidir:

CtorYonlendirmeleriSonuc

Kısa bir özet:

– Kalıtım yapıldığında ctor çağırımlarının hangi sırada olduğunu ve base ctor’a nasıl parametre geçirildiğini yani ctor yönlendirmelerini inceledir.

26
Oca'14

OOP 7: Kalıtım (Inheritance) (C# ile OOP)

Nesneye yönelik programlamanın yapıtaşlarından biri de kalıtımdır. Kalıtım kelimesi yerine bazen miras alma ya da ingilizcesi olan inheritance kullanılabilir.

 

OOP için kalıtım, bir sınıfın başka bir sınıftan türetilmesidir. Bazı programlama dilleri için bir sınıfın başka bir ya da birkaç sınıftan türetilmesi de mümkün iken c# için bir sınıf sadece başka bir adet sınıftan türetilebilir. Kısaca c# çoklu kalıtıma(multiple inheritance) izin vermiyor.

kalitim0

C# ‘ta kalıtım, adımımızı attığımız her yerdedir:) Nasıl mı? Daha önceki yazılarımdan birinde bahsettiğim gibi; c#’ta her şey object sınıfından kalıtılmıştır. Bir önceki paragrafta dediğimden yola çıkarak, her sınıf sadece bir sınıftan kalıtılıyorsa ve zaten object sınıfından kalıtıldıysa, nasıl bir sınıfı kendi istediğimiz diğer bir sınıftan kalıtacağız? Tabiki böyle bir karmaşa yok. Eğer biz bir sınıfın hangi sınıftan kalıtılacağını belirtmediysek, object sınıfından kalıtılır.

Neden Kalıtıma İhtiyaç Duyulur?

Doğayı nasıl anlamlandırırız? Beynimizde doğadaki canlılar nasıl yer tutar? Özelden genele canlıları nasıl sınıflandırdığımızı görebiliyor muyuz? Tanımlamamız bir köpek olsa da bu tanımın, bir sınıflandırmanın içinde olduğunu biliyoruz. Varlık->canlı->memeli->köpek… Örneğin, kedi ve köpeğin ortak noktası memeliler sınıfından olmak, koşabilmeleri ortak özellikleri. Bu ve bunun gibi ayrımları, genelden özele anlamlandırmaları yapabilme yeteneğine insanoğlu zaten sahip. Yazılıma da bu anlamlandırma yeteneği kalıtım ile kazandırılmaktadır.

 

Kalıtım sayesinde, bir üst sınıftan türetilmiş sınıflar, üst sınıfın istenilen özelliklerini kendilerine alırlar. Bu sayede:

 

– Gereksiz kod yazımından bir nebze olsun kurtulmuş oluruz.

– Kodun anlaşılması daha kolay olur.

– Yazılıma harcanan zaman azalır.(Uzun soluklu projeler için.)

– Sonradan gelebilecek değişikliklere kolay uyum sağlayabilecek esnek kodlar yazılmış olur.

– Sistemin, ek ihtiyaçların kolay entegre olabilmesi mümkün olur.

 

Yukarıdaki maddeler OOP yaklaşımının sağladığı faydalardır aynı zamanda. Tabiki bunlar kalıtımın doğru şekilde uygulanmasıyla mümkündür. Peki kalıtım nasıl uygulanır? Örnek kodlarla beraber bu konuya açıklık getirmeye çalışalım.

Kalıtımın Uygulanması

Birkaç farklı türde taşıtı satabilen bir oto galeri için uygulama yazdığımızı düşünelim. Farklı taşıt türleri için farklı fiyat belirleme ihtiyacı doğacaktır. Biz de her taşıt türü için fiyat hesaplama fonksiyonu kodlayalım en iyisi. İhtiyacımıza göre bir tanesini çağırır fiyatını hesaplatırız. Her şey ne kadar güzel. Sonra fiyat hesaplamadaki yöntem değiştiğinde gidip her fonksiyonu tek tek değiştiririz. Değiştrir miyiz? İşte orda durun! Değiştirmeyin. İyisi mi kodu tamamen silin:). Hatta hiç böyle kodlamayın. Gelin biz, OOP yaklaşımı ve kalıtımı bu problem için nasıl doğru şekilde uygularız bir plan yapalım.

 

İlk önce sınıfların yapısını planlayalım. Farklı türden taşıtları içerebilecek bir taşıt sınıfı olmalı. Örneğin basit olması açısından otomobil ve kamyonet olarak iki farklı taşıt türünü ele alalım. Bu durumda aşağıdaki gibi bir yapıya ihtiyacımız var.

kalitim1

Bir sınıfı başka bir sınıftan türetmek için sınıf adının yanına “:” koyarak miras alınacak sınıfın adı yazılır.

Yukarıdaki diyagram için sınıfların kodları aşağıdaki gibidir.

class Tasit { }

class Otomobil : Tasit { }

class Kamyonet : Tasit { }

İsteğimiz, taşıtlar için fiyat hesaplayabilmekti. Bunu az kod ve esnek bir şekilde halletmek için artık fonksiyonu Tasit sınıfı içerisine kodlayabilir ve diğer sınıfların üzerinden çağırabilirz.

Tasit sınıfının son hali aşağıdaki gibidir.

class Tasit 
{
    public decimal SaatBasinaUcret { get; set; }
    public int Sure { get; set; } // Saat bazında.

    public decimal FiyatHesapla()
    {
        return SaatBasinaUcret * Sure;
    }
}

Şimdi taşıt tipinden bir otomobil belleğe çıkaralım ve property’lerini set ederek fiyatını hesaplayalım.

static void Main(string[] args)
{
    // Object initializer kullanarak property'lere değer atayalım.
    Otomobil otomobil = new Otomobil()
    {
        Sure = 5,
        SaatBasinaUcret = (decimal)5/4,
    };

    Console.WriteLine(otomobil.FiyatHesapla());
}

Aynı şekilde kamyonet sınıfı için de FiyatHesapla metodunu kullanabiliriz. Böylelikle her tip için bir fiyat hesaplama metodu yazmak yerine sadece base class’a yazarak işi tamamlamış olduk.

 

Şimdiye kadar anlatılanlara birkaç ek yapalım ve biraz toparlayalım:

 

– İlk önce kalıtımdan ve kalıtıma neden ihtiyaç duyulabileceğinden bahsettik.

– Kalıtımın uygulanması ile ilgili ufak bir örnek yaptık.

– Base class’taki public bir metodun nasıl alt sınıflardan çağırılabildiğini gördük.

– Erişim belirleyiciler konusunda anlattığım gibi, public elemanlar her yerden erişilebilir durumdadır. Eğer sadece alt sınıfların erişmesini istediğiniz bir eleman varsa protected ile işaretlemeniz gerekmektedir.

Internal protected ile işaretlenmiş elemanlara ise assembly dışından türetilmiş alt sınıflar da erişebilir.

 

– Kalıtımla birlikte değinilmesi gereken diğer konular ise, türettiğimiz sınıfların birinden nesne örneklediğimizde constructor çağırımlarının nasıl yapıldığı, base class ctor’una nasıl parametre gönderildiği, base, override, new anahtar kelimeleri olarak sıralanabilir. Bu konuyu içeren sıradaki yazıyı okumak için tıklayınız.

 

İyi Eğlenceler:)

12
Ara'13

OOP 6: Static Kavramı ve Static Elemanlar (C# ile OOP)

Static, adından da anlaşılabileceği gibi “durağan” olmakla alakalıdır. Örneğin static bir değişken belleğe sadece bir defa çıkarılır ve durağandır. Erişmek isteyen herkes aynı adresten okuma yapar. Fakat değerlerini değiştirmek mümkündür. Sabitlerle karıştırılmamalıdır. Sabitlere tanımlandıkları anda bir kereye mahsus değerleri atanır ve değiştirilemez fakat static elemanların değerleri istenildiğinde değiştirilebilir. Daha iyi kavramak için, static elemanların ne tip ihtiyaçlarda kullanılabileceğini inceleyelim.

Static Field ve Static Property

Mesela bir sınıftan kaç adet nesne örneklendiğini bilmek istiyoruz. Belki de bir oto galerimiz var ve adını tek yerde tutmak, her nesne için aynı ada ulaşmak istiyor olabiliriz. Bunlar ve bunlar gibi ihtiyaçlar için static elemanlara başvurmak gerekiyor. Bir elemanı static olarak işaretlemek için static anahtar kelimesini kullanmak yeterlidir.

class OtoGaleri
{
    private static string _firmaAdi;
}

Bu eleman static olmasaydı, otoGaleri sınıfından bir nesne örneklendiğinde _firmaAdi default değeri ile belleğe çıkacaktı. Bir nesne daha örnekendiğinde yine yeni bir _firmaAdi belleğe default değeriyle çıkacaktı. Kısacası ne kadar nesne örneklenirse o kadar da _firmaAdi belleğe çıkacaktır. Fakat _firmaAdi için static anahtar kelimesi kullanıldığında, OtoGaleri sınıfından ne kadar nesne örneklenirse örneklensin bellekte tek bir _firmaAdi elemanı varlığını sürdürecektir. Hal böyle olunca bu elemana nesne örneği üzerinden erişmek, kodu yazanda veya okuyanda yanılgıya sebep olabilir. Aslında static olan bu elemanın sadece bir nesne için değiştiğini düşündürtebilir. Öyleyse mantıklı olan, static elemana tip adı üzerinden erişmek olabilir. C#’ta da static elemanlara erişim tip adı üzerinden yapılmaktadır.

 

Static elemana yalnızca tip adı üzerinden erişilebildiğini gösteren ekran alıntılarını aşağıdan inceleyebilirsiniz.

İlgili sınıf aşağıdaki şekilde kodlanmıştır. Bir static field ve bu fielda erişim sağlayan bir propertyden oluşmaktadır.

5
Ara'13

OOP 5: Nesneler İle Çalışmak ve Object Initializer (C# ile OOP)

Bir sınıfı örneklemek, nesne yaratmak; ikiside aynı şeylerdir. İngilizce tabiriyle nesne için instance da denilebilir.Nesnelerin bir sınıfın örneği olduğundan daha önce bahsetmiştim. Yani ilk önce örneklenebilecek bir sınıfa sahip olunmalıdır. Örneklenemeyen sınıflar da mı var diyorsanız bu konuda ayrıntılı bilgileri ilerleyen zamanlarda aktarmaya çalışacağım. Şimdilik bir sınıfın örneklenemez(nesnesi yaratılamaz) olabileceğini bilmek yeterli. Örneklenmeye müsait, aşağıdaki gibi bir sınıfı ele alalım.

class Tasit
{
	public string Marka{ get; set; }
	public string Model{ get; set; }
}

Yukarıdaki sınıf için biraz inceleme yapma zamanı:

 

– Field tanımlamayıp direkt property kullandım. Biliyorum ki derleyici fieldları, getter ve setter’ları kendisi oluşturacak(kendi belirlediği uygun isimlerle).

– Ctor(yapıcı fonksiyon/constructor) kodlamadım. Yine biliyorum ki derleyici, gövdesi boş ve parametre almayan bir ctor oluşturacak.

– Son olarak, c#’taki her şey gibi yukarıdaki sınıfın da Object sınıfından kalıtıldığını biliyorum.

Nesne Yaratma ve Propertylere Değer Atama

Yukarıdaki sınıftan bir nesne yaratıp propertylere değer atayalım.

Tasit t = new Tasit();
t.Marka = "Audi";
t.Model = "A3";

Yukarıdaki örnekte nesne yaratılıyor ve ardından propertylere değerleri atanıyor.

26
Kas'13

Dört Yıllık Lisans Eğitimim, Üniversitem ve Ben (Benim Köşem, Genel)

mezunBen

Başlamak Bitirmenin Yarısıydı; Şimdi bitti. Yenileri başlıyor… Fakat eğitim hayatının defterini dürmek yok! Çalışmak, öğrenmek her zaman…

 

Bu yazıya devam etmeden önce, şimdiye kadarki üniversite hayatımda bana bir şeyler öğretmek için çabalamış tüm hocalarıma ve diğer herkese minnettar olduğumu belirtmeliyim. Özellikle üniversite hayatım boyunca hayata ve mesleğime dair çok şey öğrendim. Her zaman yaptığım gibi bildiklerimi başkalarına aktarmaya çalıştım. Hep söylerim; “Pekiştirmek için en iyi yol başkalarına öğretmektir.”.

 

İki yıl önce yazdığım gibi bu yazıyı da ileride okuyup, bu zamanlarda neler hissettiğimi ve neler yaşadığımı daha iyi hatırlamak ve gülümsemek için yazıyorum. Hikaye gibi yazmayıp, yine maddeleme yöntemini kullanacağım:) İyi okumalar(Bana ve herkese).

 

– Sınav sonucu geldi, Edirne’ye gidildi kayıt için. Heyecanlı olduğum kadar şaşkındım, mutluydum ve bir sürü duyguyu bir arada yaşıyordum.

– Kısa süre sonra okul başladığında ilk defa ailemden bu kadar uzaktım. İlk dersime beni uğurlayıp gittiler. Yeni bir hayata ilk adımlarımı atmıştım. Kim bilir önümde ne yaşantılar vardı.

– Başka bir şehir, bambaşka bir ortam, sudan çıkmış balık gibi başladım üniversiteye. Zordu başta, yaşanmaya değer ve tarif edilemeyecek kadar güzel geçti.

– Beklentilerini düşük tutanlara yeterde artardı Edirne. Bursa’dan gelen ben için alışması zor olsa da Edirne yolu hiçbir zaman çekilmez olmadı.

– Çok değerli arkadaşlarım, dostlarım, hocalarım oldu.

– Nilüfer otobüslerinde geçti epey zamanım. Sıkıcı değil, rölantide bir mutluluk ve ruh hali içinde geçti yolculuklarım bazı istisnalar hariç.

– Yurtta kalamadım hiç. Yedeklere düşmüştüm, bekleyemedim kira tuttum kısa sürede. Dört yıl boyunca da hep kiralık dairelerde kaldık. Güzeldi kesinlikle. Rahattı…

– İlk dönemin birazında tek birazında Kaan’la, diğer dönemde de Şakir ile ev arkadaşıydım. İkinci yıl sevgili dostum Halil, üç ve dördüncü yıllarımda ise Halil ve lisedeki en yakın arkadaşım, dostum Doğan ile birlikte üç kişi kaldık. Şakir daha ilk seneden Marmara’ya kapağı atmıştı:)

– İlk sene haricinde hep iyi çalıştım. Sevdim mesleğimi. Severek çalışmanın mutluluk verici olduğunu öğrendim. Yazılım mühendisliğini sevdiren hocalarımın bendeki yeri ayrıdır.  Özellikle Yrd.Doç.Dr. Aydın Carus, Doç.Dr. Yılmaz Kılıçaslan, Yrd.Doç.Dr. Tolga Sakallı, Yrd.Doç.Dr. Deniz Taşkın ve Arş.Gör. Emir Öztürk  hocalarımın:)

– Bir yandan mesleğimi en iyi şekilde yapmaya çalışırken bir yandan da hayatımı tam da istediğim gibi, her dakika ne istediysem onu yaparak yaşadım. İllaki istisnalar olmuştur. Bu konuda çok şanslı olduğumu düşünüyorum.

– Kendi gelişimimi çok aksattığım zamanlar da oldu fakat hiç ipleri koparmadım.

– Okuldan otogara giden o yolda yürümekten çoğu kişi yakınırken ben hep zevk aldım. Karanlık, arkadaşlarla yürüyüş ve sohbet…

– Karanlık demişken, ikinci öğretim olmak paha biçilemez. O yüzden imkanınız varsa harç parası çok diye ikinci öğretimi ikinci plana atmayın:)

– Bir evimiz yoktu. Tuncay,Barış,Furkan,Latif dörtlüsünün de , Aybars’ın da, Ali,Enes,Engin,Cumhur dörtlüsünün de(laf yanlış yere gitmiyor merak etmeyin:))  evini kendi evim gibi saydım.

– Her yaz tatili başlamadan üniversite arkadaşlarımla organizasyon şirketlerinin düzenlediği tatillere gittik. Alanya ve Kemer’e giden uzun otobüs yolculukları bile çok güzeldi. Son sene oldukça kalabalık katıldığımız Magic Break’in aracılık ettiği tatil ise unutulmazlarımdandır.

– Burs aldığım yerde yaptığım zorunlu her yaz bir aylık çalışmalarım ve severek yaptığım yazılım stajlarım oldu.

– Bir güzelle yollarımız tekrar kesişti:)

– Balo ve mezuniyet törenleri güzel hatıralarım arasında yerlerini aldı.

– Çok anılar biriktirdim. Yaşamaya doyamadığım zamanlar yaşadım. Üniversite hayatı iki kelime, anlamı ise sayısız bende. Herkesin böyle güzel zamanlar geçirmesini temenni ederim.

 

Sağlıcakla kalalım…

24
Kas'13

OOP 4: Encapsulation(Sarmalama) (C# ile OOP)

Nesneye yönelik programlama anlayışının ilkelerinden bir tanesi olan encapsulation kavramını incelemeye ve kod örnekleri vermeye çalışacağım. Encapsulation kavramının kısa bir açıklamasına OOP 1 yazımda değinmiştim.

 

Encapsulation, erişim belirleyicileri ile sağlanır. Öncelikle erişim belirleyicilere değinmekte fayda var.

Public Erişim Belirleyicisi

Public erişim belirleyicisi ile işaretlenen elemanlar her yerden erişilebilir olurlar. Yani içinde bulunduğunuz namespace’den erişebilirsiniz ve oluşturduğunuz dll’i kullanan her proje, dll içerisindeki public elemanlarınıza erişebilir.

Private Erişim Belirleyicisi

Private erişim belirleyicisi ile işaretlenen elemanlar sadece tanımlandıkları sınıf içerisinden erişilebilir durumdadırlar. Bu elemanlara sınıf dışarısından, nesne örnekleyerek ulaşmak mümkün değildir.

Protected Erişim Belirleyicisi

Protected erişim belirleyicisi ile işaretlenen elemanlar içinde bulundukları sınıftan ve bu sınıftan kalıtılan sınıflardan erişilebilir.

Internal Erişim Belirleyicisi

Internal erişim belirleyicisi ile işaretlenen elemanlar içinde bulundukları namespace içerisinden erişilebilir.

Protected Internal Erişim Belirleyicisi

Protected internal erişim belirleyicisi ile işaretlenen elemanlar, aynı namespace’de olmasalar dahi kendi sınıflarından kalıtılan sınıflar tarafından erişilebilirler. Protected ve internal erişim belirleyicilerinin or işlemine tabi tutulması olarak düşünülebilir.

Getter ve Setter

Sarmalama kavramının uygulanabilmesi için erişim belirleyicilerin etkin olarak kullanılması gerekir. Yapılması gereken kesinlikle her elemanın public yazılıp geçilmesi değildir. Planlama yapmak ve her elemanı uygun erişim belirleyiciler ile işaretlemek gerekir.

 

Örneğin; Sınıf içerisindeki field’lara direkt olarak erişilebilmesi uygun değildir. Zamanında, tüm field’ları public olan bir sınıf yaptığımızı düşünelim. Daha sonra proje içerisindeki binlerce satırda bu sınıftan nesne örnekleyip field’larını kullandık. Bugün ise field’lardan bir tanesine atama yapmadan önce ufak bir kontrol yapma ihtiyacı duyduk. Şimdi dönüp binlerce satırı değiştirelim… Ya da gelin biz bunu böyle yapmayalım. Field private olsun. Nesne örnekleyip erişmek isteyen de public bir metodu aracı olarak kullansın. Bu metoda da Getter diyelim. Belki de bu field’a atama yapmak da istenebilir. Yine bir public aracı metot olsun ve buna da Setter diyelim.

22
Kas'13

OOP 3: Constructor ve İlk Değer Atamaları (C# ile OOP)

Constructor(Ctor)(yapıcı fonksiyon), sınıfların içlerine yazılır ve sadece içine yazıldığı sınıftan bir nesne örneklenirken 1 defaya mahsus olarak çağırılır. C#’ta constructor, sınıf ile aynı isimde olmalıdır.

using System;

namespace ConstructorVeIlkDegerAtamalari
{
    class Tasit
    {
        //Constructor(yapıcı fonksiyon)
        public Tasit()
        {

        }
    }
}

Eğer class içerisine ctor kodlanmazsa derleyici bizim yerimize default bir ctor tanımlar. Bu ctor parametre almayan boş bir ctor olacaktır.

 

Constructor’lar genelde belleğe çıkan nesnenin özelliklerine ilk değer atamaları için kullanılır. Birçok özel durum da ihtiyaç duyulduğunda constructor içine kodlanabilir. Örneğin sınıftan kaç adet nesne örneklendiğini bilmek için.

class Tasit
{
    public string Marka;
    public string Model;

    //Constructor(yapıcı fonksiyon)
    public Tasit()
    {
        Marka = "Wokswagen";
        Model = "Golf";
    }
}

Yukarıdaki class için bir nesne örnekleyip property’lerini ekrana bastığımızda, property’lere değerlerinin atanmış olduklarını görebiliriz.

20
Kas'13

OOP 2: Sınıf ve Nesne Kavramları (C# ile OOP)

Sınıf Kavramı

En basit tanımıyla, sınıflar şablonlardır. Kod olarak orada dururlar ve bellekte yer kaplamazlar. Nesneler, sınıfları kullanarak örneklenirler. Örneğin bir taşıt sınıfı şu şekilde tanımlanabilir:

namespace OOPSinifveNesneKavramlari
{
    class Tasit
    {

    }
}

Yukarıdaki örnekte tanımlama yapılırken erşim belirleyicisi kullanılmamış. Böyle bir durumda tip tanımları için varsayılan erişim belirleyicisi internal‘dir. Yukarıdaki class tanımı ile aşağıdaki arasında bir fark yoktur.

internal class Tasit{ }

C#’ta her şey nesnedir. Çünkü her sınıf bir base tip olan Object ‘ten kalıtılmıştır. Hatta her interface, struct ve diğer her şey Object sınıfından kalıtılmıştır.

 

Aşağıdaki kod örneği ile

class Tasit
{

}

Alttaki kod örneği arasında bir fark yoktur.

class Tasit : Object
{

}

İçine hiçbir nitelik eklenmediği ve hiçbir sınıftan kalıtılmadığı halde taşıt sınıfının bazı niteliklere sahip olduğu görülüyor:

20
Kas'13

OOP 1: Nesneye Yönelik Programlamaya Başlangıç (C# ile OOP)

OOP (Object Oriented Programming/Nesneye Yönelik Programlama). Nesneye yönelik programlama, kod içerisinde nesne dediğimiz kavramları kullanarak karmaşıklığın önlemesini amaçlamaktadır. Sınıflardan nesneler türetilir ve yönetilir. Fakat OOP için daha geniş açıklamalara ihtiyaç var.

Neden OOP?

1960’lı yıllarda, geliştirilen yazılımların sadece %5’i gerçekten kullanılabilir durumdaymış. Geriye kalan %95’i ya değişikliğe ihtiyaç duyuyor ya da tamamıyla kullanılamaz yazılımlarmış. Bunun sebebi ise basitçe; “karmaşıklık”. Bu yüzden 1968 yılında yazılım bunalımı bile ilan edilmiş. Yazılımın karmaşıklığı arttıkça uygulama maliyeti katlanarak artıyormuş. Tabiki günümüzde de karmaşıklık, maliyeti artıran önemli unsurlardan.

 

NYP’den önce Uygulama Karmaşıklığı – Bakım Maliyeti Çizelgesi:

UygulamaBakimMaliyeti

Temel olarak, yazılımda karmaşıklığı azaltmak ve yönetimi, değişikliği ve bakımı daha iyi yapılabilen programlar üretmek için geliştirilen OOP bu iş için aşağıdaki ilkeleri benimser:

 

– Soyutlama (Abstraction)
– Sarmalama (Encapsulation)
– Kalıtım (Inheritance)
– Çok Biçimlilik (Polymorphism)

26
Tem'13

Android Studio 2.0 ile Eski Projelerin Çalıştırılması (Android, Notlar)

Android studio 2.0’dan önceki versiyonları kullanarak geliştirdiğiniz projeleri açmaya çalıştığınızda aşağıdaki gibi bir hata ile karşılaşırsınız.

android-refresh-failed

Hata: 

Gradle ‘projectName’ project refresh failed: Project i using an old version of the Android Gradle plug-in….

Çözüm:

1- Projeniz içindeki gradle.build dosyasını açın ve aşağıdaki satırları bulun.

5
Tem'13

Android Studio Kurulumu (Android, Başlangıç)

Android studio, google’ın geliştiricilere sunduğu geliştirici aracıdır. Android studio yayınlanmadan önce projeler eclipse ile geliştirilmekteydi. Bu yazımda android studio kurulumundan ve birkaç sorunun nasıl giderileceğinden bahsedeceğim.

 

İlk önce buradan android studio indiriniz.

android-indir

11
Eki'12

Dropdownlist’e Datatable Bağlanması ve Bazı Ayarlar (C#)

Bir C# form uygulamasında combobox kullanıldığında, text ve value gibi özellikleri değiştirmek çok kolay fakat dropdownlist ile bunu yapmaya çalıştığımda aynı fonksiyonların işe yaramadığını gördüm.

 

Dropdownlist ile combobox arasındaki fark ise; dropdownlist ‘e el yordamıyla yazı giremezsiniz.Yani seçili eleman ancak liste elemanlarından birisi olabilir.

Combobox olduğunda ise seçili elemanlardan farklı olarak bir text girebilmeniz mümkün.Bu çoğu zaman istenmeyen bir durum olabilir.

 

Şimdi dropdownlist’e datatable bağlanmasını,seçili elemanı iptal etmeyi ve seçili elemanının değiştirilmesini açıklamaya çalışacağım.

Yeni makaleleri E-Mail ile takip edin!