Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş-4


Bu yazı daha önce yazdığım Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş-3 yazısının devamıdır. Önce onu okumanızı öneririm.

View at Medium.com

Bir önceki iki yazıda şu soruları sormuş ve kısmen cevap vermiştik:

  1. Eklemek istediğimiz başlık sözlükte yoksa ve çağırdıysak bu sorunu bildirim göstermeden nasıl hallederiz?
  2. Başlık zaten varsa ve değiştirmek istemiyorsak, aynı başlığa yeni bir açıklama değerini nasıl ekleriz?
  3. Bir başlığı silmek ya da düzenlemek istediğimizde ve başlıkta birden fazla açıklama varsa, tüm açıklamalara mı etki edeceğiz yoksa sadece birine mi?
  4. Bir başlığa, tarih bilgisini nasıl girebiliriz? Bu tarih bilgisine dayanarak nasıl sıralama işlemi yapabiliriz?
  5. Arama, filtreleme işlerini nasıl yapacağız?

Önce, bir önceki yazıda spagetti usulüyle bir takım değişiklikler yapmıştık. Bu değişiklikleri Dictionary.php dosyasındaki sınıfa taşıyarak işe başlayabiliriz.


Dictionary.php dosyamızın içine şu metodu ekleyelim:

public function getEntry(string $key): string
{
if (array_key_exists($key, $this->entries)) {
return $this->entries[$key];
}
}

2. soruyla devam edelim. Aynı başlığa birden fazla değer eklemek istediğimizde ne yapmamız gerek? Burada Dictionary sınıfımızın davranışını gözle görülür şekilde değiştirmemiz gerekecek. Yani, Dictionary sınıfı, artık kendisinden bir başlık talep ettiğimizde metin yani string değeri yerine bize bir dizi değeri döndürmeli.

Sınıfları görevlerine göre parçalamak


Dikkat: Dictionary sınıfının sorumlulukları artıyor! Sözlük yani Dictionary sınıfı sadece verilen başlıklara karşılık açıklamaları yerine getirmek sorumluluğuna sahipti. Şimdi bir sözlük girdisinin nasıl yönetileceğine de el atmaya başladı. Bu nedenle, sınıflarımızı temiz ve düzenli tutmak istiyorsak, tek sorumluluk yani single responsibility prensibine göre sınıfımızı parçalamamız gerekiyor. Henüz tasarım ve prototip aşamasında olduğumuzdan, sınıfımızın davranışını, arayüzünü ve kodlarını istediğimiz gibi değiştirebiliriz. Ancak örneğin milyonlarca kullanıcısı olan, koda kafamıza göre müdahele etmemizin kabusa yolaçacağı durumlar profesyonel hayatımızda zırt pırt karşımıza çıkacak. İkinci aklımızda tutmamız gerek prensip Open-Closed yani Açık-Kapalı prensibi. Bu prensibe göre,

Sınıflar değişime kapalı, gelişime açık olmalıdırlar.

Üstte bahsettiğim sorunu çözmenin, farklı yöntemleri mevcut ki bu yöntemleri kullanmamız sayesinde Amerikayı yeniden keşfetmemize veya tekerleği bir daha icat etmemize gerek kalmasın. Bu prensibi nasıl kullanacağımıza daha sonra detaylıca değineceğim. Şimdilik sınıfımızı parçalamakla işe başlayalım. Sözlük sınıfımızı parçalayıp yeni bir girdi sınıfı hazırlayacağız. Burada özellikle dikkat etmemiz gerek nokta, sınıfların birbirlerinden bağımsız, tek başına yaşayabilen canlılar gibi olmaları. Şimdi tekrar sınıflarımızın sorumluluklarını güncelleyelim.

Programımız lego gibi sökülüp takılabilen parçalardan oluşmalı

Sözlük sınıfının sorumlulukları

  1. Farklı başlıklara sahip olan sözlükler yaratmak, başlığı güncelleyip değiştirebilmek.
  2. Arama, sıralama, güncelleme, filtreleme işlerini yapmak.
  3. Sıralı olan nesne verisini, örneğin metin, word veya json formatında kullanıcıya göndermek.
  4. Bir girdiği listeden silmek, yeni bir girdiyi listeye eklemek. Dikkat, girdiyi güncellemek, sözlük sınıfını alakadar etmiyor. Aynı başlıkta hali hazırda başka bir girdi listede mevcutsa, hata vermek. Çünkü girdi başlıkları benzersiz olacak. Bazı sözlüklerde aynı başlıkla farklı girdiler eklenebiliyor. Ancak bizim sözlüğümüzde girdiler 1. açıklama 2. açıklama diye ilerleyecekler.

Girdi Örneği

Girdi sınıfının sorumlulukları

  1. Yeni bir başlık ve açıklama ile bir girdi yaratmak.
  2. Girdinin başlığını ve açıklamalarını değiştirmek.
  3. Girdiye yeni açıklama girmek.
  4. Girdiyi silmek. Silerken açıklamalar dizisini boşaltmak. Eğer girdinin tüm açıklamaları silindiyse, girdinin kendisini silmek.
  5. Sırası bilinen açıklamayı silmek, değiştirmek.


Tembel yazılımcılar için arayüz yani interface kavramı

Daha önce arayüz kavramından, otomobil örneği ile bahsetmiştik. Arayüz sınıfımızın nasıl kullanıldığını dünyaya tanıtan bir programlama yapısı. Arayüzler, içi boş metodların bir listesinden başka bir şey değil aslında. Arayüzlerin içinde metodun kodundan ziyade metodun imzasını, yani aldığı parametreleri, paramtere tipini, döndüreceği değerin tipini tanımlıyoruz.

Bizi sadece dışarıdaki butonlar fln ilgilendiriyor, bu butonlarla cihazı kullanıyoruz. İçindeki elektronik hedelerle alakamız yok.

Arayüz tanımlamak aynı zamanda, kodun nasıl çalışacağını yazmaya girişmeden önce bize genel olarak program yapısını tasarlama fırsatı veriyor. Peki PHP’de arayüz nasıl tanımlanıyor? Öncelikle arayüz yazarken arayüz adı ve sonun Interface yazmayı alışkanlık haline getirelim. Böyle yapmak zorunlu değeil ama şıklık, düzenlilik açısından şart. Bunun gibi iyi pratiklere baştan sahip olmaya çalışırsanız, daha sonra sorun yaşamazsınız. Şimdi ilk arayüzümüzü yazmaya başlayalım.

Girdi Arayüzü yani EntryInterface

<?php

namespace
MidoriKocak;


interface EntryInterface
{
function setKey(string $key);
function getKey(): string;
function setValues(array $values);
function getValues(): array;
function getValue(int $order): string;
function setValue(int $order, string $newValue);
function addValue(string $value);
function deleteValue(int $order);
}

Tıpkı sınıflarda olduğu gibi interface yani arayüzlerin de ait oldukları isim alanları yani namespaceler var. Dosyanın başına içinde bulunduğumuz namespace’yi belirttik. Aslında doğrudan Entry sınıfını yazabilirdim ama metodların içerisini doldurmaya üşendiğim için interface yazmayı tarcih ettim. Sınıfları parçalarken gaza gelip atomu parçalamaya kadar gidebiliriz ama başımıza büyük bela alırız.

O kadar çok berbat kod gördüm ki, artık dünyaya ben de böyle bakıyorum.

Einstein’in şöyle bir lafı var:

Everything should be made as simple as possible, but not simpler. Albert Einstein

Yani meali, “Herşey olabildiğince basit yapılmalıdır, ancak bundan daha basit olmamalıdır.” O yüzden şimdilik başta karar verdiğimiz görev ve sorumlulukların dışında nesneler oluşturmuyoruz ki proje bitsin.

Arayüzü satır satır okumaya devam edelim.

  1. setKey: metin olarak bir başlık alacak. Girdinin başlığını belirliycek.
  2. getKey: başlığı metin olarak döndürecek.
  3. setValues: girdi içindeki açıklama listesini doğrudan değiştirmemizi sağlayacak. Şimdi farkettiğim üzere şimdilik bu metoda ihtiyacımız yok. Basitlik, bilgi gizleme ve güvenlik açısından silebiliriz. Ne kadar az metod o kadar kolay kullanım çünkü.
  4. getValues: girdiye ait başlıkları doğrudan dizi olarak döndüren metod.
  5. getValue: değerine erişmek istediğimiz açıklamaya sırasını belirterek erişmemizi sağlayan metod.
  6. setValue: değerine değiştirmek istediğimiz açıklamaya sırasını belirterek değiştirmemizi sağlayan metod.
  7. addValue: Sıra belirtmeden, doğrudan açıklamalar dizisine açıklama eklememizi sağlayan metod. Kolay kullanım için.
  8. deleteValue: Sıra belirterek istediğimiz açıklama değerini silmemizi sağlayan metod.

Gördüğümüz gibi, elimizde bağımsız, başka bir sınıfla alakası olmayan, kendi başına bir program gibi kullanabileceğimiz bir sınıf arayüzü oluştu.

Sözlük arayüzü yani DictionaryInterface

Şimdi Sözlük sınıfına baştan yeni bir arayüz yazalım ve bu arayüz de girdileri yönetmek için bu girdi arayüzünü kullansın.

<?php

namespace
MidoriKocak;

interface DictionaryInterface
{
function setTitle(string $title);
function getTitle(): string;
function setEntries(array $array);
function getEntries(): array;
function addEntry(EntryInterface $entry);
function getEntry(string $key): EntryInterface;
function deleteEntry(string $key);
}

Bu arayüzü de satır satır inceleyelim.

  1. setTitle: Oluşturacağımız sözlüğün başlık değişkenini değiştirmemizi, metin tipinde bir parametre alarak sağlayan metod. (set metodlarının hiçbirşey döndürmediğine dikkat edin. Set metodlarında hata olup olmadığını nasıl anlayacağız peki? Buna da hata denetimi konusuna geldiğimizde detaylıca değineceğim.)
  2. getTitle: Başlık değişkenini metin olarak döndürmek zorunda olan metod.
  3. addEntry: Sözlüğümüze entry yani girdi sınıfından bir nesneyi eklememizi sağlar. Set yerine add yani ekle ifadesini kullandık ki, sınıfta birden fazla entry yani girdi tutulduğu metodun adından anlaşılsın.
  4. getEntry: (metin tipinde $key) degeri girerek basliga erismemizi saglar.
  5. setEntries: Bu da sözlük sınıfında verileri tuttuğumuz diziyi değiştirmemizi sağlayan metod. Kullanırken dikkatli olmalı ve diziyi direk entries yani girdiler değişkenine eklememeli, tek tek girdiler kurallara uyuyor mu kontrol ederek sağlam verileri diziye eklemeliyiz.
  6. getEntries: Varolan verileri dizi şeklinde döndüren metod. Girdi sınıfından nesneler içeren bir dizi döndürecek.
  7. deleteEntry: Sözlükten adını belirttiğimiz girdiyi silen metod. Eğer bir girdinin hiç açıklaması yoksa, bu başlık da otomatik olarak silinmeli. Ancak buna daha sonra dikkat edeceğiz.

Minik minik nesneler

Şimdilik bu kadar. Bir sonraki yazıda bu arayüzlerin içini nasıl dolduracağımıza ve kodu nasıl kullanıp test edeceğimize bakacağız.

Sevgiyle kalın.

Bir sonraki yazıya buradan ulaşabilirsiniz:

View at Medium.com


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com

“NO” filminin gerçekleri: Türkiye’de “Hayır” nasıl kazanır?

Bu yazı http://iscicephesi.net/2017/01/no-filminin-yalanlari-silide-hayir-nasil-kazandi/ adresinde yazılmış olan “NO” filminin yalanları: Şili’de “Hayır” nasıl kazandı? başlıklı yazıya cevaben yazılmıştır.


İktidara geldiği 2002 yılından beri AK Parti’sinin yaptığı tek bir şey var. Kazanmak. Nedenini merak edenlere kısaca şu kitabı öneririm: http://www.idefix.com/Kitap/AKP-Neden-Kazanir-CHP-Neden-Kaybeder/Ates-Ilyas-Bassoy/Arastirma-Tarih/Politika-Arastirma/Turkiye-Politika-/urunno=0000000381027 Kitaptan şöyle bi alıntıyla yazıma başlamak istiyorum:

10. Yıl Marşı Atatürk iktidarının en güçlü olduğu dönemde; 1933’te yazıldı. Marştaki “Demir ağlarla ördük, ana yurdu dört baştan” sözünden, AKP dışında kimsenin bir ders çıkarmaması tuhaf değil mi? Bir marşın içine bile “somut icraat” ekleme ihtiyacı hisseden Atatürk’ün iletişim tarzını kim örnek alıyor? “Göktürk Uydumuz Uzayda” diye ilan veren AKP mi? Bu mevzulara hiç takılmayan CHP mi?

2002 yılından beri CHP’nin, HDP’nin, binde 0’lık komünist partilerin ve bilimum solcuların başarıyla yaptığı tek şey ise şu: Kaybetmek. Ve Konuşmak. Hep kaybettiği aynı başarısız stratejiyi ısrarla takip etmeye devam etmek için, önce etrafındakileri sonra kendini kandırmak için konuşmak.

Akp bu zamana kadar ekseriyetle hep sahte bir gelecek ve makyajlanmış projeler, olumlu tonu olan kampanyalar yaparak başarılı oldu. Bunun karşısında ana muhalefet partisi CHP’nin kampanyaları, genel başkanın konuşmaları hep AKP’nin führeri, yaptığı şeyler, güncel durumun kötülü üzerine kuruluydu. Sürekli olumsuz bir dil kullanarak, örneğin şeriat gelecek diye, laik kesimlerin kendisine oy vermesini bekledi ve süreki başarısız oldu. Bu konuda tabii ki kampanyaları veya propaganda yetenekleri sadece belirli değil. Çürümüş kadrosu, yalakalıkla çalışan hiyerarşisi, çağdışı parti yapısı, proje üretememesi, halkın gerçeklerinden habersiz olması, toplumun geniş kesimlerine ve değerlerine uzak olması bu başarısızlığın tabii ki diğer nedenlerinden. Uzun uzadıya bunları tartışmak istemiyorum. Daha önce çeşitli yazılarımda ve hatta CHP’nin genel başkana yazdığım mektupta bütün bu konulardan uzun uzadıya bahsetmiştim. Hatta kendisi telefonla bizzat arayıp İstanbul İl Başkanlığında görevlendirmişti. Zamanı geldiğinde bu konulardan da başka bir yazıda bahsederim. Ancak bu yazıda amacım başta linkini verdiğim yazıya cevap vermek.


Bilmeyenler için kısaca açıklamak gerekirse No! filmi Şili’de diktatörün devrilmesini sağlayan referandum’da reklam kampanyasında olumlu dil kullanılması ile referandumun kazanıldığını söyleyen bir film.

“NO” filminin yalanları: Şili’de “Hayır” nasıl kazandı? başlıklı yazı, filmin ana fikri olan “solcular kampanyalarında olumlu bir dil kullanmalılar” argümanına karşı bir alternatif göstermiyor. Bunun yerine filme “yalancı”, “basit”, “yüzeysel”, alıntı yaptığı yazarı ve filmin yönetmenini “burjuva” olarak adlandırmaktan başka, şu yöntem doğru bir kampanya yöntemidir diye bir argüman sunmuyor.


Yazının ilk yapısal çarpıklığı ilgisiz kavramları sanki ilgiliymiş gibi göstermesi. Yazar ve yönetmenin geldiği toplumsal pozisyonun burjuva sınıfı ve zengin bir aileden geliyor olmaları onların görüşlerine güvenmemizi engelleyecekse Karl Marx ve Friedrich Engel’si komple reddedebiliriz. Çünkü iki duayen de burjuva sınıfının içine doğan ve zengin ailelerden gelen kişiler. Dolayısıyle yazıya göre komple sosyalizmi de reddedebiliriz. Çünkü mesela Heraclitos’dan beri hep zenginler katkı yapmış.

Yazı ayrıca kurguya gerçeği birbirine karıştırıyor. Film tabii ki gerçekleri basitçe ve biraz değiştirerek anlatacak. Sonuçta kitle filmi. Yoksa ya belgesel ya da 450 sayfalık sosyolojik sınıf analizi olurdu. Alın size bir filmi eleştirmenin en hatalı yolu.

Yazı havalı görünmek adına kişi başına düşen televizyon sayısından bahsetmiş ve kimsenin televizyon izlemediğini söylemiş. Anne ve babalarımızdan bildiğimiz en basit konu şu: Televizyon ve video yayını eskiden bu kadar yaygın değilken bütün köy, bütün ilçe televizyonu olan eve toplanıp önemli programları ve haberleri izlerler. Hatta Vizontele filmi bu konuyu işler.


Bu yüzden yazının değindiği istatistik biraz kofti bi istatistik olmuş.

Türkiye’de olumlu kampanya yapmanın sol için başarılı olduğu ilk durum olan Antalya seçimlerini anlatan AKP’neden kazanır, CHP neden kaybeder adlı kitap, yine neden olumlu kampanya yapmanın gerekli olduğunu ezici bir şekilde ispatlıyor. Şurada kitap ile ilgili diğer bir yazıya bakabilirsiniz: http://www.kitapincelemesi.com/akp-neden-kazanir-chp-neden-kaybeder-ates-ilyas-bassoy


Gelelim yazının diğer gerçekle alakasızlıklarına. Eğitim ve gelir seviyesi azaldıkça AKP oyları artıyor. Toplumunun %45’i ortaokul, %42’si lise mezunu olan Türkiye’de 12 milyon küsür işçinin %12’si sendikalı. AK Partisi Sol partilere oy vermesi gereken işçilerin %40’ından, ev kadınlarının %46’sından, işsizlerin %39’undan oy alıyor. Sadece zenginlerin hakkını savunan, işçileri, fakirleri ezen, mahveden AKP yerine, onların hakkını savunan sol partilere solculara oy vermeleri gerekmez miydi? Vermiyorlar işte. Bu insanlar zaten zor ve sıkıntılı olan hayatlarını, kapkara kampanyalarla daha da karartmak istemiyorlar. Üstelik AKP saha çalışması yapan parti. Ev ev, kapı kapı dolaşan, şahısların hayatına dokunan hizmetler sağlayan tek parti. Örneğin CHP’ye önerdiğim, ve CHP’nin yüzüne gözüne bulaştırdığı Halk Dershaneleri projesi vardı. Gençlik kolları üyesi üniversite öğrencileri, gidip dar gelirlileri ailelere sahip öğrencilere özel ders versin demiştim. CHP yapamadı. Tarikatlar yıllardır yapıyor.

Alakasız bir örnek vermek istiyorum. İster okumamış, isterse de doçent dahi olsa, sevgilisinden, kocasından şiddet gören kadınlar var. Bu kadınlara, “Neden ayrılmıyorsun, bak seni dövüyor, ayrılsana, yaptığın yanlış” dediğinizde, ayrımsız neredeyse hepsi “Seviyorum, aşığım” diye cevap veriyorlar. Sen üst perdeden yaptığın yanlış demek yerine, o kadına psikolojik destek, iş imkanı, ekonomik bağımsızlık, sığınma evi, can güvenliği sağlamazsan, o kadına ne kadar üst perdeden mantık dersi verirsen ver, o kadın doğruyu yapmayacaktır. Üstelik kendi gerçeklerini görmezden gelip, hariçten gazel okuduğun için de hem psikolojisi daha da bozulacak hem de sana daha çok tepki duyacaktır. O dayakçı sevgili veya koca, şiddet de uygulasa, yalan da olsa, yanılsama içinde yüzen zihninde güvenlik, koruma ve “istikrar” demek çünkü. O kadına, “hadi ayrıl” demek yerine yukarıda saydığım imkanları ya da en azından o imkanın yoksa dahi duygularını anladığını göstermekle adım atmalısın. Günümüz Türkiye seçmeni de bu şiddet gören kadın olgusundan farklı değil.

Hepimiz adana aladağ’da olan yurt faciasına üzüldük. Ancak tarikatlar gidip oraya yurt açabiliyor ve insanlardan oy alabiliyor. Aşağıda Aladağ 1 kasım seçim sonuçları var:


