Yazılım Mühendisliği Rehberi-(P)Object Oriented

Nasıl daha iyi yazılım mühendisi olabiliriz diye daha önceden birkaç şey karalamıştık hatırlarsanız. Bu seferde birkaç satır Object Oriented dünyasına ait birşeyler karalayalım. Object Oriented yani türkçeye çevirmeye çalışırsak Nesneye Yönelik yazılım felsefesi hakkında birkaç şeyde biz söyleyelim. Object Oriented Programming, Object Oriented Design, Object Oriented Analysis hepsine yazının bundan sonraki kısmında Object Oriented diyeceğim.

Bugünlerde Object Oriented denince nedense aklıma eski bi Ruffles reklamı vardı o geliyor. Reklamda spiker taraftarın birine mikrofonu uzatıyortı birşey soruyordu yanılmıyorsam ardından geçen konuşmadan sonra öldürücü slogan geliyordu : "Ruffles Her maça gidiyor , her maçta yeniyor" diyordu. Nereden Object Oriented ile bağdaştırdığımı sorarsanız size hak vererecek şöyle açıklamaya çalışayım. Günümüzdeki modern yazılım dünyasında, modern object oriented programlama dilleri, modern geliştirme ortamları, modern framework’lere sahibiz. Bunları kullananlardan herhangi birine sorduğunuzda size muhtemelen Object Oriented yazılım geliştirdiğini söyleyecektir. Bunların gelişiminde Object oriented felsefenin etkisi çok büyük fakat bunları kullanarak gerçekten Object Oriented yazılım geliştirmiş oluyormuyuz? Cevap acı ama gerçek malesef olmuyoruz. Hatta daha da acısı büyük bir çoğunluğumuz Object Oriented olarak yazılım geliştirdiğimizi düşünüyoruz fakat eski prosedürel mantıktaki programlanın biraz bozuk şekilde evrimleşmiş şekli olan Prosedürel Object Oriented diye yorumladığım PObject Oriented yazılım geliştiriyoruz.

Kendimden örnek vereyim ilk önce. Okul yıllarında Java’da ya da C# , C++ gibi dillerde programlama yaparken dil Object Oriented diye benim yaptığım programlarında Object Oriented olduğunu düşünürdüm. İşin kötüsü tabi bunu sonradan yanlış olduğunu anlamak oldu. Tabi ilk başta insanın aklına "E ben java’da program yazmıyormuyum? Yazıyorum.. E java’da herşey nesne değil mi? Nesne.. E o zaman ben Object Oriented yazılım geliştirmiş olmuyormuyum?" diye bir soru geliyor. Bu soruya cevabımız "Malesef hayır, geliştirmiş olmuyorsunuz.". Muhtemelen Object Oriented olduğunu düşünerek Object tabanlı modern bir dilde geliştirdiğiniz programların çoğu PObject Oriented. Etrafta birkaç (on,yüz,bin) sınıf var, bu birkaç (on,yüz,bin)’lik sınıfların içindeki çoğu kod sadece birkaç onluk sınıfta toplanmış, o da yetmezmiş gibi bu sınıfların içindeki onlarca metod yüzlerce satırdan oluşuyor. Ayrıca şöyle bi yapıya göz gezdiriyorsunuz kimin eli kimin cebinde değil bütün sınıfların referansları bütün sınıflarda bulunuyor. Proje interface fakiri vb….Zaten niye interface diye bir kavramı bu programlama dillerine koymuşlar bir türlü anlamadım neymiş efendim C++’da çoklu kalıtım varmış modern programlama dillerinde de çoklu kalıtımın sorunlu yapısı yerine interface kavramı çıkarılmışşşşşşşş.. Sınıfları şöyle bir inceliyorsunuz bazıları metodlarını kabadayı binlerce satırlık sınıflara kaptırmış. Bu sınıflarda property ya da getter/setter ‘dan başka birşey yok. Aslında bu tarz sınıfları C’ deki struct ya da Pascal’daki Record yapısını kullanarakta çok güzel yapabilirdik. Bana sorarsanız o binlerce satırlık sınıflarıda prosedürel programlama ana sınıfta birkaç yüz satırlık uzun parametreli metodlarla yapabilirdik ne gerek vardı Java’ya, C#’a. Birde object oriented havası vermek için Köpek sınıfını Hayvan sınıfından türettikmi olay bitmişti. :)

