İçeriğe geç

Nesne Yönelimli Programlama – Başlarken (OOP)

Bu yazıyı Nesne Yönelimli Programlama (OOP – Object Oriented Programming) kavramına dikkat çekmek için kaleme aldım. İçeriği biraz kısa olsa da asıl fikri “doğru ve iyi bir yazılımcı” olabilmeniz için birkaç temel unsuru hatırlatmak olacak.

İçerisinde bulunduğum onca sene boyunca birçok projede birçok kişi ile çalıştım; teknik kod desteği verdim, proje geliştirdim, proje ve müşteri yönettim… Eğitim ayağında da yer alarak aslında yazılım dünyasının her aşamasında bulunmuş, her aşamasındaki kişilerle çalışmış oldum.

Üzülerek gördüm ki, bu işe gönül vererek yapan meslektaşımın sayısı çok az. Özellikle azımsanamayacak kadar çok kişi “nesne yönelimli programlama” kavramından bihaber.

Yazdığı dilin temelini çok iyi oturtmadan kod yazmaya çalışanları izledim. Öyle ki projelerde kıdemli geliştirici seviyelerine gelmiş, bu seviyeye gelene kadar birçok projede yer almış ancak en temel bilgilerden bile yoksun birçok kişi var. Bu da beni fazlasıyla üzdü, dahası biraz rahatsız etti.

Bu nedenlerle bloğumda bu konu üzerine oldukça çok yazı bulacaksınız. Birkaç yazılımcıya olumlu olarak dokunsam bile bunu kar sayacağım.

Biraz daha ileri seviye olan ancak bir yazılımın alt yapısının nasıl olması gerektiği ile ilgili fikir edinebileceğiniz SOLID Prensipleri makalemi okumanızı öneririm.

OOP Yaklaşımı Nasıl Olmalı?

Her şeyden önce yazdığınız projenin nesnel bir anlamı olması gerektiğini bilmeniz gerekir. Bunun için sınıfları (class) her görev için ayrı ayrı oluşturmanız, anlaşılır ve düzenli geliştirme yapmanız gerekir. Projeniz bir üst versiyona geçiş yapacağı zaman baştan yazmak zorunda kalmamanız gerekir. Bu önemli bir anahtar cümle…

Yazılımda güncelleme yapacağınız zaman yapmanız gereken tek şey sadece gerekli olan yenilikleri oluşturmak olması gerekir. Mevcut bir sınıf içine bir metot ekleyip o metoda ait belirli kısımlarda aynı sınıf içinde farklı çağrımlar yapmamalısınız. Yani basitçe anlatmam gerekirse farklı bir işlevi kod parçalarını tek bir metoda if-else vasıtası ile eklememeniz.

Var olan bir metodun içinde yapacağınız herhangi bir değişiklik ona bağlı diğer metot veya işlemlerin çalışmasını olumsuz etkilememelidir. Mümkün mertebe kodlarınızı revize etmeden yenileri ile yola devam etmeniz en önemli husus.

Özellikle OOP Tasarım İlkeleri (Design Patterns) ve OOP Prensipleri (OOP Princeples) konularına ağırlık vermelisiniz. Yazılım geliştirmeye yeni başladıysanız bu konular size biraz ağır gelebilir ancak bir müddet sonra muhakkak bu yapılara da göz atmanız gerekir. En azından şimdilik teorik olarak ne işe yararlar onları öğrenmelisiniz ki bu yapılarda önerilen proje geliştirme yöntemlerini uygulamaya çalışarak kendinizi daha iyi geliştirebilirsiniz.

Her şeyden önce şu mantık ile yazılım geliştirmelisiniz: Yaptığım yazılım ileride yeni eklentilere ihtiyaç duyabilir mi? Bunun cevabı evet ise, aslında benim tavsiyem hayır bile olsa bunu uygulamanız yönünde, o zaman yazılım mimarisini en basit şekli ile en doğru yapıda kurmanız gerekir.

Nesne Yönelimli Programlama kısaca; yeniden kullanılabilir, esnek ve verimli kod yazma yöntemidir.

Nesne Yönelimli Programlama İlkeleri

Buradaki her bir ilkeye ayrı konu başlıklarında C# örnek kod yapıları ile değinip burada link vereceğim.