AK Partisi %57 oy almış. Toplamd faşist partilerin oy oranı %84. Burada solcular adına bir başarısızlık yok mu? Çok merak ediyorum, çay içip, devrim teorileri tartışmak yerine, yazının yazarı Adana Aladağ ayarında bir ilçede saha çalışması yapmış mı? İşçi direnişlerine, grevlerine ziyaretlerde bulunmuş mu? Kaç sendikasız işçiyi sendikalı yapmış? İşçilere kaç adet seminer ve konferans vermiş? Sıfırdan fazla olduğunu sanmıyorum.

Yazıda duvar resimlerine referans verilmiş. Sanki şilide duvar resimleriyle referandum kazanılmış gibi. Yazının yazarı acaba hayatında resim çizmiş mi? Ait olduğu bilmemne fraksiyonu işçiler için resim sergisi, sanat atolyeleri yapmış mı? Hiç sanmıyorum.


Solcular olarak hastalığımız, boş boş konuşmak, üst perdeden eleştirmek, özeleştiri vermememek ve sürekli kaybetmek. Eğer proje sunamazsak, insanların hayatına dokunamazsak, onlarla tanışmazsak, işçilerin evlerine gitmezsek, elle tutulur işler yapmazsak, kendimizi anlatmazsak, bunları zaten hali hazırda yapan faşistler, tarikatlar, dinciler ve yobazlar, yani sonuç olarak AK Partisi kazanacak. Ama olumlu kampanya yaparsak, çay içmeyi bırakıp, o çamurun içinde bütün gün çalışan, ter kokan işçilerin, evine iş yerine gidip onlara üstten bakmak, aşağılamak veya küçümsemek yerine, onlarla dürüstçe arkadaş olursak, BİZ KAZANACAĞIZ!

Kaynaklar

  1. http://m.bianet.org/bianet/siyaset/139325-akp-oylari-nereden-geliyor
  2. http://www.konda.com.tr/tr/raporlar/KONDA_30Mart2014_YerelSecimAnalizi.pdf
  3. http://www.ermenihaber.am/tr/news/2015/07/02/T%C3%9C%C4%B0K-T%C3%BCrkiye%E2%80%99de-2-66-milyon-ki%C5%9Fi-okuma-yazma-bilmiyor/60948

Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com

Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş-3

Bu yazı daha önce yazdığım Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş-2 yazısının devamıdır. Önce onu okumanızı öneririm.

View at Medium.com

Nasıl kullanacağımızı şekliyle anlayan bir nesne

Nesneyi Kullanmak ve Arayüz Kavramı

Daha önce information hiding, yani bilgi gizleme kavramından bahsederken şöyle demiştik:

araba kullanırken, motorun, katalitik konvertörün, alternatörün o anda ne yaptığı ile ilgilenmiyoruz. Araç kullanıcısı olarak bizim amacımız bir yerden bir yere gitmek, ve bunu aracın direksiyonunu, vitesini, pedallarını vb. kullanarak gerçekleştiriyoruz.

Eğer araba kullanmayı biliyorsak, her türlü arabayı kullanabiliriz. Çünkü otomobiller üretilirken belirli standartlara uyularak üretilmekte. Çok fütüristik değilse, bir aracın, direksiyonunun, vitesliyse debriyajının gaz pedalının, sinyal kolunun vb. olduğunu önceden tahmin ediyoruz, çünkü daha önce sürücü kursunda öğrendiğimiz ve hayatımızda gördüğümüz tüm otomobillerden edindiğimiz tecrübe bilgisiyle böyle bir beklenti oluşturduk.

Bu ne ki şimdi?

Yani mesela bir otomobilde, vites sağ alt köşe yerine tavandaysa şaşırıp kalırız, ya da İngiltere’deysek bindiğimiz bir arabada direksiyonun solda değil sağda olması, önce bir alışma ve eğitim süresi gerektirir. (Ki İngiltere’de bu yüzden kiraladığım arabanın dikiz aynasını kırmışlığım var. Neyse ki kiralarken ek sigorta almıştım)

Ergonomi

Örneğin binlerce yıldır oturmuş çatal kaşık tasarımına baktığımızda, şeklinin insan eline oturacak şekilde tasarlandığını görürüz. Bu sayede ne işe yaradığını ve nasıl kullanılacağını bilmesek de, kaşığı sapından tutup, ucundaki çukurla bişiler yapabileceğimiz deneyerek tahmin ederiz. Bu sayede bebekler çatal kaşık kullanmayı kolayca öğrenebilirler. Burada kaşığın görevi, onun şeklini belirliyor. Kullanılan nesnelerin insanın verimli ve sağlıklı bir şekilde kullanabileceği şekilde üretilmesine, genel olarak ergonomi deniyor. Biz de tasarlayacağımız yazılımlarda insanların bu beklentilerine göre hareket edersek, insanları sıkıntıya sokan, delirten ve mutsuz eden yazılımlar yerine, onların sağlıklı bir şekilde kolayca kullanıp anlayabileceği şeyler üretmiş oluruz. Kaynak 1 Kaynak 2

Arayüz

Otomobillerdeki, otomobili rahatça kullanmamızı sağlayan bu yapıya arayüz deniyor. İşte tüm otomobillerde standart olan örneğin vites, direksiyon gibi yapıların standart büyüklükte olması, bu standart arayüzün ortak bir şekilde tüm otomobiller tarafından paylaşılmasından kaynaklanıyor. Ayrıca biz otomobili kullanırken, katalitik konvertörün o anki sıcaklığını sürekli düzenlemek ve gözetmek zorunda değiliz. İşte Arayüz aynı zamanda bizim için gözümüzden gereksiz detayları kaldırıyor. Sınıfımızın yapacaklarına karar verdiğimiz ve tasarımını yaparken yazdığımız kullanıcı tarafından public metodların kümesine Arayüz (interface), sınıf içindeki bir metodun alacağı parametrelerin sayısına, veri tiplerine ve döndürmesi gereken değerin veri tipine de Metodun İmzası (signature) deniyor. Arayüz kavramının detaylarına birden fazla sınıf ortak davranışı paylaşmak durumunda olduğunda tekrar detaylı olarak geri döneceğiz

Sınıfımızı yazmaya devam edelim

Önceki yazıda yazdığımız Dictionary Sınıfının başlık oluşturma ve değiştirme, nesneyi adam gibi yaratma işlerini güzelce halletmiştik. Şimdi nesnenin asıl görevlerini gerçekleştiren kodları yazmamız gerekiyor. Bunlar şu işlemlerden oluşuyordu;

  1. Sözlüğe bir başlık girmek.
  2. Başlık içeriğini güncellemek.
  3. Başlığı silmek
  4. Arama, sıralama ve filtreleme yapabilmek
  5. Veriyi bir dosyaya kaydedip yeniden kullanabilmek.

Sırayla ilerleyeceğiz. Şimdilik konunun basit anlaşılması için, başlıkları Dictionary nesnesinde bulunan $entries adlı diziye başlık adını anahtar olarak kullanarak ekleyeceğiz. Başımıza bela olacak sorunlara önceden önlem olmaya çalışacağız ki, daha sonra ağlamayalım.

Dizi üzerinde belalı işlemler

Yımırta

PHP’de array yani diziler, veriler üzerinde işlemler yapmamızı sağlayan güzel yapılardır. Şimdi henüz sınıfımıza eklemeden bir dizi üzerinde nasıl işlem yapabileceğimize bakalım. Proje dizinimiz içerisinde array.php isminde bir dosya oluşturup tarayıcı üzerinden çalıştıralım.

<?php

$entries = [];
$entries['nesne'] = 'Sınıf Örneği';
echo $entries['nesne'];

Tarayıcıyı açtığımızda şöyle bir sonuç göreceğiz:

Dizide işlem

Hazırda bilgisayarınızda PHP yorumlayıcısı yoksa, bu minik koda şuradan da erişebilirsiniz: https://3v4l.org/CPsXm Bu sitede bilgisayarını mahvetmeden, herhangi bir yerden istediğiniz PHP kodunu test edebilirsiniz. Öneririm.


Burada diziye bir anahtar atadık ve o anahtar içindeki değeri çağırdık. Peki dizide olmayan bir değeri çağırırsak ne olur? Görelim:

Kodu şu şekilde değiştirelim:

<?php

$entries = [];
$entries['nesne'] = 'Sınıf Örneği';
echo $entries['şey'];

Şöyle bir görüntüyle karşılaşacağız.

E yok ki.

Notice yani bildirim ifadesi burda kodumuzun çalışmasının durmadığını ama ileride başımıza belalar açılacağını bildiriyor.

Aklımıza şöyle sorular gelmesi gerekiyor:

  1. Eklemek istediğimiz başlık sözlükte yoksa ve çağırdıysak bu sorunu bildirim göstermeden nasıl hallederiz?
  2. Başlık zaten varsa ve değiştirmek istemiyorsak, aynı başlığa yeni bir açıklama değerini nasıl ekleriz?
  3. Bir başlığı silmek ya da düzenlemek istediğimizde ve başlıkta birden fazla açıklama varsa, tüm açıklamalara mı etki edeceğiz yoksa sadece birine mi?
  4. Bir başlığa, tarih bilgisini nasıl girebiliriz? Bu tarih bilgisine dayanarak nasıl sıralama işlemi yapabiliriz?
  5. Arama, filtreleme işlerini nasıl yapacağız?

Gördüğümüz gibi iş şimdiden boka sarmaya başladı. Sorunu spagetti bir fonksiyonla çözmeye çalışalım:

<?php

function
getEntry(string $title){
if(!isset($entries[$title])){
return $entries[$title];
}
}

$entries = [];
$entries['nesne'] = 'Sınıf Örneği';

echo getEntry('nesne')."<br>";

$entries['şey'] = 'İsimsiz nesne';

echo getEntry('şey')."<br>";

print_r($entries);

$entries['şey'] = null;

echo getEntry('şey')."<br>";

print_r($entries);

getEntry metodundan sonraki “<br>” ifadesine takılmayın. Fonksiyondan dönen metin değeri ile “<br>” yani alt satır etiketini birleştirdik. Şöyle hatalarla karşılaşacağız.


Fonksiyonumuz çalışmıyor çünkü global olarak tanımlanmış $entries adlı değişkene erişemiyor. PHP’de ve birçok C benzeri dilde {} süslü parantezlerle ayrılmış kodlara blok deniyor, ve bloklardaki kodlar, sadece bu blok içinde tanımlanmış değerlere erişebiliyor. (Kapsam yani Scope kavramı) Bunu geçici olarak çözmenin yolu var ama kötü pratik olduğundan ve tüm güvenlik önlemlerini mahvettiğinden anlatmıyorum bile. İşi yanlış yapmayı değil doğru yapmayı öğrenmemiz gerek.

Bunu geçici olarak spagetti kodunda şu şekilde çözebiliriz. getEntry metodunda üzerinde işlem yapacağımız diziyi parametre olarak gireceğiz.

<?php

function
getEntry(string $title, array $array){
if(isset($array[$title])){
return $title.' ifadesinin değeri: '.$array[$title].'<br>';
}
}

$entries = [];
$entries['nesne'] = 'Sınıf Örneği';

echo getEntry('nesne', $entries);

$entries['şey'] = 'İsimsiz nesne';

echo getEntry('şey', $entries);

print_r($entries);

$entries['şey'] = null;

echo getEntry('şey', $entries);

print_r($entries);

Satır satır kodu inceleyelim.

  1. array $array diyerek, fonksiyonumuzun kapsam yanı scope’sinin içine işlem yapacağmız diziyi kopyaladık. Eğer kopyalamak yerine diziye doğrudan erişmek ve değişiklik yapmak isteseydik &$array dememiz gerekiyordu. Buna Call by Reference yani Referans ile çağırma deniyor. Şimdilik bunun detayına girmeyeceğim.
  2. Fonskiyonumuzun değer döndürüp döndürmediğini anlamak için dönen değeri $title.’ ifadesinin değeri: ‘.$array[$title].’<br>’; olarak değiştirdik.
  3. Fonksiyonu her çağırdığımızda birleştirdiğimi ‘<br>’ ifadesini direk fonskiyonun içine yazdık ve kod tekrarını önledik.
  4. fonksiyon içinde isset kullanarak değerin var olup olmadığını kontrol ettik, ya da kontrol ettiğimizi sandık.
  5. yaptığımız her işlemden sonra dizimizin o anki durumunu print_r fonksiyonu ile ekrana bastık.
  6. $entries[‘şey’] = null; ifadesine kadar herşey normal. Ama bu ifadede fonskiyonumuz saçmalayacak. Görelim:


Null belası

bela

İlk iki durumda, getEntry fonskiyonu sorunsuz çalıştı. Ama fonksiyonda değerin olup olmadığını isset ile kontrol ettiğimiz için, dizide şey değeri var olduğu halde, şey ifadesinin değeri: yazmadı. Halbuki print_r ile dizinin içindekileri görüntülediğimizde şey anahtarının dizide halen var olduğunu görüyoruz. Peki bunu nasıl düzeltebiliriz? PHP’de önceden tanımlı olan array_key_exists fonksiyonunu kullanarak. Bu sayede örneğin “şey” anahtarı ibnelik olsun diye null değerine bilerek eşitlense bile metodumuz o değerin halen orda olduğunu anlayacak:

<?php

function
getEntry(string $title, array $array)
{
if (array_key_exists($title, $array)) {
return $title . ' ifadesinin değeri: ' . $array[$title] . '<br>';
}
}

$entries = [];
$entries['nesne'] = 'Sınıf Örneği';

echo getEntry('nesne', $entries);

$entries['şey'] = 'İsimsiz nesne';

echo getEntry('şey', $entries);

print_r($entries);

echo "<br>";

$entries['şey'] = null;

echo getEntry('şey', $entries);

print_r($entries);

Çalıştıralım ve görelim:


Yaptığımız değişiklik sayesinde, dizi içinde bir değer null değerine eşdeğer olsa bile, fonksiyonumuz bunu algılıyor ve dizi elemanını anahtarıyla basabiliyor. Burada anlamanızı istediğim şey, null’a güvenmeyin, hatta kodunuzda null ne kadar az ise o kadar temiz demektir. Null belası için şu kaynağı okumanızı öneririm.

Diziden veriyi silmek

dizi hedesi

Buraya kadar tamam. Peki diziden veriyi silmek istediğimizde ne yapacağız? Ve getEntry metodumuz nasıl saçmalamayacak? unset fonskiyonunu kullanacağız. Örneğimize devam edelim, kodumuzun sonuna şu satırları ekleyelim :

echo "<br>";

unset($entries['şey']);

echo getEntry('şey', $entries);

print_r($entries);

Çalıştırdığımızda dizi içindeki anahtarın temiz bir şekilde silindiğini görüyoruz.


Şöyle bir sorun var yalnız. getEntry() fonksiyonunu çağırdığımızda değerin var olup olmadığından haberimiz olmuyor. Eğer değer varsa yazıyı döndürüyor, değer yoksa, hiç bir sonuç elde edemiyoruz. Bu bir sorun mu? Bence evet, çünkü programımızın doğru çalışıp çalışmadığını, kod üzerinde hata yapıp yapmadığımızı anlayamıyoruz. Bu sorunu if bloğundan sonra else bloğu ekleyerek çözebiliriz. Ama pek şık değil. Herhangi bir hatayı önceden görmemizi ve ona göre önlem almamızı sağlayacak olan try-catch blokları var. Ama bu konuyu zamanı geldiğinde detaylıca anlatacağım.

Şu soruları sormuştuk:

  1. Eklemek istediğimiz başlık sözlükte yoksa ve çağırdıysak bu sorunu bildirim göstermeden nasıl hallederiz?
  2. Başlık zaten varsa ve değiştirmek istemiyorsak, aynı başlığa yeni bir açıklama değerini nasıl ekleriz?
  3. Bir başlığı silmek ya da düzenlemek istediğimizde ve başlıkta birden fazla açıklama varsa, tüm açıklamalara mı etki edeceğiz yoksa sadece birine mi?
  4. Bir başlığa, tarih bilgisini nasıl girebiliriz? Bu tarih bilgisine dayanarak nasıl sıralama işlemi yapabiliriz?
  5. Arama, filtreleme işlerini nasıl yapacağız?

Bunlardan ilk üç soruya kısmen cevap verdik. Bir sonraki yazıda kalan soruları aklımızda tutarak Dictionary.php dosyasındaki sınıfa geri döneceğiz..

Bir sonraki yazı şurda:

View at Medium.com


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com

Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş-2

Sınıf

Bu yazı daha önce yazdığım Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş yazısının devamıdır. Önce onu okumanızı öneririm.

View at Medium.com

Önceki yazıda, nesne yönelimli programlama mantığını anlamaya çalıştık. Özetlemek gerekirse kabaca şunları anlatmıştım;

  1. Nesne kelimesinin ne anlama geldiğini
  2. Felsefi, fiziksel, psikolojik ve dilbilimsel yönleri de olduğunu
  3. Programlamada nesne kavramının ne ifade ettiğini
  4. Neden nesne yönelimli programlama öğrenmemiz gerektiğini
  5. Nesnelerin birbirleriyle ilişkilerini

Şimdi kavramları anlatmaya ve örnekler vermeye devam edeceğim. Tüm yazılarımda olduğu gibi kavramları kuru kuruya ve salakça tanımlar vermek yerine, işe yarar, elle tutulur örneklerle mantığı okuyucunun kafasında oturtmaya çalışıyorum. Bazen yazılarımın dili laubali olabilir, ama yazının eğlenceli ve anlaşılabilir olması, bence ciddi olmasından daha avantajlı.

Ben çeşmeden kana kana su içmeyi çok severim mesela.

Hayatta herşeyi yaparken bir amacımız var, örneğin su içerken amacımız susuzluk hissimizi gidermek. Bu işi yaparken de belli başlı yöntemler kullanabiliriz. Örneğin;

  1. Bardağa çeşmeden su doldurabiliriz.
  2. Bakkaldan 0,5 litrelik su alabiliriz.
  3. Çeşmeye ağzımızı dayayıp lıkır lıkır buz gibi suyu içebiliriz.

Yani belli bir amacı gerçekleştirmek için, farklı yöntemler uygulayabiliriz. Bu işi yaparken, ilk durumda susuzluk hissimiz, atıyorum %100 iken, işlemi gerçekleştirdikten sonra susuzluk hissimiz %0’a iner. Bilgisayar programları yazarken de, yazdığımız programların, belli kullanıcılar için, belli amaçları gerçekleştirmesini isteriz. İşte, programlarımızı, nesnelerimiz yazarken yapmamız gereken ilk iş, amacımızın ne olduğuna karar vermek. İkincisi de bu programı kimin kullanacağı. Şu anda düşünme tasarlama aşamasındayız. Yani özetle, belli kullanıcılar var ve bu kullanıcıların gerçekleştirmek istediği şeyler, ulaşmak istedikleri sonuçlar var.

Üzümünü ye, bağını sorma (Information Hiding)

Çeşme örneğinde, oturtmamız gereken en önemli mantık şu: Suyu içen kişi suyun dağdan mı, pınardan mı, nehirden mi geldiğini önemsemez. Onun için önemli olan, suyun temizliği, soğukluğu gibi kendini doğrudan ilgilendiren konulardır. Kitaplarda çok sık kullanılan bir diğer örnek, araba kullanırken, motorun, katalitik konvertörün, alternatörün o anda ne yaptığı ile ilgilenmiyoruz. Araç kullanıcısı olarak bizim amacımız bir yerden bir yere gitmek, ve bunu aracın direksiyonunu, vitesini, pedallarını vb. kullanarak gerçekleştiriyoruz. İşte bu “üzümünü ye, bağını sorma” olayına nesne yönelimli programlamada “bilgi gizleme” veya ingilizcesiyle “information hiding” deniyor.

Dolayısıyla bir programı yazmaya başlarken önce programın amacına karar vereceğiz. İşi nasıl yapacağına sonra karar vereceğiz.

Genel olarak programlar