Yukarıdaki bahsettiğim şeylerin hepsini Ali desideronun dediği gibi bizzat denedim çocuklara denettim. Valla hepside okumuş çocuklar bende dahil olmak üzere ama Object Oriented’ın böyle olmadığını birtürlü okulda ya da başka bir yerde okuyamamışız :)

Günümüz modern Yazılım dünyasında, Yazılım Mühendisliğinde gerçekten Object Oriented yazılım geliştirmenin önemi çok büyük fakat bunu ancak gerçek anlamda Object Oriented felsefeyi öğrendikten sonra anlıyorsunuz.Bunu bilmeden önce Pascalda C de aynı programı geliştirmişsiniz bir fark yaratmıyor gibi geliyor insana. Hatta ilk başlarda orda geliştirmek daha kolay bile gelebilir çünkü onlar saf kan Prosedürel Oriented, (P)Object Oriented değil. Ama Object Oriented dünyasına bir daldığınızda işlerin ne kadar temiz , düzenli, kolay yönetilebilir, kolay yeni özellik eklenebilir, esnek olarak geliştirildiğini görünce eski günlere geri dönmeyi pek istemiyorsunuz. Tabi unutmamak lazım amacımız Object Oriented hatrına böyle yazılım geliştirmek değil amaç gittikçe kompleksleşen yazılım projelerini daha ucuza daha kısa sürede daha yönetilebilir, yeni özellikleri kolayca eklenebilir yapıda geliştirmek bu yüzden Object Oriented sayıklayıp duruyoruz.

Object Oriented denince aslında ilk akla gelmesi gereken şey Data Hiding, Encapsulation kavramlarıdır. Ayrıca Polymorphism ve Overloading kavramlarıda bunlardan sonra oldukça önemlidir. Aslında bunlardan kısa kısa bahsetmektense uzun uzun makale hazırlamak istiyorum. Çünkü ilk başta bu kavramları yarım yamakak öğrendiğimde tamam Object Oriented felsefeyi kaptım demiştim ve hiçte önemsememiştim ama ilerledirkçe hiçde doğru anlamadığımı ve ne kadar önemli olduğunu anladım.

Object Oriented ile prosedürel programlama arasındaki en büyük farklardan birisi de Prosedürel programlamada veriler ve fonksiyonlar birbirinden ayrıdır.Yani dışarıda global veriler bulunur ve bu verileri işleyen fonksiyonlar bulunur. Object Oriented programlamada ise tam tersi veriler ve onlar üzerinde işlem yapan fonksiyonlar bir aradadır.Ayrıca Kısa bir tanımlama yaparsak Data Hiding (Bilgi Saklama) nesnelerin iç yapılarının yani sahip oldukları verilerin dışarıdan gizlenmesidir. Encapsulation ise bu dışarıdan saklanmış verilerin nesne üzerinde tanımlanmış fonksiyonlar ile dışarıya açılmasıdır. İlerleyen zamanlada daha detaylı bu konulara değiniriz…

Yukarıda olmaması gereken birçok özellik saydım bunlar sadece bazılarıydı. Eğer kodunuzda bu tarz şeyler görüyorsanız birkaç OO kitabı almanın biraz makale okumanın vakti gelmiş demektir. En azından benim için en faydalı olanda öyle sanarak yazdığım kodların Object Oriented olmadığını kısa sürede görebilmiş olmamdı. Ondan sonrası zaten kolaylıkla geliyor doğru olanın arayışı içine giriyorsunuz çünkü.

Kısaca yazılım mühendisi olanlara, adaylarına kodlarını tekrar gözden geçirmelerini gerçek anlamda Object Oriented yazılım geliştirip geliştirmediklerini sorgulamasını tavsiye ediyorum. En kısa zamanda Object Oriented felsefeyi kavramalarını şiddetle tavsiye ediyorum. Hatta aynı projede çalışsaydık muhtemelen şimdi arkadaşlara yaptığım gibi durmadan faydalarını anlatıp ikna etmeye çalışırdım olmadı dikte ederdim :)Gerçekten Object Oriented felsefenin yazılım mühendisliği alanının en önemli konularından biri olduğunu düşünüyorum . Diğer birçok yazılım mühendisliği konusu (Design Patterns, Refactoring, TDD vb..) aslında nasıl daha iyi Object Oriented yazılım geliştireceğimiz hakkındaki tekniklerdir.