Kapsülleme (Encapsulation): Kısaca verilerin gizlenmesidir. Nesnenin sınıf içinde özel olarak (private) tutulması ve bu nesnenin dışarıdan erişiminin engellenerek sınıf içinde işlemlerin yapılmasıdır. Diğer nesneler bu yapılar üzerinde değişiklik yapma yetkisine sahip değildir, sadece genel (public) fonksiyon ya da metotlar ile çağrılabilir. Amaç programın güvenliği ve veri bozulmalarının önüne geçmektir.

Soyutlama (Abstraction): Ortak özellikleri olan nesnelerin bir çatı altında toplanmasıdır. Sınıflar arası kalıtım (inheritance) uygularken kullanılır ve alt sınıflar abstract sınıfı inherit alırlar.

Kalıtım (Inheritance): Bir nesnenin özelliklerinin farklı nesneler tarafından kullanılmasıdır. Nesneler arasında ilişki kurulabilir ve alt sınıflar oluşturulabilir. Böylece üst özellikler alt yapılara taşınabilir. Örneğin Mühendis bir İnsan ise iki sınıf oluşturduğumuzu düşünürsek üst sınıf olarak insan sınıfı oluşturup Mühendis sınıfında da İnsan sınıfını inherit ederiz (miras veririz). Böylece Mühendis sınıfı hem İnsan sınıfının özelliklerini içine alır ve çağrıldığı yerlerde insan sınıfının özellikleri ile işlem görür. Daha kapsamlı ve doğruluk düzeyi daha yüksek bir veri analizi imkanı sağlar, geliştirme sürelerini azaltır.

Çok Biçimlilik (Polymorphism): Bir nesnenin birden fazla forma girmesi olayıdır. Bunun en güzel örneği ToString() metodudur. Bu metodun ana amacı ilgili nesneyi olduğu gibi string veriye çevirmesidir. Ancak siz nesneyi ilgili sınıf içinde ezerseniz (override) ve o sınıfla çağrıldığında ad ve soyadı beraber getirmesini isterseniz buradaki işlevi değişecektir.

OOP Yapıda Katmanlı Mimari?

Uzun ve farklı bir konu olduğu için kısaca değineceğim. Sonrasında ayrıca detaylı bir makale yazıp buraya link eklerim.

Nesne Yönelimli Programlama konusu tasarımsal (OOP Design) ve prensipler (OOP Principles) olarak oldukça derin bir konu. Eğer OOP yapısını iyi bir şekilde öğrendiğinizi düşünmüyorsanız muhakkak temelden başlamanızda fayda var.

Bir yazılım projesi geliştirirken genelde tek katmanda bir çok işimizi görürüz. Bunda tabi ki bir sorun yok, eğer tek katmanda çözebileceğimiz bir iş ise elbette tüm işleri bir arada toparlayabiliriz. Ancak iyi bir yazılımcı olmak istiyor ve yazdığımız projeleri tekrar tekrar yazıp aynı şeyleri birden fazla kez kodluyorsak orada nesnellikten söz etmemiz mümkün değil.

Her ne olursa olsun en ufak yazılımlarınızı bile bir mimariye oturtmak durumundasınız. Yarın bir değişiklik olduğunda, yeni bir ister geldiğinde ya da güvenlik ile ilgili ek istek ve sorunlarda tek katmanda geliştirdiğiniz projenizin başınıza ne gibi işler açabileceğini tahmin dahi edemezsiniz. Öyleyse mimarimizi en temel yapı olan 3 katmana bölmemiz ve projemizi bu şekilde geliştirmemiz en doğru yaklaşım olacaktır. Tabi sonrasında bu katmanlar Core Layer, Web Services, InterfaceServices, Entity, Repository vb. katmanlar olarak çoğalacak…

3 Katmanlı mimarinin en temel yapısı şu şekilde olacaktır:

  • Sunum Katmanı – Arayüz Katmanı (Presentation Layer – UI): Bu katman sizin son kullanıcılara (client) yayın yaptığınız katman olmalıdır. (Web, Mobile, Desktop vb.). Business Logic Layer’ndan referans almalıdır.
  • Veri Erişim Katmanı (Data Access Layer): Direkt olarak veritabanı ile bağlantılı olmalı, tek işi veri tabanından veri alıp vermek olmalı. Burada kesinlikle if-else gibi şartlı ifadeler olmamalı ve sunum katmanına bağlanmamalıdır. Business Logic Layer’a referans vermelidir.
  • İş Katmanı (Business Logic Layer): Sizin Sunum Katmanınız ve Veri Erişim Katmanınız arasındaki köprüdür. Adı üzerinde bu katmanda Veri Erişim Katmanından gelen verileri işlersiniz ve sunum katmanına öyle yollarsınız. Cache, Security, Logging, Verification gibi işler bu katmanda yapılır. Öyleyse tabi ki Data Access Layer’dan referans almalı ve Presentation Layer’a referans vermelidir.