Günümüzde genel olarak yazılımlara baktığımızda, basitçe hepsinin listelerden oluştuğunu görüyoruz. Programlar, bu listelere yeni kayıt eklemek, kayıt güncellemek, silmek ve görüntüleme işlemleri yapıyorlar. En basitinden bir yapılacaklar listesi uygulamasına yapacağımız işleri, bir bloga uygulamasına makalelerimizi kaydederken, Youtube videoları, instagram resimleri, twitter 140 karakterlik mesajları ve facebook’da saçma sapan şeyleri kaydetmemizi sağlıyor. Yani bu programların temel olarak mantığı aynı. Bu temel amaç dışındaki herşey ekstra. Bu program örneğine CRUD, yani create (yarat), read (oku), update (güncelle), delete (sil) deniyor. Ayrıca bu programlarda, kayıtlar üzerinde arama, filtreleme, sıralama işlemleri yapabiliyoruz. Mesela GittiGidiyor, HepsiBurada veya Sahibinden gibi sitelerde, aradığımız ürünleri fiyatlarına ya da eklenme tarihlerine göre sıralayabiliyoruz.

Sözlük Uygulaması

Sözlük derken, ekşisözlük değil tabii. Yeni yazdığım Nesne Yönelimli Programlama kitabı için bir sözlük uygulamasına ihtiyacım var. Girdilerin eklenebildiği, aranabildiği, farklı farklı sözlükler oluşturabileceğim, basit bir uygulama yapmak istiyorum ki, kitabımın sonunda bu sözlüğe yer verebileyim. Bu örnek uygulama da CRUD mantığı ile çalışacak. Şimdi tek tek programla yapmak istediğim şeylere bakalım:

  1. Bir kullanıcı olarak farklı farklı sözlükler yaratmak istiyorum. Bu sözlükleri açıp, içindeki girdileri görmek istiyorum.
  2. Sözlüğe yeni bir girdi, yani başlık ve açıklama girmek istiyorum. (Şimdilik her başlıkta sadece tek bir açıklama metin alanı olacak.) (Create)
  3. Başlığı girdiğimde, açıklamayı görmek istiyorum. (Read)
  4. Bu girdileri listelemek istiyorum. (Her sayfada 10’ar tane olacak şekilde. Buna pagination deniyor.) Ayrıca listeyi istersem sıralamak istiyorum. Örneğin alfabetik olarak ya da ekleme tarihine göre. (Sort)
  5. Girdiyi hatalı girdiysem, güncellemek ya da silmek istiyorum. (Update, Delete)
  6. Arama yapmak istiyorum. (Hem başlıklarda hem de açıklama metninde) (Search)
  7. Sözlüğün Word dosyası olarak çıktısını almak istiyorum.

EkşiSözlükteki gibi farklı kullanıcıların benim sözlüğüme eklenti yapmalarını veya sözlüğümü görmelerini istemiyorum, ama bu sonraki konu. Şimdilik en temel ihtiyaçlara odaklanmak en doğrusu. Mesela ekşiSözlükteki gibi bir başlığa birden fazla girdi eklemek, birden fazla kullanıcının sözlüklere ekleme yapabilmesini sağlamak, girdileri sosyal medyada paylaşmak, etiket girmek veya bkz. ile bir başlıktan diğer bir başlığa link oluşturmak gibi özellikleri sonradan da geliştirebiliriz. Bunları işe başlar başlamaz, aa ilerde kullanılır diye yazmaya kalkarsak ayvayı yeriz ki bu da yazılımcıların yaptığı en büyük hatalardan biridir. (Buna featuritis veya feature creep deniyor.)

İstediklerimi, yani ihtiyaçlarımı (requirements) listeledikten sonra, yazacağım programın hangi sınıflardan oluşacağına karar vermeye geldi sıra. Bunu yaparken İhtiyaçlardaki isimlere bakmak, sınıf tasarımı yapmada verimli yöntemlerden bir tanesi. İsimlere tek tek bakalım:

  1. Sözlük (Yani bir başlık metni, mesela Felsefe Sözlüğü ya da Nesne Yönelimli Programlama sözlüğü gibi.)
  2. Başlık (Her başlığın şimdilik tek bir açıklama metni olacak)
  3. Kullanıcı (Yani ben.)

Peki bu nesneleri nasıl kullanacağım? Buna da tek tek karar vermek gerekiyor. Nesneleri iyi ayarlamanın en iyi yollarından biri, onların sorumluluklarını önceden iyi belirlemektir. Ayrıca aklımızda tutmamız gereken önemli bir konu da, her nesnenin bir adet sorumluluğa sahip olmasıdır ki buna Tek Sorumluluk Prensibi yani (Single Responsibility Principle) deniyor. Yani yazacağımız nesne tek bir işi düzgünce yapan, bağımsız bir program gibi olacak. İstersek bu nesneyi programdan koparıp başka bir programda kullanabileceğiz.

Nesne tek başına her boku yapmaya çalışmıycak arkadaşlar. Yani sözlük nesnesi, kullanıcıları yönetmiycek, şifrelerle ilgilenmiycek, kendi başına temiz temiz bağımsız şekilde çalışacak. Eğer bir nesne her boku tek başına yapıyorsa bu kötü tasarımdır ve buna Tanrı Nesnesi (God Object) denir, test edilmesi zordur, sırt pırt hata çıkarır. Uzak durun.

Yeri geldiğinde bu prensiplere de ayrıntısıyla değineceğim. Şurada konuyla ilgili güzel bir kaynak mevcut.

Beklentiler

Sınıflarımızdan beklentilerimizi başta belirlemek uygulama tasarımımızın en önemli kısmı. Yani Sözlük sınıfı ile ne yapacağız, nasıl kullanacağız, sözlük sınıfı bize hangi hizmetleri sunacak ona karar verdiğimiz anda, işimiz %90 oranında kolaylaşacak. Sözlük sınıfı ile yapabileceğimiz şeyler şimdilik şunlar olsun:

  1. Sözlük bir isimle oluşturmak. (construct)
  2. Bu adı değiştirmek yani güncellemek. (setTitle)
  3. Sözlüğe girdi eklemek. (addEntry)
  4. Tüm başlıkları görüntülemek. (getEntries)
  5. Başlıklar içinde arama yapmak. (search)
  6. Dönen başlıkları ada göre veya eklenme tarihine göre sıralamak. (sort)

Şimdilik basitçe sözlük sınıfı ile yapabileceğimiz işlemlerin bunlar olduğuna karar verdik.

Burada foksiyonlar, koşullar, döngüler değişkenler gibi temel programlama bilginiz olduğunu farzediyorum. Eğer bu konularda bilginiz yoksa, kitapçılardan Projelerle PHP 7 adlı kitabımı satın alabilirsiniz. Satın alma linki de şu: www.seckin.com.tr/kitap/911934237

Kodları yazarken ingilizce kullanmaya özen gösteriyorum. Özellikle değişken isimlerinizin, yorumlarınızın ingilizce olması önemli. İngilizce dünyada evrensel bir dil olduğundan ve genellikle açık kaynaklı yazılımlar geliştirdiğimden, kodlarımın Mozambik’te veya Çin’de öğrenmeye istekli bir kişi tarafından okunabiliyor olması önemli. İngilizce’nin önemi konusunda ayrı bir makale de yazacağım.

Önceden kurduğunuzu tahmin ettiğim webserver’in içinde dictionary isimli bir dizin oluşturalım. Bu dizinde Dictionary.php isimli bir dosya açalım (İlk harf özellikle büyük olsun ki dosyanın bir sınıf içerdiğini anlayalım) ve sınıfımızı içinde metodlar olmadan yazmaya başlayalım:

<?php

namespace
MidoriKocak;


class Dictionary
{
private $title;
private $entries;
}

Satır satır ilerleyelim. Namespace dediğimiz kavram, yazdığımız sınıfların, aynı isimdeki diğer sınıflarla karışmamasını sağlayan, PHP 5.3 versiyonunda gelen bir icat. Ben örneklerimde kendi ismimi kullanıyorum, fakat bu konuda farklı doğru pratikler mevcut. Bunları daha detaylı anlatacağım.

“class Dictionary” diyerek sınıfımızın adına karar verdikten sonra, {} süslü parantezler içinde sınıfımızın değişken ve metodlarını yazacağız. Burada $title ve $entries, sınıfımıza ait değişkenler. Değişken ve metodların başına private yazdığımızda, o değişken ve metodlara sadece o sınıf içerisinden erişebiliyoruz ki, başka sınıflar, benim sınıfıma ait değişkenlere kafalarına göre erişip değiştirmesinler. Değişkenler ayrıca public ve protected’da oluyorlar. Değişken public olduğunda, süslü parantezin dışından herhangi bir programcı değişkenin anlık değerini değiştirebilir ve sınıfımızın çalışmasını bok edebilir. Doğru bir pratik olarak bütün değişkenlerinizi, private başlatmaya alışmanız çok önemli. Protected kavramını daha sonra anlatacağım.

Getter, Setter metodları. (alıcı, düzenleyici)

E peki bütün değişkenler private olursa bunlara nasıl erişeceğiz? Getter ve Setter metodları ile. İsimlerinin illa getBilmemne olmasına gerek yok ama doğru ve oturmuş bir pratik olarak nesne değişkeninizin ismi ne ise, başına get yazmak iyidir. Yani başlığı dışarıdan almak için getTitle, düzenlemek için de setTitle public metodlarına ihtiyacımız var. Bu sayede örneğin, kullanıcının boş başlık oluşturmasını engelleyebiliriz, ya da başlık için bir karakter sınırı koyabiliriz ki, adam başlığa bir trilyon karakter girmeye çalışıp programımızı çökerttirmesin.

public function setTitle(string $title)
{
if (($title != "") && (strlen($title) <= 70)) {
$this->title = $title;
}
}

public function diyerek metodumuza dışarıdan erişilebileceğini belirttik. string $title diyerek, string değişkeninin string yani metin tipinde olmasını garantiledik. Buna “type hinting” yani tip ipucu deniyor. PHP 5 sürümünden beri var. İlk if bloğunda göreceğimiz şekilde değişkenin boş olmadığını ve uzunluğunun da en çok 70 karakterden oluşması gerektiğini söyledik.

Burada yaptığımız işleme VALIDATION yani doğrulama deniyor ki, kullanıcılardan girdi alan uygulamalar yazarken, güvenlik açısından çok dikkat etmemiz bir kavram. Tüm kullanıcı girdileri lanetlidir diye bir söz vardır. Programımızın düzgün çalışmasını, daha programı yazarken bu şekilde garanti altına alıyoruz. Bir de bazı pislik insanların kalkıp bu girdilere HTML, Javascript, SQL kodu sokuşturmalarına da engel olmalıyız. Bunun için de belirli güvenlik önlemleri var. Bu işleme de SANITIZATION yani temizleme deniyor. Bu konuya da programımız, internet formundan kullanıcı girdileri alacak hale geldiğinde derinlemesine girişeceğiz.

Bu tip küçük detaylara dikkat ettiğimizde, programımızın nispeten hatasız çalışmasını, başımızı ağrıtacak bug’lar ortaya çıkmamasını garanti etmiş oluyoruz.

Eğer sınıf değişkenimiz public $title; şeklinde belirtilmiş olsaydı, dışarıdan herhangi bir kimse bizim validation kurallarımızı sallamadan sınıfımızın değişkenine tecavüz edebilirdi ki bunu istemeyiz. Bu yüzden nesne yönelimli programlamayı öğrenirken, gerçek hayatta kullanılan pratiklere en baştan aşina olmanızı istiyorum.

$this->title = $title;

$this ifadesi, burada içinde bulunduğumuz sınıfa ait nesneyi ifade ediyor. “->” operatörüyle değişken eğer bir nesne ise, sahip olduğu değişkene erişebiliyoruz. Nesneyi programımızda takır takır kullanmaya başladığımızda size, sınıf ve nesne kavramı arasındaki farkı da anlatacağım. Devam edelim.

Peki $title değişkenimize nasıl erişeceğiz? Bunun için de getTitle() isimli bir metod yazacağız. Bu metodun tek görevi, sınıfta bulunan private $title değişkenini kullanıcıya döndürmek.

public function getTitle():string
{
return $this->title;
}

Metodu yazarken : işaretinden sonra gelen string kelimesine dikkat ettiniz mi? Bu PHP 7 ile gelen harika bir yenilik, “return type” yani dönüş tipi olarak adlandırılıyor. Bu da metodumuzun hangi değeri döndüreceğini önceden belirlememizi sağlıyor. Yani kazara başka bir tipte değişken döndürmeyeceğiz ki, programımızı kullanan kullanıcı string yani metin yerine int yani sayı görüp afallamasın, mavi ekran vermesin, bug arayıp kafasını duvarlara vurmasın.

Sınıfımızın son hali şu şekilde:

<?php

namespace
MidoriKocak;


class Dictionary
{
private $title;
private $entries;

public function setTitle(string $title)
{
if (($title != "") && (strlen($title) <= 70)) {
$this->title = $title;
}
}

public function getTitle():string
{
return $this->title;
}

}

Dikkat etmeniz gerek iki kavram şunlar:

  1. Sınıf: Bir nesnenin kalıbını belirler.
  2. Nesne: Sınıftan kullanıcı tarafından üretilir.

Yani bu ikisi birbirinin aynısı değilidir. Mesela Sınıf audi A8’in çizimleri ise, nesne, yollarda züppelik yapan, makas atan 34TT264 plakalı hıyar arabadır.

Peki kullanıcı bu sınıfı nasıl kullanacak? Aynı dizin altında app.php isimli bir dosya oluşturalım:

<?php

require_once 'Dictionary.php'
;
$dictionary = new MidoriKocakDictionary();
echo $dictionary->getTitle();

Require ifadesiyle aynı dizindeki Dictionary.php dosyasını çağırdık. Dosya çağırma işleminin 4 adet yöntemi var.

  1. require: Dosyayı çağırır, bulamazsa programın çalışmasını durdurur.
  2. require_once: Dosyayı bir sefer çağırır, yani daha önce herhangi bir yerde require veya require_once ifadesiyle aynı dosya çağırıldıysa tekrar çağırmaz. Dosya bulunamadıysa, programın çalışmasını durdurur.
  3. include: Dosyayı çağırır, bulamazsa HATA (Warning) mesajı verir ama programı çalıştırmaya devam eder. Eğer o dosyada tanımlanan bir metoda veya değişkene erişmeye çalışırsanız, hata alır bol bol nerde hata yaptım diye ağlarsınız.
  4. include_once: Dosyayı bir sefer çağırır, yani daha önce herhangi bir yerde include veya include_once ifadesiyle aynı dosya çağırıldıysa tekrar çağırmaz. Dosya bulunamadıysa, çalışır ve kafanızı duvarlara vurursunuz.

O yüzden şimdilik require_once kullanacağız. Daha sonra, composer ve autolader kullanmaya başladığımızda bunlara veda edeceğiz, ama onu composer bölümünde anlatacağım. Şimdilik takılmayın. https://getcomposer.org/

$dictionary isimli bir değişken oluşturduk ve sınıfımızın başında belirttiğimiz Namespace ismi ile sınıfımızı new ifadesiyle yarattık. Dosyayı daha önceden doğru dürüst kurmuş olduğunuzu tahmin ettiğim yerel webserver üzerinden 127.0.0.1/dictionary/app.php adresiyle çağıralım.

Şöyle ölümcül bir hatayla karşılaşmamız gerekiyor, hatayı göremiyorsanız, PHP hata gösterme ayarlarınız kapalıdır. Onu da bi zahmet php.ini içinden açmalısınız, detaya girmiyorum.

Ölümcül hata

Hata neden oldu? Çünkü, $title değişkenimizi set etmeden, yani ona bir değer vermeden istemeye kalktık. getTitle metodunun sonuna :string yazarak metin tipinde bir değişken döndürmesini emrettik ama herhangi bir değer atamadığımızdan null döndürmeye kalktı. Bu tanımlamayı yaptığımız için ileride olabilecek bir çok bug’ın önüne geçmiş olduk. Null değişkenin henüz tanımlı olmadığını ya da bilerek veya isteyerek null değerine eşit olduğunu gösteren “yok” anlamına gelen ifadedir. Bu null belasından neden kaçmamız gerektiğini detaylıca, en iyi pratikler bölümünde detaylıca yazacağım.

Önce app.php içinde setTitle yazarak bu olayı çözebilirdik ama zırt pırt bunu kontrol edemeyiz ve programımızın da hata vermesini önlemek istiyoruz peki ne yapacağız? Sihirli __construct() metodunu kullanacağız.

__construct() metodu

PHP’de bir metodun başında iki alt çizgi varsa, ve tanımlı sihirli metodlardan (magic methods) bir tanesiyse, PHP yorumlayıcısı metodu tanır, ve gerektiği zamanda kendisi çalıştırır. Construct, yani inşa et metodu da, biz new MidoriKocakDictionary() dediğimiz anda çalışacak olan metod. Yani bir sınıftan nesne yarattığımızda bu metod çalışacak. Şu şekilde sınıfımızın başına __construct metodunu ekleyelim:

<?php

namespace
MidoriKocak;


class Dictionary
{
private $title;
private $entries;

public function __construct(string $title)
{
$this->title = $title;
$this->entries = [];
}

public function setTitle(string $title)
{
if (($title != "") && (strlen($title) <= 70)) {
$this->title = $title;
}
}

public function getTitle():string
{
return $this->title;
}
}

Burada construct metodunda, parametre olarak string $title, yani metin tipinde başlık değişkeni tanımladı. $title parametresini kullanarak $this-title ifadesiyle nesnemizin $title değişkenini tanımladık. Null belasından kaçmak için de $entries değişkenimize boş bir dizi (array) ekledik. Daha sonra sözlüğe kaydedeceğimiz kelimeleri bu dizide tutacağız.

app.php’yi çalıştıralım ve ikinci ölümcül hatamızla karşılaşalım:

İkinci ölümcül hata

Hata neden oldu? Çünkü app.php’yi değiştirmedik. __constructor() metodu içinde metin tipinde bir parametre olması gerektiği ve biz new MidoriKocakDictionary() şeklinde çağırdığımızdan, PHP derleyicisi, “E başlık nerde ulan?” hatası verdi. app.php’yi şu şekilde değiştirelim:

<?php

require_once 'Dictionary.php'
;
$dictionary = new MidoriKocakDictionary("Nesne Yönelimli Programlama Sözlüğü");
echo $dictionary->getTitle();

Tarayıcı ile app.php dosyasını açalım ve tertemiz başlığımızı görelim:

Hatasız mis gibi.

Bu yazıda şimdilik anlatacaklarım bu kadar.

Özetle;

  1. Sınıf ve nesne kavramlarının ne olduklarını
  2. Sınıfların nasıl tasarlandıklarını
  3. Ne işe yaradıklarını
  4. Nasıl yazıldıklarını
  5. Nasıl kullanılmaları gerektiğini
  6. Sihirli __constructor() metodunu öğrendik

Bir sonraki yazıda, sınıfımızı oluşturmaya ve programımızı yazmaya devam edeceğiz.

Bir sonraki yazıya şuradan ulaşabilirsiniz:

View at Medium.com


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com

Türkiye’den gitme rehberi

Özellikle laikler, solcular, aydınlar ve bilim insanları için.

Millyetçiler, dindarlar, yobazlar fln lütfen yazıyı okumasın. Bu resmi de belki iğrenip giderler diye koydum. Madem çok seviyosunuz, kalın.

1902 yılında bir grup genç adam Antonin Lefèvre-Pontalis adlı bir fransızın evinde toplanırlar. Fransız kamuoyunda Genç Türkler olarak bilinirler. Osmanlı o sırada zırt pırt toprak kaybetmektedir, donanması haliçte çürümektedir. İçte ve dışta zayıflamış, boğazına kadar borca batmış, sistemi eleştirmek imkansızdır. Eleştiri yapan batı eğitimi almış, yenilikçi, ilerici, bilimsel düşünen, ülkesini seven, milliyetçi insanlar iktidarını ve tahtını seven 2. Abdülhamit tarafından hapse atılır. 2. Abdülhamitin ispiyoncu şerefsiz jurnalcileri, parlementer sistem isteyenleri hapse atarlar. Parlementer sistem isteyenler işkence görür, kimisi hapishanelerde çürür, kimisi ölür.


Bu yüzden bağnaz, gerici, yobaz ve gırtlağına kadar borca batmış 2. Abdülhamit’in salak sistemine karşı olan devrimciler Paris’te kongre toplarlar ve ilk adımı atarlar. Sonrası belli, ikinci meşrutiyet ve cumhuriyetin kuruluşu.