Şimdi benimde en çok zorlandığım nasıl öğreneceğiz kısmına geldik . Öncelikle eğer şanslıysanız ve çevrenizde Object Oriented felsefeyi iyi bilen birileri varsa hemen yapışın hiç bırakmayın derim.Beraber yazılım geliştirin yazdığı kodu inceleyin sınıflara atadığı metodların neden oraya konduğuna dair sorular sorun vb… Dikkat edin tecrübeli demiyorum çünkü gözlemlediğim şöyle bir sonuç var Çalışma yılı = İyi yazılım mühendisi demek değildir. Bu kişilerden ne kadar bilgi alırsanız yazılım kariyeriniz için o kadar iyi olacaktır. Kitaplardan makalelerden günlerce okuyup bulamayacağınz bir bilgiyi yanınızdaki kişiden 5-10 dakika içerisinde öğrenebilirsiniz. Benimde seçtiğim ikinci seçenek kendi kendinize öğrenmekten geçiyor yani zor olan yol. Açıkçası bu şekilde öğrenmek yıllar alabiliyor. Sürekli konu hakkında kitap makale blog forum takip etmeniz gerekiyor. Takıldığınız yerlerde forumlardan yardım almak biraz zorlaşıyor dolayısıyla öğrenme süresi oldukça uzuyor. Yıllar oldu ben açıkçası hala OOP adına bilmediğim yeni şeyler öğreniyorum. Kitap olarakda daha önceden okuduğum en iyi Object Oriented başlangıç kitabı olarak tavsiye edebileceğim

Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development

aklınıza takılan sorular varsa ben burdayım. Object Oriented dünyasına giriş biletinizi kestik hadi hayırlı yolculuklar….

7 thoughts on “Yazılım Mühendisliği Rehberi-(P)Object Oriented

  1. Cosku Cimen

    çok içten,konuşma havasında yazılmış bir makale. hayvandan kedi kopek uretmekten oteye gidemiyoruz lafına koptum ve cidden öyle.cok guzel toplamışsın tum hiyeraşiyi:)keşke bu yazıyı okulda herhangi bir hocamız anlatsaydı bize.
    -hosgeldin iş gorusmesine , oop NEDİR biliyormusun anlatırmısın?
    -evet nesneye dayalı programlamadır. herşeyi nesnelerle yaparsın class oluşturursun
    -OOPde inheritance nedir biliomusun?
    -ewet arabadan mercedes,ford hayvandan kedi kopek uretmeye oopde inheritance denir.
    -encapsulation nedir biliyormusun?
    – ewet classın içindeki bilgileri dışarı sızdırmamaktır.
    -abstract nedir?
    – içi boş class. inheritance ile sen doldurursun
    -gelecekteki kariyer amacın nedir?
    – ileride yazılım alanında bilinen yetenekli bir insan olmak yazılım dunyasına yeni şeyler katmak istiyorum

    :D:D

  2. M. Cihat Altuntaş Post author

    Evet acı ama gerçek değil mi? :) Buna benzer bir iş görüşmesi yaptımtım zamanında ki bu kişiler Java ile enterprise uygulama geliştiriyorlarmışşşşş. Object Oriented Design konuları ile ilgilendiğimi söylediğimde “o ne?” tarzı bir cevap almıştım.:)

  3. Pingback: Yazılım Mühendisliği » Tell Don’t Ask Principle

  4. Ömer

    Allah razı olsun paylaştığın değerli bilgiler için.

    Kedi-köpek örneklerini aşamıyoruz okulda.

    Tecrübeli biri demişsiniz ya…Kısa bir süre

    öyle bir şansım oldu.Başlarda bunalıma girdim

    açıkcası..Dedim boşa geçti seneler..Birlikte

    çalışma şansı bulduğum kişi “Custom Control” ile

    şov yapıyordu.Daha uzun sürseydi keşke..

Comments are closed.