Yani kısaca aşağıdaki gibi bir bağlantı sağlanmalıdır:

DataBase <–> DataAccessLayer <–> BusinessLogicLayer <–> UI

Hazır Bileşenleri Kullanmalı mıyım?

Hazır bileşenler kullanarak kod geliştirmek tabi ki bizim işimize çok yarayan bir yöntemdir ancak kodun arkasında neler oluğunu bilmiyorsak, hatta onu biz yazamıyorsak açıkçası projelerin hiçbirinin profesyonelliğinden bahsedemeyiz.

Biraz yeteneğiniz varsa zaten bu tür bileşenleri kullanarak da bir proje geliştirebilirsiniz ancak eğer bu dünyada var olmak ve söz sahibi olmak istiyorsanız işin temelini ve nesnel yaklaşımı çok iyi kavramanız gerekecektir.

“Vakit nakittir” diye bir söz var; içinde bulunduğunuz proje zaman/maliyet yönünden bu tür işlevleri sıfırdan geliştirmenizi engelliyorsa ya da o işlevi görecek iyi bir hazır framework varsa  tabi ki Amerikayı yeniden keşfetmeye gerek yok, kullanın ancak muhakkak nasıl yapıldığını bilin ve bunları ara ara uygulamaya / geliştirmeye çalışın. Ve tabi ki doğru teknolojiyi kullanın, sonrasında aldığınız hatalarla, sorunlarla baş edememe riskine karşı dirençli olun; “bunu kullanana kadar kendimiz yazsaydık daha hızlı bitirirdik” demeyin benden söylemesi 🙂

Tabi yazılım geliştirme kadar proje yönetimi ile ilgili de bilgi sahibi olmanız gerekir. Bunun için Proje Yönetimi kategorisi altında yayınladığım yazılara göz atabilirsiniz.

OOP yapılarla çalışıyor ve OOP – Object Oriented Programming (Nesne Yönelimli Programlama) konusuna hakim değilseniz gerçek bir yazılımcı değilsinizdir.

“Nasılsa bir kez yazıp geçeceğim, hızlıca bitireyim” mantığını bir kenara koyarak en küçük projenizden en büyüğüne kadar nesnel davranışlara yönelik çalışmalar yapmanız gerekir.

Yeni başlayan ya da bu konuda eksikleri olan tüm mesai arkadaşlarım için elimden geldiğince bu bölümde gerek makale, gerek videolarla sizlere destek olmaya çalışacağım.

Sorularınız olursa aşağıdaki yorum alanından bana sorabilirsiniz, mümkün olan en kısa sürede yanıt vereceğim.

 

Tarih:C#.Net

6
Kimler Neler Demiş?

avatar
5 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
6 Comment authors
Volkan Barbaros Gürcanmehmet doğaMervefirat elizNihan Recent comment authors
  Subscribe  
Bildir
mehmet doğa
Ziyaretçi
mehmet doğa

yazınız için ve samimiyetiniz öznel eleştirileriniz için sonsuz teşekkürler.
ben 770 saat mcpd eğitim aldım ama halen oop konusunda veya veri tabanı konusunda bocalıyorum gerçi hiç gerçek bir projenin içinde yer almadım ama amatör olarak ta yetersizim Frown oysaki öğle şeyler planlıyorum ki ama yapamadığımk için kalıyor (mesela trafik kazalarına veya düzenlemesine yönelik önleyici yazılımlar vs.)
bana bir yol gösterecek el verecek tabiri caizse bu işin ustası kişilerin yardımlarına da açığım.
saygılarımla.

Merve
Ziyaretçi
Merve

Ellerinize sağlık.Konuyla ilgili daha detaylı makale ve videolarınızı sabırsızlıkla bekliyorum

firat eliz
Ziyaretçi
firat eliz

elinize sağlık hocam

Nihan
Ziyaretçi
Nihan

Sitenizi facebookta bir arkadaşım paylaşmış oradan gördüm, Bilgisayar Mühendisliği 3. sınıf öğrencisiyim ama yazılım yapın deseniz hiçbir şey yazamam. Internetteki videoları izliyorum fakat neyin nasıl yapıldığını bir türlü kavrayamıyorum, özellikle bu oop konusu canımı çok sıkıyor

Sevilay
Ziyaretçi
Sevilay

Elinize, klavyenize sağlık hocam