Şimdi o jön türklerin kıvılcımını yaktığı parlementer sistem yıkılmak üzere, batı eğitimi almış, laik, ilerici, ateist vb. olup da, yeni diktatörlük anayasası referandumunda evet çıkarsa Türkiye’de olacak olan kişileri, işkencehaneler, hapisler, gözaltında ölümler bekliyor.

Barış için Akademisyenler

Bu yazıyı kendini bu salak rejimde harcattırmak istemeyenler için yazıyorum.


Günümüzde dünya ikiye ayrılıyor, özgür dünya ve özgür olmayan dünya. Özgür dünya, ifade özgürlüğünün tam olduğu, parlementer sistemin veya güçler ayrılığının tam olarak çalıştığı ülkeler. Bu ülkelerde başbakanlar, bakanlar bisiklete binerler, işe metroyla fln giderler. Eğitim kalitesi yüksektir, bütün icatlar, ilaçlar, kullandığımız teknolojiler bu ülkelerde tasarlanır. Özgür olmayan dünya ise, Nursultan Nazarbayev, İlham Aliyev, Bedirmuhammedov gibi diktatörlere sahip siktiriboktan türki cumhuriyetler, tüm Rusya ve rus yanlısı, salak belarus, bilimum afrika ülkeleri ve boğazına kadar yolsuzluğa batmış güney amerika ülkelerinden oluşur. Artı yobaz Ortadoğu Arap ülkeleri de bu rezil kümeye dahildir.


Bu ülkelerde ülkenin kaynaklarına çöreklenmiş yönetici sınıf, gruplar, tarikatlar vb, ülkenin doğal zenginliklerini yerler. Çünkü zaten bu ülkelerde fikir zengini, katma değerli bilimsel icatlar üretilmez. Geneli ya ülkenin doğal zenginliklerini sömürür, iran rusya türki cumhuriyetler, ya da kendi insanlarını sömürür. çin gibi. Çin mesela, fason üretim yapar ama yenilik inovasyon üretemez. İnovasyon üreten beyin sorgular çünkü, o beyinler de bu yüzden, doğru Amerika’ya beyin göçü olur. Özgür dünya ülkeleri, özgür olmayan ülkeleri, aptal veya yobaz gerici vb. oldukları için sömürür dururlar.


Geri kalmış ülkelerde yöneten sınıfı asla bisiklete binerken göremezsiniz. Mercedes’lere binerler lüks içinde yaşarlar. Artı bu ülkelerde yönetici kesim eleştirilemez, özgür, barışçıl, eylemler yapılamaz, sistemi ve yönetici kan emici vampirleri eleştirmek isteyenleri hapse atarlar, sokakta vururlar, gazetelerini radyolarını kapatırlar, barış isteyenleri üniversiteden fln atıp ekmeksiz bırakırlar. Sadece yönetici kesim ve o kesimin etrafında toplanmış sorgulamayan, sömürüden nemalanan cahil ve aptal asalaklar için yaşama şansı vardır.

Özgür dünyada da aptal insanlar vardır. Bu aptal insanlar Donald Trump gibi bi beyinsizi başkan seçerler. Ya da İngiltere’deki gibi Brexit yaparlar. O yüzden siktir olunup gidilecek ülkeler listemizden şimdilik Amerika ve İngiltereyi naşlıyoruz. Doğu avrupa ülkeleri ve o ülkelerin dallama vatandaşlarının çoğu zaten trump kafasında olduğu için doğu avrupayı unutun. Avrupa dışında Avustralya ve kanada iyi deniyor. Kamboçya, Tayland vb gibi yerlere gidenler de var, ama benim bir bilgim yok.


Batı Avrupa’dan bahsedeceğim. Avrupa gerçekten medeniyet. Türkiye’yle karşılaştırmam bile. En sikindirik doğu avrupa ülkesinde bile kimse kimse laf atmıyor, hakaret kavga gürültü yok gibi, arabalar korna çalmıyorlar ve yaya geçidinde duruyorlar. Bir kadın olarak gece ne zaman istesem dışarı çıkabilirim, kimse rahatsız etmez. İşyerlerinde ayrımcılığa karşı EU yasalarıyla her türlü etnik, cinsel kimlik, cinsel yönelim koruma altına alınmıştır. Kadına karşı şiddete tahammül yok, devlet koruması yalan değil.


Sokaklar temiz, şehirler beton ve çirkinlik abidesi değil, heryerde parklar ve meydanlar var. Kültür sanat faaliyetleri lüks değil, eğlenmek istesen bira 4 lira burda mesela. Gıda fiyatları, bizdeki gibi stokçu şerefsiz pislikler, adi kabzımallar fln olmadığı için türkiyenin 3te biri. Paranın alım gücü var. aldığın maaş 1 sene sonra kuşa dönmez, şirketlerde ek mesai ücreti vardır.


Avrupa’ya gitmenin birinci anahtarı dil kursu. Avrupa dil bilmeyen adam istemiyor. Burası net, yani para biriktirip 3000 euro 6-7 aylık dil kursu için bir kenara koyacaksınız. Dil kursu için öğrenci vizesine başvuracaksınız. Benim önerim Hollanda, İtalya, İskandinav ülkeleri gibi ülkelerin dilini öğrenmeniz, bu ülkelere başvurmanız. Avrupa kesinlikle ama kesinlikle meslek sahibi olmayan şahıs istemiyor. O yüzden dil kursundan önce okulunuzu bitirmenizi ya da bir meslek kursundan sertifika almanızı öneririm. Yoksa oturum moturum hikaye. Lise mezunuysanız, dil kursundan sonra üniversiteye girecekseniz olur. Dil kursundan sonra, üniversite mezunuysanız, çevre için kesinlikle yüksek lisans öneririm. Oturduğunuz ülkenin dilini çok iyi bileceksiniz. Yoksa hayat cehennem gibi gerçekten. Zaten dil kursu, yüksek lisans meslek kursu gibi eğitimlere katıldıktan sonra çevre edinirsiniz.


Çalışacaksanız kesinlikle Türklerle çalışmayın. sigortanızı ödemezler, az para verirler, sizi kandırmaya çalışırlar, kabadırlar.

Avrupa ülkelerinde yaşamak için özetle mesleğiniz olacak, dil bileceksiniz, İngilizce ve o ülkenin dili, ülkenin insanlarına ve kültürüne saygınız olacak.

Avrupa özellikle sanata ve sanatçılara çok önem veriyor. Ressam, heykeltraş veya müzisyenseniz, portfolyonuz da varsa vize ve oturum alırken bir adım öndesiniz.

Ama bir sürü vasıfsız dallamanın burada bana vize vermiyolar vb diye yakındığını gördüm.


İltica konusunu tavsiye etmiyorum. Mecbur kalmadığnız sürece zorlamayın. Gerçekten siyasi muhalifseniz, eylemlere katıldığınız belliyse, bir kaç sefer gözaltına alındıysanız, mahkemeniz vb olduysa, “ayak bastığınız ülkeye” iltica edebilirsiniz. Ama genel olarak çok zor olduğunu söylüyorlar.

Bence en iyi yol, atıyorum isveççe, fince dil kursuna 6-8 ay gidip, orada bir üniversiteye başlamak. Sonra da yüksek lisans ya da lisans yaparken çevre edinmek.

Bu kadar. Umarım yararlı olmuştur.

Not: Şu iki yazıya da selam olsun:
1. https://medium.com/@ordaneisivarmis/turk-milleti-ve-sikinin-ucuyla-i-s-yapmak-gerce-i-e7b170699056
2. https://suyunrengi.wordpress.com/2014/11/09/ortadogululardan-nicin-nefret-ediyorum/

Not 2: http://www.diken.com.tr/intihar-eden-akademisyenin-burs-basvurusu-turkiyede-akademik-gelecek-ongoremiyorum/


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com

Feedback for Your Job Interview from a Candidate

I was interviewed at this company www.tabella.cz and here is my feedback hence they did not grace me with any.


Hello,

Hence you did not send me any feedback, and not hear from you, I decided to send you a feedback. I was very happy about the first round of your job interview, interviewers were polite and respectful and you asked smart questions. I was happy that my technical knowledge was respected.

However the second round of interview, which I wasn’t expecting a technical one, was opposite. Interviewer was extremely disrespectful. In the first second I understood that he was prejudiced and going to ask amateur questions from his manners. A guy, without smiling and showing that he is not happy to meet a “different” person to interview, is not an uncommon type of interviewers I encounter.

Asking questions on paper with a bic pen is extremely unprofessional, also improvising questions on fly without preparing them is too. Other than that, asking syntax order of a left or right join, instead of the purpose of that to a candidate that says she worked one year as front-end engineer is forcing her to fail. Also it’s extremely rude to comment, “oh you wrote a book about it explaining but you don’t remember the syntax?” with a mocking face.

Actually I am not interested with your company or your offer anymore, hence a accepted a different offer from abroad, I hope my feedback is going to be useful for your company, not to frustrate future candidates with your unprofessional behaviour.

Yours,

Midori Kocak
Cumputer Scientist & Engineer
http://www.mynameismidori.com

Neden kodlama öğrenmeliyim?


Kodlama resim yapmak gibidir demiştim. Bu sorunun da cevabı neden resim yapmayı öğrenmeliyim? Neden bir hobi edinmeliyim? Ya da, şu yaşımdan sonra neden yeni bişiler öğrenmeliyim ki? gibi sorulara verilecek cevaplardan farklı değil aslında ama yine de ben tek tek yanıt vermeye çalışayım.

1. Herkes Programlama öğrenebilir

2011 yılında Machester’da bir yazılım konferansında bize seminer veren konularında baya ağır bilgiye sahip efsane şahıslara “Bu işe neden başladınız?” diye sormuştum. Elemanın biri “Ben Starbucks’ta barista’ydım. (Kahve koyan eleman) Bir arkadaşım bu işten iyi para yapıyordu, ben de merak ettim öğrendim.” diye cevap vermişti. Hala aklıma geldikçe anlatıyorum. Bu eleman şimdi Kanada’nın büyük yazılım şirketlerinden birinde baş yazılımcı. Öğrendiği herşeyi paylaştığı harika bir blogu var. O konferansta ben dahil bir sürü yazılım mühendisi, bu arkadaşın cevabıyla, tabiri caizse göt olmuştuk, hala unutmuyorum. Adam yazılımcı değil, alakası yok ama öğrenmek istiyor, kafaya koyuyor ve alanında en büyük uzman oluyor. Demek ki isteyince herkes programlama öğrenebilir.

2. Çünkü, birşeyler yaratmak en güzel mutluluk kaynağı


Kodlama işi resim yapmak gibi diye ikide birde söylüyorum. Bir kişi hayatı boyunca hiç resim yapmamış da olsa, doğru teknikleri öğrenir ve pratik yaparsa, güzel resimler yapabilir. Bu yüzden yazılarda Bob Ross’un resimlerini kullanıyorum. Başta bomboş tuvali yarım saat arka plan renkleriyle doldurmak, fırçayı tutmak gibi sıkıcı işlerden sonra, doğru teknikleri öğrenerek, “Şuraya minik bir ev yerleştirelim”, “Şuraya ceylanların su içtiği minik bir nehir çizelim” aşamasına geçiliyor. Bu şekilde resim çizmeye başladıktan sonra, bir şeyler yaratmaktan alınan keyif paha biçilemez ve verilen tüm emeklere değiyor. Tabii ki, herkes Rembrandt veya Van Gogh olmak zorunda değil, ama olabilirsiniz de.

3. Kazancı gayet iyi


Gerçekten öğrenmekten ve kendinizi geliştirmekten vazgeçmezseniz, sıralama, arama, veri yapıları gibi temel konuları iyice öğrenirseniz, nesne yönelimli programlamayı uygularsanız programlama işinde çok para var. Özellikle mobil uygulama geliştirme çok revaçta. En kötü mobil uygulama geliştirme işi 10bin euro’lardan başlıyor. Şu linkte maliyetleri hesaplamak için araçlar var. Üstelik freelance, home-ofis, yani 9–6 iş ortamına mahkum olmadan çalışabilme avantajları var. İyi bir çevreniz, alanınızda güzel bir itibarınız (blogunuz, açık kaynaklı yazılımlara katkınız vb.) varsa, yazılımcı kazançları gayet yüksek. Yeter ki, bedavaya çalışmayın. (Not: Bu konuda da bir yazı yazmak lazım.) Özellikle, facebook, google, amazon, microsoft gibi büyük firmalar diploma vb. aramıyorlar. Yukarıda bahsettiğim sıralama ve arama, veri yapıları gibi temel konuları çok iyi bildiğinizde çok iyi maaşla, vize desteğiyle sizi transfer etmek için yarışıyorlar. (Bu konuda hackerrank sitesini öneririm.)

4. Kimse sizi kandıramaz

Çaresiz yönetici kadrosu

Kodlama bilen kişilerde gördüğüm en büyük gıcıklık bilgilerini paylaşmaktan kaçmaları. Bunun egoistlik, iş kaybetme korkusu gibi saçma sapan sebepleri olabilir. Hatta bazı kodcuları evimin kapısından içeri sokmam. Soruna cevap vermez, günaydın demez, bilerek yanlış bilgi verir, kötü rekabet eder vb. Çoğu yalan söyler. Örneğin yazılımla uğraşan bir şirkette yönetici ekipteyseniz, kodcularla uğraşmak baş ağrıtabilir. Bu absürd, gelişmemiş insan türüne muhtaç olmamak için ve “memory çok şişti, ondan hata oldu, bug çıktı” gibi yalanlara aldanmamak “E adam gibi veri yapısı oturtaydın” diye cevabı yapıştırmak için temel de olsa kodlama öğrenmekte yarar var.

5. Çılgın paralar dökmeye gerek yok. El kadar bilgisayar yeter


Kodlama yapmak için 35$’lık Raspberry Pi bilgisayar yeter. Öyle ahım şahım bilgisayarlara deli paralar akıtmanıza gerek yok. Hatta bilgisayarın kaynakları kısıtlı olduğunda yapacağınız yazılımın performansına da dikkat etmiş olursunuz ki, bu da sizin diğer kodculardan ayrılmanızı sağlar. İhtiyaç duyacağınız bir çok araç, açık kaynaklı yazılım geliştirdiğinizde ücretsizdir. İnternette dünya kadar kaynak ücretsiz bir şekilde önünüze serilmiş vaziyettedir. BilgeAdam vb. gibi dershane usülü eğitim veren ticari kurumları tavsiye etmiyorum. Bunun yerine, youtube üzerinden videolu anlatımlar, piyasada insan gibi konuşan, dilinden kolayca anlayacağınız kitaplar mevcut. (Mesela benim kitabım, di mi ama?) İngilizceniz de varsa, ki kesinlikle olmalı, internette istediğiniz teknolojiyi öğrenmek için ulaşamayacağınız kaynak yok. Tüm insanlığın bilgisi elinizin altında. Kodlama yapmak, hali hazırda bir sanat olduğu, standartları tam oturmadığı için, alanda çalışmak için bir diplomaya sahip olmak zorunda da değilsiniz. Mesela, diş hekimliği fakültesi olmadan diş çekemezsiniz, ya da makine mühendisi değilseniz, doğalgaz tesisatı kuramazsınız, ancak böyle kısıtlamalar kodlama alanında yok. Bu aslında, biz bilgisayar, yazılım mühendisleri için kötü bir durum. Ancak bilgisayar bilimleri şunun şurasında 50 yıllık bir bilim dalı olduğu, ve halen bilimsel standartları oturmadığı için, sanat dalı olarak düşünülebildiği için, kodlama sanatını iyi bilen birisi gayet bu alanda profesyonelce çalışabilir.

Sonuç


Sonuç olarak, yeni şeyler öğrenmekten keyif alıyorsanız, bir şeyler yaratmak hoşunuza gidiyorsa, yeni bir meslek edinmeye ve bu alanda çalışma ve para kazanma olanakları size cazip geliyorsa kesinlikle ama kesinlikle kodlama öğrenmelisiniz.


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com

Nesne Yönelimli Sistemler Için Soyut Bir Nesne Modeli

Alan Snyder Yazılım Teknolojisi Laboratuvarı HPL-90–22 Nisan 1990 Çeviri: Midori Koçak — mtkocak (at) gmail (dot) com 30.12.2016


Anahtar kelimeler: nesne-yönelimli programlama, nesne yönelimli sistemler, nesne modelleri, veri modelleri, dağıtık sistemler, nesne yönetimi

Bu rapor, nesne yönelimli sistemler için soyut bir nesne modeli tanımlamaktadır. Soyut nesne modeli temel kavramlar ve terminolojinin organize bir şekilde sunulmasını sağlamaktadır. (Soyut nesne modeli) dağıtık bir nesne yönetimi altyapısı üzerine kurulmuş uygulamalar tarafından görüldüğü şekilde kısmi bir hesaplama modeli tanımlamaktadır. Amacı, nesne sistemlerinin temel özelliklerini bünyesinde toplayan genel bir taslak sunmaktır. Bu çerçevede, genel modelin detaylandırılması (rafine edilmesi) ve doldurulması (genel modele ait belirli varlıkların tanımlanması) yoluyla, birçok belirli nesne modelini tanımlamak mümkün olmalıdır. Soyut model, Nesne Yönetim Grubu’nun kullanımı için, önerilen nesne teknolojilerini talep etmek, açıklamak ve değerlendirmek için ortak bir kavramsal çerçeve olarak geliştirilmiştir.

© Telif Hakkı Hewlett-Packard Company 1990

Önsöz

Bu rapor, Nesne Yönetim Grubunun teknik komitesi tarafından kullanılmak üzere hazırlanmıştır. (Rapor) OMG (çn. NYG olarak adlandırılacaktır) teknik komitesine, gelişen NYG standardının durumunu tanımlayan daha büyük bir belgenin parçası olması önerilmiştir. Bu rapor, OMG’nin resmi bir belgesi değildir. NYG standardının durumu hakkında daha fazla bilgi için, lütfen Nesne Yönetimi Grubuna başvurunuz. Nesne Yönetimi Grubu, Framingham Kurumsal Merkezi, 492 Old Connecticut Path, Framingham, Massachusetts 01701.

Teşekkürler

Bu rapor, Nesne Yönetim Grubunun teknik komitesinin bir faaliyeti olarak gerçekleştirilen çalışmaları belgelemektedir. Jeff Eastman, Jon Gustafson, Brian McBride, Ian Thomas, Jan te Kiefte, Lee Scheffler, Rod Bark, Pete Showman, Dennis Tenney ve Tom Allen gibi birçok insandan gelen görüşmelerden ve geribildirimden yararlanılmıştır. Özellikle, Bill Kent ile nesne arayüzleri, nesne kimliği ve nesne durumu konularında yapılan kapsamlı tartışmalardan yararlanılmıştır. Bill, genelleştirilmiş nesne modelini (çn. rapora) dahil etmek için ilk mücadeleye başlamamı sağladı ve olayları daha dikkatli ve açık bir şekilde açıklamam için birçok kez beni zorladı. Bill’in bu belgeye katkısıim, tüm konularda fikir birliğine vardığımz gibi algılanmamalıdır. Son olarak, bu çalışma Alain Couder tarafından başlatılan HP “nesne görev gücü’nün” daha önceki çalışmasının bir sonucudur.

Giriş

NYG nesne modeli, NYG nesne kavramlarının ve terminolojisinin organize bir sunumunu sağlamaktadır. Nesne modeli, NYG uyumlu uygulamaların ve son kullanıcı uygulamalarının karşılaştığı hesaplama modelini kısmen tanımlamaktadır. NYG nesne modelinin amacı, NYG tarafından önerilen teknolojiler için kavramsal bir çerçeve tanımlamak ve özellikle belirli teknolojileri önermek ve benimsemek için yapılacak temel tasarım seçimlerini motive etmektir.

NYG nesne modeli, bir NYG sisteminin bileşenlerini veya arabirimlerini tanımlamamaktadır. Nesne modeli, NYG uygulamalarının yapısını da tanımlamaz. Nesne modeli, belirli nesneleri, belirli türde nesneleri veya nesnelere özel arayüzleri tanımlamaz. Bu konular NYG referans modeli tarafından ele alınmaktadır.

Önerilen herhangi bir NYG teknolojisinin burada, modeli detaylı olarak anlatması ve oluşturması beklenmektedir. Modelin ayrıntılandırmak, örneğin talep öz niteliklerinin biçimini veya türleri belirlemek için kullanılan dili tanımlayarak daha belirli hale getirilmesi anlamına gelmektedir. Modeli doldurmak, model tarafından tanımlanan belirli varlık örneklerini, örneğin belirli nesneleri, belirli işlemleri veya belirli türleri ortaya koymak demektir.

Bu nesne modelinin bir amacı da, önerilen teknolojilerin olası modellerine gereksiz kısıtlamalar getirmekten kaçınmaktır. NYG nesne modelinde somutlaştırılan gereklilikler, nesne teknolojisi kavramı için “gerekli” kabul edilenlerdir.

Nesne sistemlerinin temel karakteristiği, nesne istemcileri tarafından görülen nesnelerin semantiği ile bu semantiklerin varolan veri gösterimleri ve çalıştırılabilir kod açısından uygulanımları arasındaki ayrımdır. Nesne semantiği, nesne oluşturma ve nesne kimliği, talep ve işlemler, türler ve imzalar gibi kavramları içerir. Nesne uygulanımı, yöntemler, veri yapıları, sınıflar (uygulanım tanımları gibi) ve uygulama kalıtımı gibi kavramları içermektedir.

Nesne modeli ilk önce nesne semantiği ile ilgili kavramları tanımlar ve ondan sonra nesne uygulanımı ile ilgili kavramları açıklar. Nesne semantiği istemcilere görünür olduğundan, nesne modeli, nesne semantiği kavramlarını tanımlamada en belirgin ve kural belirleyici kavramdır. Nesnenin uygulanımı ile ilgili tartışmalar daha fikir vericidir; çünkü nesnelerin farklı uygulanımları için farklı nesne teknolojileri kullanılmasını sağlayan maksimum özgürlük amaçlamaktadır.

Nesne sistemlerinin NYG nesne modelinin kapsamı dışında başka özellikleri de mevcuttur. Bu kavramların bazıları uygulama mimarisi bakış açıları olup, bazıları nesne teknolojisinin uygulandığı belirli alanlarla ilişkilendirilmiştir. Bu tür kavramlar mimari referans modelinde daha düzgün bir şekilde ele alınmaktadır. Hariç tutulan kavramlardan bazıları, bileşik nesneler, öz nitelikler ve bağlantılar, nesnelerin kopyalanması, değişim yönetimi ve işlemlerdir (transactions). Ayrıca NYG nesne modeli kapsamı dışında denetim ve yürütme modeli de vardır.

Nesne modeli tanımında, yeni terimleri tanıtmak veya tanımlamak için italik kullanılır. Parantezli cümleler ve girintili paragraflar yorumdur ve nesne modelinin bir parçası değildir.

1.1 Klasik vs. Genelleştirilmiş Nesne Modelleri

Aşağıda tanımlandığı gibi, NYG nesne modeli genelleştirilmiş bir nesne modelidir. Bu nedenle, mevcut sistemlerden aşina olunan nesne modellerinden derin bir biçimde farklıdır. NYG nesne modeli kasıtlı bir şekilde, aşina olunan nesne modellerinin genelleştirilmesidir. NYG nesne modelini açıklamaya geçmeden önce, bu iki farklı nesne modelini karşılaştırmak ve farklarını vurgulamak faydalı olacaktır. Bu açıklamalarda kullanılacak terimler daha sonra açıklanacak olmasına rağmen, anlamlarının sezilmesi kolay terimlerdir.

Çoğu nesne teknolojisinde kullanılan klasik nesne modelinde, bir istemci nesneye mesaj göndermektedir. Kavramsal olarak, nesne, hangi hizmetin gerçekleştirileceğine karar vermek için mesajı yorumlar. Klasik modelde, talep, nesneyi ve sıfır veya daha fazla öz niteliği tanımlamaktadır. Çoğu klasik nesne modelinde, gerçekleştirilecek işlemi tanımlayan özellikle bir ilk parametre tanımlanması gerekir; Mesaj, talep edilen işlemi temel alan metodun seçilerek yorumlanır. Tabii olarak, metod seçimi nesne veya sistem tarafından gerçekleştiriliyor olabilir.

Genelleştirilmiş nesne modeli istemcinin bir işlem belirttiği bir talep ve herhangi birinin nesne belirtebileceği sıfır veya daha fazla öz nitelik bildiriminde bulunduğu modeldir. (Örnek olarak Genelleştirilmiş nesne modeli Common Lisp Nesne Sistemi ve Iris Veritabanı tarafından kullanılmaktadır.) Genelleştirilmiş nesne modelinde, metod seçimi, talebin yanı sıra işlemde tanımlanan nesnelerden herhangi birine dayanabilir. Yöntem seçimi birden fazla nesneye dayandığından, seçimin nesne değil sistem tarafından yapıldığı iyice görülmektedir. Metod seçimi, uygulamada çok aşamalı olarak gerçekleştirir, son aşama nesne tarafından tamamlanır.

Klasik nesne modeli, genelleştirilmiş nesne modelinin özel bir halidir. Nesneye klasik olarak bir mesaj göndermek, metod seçiminin işleme bağlı olduğu ve nesnenin ilk öz nitelik aracılığıyla tanımlandığı genelleştirilmiş talebe eşdeğerdir. Örneğin klasik modelde “yazdır yazıcı-a” mesajını “hesap_tablosu-a” nesnesine gönderme işlemi, metod seçiminin yazıcı-a nesnesine değil, hesap_tablosu-a nesnesine bağlı olduğu varsayıldığında, genelleştirilmiş modelde “yazdır hesap_tablosu-a yazıcı_a” talebini bildirmeye eşdeğerdir.

Genelleştirilmiş nesne modeli, bir nesne teknolojisinin ek işlevsellik sağlamasına olanak tanır. Örneğin, nesne teknolojisi, sadece bir elektronik tabloda ve belirli bir tür yazıcıda yazdırma işlemi talep edildiğinde çağrılan bir metodun tanımlanmasını destekleyebilir. Bu özelleşmiş metod, belirli yazıcı türlerinin benzersiz özelliklerinden yararlanabilir.

Klasik nesne modellerinin dağıtık uygulamaları genellikle nesnelerin konumlarını belirler. Genelleştirilmiş modellerde ise, işlemlere konumlar atamak da mümkündür. Böylece, uzaktan yordam çağrıları da genelleştirilmiş nesne modelinin özel bir örneğidir.

Genel bakış

NYG sistemi, kod ve veri içeren bir hesaplama sistemidir.

Bu belgede ele alınan bakış açısı, sadece tek bir NYG hesaplama sisteminin varolduğunu kabul etmektedir. (Sistem birden çok birbirinden ayrı hesaplama parçalarını içeriyor olabilir.) Bu bakış açısının sebebi, farklı hesaplama parçalarının, daha sonra tek bir parça olarak bağlandığı durumları zarifçe ele almaktır. Bu açıklama, belirli bir nesne teknolojisinde, bağımsız nesne sistemlerinin (ağlar), istendiğinde birbirine bağlanabilmesini desteklemesi gerektiğini belirtmemektedir. Diğer bir değişle, nesne modeli evrensel isimlendirme mimarisini desteklemek zorunda değildir.

NYG sistemindeki varlıklar, NYG nesnelerini, değerler (nesne adları ve tutamaçları dahil), işlemler, imzalar ve türleri (arayüz türleri dahil) içerir.

Nesne Semantiği

Bu bölüm, nesne semantiği ile ilişkili kavramları, yani nesneleri kullanma ile ilgili kavramları tanımlamaktadır. (Bkz. Şekil 1.)

3.1 Nesneler

NYG hesaplama modeli, NYG nesneleri olarak bilinen varlıkları içerir. (NYG nesneleri, C++ nesneleri gibi nesneler olarak da adlandırılan diğer muhtemel nesnelerle karıştırılmamalıdır. Kısaltma amacıyla, NYG nesnelerine bundan böyle nesneler denilecektir. Nesnelerin aşağıda açıklanan bazı özellikleri mevcuttur.
Bir nesne, istemcilere hizmet sağlama işleminde rol alır. Bir hizmetin istemcisi, hizmeti talep etme yeteneğine sahip herhangi bir varlıktır. (İstemciler, uygulama programları, nesneler, aracılar ve bir kullanıcı arayüzü aracılığıyla hareket eden son kullanıcıları içerebilir.)

3.2 Talepler

İstemciler talep bildirerek, hizmet talep ederler. Bir talep, diğer bir deyişle, hesaplama sisteminin çalışması esnasında, belirli bir zamanda meydana gelen bir şeydir. Bir taleple ilgili olan bilgi, istenen işlemden ve sıfır veya daha fazla (gerçek) öz nitelikten oluşmaktadır.

Bir talebin, çalıştırıldığında bir talep bildirilmesine yol açan, statik bir program metninden farklı birşey olduğu anlaşılmalıdır. Nesne modeli, hangi programların talep bildireceğini belirleyen bi söz dizimi dikte etmez. Örneğin talep bildiren bir yapıda, işlemin önce gelmesini gerektirmez. Nesne modeli, bir programın hangi işlemleri veya hangi öz niteliklerin çalıştırılma esnasında neye tekabül ettiği ile ilgilenmez.

Talep içerisinde belirlenmiş olan bir işleme, işlem adı denmektedir. Nesne modeli, istemcilerin işlemlere nasıl isim verdiğini de tanımlamaz. Farklı istemcilerin aynı işlemi tanımlamak için farklı isimler veya aynı ismi farklı işlemleri tanımlamak için kullanmaları mümkündür.

Birincil nesne semantiği kavramları

Talep dendiğinde anlaşılması istenen şey, işemin gerçekleştirilen hizmeti tanımladığı ve öz niteliklerin hizmet sunumuna katılan nesneleri ve istemci tarafından istenen sonuçları belirten diğer bilgileri tanımladığıdır. Bu nesne modeli, alışılagelmiş tek nesneli taleplere ek olarak, bir talebin sıfır veya daha fazla nesneyi adlandırmasına olanak vermektedir.

İşlemler (olasılıkla) jeneriklerdir, yani, nesnelerden talep edilen tek bir işlem, gözlemlenebilen farklı davranışlara yol açan, farklı uygulanımlara sahip olabilir.

Bu, hesaplama modelini karakterize etmesi amaçlanan felsefi bir ilkedir. Burada amaçlanan, farklı nesnelerden, belirli bir işlem talep edildiğinde, hizmeti gerçekleştirmeyi amaçlandığında yürütülecek kodun farklı farklı olabileceği ve farklı bir şekilde gözlemlenebilir davranışlara yol açabileceğidir. Özellikle, varolan işlemler için özelleşmiş davranışlar sağlayan yeni bir çeşit nesne sisteme eklenebilir. Belirli bir işlem için, farklı davranışlar, birşeyin yazdırılması gibi ortak bir amaca sahip olmaları beklenir, fakat, bu beklenti sistem tarafından zorlanan bir durum değildir.

İşlemler açık eylemler tarafından yaratılırlar, bu tarz eylemlerin her biri gelecekte yaratılacak veya daha önce yaratılmış olan işlemlerden farklıdır.

Bu tanımlama, aşağıda açıklanan nesne kimliğine eşdeğer bir kavram olan işlem kimliği fikrini açıklamaktadır. Temel bir seviyede, işlemlerde “kaza sonucu” aşırı yüklenme olamaz: İki istemcinin aynı işlemi belirtmesi için işlem kimliğinin ortak bir kaynaktan her bir istemciye iletilmiş olması gerekir. Dolayısıyla, geliştirici, (yeni bir işlem oluşturarak) hizmetin diğer hizmetlerden açıkça farklı olduğundan emin olacağı yeni bir hizmet tanımlayabilir.

Nesne mode bir işlemin bir nesne veya bir işlem adının (örneğin öz nitelik olarak kullanılabilecek) bir değer olduğunu tanımlamaz.

Talep kavramları

Değer, bir talep içerisinde bulunan, olası (gerçek) bir öz niteliktir. Değer, talebi gerçekleştirmek amacıyla, nesneyi tanımlayabilir. Nesneyi tanımlayan değere, nesne adı denir. (Bkz. Şekil 2.)

Nesneler dışındaki soyut varlıkları tanımlayan değerler olabilir. Bu tür değerlere değişmez (literal) denir. Örneğin, değişmez dendiğinde, bu değerlerin mutlaka derleme zamanı sabitleri olduğu kastedilmemektedir. Örneğin belirli bir sistemde, tamsayılar talepler içerisinde tanımlanmış olabilirler, fakat, sistem tarafından tanımlanan nesnelerin tüm özelliklerine sahip olmayabilirler. Başka bir deyişle, nesne modeli izin verse dahi tüm referanslanabilir varlıkların nesne olmasını gerekmez. Ayrıca, var olan herhangi bir varlığı referans göstermeyen anlamsız değerler de olabilir. Örneğin, henüz oluşturulmamış nesneleri tanımlamak için bazı değerler saklı tutulabilir. Bu durum, bir sonraki bahiste görmezden gelinmektedir.

Tanıtıcı (tutamaç, handle), belirli bir nesneyi açıkça tanımlayan bir nesne adıdır. Uzay, zamanın belirli pragmatik sınırları içerisinde, bir tanıtıcı, bir talep içerisinde kullanıldığı zaman, her seferinde aynı nesneyi güvenilir bir şekilde tanımlar.

Bir nesne teknolojisi, farklı nesneleri farklı zamanlarda veya farklı “lokasyonlarda” tanımlayan nesne adları sağlayabilir, örneğin belirli bir türdeki en yakın yazıcıyı gösteren bir değer gibi. Bu değerler nesne adlarıdır, ancak tanıtıcılar (handle) değillerdir. İkisi de yararlı olmasına rağmen, güvenilir, belirsiz olmayan nesne adlarının (tanıtıcılar) varlığı bir nesne sisteminin vazgeçilmez bir özelliğidir.

Nesne isimleri ve tanıtıcılar arasındaki ayrım, Unix dosya sistemine benzetme yapılarak anlatılabilir. Unix dosyalarının nesneler olduğunu ve bir Unix dosyasını tanımlamanın üç olası yolu olduğunu göz önünde bulundurun: yol adları, dosya tanımlayıcıları ve inode’lar. Bir yol adı, bir nesne adıdır, ancak bir tanıtıcı değildir, çünkü bir yol adına göre adlandırılmış dosya, dosyaları veya dizinleri yeniden adlandırma sonucunda anında değişebilir. (Göreceli bir yol adı, verilen bir işlem tarafından belirli bir zamanda “geçerli” olarak tanımlanan dosya dizinindeki yoruma bağımlı olmasıyla ek bir belirsizliğe sahiptir.) Bir dosya tanımlayıcı, bir tanıtıcıdır çünkü tek bir işlemde (veya dosya tanımlayıcıları paylaşılıyorsa işlem ağacında), aynı dosya nesnesini her zaman tanımlamaktadır. Bir inode belirli bir dosyayı tek bir dosya sistemi bağlamında belirgin olarak tanımlamış olsa da bir inode bir nesne adı değildir çünkü bir değer değildir (olağan Unix sistem çağrılarında kullanılamaz), Hem yol adları, hem de dosya tanımlayıcıları olması faydalıdır. Unix’in en büyük kısıtlılığı, dosya tanımlayıcısının kalıcı bir biçiminin olmamasıdır.

Nesne modeli, bir nesnenin tek bir bağlamda veya farklı bağlamlarda birden çok işleme sahip olmasını sağlar. Örneğin, bir Unix işlemi bağlamında bir tanıtıcı, o işlemin adres alanına işaretçi olabilir. Farklı işlemlerde, aynı nesne farklı işaretçilerle tanımlanır. Bu tür tanıtıcılar (handle), yalnızca işlemin adres alanı içinde ve yalnızca işlemin ömrü boyunca geçerlidir. (Yukarıdaki Unix dosya sistemi örneği, bir nesnenin tek bir bağlamda birden fazla tanıtıcısına işaret etmektedir: Bir Unix işlemi, aynı dosyayı tanımlayan birden çok dosya tanımlayıcısına sahip olabilir. Dosya tanımlayıcıları, dosyayla farklı ilişkili konumlara sahip olmalarıyla ayrışırlar.)

Bir nesne, bir veya daha fazla gerçek parametre o nesneyi tanımlıyorsa, bir talebe katılmak üzere tanımlanmıştır. (“Katılmak” sözcüğünü ile nesnenin gerçekten istenen hizmeti sunmasındaki herhangi görev derecesi kastedilmemektedir.)

Bir talep, bir hizmetin istemci adına gerçekleştirilmesine yol açar. Hizmeti gerçekleştirmenin bir sonucu, bazı sonuçların istemciye geri gönderilmesi olabilir. Bir taleple ilişkili sonuçlar, istenen hizmeti gerçekleştirmeye çalışırken istisnai koşulların ortaya çıktığını gösteren değerlerin birlikte farklı değerler de içerebilir.

Nesne modeli, bir istemci tarafından parametrelerin, sonuçların ve istisnai koşulların nasıl tanımlandığını belirtmez. Parametrelerin ve sonuçların tanımlanması ardışık / konumsal veya isimlerle olabilir. Bu ayrıntılar, bu modeli ayrıntılı olarak anlatan belirli bir nesne teknolojisi tarafından belirlenir.

Nesne modelinin, bir işlemin, istemci programlarında statik olarak tanımlanması gerektiğini belirtmediğini unutmayın. Örneğin, bir programlama dili arayüzü, işlem adının değişken olarak varolduğu bir talepte bulunmak için bir yapı sunuyor olabilir. Böyle bir yapı Lisp’deki “funcall” yapısına benzer olacaktır.

3.3 Davranış ve Soyutlama

Bir talebin davranışı, istenen hizmetin gerçekleştirilmesinden kaynaklanan gözlenebilir etkilerdir. (Etki, istekte bulunan istemci dışındaki taraflar tarafından görülebilir.) Bir talebin davranışı, istemciye (geri gönderilen değerler ve rapor edilen istisnai koşullar dahil olarak) geri döndürülen sonuçların yanısıra (aynı veya farklı bir istemci tarafından) gelecekteki sonuçlarla ilgili dolaylı etkileri içerir.

Genel olarak, bir isteğin muhtemel davranışları, diğer istekleri bildiren hesaplamaları da kapsayan herhangi bir rastgele hesaplamadır. (Bu ifade, hesaplama modelinin kastedilen gücünü karakterize etmektedir.)

Bir isteğin davranışı genellikle hem talebin gerçek öz niteliklerine, hem de hesaplama sisteminin durumuna bağlıdır. Hesaplama sisteminin durumu geçmiş isteklerin tarihçesinin bir gösterimidir; özellikle, geçmiş isteklerin gelecekteki davranış üzerindeki etkilerini temsil etmektedir. Bir davranış, öz nitelikleri, talebin gerçek argümanlarını ve sistemin durumunu içeren bir fonksiyon olarak modellenebilir. (Teknik olarak, bu teknik düzanlamsal semantik olarak adlandırılır.)

Sistemin durumu, fiziksel olarak, isteklerin yürütülmesi arasında kalıcı olan verilerle temsil edilir. Bu “kalıcı veriler”, nesne etkili bir şekilde temsil eden referansları içerebilir. Nesne modeli, bu gibi referansların depolanmış biçimi hakkında hiçbir şey söylemez. Kalıcı nesne referansları, yalnızca talep argümanları veya sonuçları olarak iletilmiş değerler (nesne adları) aracılığıyla istemciler tarafından görülebilir. Örneğin, kalıcı bir nesne referansı, bir nesnenin belirli bir öz niteliğini döndüren, hizmetin sonucu olan değer olarak, istemciye açıklanabilir.
Bir isteğin davranışı, bağlamsal bilgiye (örneğin, istemcinin kimliğine) ve sistemle bağlantılı olan (bağlı bir donanım aygıtının durumu gibi) diğer varlıkların durumuna veya kullanıcıların doğrudan etkileşimlerin etkilerine bağlı olabilir. Bu ilave etkiler, davranış fonksiyonuna ek argümanlar olarak modellenmektedir.

Bir nesne açıkça, ilgili taleplerin davranışı ile karakterize edilen soyutlamanın vücut bulmuş halidir. Bir nesne tarafından vücut bulmuş olan soyutlama, istemcileri için anlamlıdır. Son kullanıcı tarafından görülebilen bir nesne, tipik olarak, son kullanıcı tarafından aşina olunan bazı gerçek dünya nesnelerini modellemektedir.

Bu felsefi ilkeler, anlamlı soyutlamalar oluşturmak için nesneleri kullanmadaki amacı açıklamaktadır. Elektronik tabloları değiştirebilmeyi hedefleyen bir istemciye, elektronik tablolardan beklenen hizmetleri gerçekleştiren nesneler sunulmalıdır. Bir e-tablo nesnesinin e-tablo gibi davranması, nesnenin özünde bulunur ve istemcinin bilgisine bağımlı değildir. Unix’ten karşıt bir örnek konuyu açıklığa kavuşturmaya yardımcı olabilir. Unix dosyası, değiştirilebilir bir bayt dizisinin düşük seviyeli soyutlamasıdır. Bir Unix dosyasına ek semantik eklenmemiştir; bunun yerine, bir Unix dosyasının yorumu dosyayı işleyen uygulamalara bırakılmıştır. Bir Unix dosyası bir e-tabloyu temsil edebilir, ancak Unix dosya sistemi bu amacı belirlemez. Bunun yerine, bu özel Unix dosyası üzerinde çalışırken elektronik tablo uygulamasını çağırmak istemcinin sorumluluğundadır. Bu ifadelerle, birden fazla soyutlama seviyesini destekleyen sistemleri dışarıda bırakmak kastedilemiştir.

3.4 Nesnelerin Yaratılması ve Kimliği

Bir nesne, açık bir eylemle oluşturulur. Nesnenin kimliği vardır: daha önce yaratılmış olan veya hesaplama sisteminde yaratılacak olan her nesneden ayrıdır.

Nesne kimliğinin bu kavramı, her nesne yaratma olayında bir nesne tanımlayıcısının önceden ayrılmadığı sonsuz bir nesne tanımlayıcıları kümesi varsayılarak resmi olarak modellenebilir. Nesne kimliği, nesne tanımlayıcılarının denkliği olarak modellenir. (Soyut nesne kimliği konusundan aşağıda bahsedilmektedir.) Nesne modelinin, hesaplama sisteminde benzersiz nesne tanımlayıcılarını açıkça kullanmasını gerektirmediğine dikkat edin. Benzersiz tanımlayıcılar bir uygulama tekniğidir. Benzersiz tanımlayıcılar kullanılsa bile, istemcilere gösterilmelerine gerek yoktur.

Nesne oluşturma, işlemler yoluyla istemcilere sunulmaktadır. Nesne oluşturma işleminin sonucu, yeni oluşturulan nesneyi tanımlayan bir tanıtıcı şeklinde istemciye ifşa edilir.

Bir talebin davranışı, katılımcı nesnelerin kimliklerine bağlı olabilir. Özellikle, hesaplama sisteminin durumuna ait bir bileşen, belirli bir nesneyle benzersiz şekilde ilişkilendirilebilir. Genel olarak, böyle bir bu durum nesnenin katıldığı belirli talepler bildirilmeden değiştirilemez. Başka bir deyişle, farklı nesneler işlemler tarafından kapsüllenmiş ayrı bir duruma sahip olabilirler.

Bu ifadeler, hesaplama sisteminin kastedilen gücünü tanımlamaktadır. Belirtilen özelliklerle nesneleri tanımlamak mümkün olmalıdır. Kapsüllenmiş durumun klasik örneği, push (ekle) ve pop (kopar) hizmetlerini sunan yığın nesnesidir: örtülü olarak bir yığın nesnesi ile ilişkilendirilen durum, push (eklenen) edilen ama henüz pop edilmemiş (koparılmamış) öğelerin sırasıdır. Bu durum yalnızca push ve pop işlemleri ile değiştirilir. İstemcilere sadece pop’un zamanla değişen davranışıyla gösterilir.

Hesaplama sisteminin durumunun tek tek nesnelerle benzersiz şekilde ilişkilendirilmemiş ek bileşenleri olabilir. Örneğin, iki nesne kümesi, program kaynağı ve geliştirici nesneleri üzerinde yaratılmış ve tarafından-yaratılmış ilişkilerini düşünün. Bu işlemlerle sunulan durumun, nesne çiftleriyle veya işlemlerin alternatif olarak kendileriyle ilişkilendirildiği düşünülebilir. İlişkilendirilmiş durum denildiğine, durumun kalıcı gösteriminin şeklini sınırlandırmak kastedilmemektedir.

Nesne modeli, nesne yaratımı ve nesne yokedilmesi konusunda başka detaylar tanımlamamaktadır.

3.5 Soyut Nesne Kimliği

Nesneler, isteklerin davranışını etkiledikleri ölçüde istemciler tarafından ayırt edilebilme yeteneğine sahiptirler.

Diğer bir deyişle, nesne modeli, yukarıda tanımlandığı gibi nesne kimliğinin istemcilere doğrudan ifşa edilmesine izin verir ancak bu durumu zorlamaz. Nesne kimliği ile ilgili istemciler için uygun olan aşağıda gösterilen şekilde diğer olası kavramlar da vardır. Nesne modeli tarafından desteklenmese dahi, sistemin soyutlama yeteneklerinin, nesne kimliği ile ilgili soyut kavramların sağlanarak kullanılması mümkün olabilir. Bu kavramlar, istemciler tarafından talep edilen belirli hizmetler şeklinde gerçekleştirilebilirler. Örneğin, soyut bir nesne kimliği kavramına göre iki nesnenin kimliğinin “aynı” olup olmadığını karşılaştıran bir bir hizmet sunulabilir. Kastedilen soyut nesne kimliği kavramını temel alarak, hizmet, ayrık bir biçimde yaratılmış iki nesnenin “aynı” olduğunu bildirebilir. Nesne modeli, bu tarz bir hizmeti tanımlamamaktadır. Böyle bir hizmetin uygulanımını yapmak, nesnelerin ayrık bir şekilde yaratılmalarına göre test edilebilmelerini gerektirir.

Nesne kimliği konusuna daha soyut bir fikir örneği vermek gerekirse, “Kimlik birleştirme” kavramından bahsedilebilir. Bu fikir aslında birbirinden ayrık olan iki nesnenin, istemcilerin görüş açısından birbirinden ayılamayan, tek bir nesne haline gelmelerine izin verir. Nesneler gerçek dünyanın evrimleşen bir şekilde anlaşılması anlamında, dünyayı modellemek için kullanıldığında, örneğin, “Joe’nun babası” ve “Bob’un kardeşi” varlıklarının aslında aynı kişi olduğunu belirten bir modelleme için kullanıldığında faydalı olmaktadır.

Nesne kimliği fikri için daha soyur bir örnek (değişmez) matematiksel soyutlamalardır. Elemanları 1 ve 2 tamsayılarından oluşan bir küme kavramını matematiksel soyutlamaya örnek olarak verebiliriz. Bu şekilde sadece tek bir küme vardır. Nesneleri matematiksel soyutlamaları temsil etmek için kullanan bir sistemde, aynı soyutlamayı temsil etmek için birbirinden farklı çoklu nesneler var olabilir. Fakat, istemciler, bu nesneleri “özdeş” olarak görmelidirler. Bir hizmet, istemciler için bu ilüzyonu sağlayabilecek şekilde tanımlanabilmelidir.

Soyut nesne kimliğini desteklemek için gereken motivasyon, nesne modelinde doğrudan daha karmaşık kimlik biçimleri sağlamak yerine, yeni kimlik kavramlarını tanımlamadaki esnekliği sağlamak ve nesne teknolojisinin uygulanımları çok zor olan nesne kimliği kavramlarını desteklemesini önlemektir. Daha karmaşık nesne kimliği biçimleri, belirli bir nesne modelinde önlenmiş değildir.

3.6 Anlamlı talepler

Tüm talepler anlamlı değildir: bir nesne, tüm hizmetleri desteklemek durumunda olmayabilir ve bir talebin mevcut öz niteliklerinde başka kısıtlamalar varolmuş olabilir.

Anlamlı talep fikri, tip tabanlı sistemlerde, tiplerin hatasızlığı fikrine karşılık gelmektedir. Smalltalk’daki mesaj anlaşılamadı hataları bu fikre karşılık gelmektedir.

Her işlemin, o işlem için anlamlı olan olası (mevcut) öz nitelik değerlerini kısıtlayan ilişkili imzası vardır. Mevcut öz nitelikleri talep içinde tanımlanmış işlem imzasını tatmin etmeyen bir talep, anlamsızdır. Anlamsız bir talep bildirimi yapmak, istemciye bir istinsa koşulu rapor edilmesine yol açabilir.

Tip tabanlı programlama dillerine aşina olan okuyucular için, bir imza, bir prosedür veya fonksiyon tipi gibidir. Bu özel durumda, bir imza, (birden fazla türe sahip argümanları kabul eden) jenerik bir fonksiyonun türü gibidir. Örneğin, artı işleminin imzası, mevcut argümanların gerçel sayı veya tamsayıların bileşkesi olduğu ve bir tamsayı sonucunun eğer iki parametre de tamsayı olduğu (ya da gerçel sonucun iki parametre de gerçek olduğu), iki adet öz nitelik olmasını şart koşuyor olabilir.

Nesne Modeli, dilin imzalar tanımlamak zorunda olup olmadığını tanımlamamaktadır. Bu tarz bir nesne modelinin detaylanmış hali, belirli imza biçimlerini tanımlayabilir.

Eğer işlem isimleri (işlem isimlerinin talepler içinde öz nitelik olabildiği durumlar) değerler ise, imzalar aşağıda tanımlandığı gibi tip olarak düşünülebilir. Bu manada, Figür 1, işlemlerin tiplere sahip olduklarını göstermektedir.

Bir işlem yaratıldığında, imzası da belirlenmiş olur.

Nesne modeli bir işlemin yaratıldıktan sonra imzasını değiştirip değiştiremeyeceğini tanımlamamaktadır.

Bir imza, ilgili talepler ile ilişkili olan olası sonuç değerlerini veya istisnai koşulları karakterize edebilir. Bu ek bilgi, anlamlı talep fikrini etkilememektedir, ancak programların statik analizlerini gerçekleştiren araçlar tarafından kullanılabilir.

Nesne modeli, sonuçların olası karakterizasyonlarını tanımlamaz. Tipik olarak, sonuçları kendi tipleri açısından imzalar karakterize etmektedir. İmzalar işlem davranışının biçimsel veya biçimsel olmayan tanımları veya işlemin eşzamanlı olup olmadığı gibi ek bilgiler içerebilirler.

Bir tip, olası sonuçları karakterize eden veya olası öz nitelikleri kısıtlamaya yarayan bir imzada kullanılabilecek değerler üzerinde tanımlanmış (boolean fonksiyonu biçiminde olan) bir beyan biçimidir.

Bu açıklama, tip fikrine ilişkin çok genel bir tanım belirtmektedir. Bu tanıma göre, tamsayı gibi bir tür, bir tamsayı değerine uygulandığında true döndüren ve başka herhangi bir değere uygulandığında false döndüren bir işlem olarak düşünülebilir. Bu tanım, tek sayılar türü gibi daha alışılmadık türler tanımlanmasına olanak verir. Bu tanımın, tek bir değerin birden fazla türde olmasını (birden fazla tür işlemlerini tatmin edebilmesini) sağladığına dikkat edin. Örneğin, 1 numaralı tamsayıyı ifade eden değer, hem bir tam sayı, hem de tek bir tamsayıdır.

Nesne modeli, bir sistemde hangi tür tiplerin var olabileceğini tanımlamamaktadır. Bu modelin ayrıntılı bir şekilde ele alınması, türler için belirli bir biçimselliği tanımlayacaktır. Biçimselliğin seçimi, tip olarak kullanılabilecek işlem (predicate) kümesini kısıtlayabilir.

Tip kavramının bu tanımı, aynı nesneyi (veya başka bir soyut varlığı) belirten farklı değerleri birbirinden ayırmayı sağlayan tiplere olanak verir. (fakat zorunlu kılmaz.) Eğer belirli bir nesne modeli, aynı nesneyi (veya başka bir soyut varlığı) tanımlayan değerleri birbirinden ayırmaya yarayan tipleri sağlamıyorsa, tipler, (değerler üzerinde varolan işlemlerden hariç olarak) nesneler üzerinde varolan işlemler (predicate) olarak görülebilirler.

Hali hazırda varolan nesne-yönelimli programlama dilleri, sınıf adı verilen, nesnelerin birbirinden farklı uygulanımlarını birbirinden ayırmaya yarayan tipler sunmaktadırlar. Arayüz tipinin daha genel bir kavramı, jenerik işlemleri sezmeyi sağlayan alttaki açıklamada bulunmaktadır.

Nesne model, tiplerin nesneler veya çağırılabilen işlemler olup olmadıklarına bir kısıtlama getirmemektedir. Bazı sistemlerde, tip-kontrolü derleme zamanında gerçekleştirilir ve tipler çalıştırma sırasında temsil edilmezler.

Bir tipin genişletilmesi (extension), belirli bir tipi tatmin eden değerlerin kümesidir. Bir tipin genişletilmesi, yeni nesneler yaratıldığı sürece, zamana bağlı olarak değişebilir ve varolan nesneler üzerinde yan etkilere sebep olabilir.

Eğer tipler, aynı nesneyi tanımlayan birden çok değerleri ayırt etmiyorlarsa, tip genişletilmesi, değerlerin kendilerinden hariç olarak, sunulan değerler tarafından tanımlanan nesnelerin içerilmesi olarak görülebilir.

Bir ilişki, tipler üzerinde tanımlanan uygunluk olarak adlandırılmaktadır. Eğer a tipine uyumlu olan herhangi bir değer, b tipine de uyumluysa, a tipi, b tipine uyumludur.

Uyumluluk ilişkisini tanımlayacak olan belirli bir nesne modeli, mantıksal düşünce ile uyumlu olmalıdır. Uyumluluk, kalıtımın geleneksel kullanımlarından biri olan, nesnelerin hiyerarşik bir şekilde sınıflandırılmalarına olanak verir. Tip uyumluluğuna aşağıda bir örnek verilmektedir.

Bir nesne tipi, tip genişlemesinin bir nesneler kümesi olduğu tip çeşididir. (Tam olarak nesneleri tanımlayan değerler kümesidir.) Diğer bir deyişle, bir nesne tipi, sadece nesneler (nesneleri tanımlayan değerler) tarafından tatmin edilebilir.

Bir nesne birden çok tipi tatmin edebilir. Örneğin, bir Lotus 2.2 tablo nesnesi, (azalan belirginlikle) şu tipleri tatmin sırayla tatmin etmektedir: Lotus 2.2 tablosu, Lotus tablosu, yazdırılabilir nesne. Bu örnekte, bütün tipler uyumluluklarına göre ilişkilidirler. Bazı sistemler, bir nesnenin uyumlulukla alakalı olmayan tipleri tatmin etmesine olanak sağlayabilir. Örneğin, belirli bir bireyi tanımlayan bir nesne, kişi tipini ve hissedar tipini birlikte tatmin edebilir. (Hissedar olmayan kişiler veya kişi olmayan, örneğin, şirket olan hissedarlar var olabilir.)

Bir arayüz, nesnenin olası kullanımlarının kümesininin tanımıdır. Özellikle, bir arayüz, bir nesnenin anlamlı bir şekilde katılabileceği olası talep kümesini tanımlar. Bir nesne, arayüz tarafından tanımlanan her bir talep için anlamlı olması ile arayüzü tatmin eder denir.

Klasik nesne sisteminde, bir arayüz işlemler kümesinden oluşur. Örneğin, “yazdırılabilir nesneler” arayüzü, tek bir yazdır işleminden oluşabilir. Bir nesne, bu işlemlerden birini tanımlayan herhangi bir talebin ilk parametresi olarak anlamlıysa, klasik bir nesne arayüzünü tatmin eder denir.Genelleştirilmiş nesne modelini destekleyen bir sistem, nesnenin anlamlı olarak ortaya çıkabildiği işemlerin belirli biçimsel parametrelerini tanımlayan daha karmaşık arayüzleri destekleyebilir. Örneğin “yazdırılabilir nesne” arayüzü, yazdır talebinin ilk parametresi olarak görünen ve “yazıcı nesnesi” arayüzü, yazdır talebinde ikinci öz nitelik olarak ortaya çıkan bu nesneler tarafından tatmin ediliyor olabilir.

Arayüzler bir anlamda, imzaların ikilileridir. Taleplerin anlamlılığını belirleyen “kısıtlamalar” kümesi içeren, bir sistem düşünülebilir. İmzalar, bu bilginin işlem-merkezli görüşüdür ve arayüzler, bu bilginin nesne-merkezli görüşüdür. Nesne modeli, bu bilginin nereden kaynaklandığını belirlemez. Bir nesne, yazdır işleminin davranışını tanımladığı için yazdırılabilir olabilir. Alternatif olarak, bir nesne, yazdır işleminin beyan edilen ilk argümanın tipi olan yazdırılabilir nesneyi tatmin ettiği varsayıldığı için yazdırılabilir olabilir.

Bir arayüz tipi, herhangi bir nesne (harfi harfine nesneyi tanımlayan bir değer) tarafından tatmin edilebilen bir tiptir.

Bir arayüz, belirli bir nesnenin ne yapabileceğini ve istemcinin nesneyi nasıl kullanma niyetinde olduğunu aynı anda tanımlayabilir. Örneğin, bir arayüz tipi, bir prosedür için biçimsel öz niteliği bildirmek, mevcut öz nitelik nesnesinin prosedür içerisinde nasıl kullanılacağını göstermek için kullanılabilir.

Arayüz tipleri üzerinde uyumluluk küçük bir arayüz tarafından nasıl kullanılacağı açıklanan bir objenin, aynı zamanda daha büyük bir arayüz tarafından tanımlandığı şekilde kullanılabilmesi anlamına gelir. Arayüz tipleri üzerinde uyumluluk en azından basit tip sistemleri için, küme içermesi ile ilişkilidir. Yazdır ve Kopyala işlemlerinden oluşan arayüz, sadece yazdır işlemini içeren arayüzle, yazdırılabilen ve kopyalanabilen (içermeden dolayı) bir nesne basitçe yazdırılabildiği için uyumludur.

Her bir nesnenin, nesne için anlamlı olan bütün talepleri açıklayan esas (azami, en genel) bir arayüzü vardır.

Bir nesnenin esas arayüzü, yeni işlemler tanımlanması gibi belirli sebeplerden dolayı genişleyebilir veya daralabilir. Nesne modeli, istemsinin bir nesnenin esas arayüzünü belirleyebildiği bir hizmetin varlığına izin verir ama bunu zorlamamaktadır.

4. Nesne Uygulanımı

Bu bölüm, nesne uygulanımı ile ilgili kavramları, örneğin, nesnelerin uygulanımı ile ilgili kavramları tanımlar. (Bkz. Şekil 3.)

4.1 Taleplerin Gerçekleştirilmesi

İstenen bir hizmeti gerçekleştirmenin pratik etkisi depolanan bazı verilere erişen bazı kodların çalıştırılmasına neden olmaktır. Saklanan veriler, hesaplama sisteminin durumunun bir bileşenini temsil eder. Talep edilen hizmeti gerçekleştiren kod, sistemin durumunu durumunu değiştirebilir. Bir hizmeti gerçekleştirmek için yürütülen koda bir metod (yöntem) adı verilir.

Bir NYG sistemi, istemciler ve hizmetler arasındaki arabulucu olarak görev yapan bir altyapı içermektedir. (Tabii ki, bir hizmet kendi isteklerini yayınlayarak da bir istemci olabilir.) Altyapının birincil işlevi, istenen bir hizmeti gerçekleştirmek için uygun kodu seçmek ve bu kodu uygun verilere erişmek için çalıştırmaktır.

Nesne uygulanımının ana kavramları

Talep edilen bir hizmeti gerçekleştirmek ve metod tarafından erişilecek veriyi seçmeye bağlama (binding) denir. Bağlama, (tipik olara bir metodun) seçiminin, mevcut talep bildirilmeden önce olursa statik, veya seçim talep bildiriminden sonra yapılıyorsa dinamik olarak adlandırılır.

Statik bağlama, bildirimlere bağlı olarak derleyiciler tarafından gerçekleştirilir. Talep bildiren bir program yapısı genellikle değişkenler içerir. Programdaki bildirimler, bu değişkenler tarafından ifade edilen olası değerleri kısıtlayabilirler.

Talep edilen bir hizmeti gerçekleştirilen kod belirli etkenlere, özellikle talebe katılan nesnelerin kimliğine bağlı olabilir.

Katılan nesnelere bağlı olan kod seçimi, bir işlemin jenerik olarak açıklanmasına temel oluşturur. Klasik bir nesne modelinde, seçilen kod, sadece bir talebin ilk öz niteliği tarafından tanımlanan nesne sınıfı ve işleme bağlıdır.

Seçilen kod ayrıca, nesnenin “konumu” veya istemcinin “konumu” gibi diğer etkenlere de bağlı olabilir. (Nesne modeli bir konum kavramını zorunlu kılmamaktadır.) Belirli bir nesne teknolojisi istemciler için artırılmış bir öngörülebilirlik sağlayan bağlama işlemi üzerinde kısıtlamalar empoze edebilir. NYG modeli, kasıtlı olarak bunun gibi kısıtlamalar empoze etmemektedir.

Talep edilen bir hizmetin gerçekleştirilmesi, kaydedilmiş bir veriye erişebilen bir metodun çalıştırır. Eğer metodun ve verinin kalıcı biçimi çalıştırılamıyorsa, önce çalıştırılamayan metodu ve veriyi, çalıştırılabilir bir adres alanına kopyalamak gerekli olabilir. Bu işleme aktivasyon denir. Bunun tersini yapan işleme ise pasifleştirme denir.

4.2 Davranışın gerçekleştirilmesi

Bir NYG sistemi, taleplerin davranışlarının gerçeğe dönüştürülmesini sağlayan mekanizmaları sunmak zorundadır. Bu mekanizmalar, veri yapısı tanımları, metod tanımlamaları ve NYG altyapısının çalışacak metodların ve metodlar için erişilebilir hale getirilen verilerin seçiminin nasıl yapılacağının tanımlamalarını içerebilir. Mekanizmalar ayrıca yeni verilerin tahsis edilmesi ve nesnenin uygun metodlarla ilişkilendirilmesi gibi, nesne yaratımı ile ilgili olan somut eylemleri tanımlamak için sağlanmak zorundadırlar.

Bir nesnenin uygulanımı -ya da kısaca uygulanım- nesnenin yaratılması ve nesnenin uygun hizmet kümesine katılımını sağlayan bilgilerin tanımlanmasıdır. Bir uygulanım, tipik olarak, bir nesneyle ilişkili olan çekirdek durumu temsil eden veri yapısının tanımını ve bunun yanısıra bu veri yapısına erişen metodların açıklamalarını içerir. Ayrıca, tipik olarak, nesnenin niyet edilen tipi hakkında bilgi içerir. (Bir uygulanım, varolan bir nesneye yeni davranışlar eklemek için de kullanılabilir.)

Bir NYG sistemi, metod tararından gerçekleştirilmekte olan hizmet için varolan talebin içinde tanımlanan nesne veya nesnelere referans veren metod tanımlarına izin veriyor olabilir. Kendine-referans olarak adlandırılan bu yetenek, bir metodun, aynı nesne ya da nesneleri dahil eden ek taleplerde bulunmasına olanak verir. Kendine-referans, tek bir metod, farklı nesneler tarafından çalıştırılabildiğinde yararlıdır. (Smalltalk’ta kendine-referans self kelimesi ile gösterilir.)

4.3. Davranışın paylaşılması

Bir NYG sistemi, tipik olarak, uygulanımı paylaşan aynı davranışa sahip olan nesnelere izin veren mekanizmaları sağlayacaktır. Bir sınıf, birden fazla nesnenin yaratılması için örneklenebilen (instantiated) uygulanımdır. Sonuç olarak ortaya çıkan nesnelere, sınıfın örnekleri denir. Kendine-referans, bir sınıfın birden çok örneği, metodları paylaştığında yararlıdır.

Ancak, aynı davranışı destekleyen birbirinden farklı uygulanımlar da olabilir. Örneğin, belirli bir donanım ortamı için belirli uygulanımlar mevcut olabilir. Ayrıca, zamanla, performans artırımı için sunulmuş olan uygulanım serileri de mevcut olabilir.

Çoğu varolan sistemde, sınıflar, uygulanımı ve arayüz tipini birlikte tanımlamaktadırlar. Bu görevleri tek bir varlıkta birleştirmek, bir sistemin aynı davranışın farklı uygulanımlarını desteklemesini zorlaştırabilir. Bir sınıf, bir nesne olabilir veya olmayabilir.

Bir NYG sistemi, tipik olarak kendi uygulanımlarının bazı kısımlarını ortak kullanan benzer davranışlara sahip nesnelere izin veren mekanizmalar sunacaktır. Örneğin, bir uygulanım kalıtımı, bir uygulanımın artımlı bir şekilde düzelmesi olarak tanımlanan uygulanıma izin vermek için sağlanıyor olabilir.

Uygulanımların ortak kullanımını sağlayan alternatif bir teknik delegasyondur. Delegasyon, talebi gerçekleştiren metodun içindeki kendine referansın, talebi bildiren metodda kendine referans olarak aynı nesne veya nesneleri döndürebilmesi yeteneğidir.

5. Sözlük

Aktivasyon: (activation) Metodların ve kaydedilmiş verinin kalıcı biçiminin, çalıştırılabilir bir adres alanına, metodların, kaydedilmiş veriler üzerinde çalışmalarını sağlamak için kopyalanması.
Davranış: (behavior) Bir talebin davranışı, talep edilen hizmetin (sonuçları içerecek şekilde) yarattığı gözle görülebilen etkileridir. (Bakınız sonuçlar.)
Bağlama: (binding.) Talep edilen hizmeti gerçekleştirmek için varolan kodun ve kod tarafından erişilecek verinin seçilmesi. (Bakınız metod)
Sınıf: (class) Bir sınıf, aynı (başlangıç) davranışa sahip olan nesnelerin yaratılması için örneklenebilen uygulanımdır.
İstemci: (client) Bir istemci hizmet talep edebilen herhangi bir hesaplama varlığıdır.
Uygunluk: (conformance) Uygunluk, mantıksal düşünüşle uyumlu olan tipler üzerinde tanımlanmış olan ilişkidir. A tipini tatmin edenherhangi bir değer, aynı zamanda b tipini de tatmin ediyorsa, bir a tipi, b tipine uygundur denir.
Dinamik Bağlama: (dynamic binding) Talep bildirildikten sonra gerçekleştirilen bağlama işlemidir.
Delegasyon: (delegation) Delegasyon, talebi gerçekleştiren metodun içindeki kendine referansın, talebi bildiren metodda kendine referans olarak aynı nesne veya nesneleri döndürebilmesi yeteneğidir. (Bakınız kendine-referans)
Kapsüllenmiş: (encapsulated) Bir nesne, ilişkili olduğu durum sadece belirli metodlar tarafından erişilip değiştirilebiliyorsa, kapsüllenmiştir.
Tipin genişlemesi: (extension of a type) Bir tipin genişlemesi, tipi tatmin eden değerler kümesidir.
Jenerik işlem: (generic operation) Kavramsal düşünce. Bir işlem, gözle görülür farklı davranışlara yol açan, farklı uygulanımlara sahip nesnelerden talep edilen bi hizmeti tanımlıyorsa jeneriktir denir.
Tutamaç: (handle) Tutamaç, nesneyi güvenilir bir şekilde tanımlayan bir değerdir. (Bakınız nesne adı)
Kimlik: (identity) Kavramsal düşünce. Bir varlık doğası gereği diğer varlıklardan ayır edilebiliyorsa, (örneğin ayrık yaratım olayları temelinde) bir kimliğe sahiptir denir.
Uygulanım: (implementation) Bir uygulanım, bir nesnenin yaratımı ve nesnenin uygun olan hizmet kümesini sunmadaki katılımı için gerekli olan bilgiyi sağlayan açıklamadır. Bir uygulanım, tipik olarak, bir nesneyle ilişkili olan çekirdek durumu temsil eden veri yapısının tanımını ve bunun yanısıra bu veri yapısına erişen metodların açıklamalarını içerir. Ayrıca, tipik olarak, nesnenin niyet edilen tipi hakkında bilgi içerir.
Uygulanım kalıtımı: (implementation inheritance) Diğer uygulanımların artımlı bir şekilde düzeltilmesiyle meydana gelen uygulanım yapısı.
Kalıtım: (inheritance) Diğer tanımlamaların artımlı bir şekilde düzeltilmesiyle meydana gelen tanımlama yapısı. (Bakınız uygulanım kalıtımı)
Örnek: (instance) Bir sınıfın örneklenmesiyle yaratılan nesne.
Örnekleme: (instantiation) Bir sınıf kullanarak bir nesne yaratma işlemi.
Arayüz: (interface) Bir arayüz, nesnenin olası kullanımlarının kümesini tanımlamasıdır. Özellikle, bir arayüz, bir nesnenin, anlamlı olarak katılım sağlayabildiği olası talepleri tanımlar.
Arayüz tatmini: (interface satifaction) Bir nesne, arayüz tarafından tanımlanmış her bir olası talep için anlamlı ise bir arayüzü tatmin eder.
Arayüz tipi: (interface type) Bir arayüz tipi, belirli bir arayüzü tatmin eden her nesne tarafından tatmin edilen tiptir. (Bakınız nesne tipi)
Sabit: (literal) Nesne olmayan bir varlığı tanımlayan değer. (Bakınız nesne adı)
Anlamlı: (meaningful) Bir talep, mevcut öznitelikleri, söylenen işlemin imzasını tatmin ediyorsa, anlamlıdır.
Metod: (method) Talep edilen bir hizmeti gerçekleştirmek için çalıştırılabilen kod.
Nesne: (object) Bir NYG nesnesi, NYG hesaplama sisteminde, ayrılmış bir varlık tipidir.
Nesne Yaratımı: (object creation) Bir nesnenin daha önce varolan nesnelerden farklı olacak şekilde varolmasını sağlayan olay.
Nesne Uygulanımı: (object implementation) Bakınız uygulanım.
Nesne Adı: (object name) Bir nesneyi tanımlayan değer. (Bakınız tutamaç)
Nesne Tipi: (object type) Bir nesne tipi, genişlemesinin bir nesneler kümesi (harfi harfine nesne tanımlayan değerler kümesi) olduğu bir tiptir. Diğer bir deyişle, bir nesne tipi, sadece nesneler (nesneyi tanımlayan değerler) tarafından tatmin edilir. (Bakınız arayüz tipi)
İşlem: (operation) Bir işlem, talep edilebilen tanımlanmış bir hizmettir. Bir işlemin ilişkili olduğu, anlamlı bir talep içerisindeki öz nitelikleri kısıtlayabilen bir imzası vardır.
İşlem adı: (operation name) Bir işlemi tanımlamak için bir talep içerisinde kullanılan isim.
Katılmak: (participate) Bir nesne, talebin bir veya birden fazla özniteliği, o nesneyi tanımlıyorsa, talebe katılır.
Pasifleştirme: (passivation) Aktivasyonun tersi.
Esas arayüz: (principal interface) Bir nesnenin esas arayüzü, nesnenin anlamlı olduğu bütün talepleri tanımlayan arayüzdür.
Talep: (request) Talep bir olaydır. Bir istemci, bir hizmetin gerçekleştirilmesi için talep bildiriminde bulunudur. Bir taleple ilişkili olan bilgi, sıfır veya daha fazla (mevcut) öz nitelikten oluşur. Ayrıca, istemciye dönebilecek olan sonuçlar da taleple ilişkilidir.
Sonuçlar: (results) Bir talebin sonuçları, istemciye geri dönen, talep edilen hizmetin gerçekleştirilmesi sırasında ortaya çıkan istisnai koşulları gösteren durum bilgisi gibi değerleri içerebilen bilgidir. 
Kendine-referans: (self-reference) Kendine referans, bir metod tarafından gerçekleştirilmekte olan hizmet talebinde tanımlanan nesne ya da nesnelerin, metod tarafından saptanması yeteneğine denir. (Smalltak’da kendine referans self kelimesiyle gösterilir.) (Bakınız delegasyon)
Hizmet: (service) Bir hizmet, talebe bağlı olarak gerçekleştirilebilen hesaplamadır.
İmza: (siganture) Bir imza, işlemi adlandıran taleplerde anlamlı olan, olası (mevcut) öz nitelik değerlerinin kısıtlandığı işlem tanımıdır. Mevcut öz niteliklerinin talepte adlandırılmış işlem ile ilişkili olan imzayı tanımlamadığı talepe, anlamsız talep denir.
Durum: (state) Bir hesaplama sisteminin durumu, gelecek taleplerin davranışını açıklamak için ihtiyaç duyulan eski taleplerin tarihçesi hakkındaki bilgidir.
Statik Bağlama: (static binding) İstemcisinin statik özelliklerine bağlı olarak, talebin bildirilmesinden önce gerçekleştirilmiş bağlama işlemidir.
Tip: (type) Tip, olası bir sonucu karakterize eden veya, olası öz nitelikleri kısıtlayan imzada kullanılabilen değerler üzerinde tanımlanan işlemdir. (predicate) (boolean fonksiyonu)
Değer: (value) Bir değer, bir talepte olası mevcut değer olabilen herhangi bir varlıktır. Nesneleri tanımlamaya yarayan değerler, nesne adı olarak adlandırılır. Nesneler dışındaki varlıkları tanımlayan değerler, sabit olarak adlandırılır. (literals)

Referanslar

[1] D. H. Fishman, et al. Iris: An Object-Oriented Database Management System. ACM ‘Iransactions on Office Information Systems, 5:1 (Jan. 1987). 
[2] S. Keene. Object-oriented programming in Common Lisp. Symbolics Press and AddisonWesley, 1989. 
[3] A. Snyder. The Essence of Objects. Report STL-89–25, Hewlett-Packard Laboratories, Palo Alto, California, 1989.


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com

Kodlama öğrenmek istiyorum. Nerden başlamalıyım?


Uzun zamandır içinizde bu isteği hissediyordunuz. Ama korkuyordunuz, çünkü nereden başlamanız gerektiğini bilmiyordunuz. Kod yazan artist arkadaşınız iyi para kazandığını iddia ediyordu ama “Ya Selman, bana da öğretsene şu işi.” dediğinizde, he deyip, hı deyip geçiştiriyordu. Doktor ayağınıza geldi. Kafanızdaki nereden başlamalıyım sorusuna bu yazıda yanıt vermeye çalışacağım.

Kodlama yaparken amacımız program yazmaktır. Peki program ne? Program, belli bir girdiyi alıp, işe yarar bi çıktıya dönüştüren varlıktır. Yani bir amacı olacak. Örneğin resim paylaşacağım (instagram), video paylaşacağım (youtube), saçma sapan şeyler paylaşacağım (facebook), milleti trolleyeceğin (twitter) programlar yazabilirim. Şimdi revaçta oyun meselesi var, millet çatır çatır tavla, okey oyunu yazıp para kazanıyormuş, ayrı.

Şu yazının şu paragrafına gelene kadar öğrendiğimiz şeyleri gözden geçirelim;

  1. Programın bir girdisi olacak.
  2. Program bu gelen girdileri işleyecek.
  3. Sonuç olarak, işe yarar, elle tutulur çıktılar üretecek.

Buraya kadar okuduğunuza göre bir kod parçasının aşağı yukarı ne yaptığını anladınız demektir.

Programlama dahi işi değildir arkadaşlar.


Hatta bence örgü örmek falan daha zor. Programlamayı ben resim yapmaya benzetiyorum. Aklınızda büyük bir resim var ve o büyük resime ulaşana kadar, küçük küçük parçaların resimlerini çizmeye çalışıyorsunuz. Tıpkı resim yapmak gibi, alıştırma yaptıkça konuyu daha iyi anlıyorsunuz ve daha güzel resimler yapmaya başlıyorsunuz. Ama daha güzel resimleri yapana kadar tüm o sıkıcı alıştırmaları yapmak zorundasınız.

Peki ya Matematik?

Programlamanın temelinde matematik olduğunu duymuşsunuzdur. “Ayyy, aman benim hiç matematik temelim yok demeyin.” Minibüste verdiğiniz para üstünü hesaplarken, dolar bozdururken, “Ay, buna fiş kesmeseniz kaç para olur?” derken, “Bulgur pilavına, 1 ölçek su, 1 ölçek bulgur, 1/3 ölçek et suyu” derken, “Ya şimdi bu çocuğa mesaj atsam, cevap verdiğinde 15 dakika geç cevap versem, tepkisine göre beni sevip sevmediğini anlarım.” derken zaten tıkır tıkır matematik hesabı yapıyorsunuz. Matematiğin zor diye düşünülmesinin sebebi, matematiğin değil, anlatmasının zor olması. Anladıktan sonra herşey kolay.


Şu yazıda anlattığım kahve baristası eleman gaza gelip programlama hocası olduysa, Türkiye’nin en büyük hackeri, bilgisayarla zerre alakası olmadığı halde okey puanları çalındığı için delirip, Türkiye’nin hatta dünyanın en büyük hacker’larından biri olduysa, siz de bence aklınıza koyduğunuz şeyi başarırsınız. Yeter ki kendinizi korkutmayın.

O ne demek?

Şu demek; programlama öğreneceğim diye piyasadaki en zor kitabı alıp satır satır okursanız duman olursunuz. Onun yerine minik minik adımlarla başlayın, anlamadığınız yeri sorun, küçük küçük şeyler yapmaya çalışın. Bu konuyla ilgili ipuçları da vereceğim.

Hangi dil?


Bence önce HTML, sonra JavaScript sonra da keyfe göre Python, Ruby ya da PHP. Bunlar kesmedi derseniz, C#, Java ve en son C ve C++.

Peki öğrenmek için ne yapayım?

Tutorial, tutorial, tutorial. Yani adım adım öğreten makaleler okuyacaksınız. İnsanımız okumayı pek sevmediğinden video tutorial daha çok seviyor ama ben ileriye saramadığım için sıkıntılar basıyor ama tabiki tercih meselesi.

Başka?

Önce HTML öğrenin dedim. HTML aslında bir programlama dili değil, ama konuya ısınmanızı sağlar. HTML web sayfası yapmaya yarayan dil. Piyasada benim kitabım dahil bir sürü kitap var. Hepsi birbirinden değerli kaynaklar. Ama en önce, örneğin, kendinizi, adınızı, soyadınızı, kendiniz hakkında kısa bir paragrafı, twitter, instagram, facebook linklerinizi içeren minik bir site yapabilirsiniz. Dandik olsun, sonra zaten CSS ile güzelleştirmeye kasacaksınız.

Daha sonra zırt pırt içeriği elle güncellemek istemiyorum dediğiniz anda gerçek bir programlama diline geçeceksiniz. Ben PHP uzmanıyım, ama şimdi başlayanlara Python, Ruby, JavaScript de öneririm. Gerçi programlamanın temelini öğrendikten sonra hepsi aynı.

Programlamanın temeli?

Evet. Programlamanın temeli genellikle aynı. Sırayla anlatayım.


  1. Değişken. Yani bir isme sahip olup, farklı değerlere sahip olabilen varlık. Mesela yaş gibi. Yaş değişkeni her insan için bir sayıyı temsil eder. Adamın biri sana gelip 28 dese, tuhaf tuhaf yüzüne bakarsın ama “yaş=28” derse, daha az tuhaf tuhaf bakarsın. “Ayol, deli mi ne?” dersin ama yaşının 28 olduğunu da anlarsın.
  2. Eğer, değilse. Yani koşula bağlı bıdı bıdı. Mesela tekel bayiinden bira alacaksın. Tekelci abi “Yaş?” diye sordu. 17 dersen o birayı alamazsın. Yani yaşın 18’den büyükse, birayı alırsın, 18’den küçükse babayı alırsın.
  3. Koşula bağlı döngü. “Ay, bu ne şimdi?” diyorsun. Şu; Beden dersinde lak lak yaptın, gıcık beden hocası sana kalkıp, 100 kere şınav çek derse bu döngü oluyor. Koşul da 100. Ya da git, okulun bahçesinin etrafını 10 kere koş derse yine aynı şey.
  4. Metod, fonksiyon. Fonksiyon diyince daha afilli duruyor ama aslında değişkene benzer bi muhabbet. Annen sana “Kızım kalk odanı topla dediği anda odanı toplaman gerektiğini anlarsın.” Senin için odanıTopla emri, yerdeki bütün eşyaları dolaba özenle tıkıştırmak da olabilir, tek tek bütün kıyafetleri katlayıp, çekmecelere dizip, yerleri viledayla silmek de olabilir. Eğer annen odanıTopla emrinin iyi uygulanmadığını görürse, terlikFırlat metodunu uygulayabilir. Bu da senin için hiç iyi olmaz. Sonuç olarak odanıTopla kelimesinin, yapman gereken eylemlerin bütününü temsil ettiğini biliyorsun. Artı annen odanıTopla(‘hem de hemen’) dediyse, sen bu emri 3 saat sonra yerine getirmeye karar verirsen, o terlik kafana anan odanı toplamadığının farkına vardığı anda yapışacaktır.


Sonuç olarak?


Sonuç olarak, lisedeyken birşeyleri öğrenmenin ezberlemenin rezalet derece zor olduğunu, eziyet olduğunu düşünürdüm. Sonra uçakların kokpitini düşündüm, binlerce düğme, gösterge… Bu adamlar bu kadar nasıl şeyi akıllarında tutuyorlar ki diye sordum kendi kendime. Sonra bizim evin mutfağını düşündüm. En az 10 tane dolap, 4–5 tane çekmece, her çekmecede ayrı bir alet, toplamda binlerce parça eşya, çatal bıçak, tribüşon, servis tabağı, çay bardağı, demlik ve hepsini aklımızda tutabiliyoruz.


Hatta “Kalk kızım çay demle.” dendiğinde, “Annneaa, çaydanlık nerdea?” diye sormuyoruz, çünkü terlik geliyor. Hatta, tek tek tüm o aletler ve elli çeşit yemek malzemesiyle, değişik değişik bin türlü yemeği aklımızdan uydurup hızlıca yapabiliyoruz. Demek ki beynimize de programlar gibi bunları yüklemişiz.


Konuya bu açıdan baktığımızda, yapamayacağımız, öğrenemeyeceğimi ve başaramayacağımız hiç bir şey yok. Özellikle ev hanımları olarak.


Eleştiri, yorum ve önerilerinizi bekliyorum. Sevgiyle kalın.


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com

Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş

Uyarı: Bu serideki kod örnekleri ve yazılar, seri tamamlanana kadar değişebilmektedir.

Nesne Yönelimli Programlama’yı duydunuz. Kendinizi geliştirmek için öğrenmek zorunda olduğunuzu öğrendiniz. Ancak nereden başlamak gerektiğini bilmiyorsunuz. Bi kaç kitap açtınız, kafanız karıştı, kitabı yatağın üzerine fırlattınız ve spagetti kod yazmaya, müşterinize böyle uygulamalar sunmaya devam ettiniz. İçten içe bir suçluluk duyuyorsunuz ama yapacak birşey yok deyip hayatınıza devam ettiniz. Artık buna bir dur demenin zamanı geldi.


Bildiğiniz gibi ben kuru kuruya kavramları anlatmayı sevmiyorum. İnternetten bulduğu slayttan ders anlatan hocalar gibi ezberden kavram sıralamayı doğru bulmuyorum. Piyasada çok güzel kaynaklar, detaylı kapsamlı kullanım klavuzları var ama ben kavramları anlatmak için Hayvan sınıfı, Memeliler sınıfı, At sınıfı ve Eşşek sınıfı gibi hayatınızda hiçbir yazacağınız programda olmayacak kavramları da kullanmayı sevmiyorum. Detaylı kaynakları konunun mantığını kavradıktan sonra satın alıp, gerçek, profesyonel uygulamalar geliştirirken açıp bakarsınız. Mesela Rıza Hoca’nın A-dan Z-ye PHP kitabı vardır. Tavsiye ederim. Ama konuyu hiç bilmiyorsanız, kendinizi bana bırakacak, önce minik adımlarla, masal dinler gibi beni dinleyeceksiniz.


Neden nesne yönelimli programlama öğreneyim ki?

  1. Çünkü bir sonraki aşamaya, yani düzenli, temiz, dünyadaki standartlara uygun, tekrar kullanılabilir, kodu açtığımızda profesyonel birine göstermeye utanmayacağımız kodlar yazmak istiyoruz.
  2. Bizden sonra spagetti karman çorman kodumuz üzerinde çalışacak gariban yazılımcının edeceği küfürler yüzünden kulaklarımızın çınlamasını istemiyoruz. Kodumuz okunabilir oluyor. Karmaşa azalıyor.
  3. Minik minik, kendi projelerimize ait kütüphane oluşturup, yeni projelerde bunları modüler olarak kullanabilmek istiyoruz. Tıpkı Lego gibi. Kodumuz yeniden kullanılabilir oluyor.
  4. Ben zamanında spagetti kod yazarken, kendi kodumu okuyamadığım oluyordu, sonra kendime küfrediyordum, bunun da olmasını istemiyoruz.
  5. Nesne yönelimli programlamanın temel kavramlarını öğrendiğimiz zaman, diğer nesne yönelimli programlama dillerini kolayca kavrayabiliyoruz ve o dilleri kolayca öğrenebiliyoruz.
  6. İyi okunabilen kodlarda, karmaşa daha az olduğu için, hataları yakalamak daha kolay oluyor.
  7. Test edilebilen kodlar yazabiliyoruz. Bu sayede daha sonra ortaya çıkabilecek hataları önceden yakalayabiliyoruz.

Nesne yönelimli programlama öğrenmek istiyorum. Peki nereden başlamalıyım?

Hiç kod yazmaya girmeden önce kavramları, yani konunun mantığını anlamamız gerekiyor. “Nedir bu nesne kavramı? Ne işe yaradığını az çok anlattık ama tam olarak nedir? Hocam, gerçek hayatta bu ne işime yarayacak?” diye lisede, zavallı öğretmenlerimize ergen kafasıyla ukala ukala sorduğumuz soruların cevabını önce kendimiz verebilecek hale gelmemiz gerekiyor. Yani nesne yönelimli programlayı öğrenmek ve anlamak biraz da bilinç meselesi. Bilinçli, yani ne yaptığımızın farkında olarak çalıştığımızda, üreteceğimiz eserlerin iyi veya kötü, kaliteli veya kalitesiz olup olmadığını kendimiz bilirsek, o zaman kendimize güvenimiz de, başkalarının da bize olan güveni de otomatik olarak artıyor.

Peki nedir bu Allahın belası Nesne kavramı?

Aristo abimiz. Yakışıklıymış da.

Kitabı yazmaya başlarken, nesne kavramını çok iyi anladığını sanan ben, konuyu araştırmaya başladığımda olayın yazdığımız salak programları “class” bloklarının içine sokmaktan daha derin olduğunu gördüm. Programlama konusunun temeline indiğimde orada matematikle karşılaştım. Matematiği anlamaya çalıştığımda, aslında çabalarımızın felsefeden başka bir şey olmadığını gördüm. Yani, uğraştığımız şey, dünyadaki olayları anlamak, bunun bir şekilde yorumlamak ve elle tutulur bir değişim yaratacak bir sonuca ulaşma çabası göstermekten ibaret. Yazacağımız programlar, yaptığımız işler görülebilir bir değişiklik yaratmak üzerine. Tam da bu noktada programlamadan çıkıp gerçek hayata geçiyoruz ve anlıyoruz ki nesne dediğimiz varlık sadece basit bir programlama kavramı değil.

Nasıl yani?

Yanisi şöyle. Nesne kavramının, dilbilimde (hani özne-nesne, tümleç, yüklem falan var ya.), fizikte (belirli bir yükseklikten, belirli hızda düşen, kütlesi olan nesne), psikolojide (algıladığımız nesneler) yeri var. Biz bilgisayarlarla ilgili olduğumuzdan, bilgisayarlar da düşünen elektronik beyinler olduğundan kavramın düşünce ile ilgili olan tanımına bakalım.

nesne İng. object

(Lat. objectum = karşıda bulunan, karşıya konan) : 1. (Genellikle) Karşımızda bulunan şey. 2. Öznenin bağlılaşık kavramı olarak, özne ediminin, bilincin kendisine yöneldiği şey: a. Kendisine yönelinen, düşünülen, tasarlanan nesne, kendisine yönelen bir edim olmadan var olmayan şey; bilinçte, düşünme nesnesi (konu) olarak düşünme olayının karşısında bulunan şey; düşüncel (ideal) nesne. b. Özne ediminden, bilinçten, bağımsız olan gerçek (real) nesne; gerçeklik olarak, dışdünyanın bir parçası olarak bilincin karşısında duran şey.

BSTS / Felsefe Terimleri Sözlüğü 1975

Şey diye bitirmiş. Peki şey nedir? Ona da bakalım.

şey İng. thing

(Günlük dilde) Herhangi bir düşünce konusunu göstermeğe yarayan belirsiz terim. (Felsefede) 1. Düşünen bilincin konusu olabilen, gerçekte var olmayıp da yalnızca düşünülmüş olan her şey. Bu anlamda: düşünce nesnesi = ens rationis. 2. Kişiye karşıt olarak: Bilinçten yoksun varlık. 3. Gerçek olan, bilincin dışında, kendi başına var olan tek nesne (ens reale). Böyle bir var olan, tek nesne olarak niteliklerin taşıyıcısı töz diye de anlaşılır. 4. Duyularla kavranabilen cisimsel nesne.

BSTS / Felsefe Terimleri Sözlüğü 1975

Bu tanımdan şunu anlıyoruz. Birşeyin nesne olabilmesi için belirli kurallar var.

  1. Düşünen aklımızın, yani zihnimizin dışında olacak.
  2. Düşüncemizin konusunu oluşturacak, yani düşüncemize yakıt oluşturacak.
  3. İsmi varsa nesne, ismi yoksa şey olarak adlandırılacak.

İnsanlar olarak bizim, evrim sürecinde, hayvanlardan farklılaşmamızın en büyük ayırt edici özelliği, düşünebilmemizdir. Düşüncenin dil kavramının insanlarda ortaya çıkmasıyla başladığını biliyoruz. Kaynak

Peki düşünce nedir? Nasıl başlar? Düşünce algı ile başlar. Kendi dışımızdaki ortamda algıladığımız sinyaller, önce beynimize gider. Bu kısaca 3 saattir aradığın, önünde duran ama görmediğin ve salak salak aradığın anahtara baktığın aşama oluyor. O şeyin anahtar olduğunu anladığın anda, algı sürecin tamamlanıyor.

Daha sonra bu algılar ile belirli sonuçlar üretmemiz gerekiyor ki düşünme eylemimiz amacına ulaşsın. Burada, bilgisayar programları veya algoritmaları ile varolan benzerlik dikkatinizi çekti mi? Bilgisayar programları ile biz belirli girdiler kullanarak belirli sonuçlara ulaşmaya çalışıyoruz. Girdi-İşleme-Sonuç adımlarıyla programları çalıştırıyoruz. Düşünce kavramında da, girdiler algılanmış nesnelere, işlem düşünceye ve sonuçlar yani çıktılar, çıkarımlara denk geliyor. Bizim bilgisayarlardan farkımız, benlik bilincine sahip olmamız ve etraftaki kendimizden farklı olan nesnelerin bizim dışımızda olduğunu idrak etmemizden kaynaklanıyor. (Bu konuyu, özellikle yapay sinir ağları konusunu daha derinlemesine araştırırsanız bundan bir 5 sene sonra zengin olacağınızı garanti ediyorum.) Yani nesne, düşüncemizin konusu olan soyut ya da somut varlıkları, önce kendimizden daha sonra birbirlerinden ayırt etmemizi sağlıyor. (Burada da mantık konularına giriyoruz. Üniversite ders kitabı falan yazarsam bu kavramlara derinlemesine ineceğim söz.)

Gerçek olan ne?

Bakışlara dikkat. Descartes

Yani ben gerçekten varolduğumu nasıl anlıyorum? Bu konuda Rene Descartes 1637 “Cogito ergo sum” demiş. Yani “Düşünüyorum, o halde varım.” Düşünme eyleminin kendi zihnimizden bağımsız bir dünyanın varlığını gerektirdiğini biliyoruz. fMRI denen beyin taraması insana birşey gösterildiğinde, beynin hangi bölgelerine kan akışı olduğunu gösteriyor. Yeni bilimsel gelişmeler sayesinde, önce zihinden bağımsız varlığın, sonra algı kavramının düşünme kavramının öncülü olduğunu da öğrenmiş bulunuyoruz. Descartes abimizin haklı olduğunu bu sayede anlıyoruz. Yani nesne kavramını oluşturabilmemiz için önce bir içsel zihne (ya da bilgisayar programlarında, çalışan bir hesaplama ünitesine) daha sonra da algılara ihtiyacımız var. (Bu da bilgisayar programlarında girdilere denk geliyor.)

İnsanlar olarak mantıklı düşünmenin önemini biliyoruz. Konuya mantık açısından baktığımızda mantığın en temel kavramlarıyla da ilişki içinde olduğumuzu görmek kolay. Kaynak

Mantığın 4 temel ilkesi diyor ki:

  1. A, A’dır. (Özdeşlik ilkesi)
  2. A, A olmayan değildir. (Çelişmezlik ilkesi)
  3. C, ya A’dır, ya da A olmayan’dır. (3. şıkkın imkansızlığı ilkesi)
  4. Sonuç varsa, sebep vardır. (Yeter sebep ilkesi)

Matematiğin bile temellerini oluşturan bu düşünsel ilkeler, nesne kavramı için de aynı şekilde geçerlidir. Nesneleri, kendimizden, düşünen zihnimizden ve diğer nesnelerden ayırt edebiliyorsak (1. ve 2. ilke), Nesnelere farklı isimler ile referanslar verebiliyorsak (3. ilke) ve düşünürken ya da programlar yazarken girdilerin, sonuçlar üretebileceğini biliyorsak (4. ilke), mantıklı düşünebiliyoruz demektir.

(Not: Kanıtı olmayan gerçekler kitabı’nda gerçekliğin fiziksel varlıklardan çok, bu varlıkların kendileri dışında yarattığı etkileri de içerdiği iddia ediliyordu. Yani, Mozart, eserleri ile birlikte yaşamaya, düşüncesindeki deseni farklı insanalara aktarmasıyla yaşamaya devam ediyor diye iddia ediliyordu. Bunu da yazayım da kafanız daha da karışsın.)

Nesne yönelimli programlama nerden çıktı?

Ole-Johan Dahl ve Kristen Nygaard abilerimiz

Norveç’te 1961 yılının soğuk bir sonbahar akşamı, yani soğuk derken -25 falan, Ole-Johan Dahl ve Kristen Nygaard abilerimiz, Simula denen programlama dilini icat ediyorlar. Kaynak Amaçları, yazılan programların insanlar tarafından daha kolay anlaşılmasını ve gerçek hayatta varolan bilimsel olayların daha verimli bir şekilde simüle edilmesini sağlamak.

Alan Kay

Nesne yönelimli programlamayı yaygınlaştıran Alan Kay abimiz, 1971 yılında Amerika’da Smalltalk programlama dilini icat ediyor. Alan Kay abinin bu konudaki motivasyonu ise, kendisi biyoloji kökenli olduğundan, programları, birbiriyle konuşan, birbirinden bağımsız hücreler gibi düşünmesi. Yani kendisinin sahip olduğu biyoloji temeli bugünkü kullandığımız programlama dillerine de temel oluşturuyor. Daha çok merak edenler için kaynak.


Burada Nesne Yönelimli programlamanın tarihçesine inmek istemiyorum. Araştırmanızı, okumanızı tavsiye ederim. Bu yazı ders kitabı haline gelirse bunu da yazarım.

Özne-nesne ilişkisi

Ali Topu At

Nesnelerin zihnimizin, ya da bilgisayarımızın dışında varlıklar olduğunu ve kavramları birbirinden ve kendimizden ayırt etmemize yardımcı olduğunu anladık. Bunun dışında nesnelerin gerçek dünyaya referans verdiğini, gerçek dünyadaki kavramları temsil ettiğini de az çok biliyoruz. Peki nesneler birbirileriyle nasıl ilişkilere sahipler. Bir nesneyi kullanan, onun üzerinde etkisi olan nesneye, özne diyoruz. Dilbilimde, “Ali topu at!” derken, Ali’nin özne, topun nesne, atmak kelimesinin de yüklem, yani yaptığımız işlem olduğunu biliyoruz. Bilgisayar programlarında, özne, bir diğer nesneyi çağıran, ona mesaj gönderen, onu yaratan bir bilgisayar programıdır.

Üyelik ilişkisi (IS-A)

Nesneler belli bir grubun üyesi olabilirler, yani daha üst bir sınıfın özelliklerine sahip olabilirler. Bu sayede birden fazla nesne grubunu, başka gruplardan ayırt edebiliriz. Eski yunanda yaşayan en büyük düşünür Aristo abimiz, taksonomi bilimiyle, canlı varlıkları, ortak özelliklerine göre sınıflandırmış. Biz de nesneleri aynen bu şekilde sınıflandırabiliyor, birden fazla nesneyi ortak özelliklerine göre gruplandırıp onları tek tek belirtmeden, düşüncemizin konusu haline getirebiliyoruz. Yani, Ali, Ayşe, Ahmet, Mehmet demek yerine, “Gıcık insanlar” diyebiliriz mesela. Ayrıca bir grubun üyesi olmayan iki ayrı nesne, aynı eylem içinde birlikte yer alıyorlarsa, onlar da belirli bir grubun içinde kabul edilebilirler. Örneğin, “Ali ve Ayşe İstabul’a gittiler” dediğimizde, Ali ve Ayşe’nin gitme eylemini yapabilen türden varlıklar olduklarını anlayabiliriz. Kaynak

Nesneler farklı nesnelerin bir araya gelmesiyle oluşabilirler. (HAS-A)


Yukarıda verdiğimiz grup örneğinde, eğer oluşturduğumuz grubun kendisi de bir nesne olarak kullanılabiliyorsa buna, Toplama (yani Aggregation) diyoruz. Örneğin, bir etli türlü yapmak için, patlıcan, domates, bamya, tereyağı kullanıyoruz ve sonuç olarak etli türlü elde ediyoruz. Elde ettiğimiz sonuç yine bir nesne meydana getirebilir. Kaynak

Nesnelerin kendilerine ait özellikleri ve yapabildikleri vardır.


Örneğin Ahmet çok yemek yerse, kilo alır. Ahmet tutup dünyayı yiyip 101 kiloya çıkarsa mutsuz olur. Ahmetin nümerik kilo özelliği, onun şu anki duygu durumu özelliğini etkiler. Ahmetin yemek yiyebilmesi onun yapabildiği şeyleri gösterir. Ahmet kilosundan mutsuz olup kendini aç bırakırsa, akşam daha çok acıkıp, iki tane fırın sütlaç, iki prosiyon döner ve kaymaklı ekmek kadayıfı yer ve daha çok mutsuz olur.

Nesneler birbirlerine mesaj gönderebilirler.

Ahmet’i uzun zamandan sonra gören arkadaşı, “Baba sen napmışsın, acayip kilo almışsın yea.” diyebilir. Arkadaşı Ahmet’e mesaj göndermiş olur. Ahmet’de buna sinir olup 3 ay boyunca spor salonuna yazılıp iyi bir diyet ve egzersiz programı ile fit bir hale gelebilir. Yani, nesnelerin birbirlerine gönderdikleri mesajlar, nesnelerin eylemlerini tetikleyebilirler. Bu eylemler sonucunda nesneler kendi özelliklerini değiştirebilirler.

Şimdilik bu kadar. Umarım kavramlar kafanızda biraz oturmuştur. Yazı ile ilgili düzeltme ve yorumlarınızı, sorularınızı bekliyorum.

Serinin devam yazısına şuradan ilerleyebilirsiniz:

View at Medium.com


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com