Ben de OOP ile 1-2 sene önce tanıştım ve ben de benzer bir bakış açısıyla bakardım. Şimdi ise fikirlerim değişti; bu yüzden "Aralarındaki farklar nedir?" sorusunu, taze hatıralarım ile birlikte sanırım yanıtlayabilirim...
Aslında programlama tekniği olarak baktığımızda, kuşkusuz bir çok farkı var. Bunu Wikipedia maddelerini karşılaştırarak görebiliriz. Ama eğlenceli bir açıdan baktığımızda (işin büyüsünden sıyrıldığımızda) aslında hiç bir fark yok. Çünkü assembly tarafında siz bir işlevi (call ile) çağırırken nasıl bir altyordama dallanıyorsa, nesneler üzerinde cirit atarken de benzer şeyler oluyor. Tıpkı şu ikisinin farkı olmadığı gibi:
import std.stdio;
struct KayıtDefteri {
string kimlik;
string isim;
string[] notlar;
}
void main() {
auto kayıt = KayıtDefteri("E21f", "falan filan", [ "geldi", "durdu", "gitti" ]);
kayıt.writeln();
DefterYaz(kayıt).writeln();
}
string DefterYaz(KayıtDefteri kayıt) {
string çıktı = KayıtDefteri.stringof ~ "(\"";
çıktı ~= kayıt.kimlik ~ "\", \"";
çıktı ~= kayıt.isim ~ "\", [";
auto ekle = kayıt.notlar.length - 1;
foreach(i, not; kayıt.notlar) {
çıktı ~= "\"" ~ not ~ "\"";
if(i < ekle) çıktı ~= ", ";
}
return çıktı ~ "])";
}/* Çıktısı:
KayıtDefteri("E21f", "falan filan", ["geldi", "durdu", "gitti"])
KayıtDefteri("E21f", "falan filan", ["geldi", "durdu", "gitti"])
*/
Elbette çıktılarının aynı olması demek hiç bir farkları olmadığı anlamına gelmiyor. Çünkü D, bir yapının içindeki üyeleri ekrana yazarken karşılaştığı nesne elemanlarının (element, member) her birine göre farklı bir altyordamı çağırıyor olmalı. Örneğin integer değerler için çok farklı, float'lar için daha farklı algoritmalar işletiliyor. Tıpkı Ali hocamın verdiği hayvanlar sınıfı gibi. Çünkü o sınıftaki üyelerin özelliklerini bilmesek dahi, sınıfı geliştiren kişinin bilgisi dahilinde, ihtiyacımız olan her şey bir yapı altında toplanmıştır.
Ben 'KayıtDefteri()' içindeki her üyenin dizge olduğunu bildiğimden, gereksiz tüm olasılıkları eleyip kendi çıktımı ürettim; hatta özelleştirebilirdim de. Aslında std.format modülündeki algoritmaları, 'writeln()', dolayısıyla 'write()' işlevi de kullanmakta. Sanırım o da std.format.formattedWrite (https://github.com/D-Programming-Language/phobos/blob/master/std/format.d) temelli bir şey olmalı.
Biraz da gerçek hayattan örneklersek:
Vücudumuzu oluşturan her bir hücrenin aslında benzer yapı taşlarından meydana geldiğini hatırlarsak neler döndüğünü az çok fark edebiliriz. Beynimiz, her bir hücreye sinir ağları ile bağlanmaz öyle değil mi! Kendi başına hareket eden bir sürü yapı olsa da temelde birbirleri ile uyumlu bir kod (DNA) ile şekillendikleri için her an merkezi bir denetleme sistemine ihtiyaç duymadan, hepsi birbiri ile uyumlu çalışmakta. Size sadece en üstten bir denetleme yeterli olmakta. Örneğin yolda adım atmak için sadece omuriliğinizden kalcanızdaki kas gruplarına doğru bir tetiklenme gider. Yolda yürürken acaba şu adımımı atsam diye düşünmezsiniz ya da durmak istediğinizde arkadan gelen ayak olduğu yerde kalmaz. ATP dengesi azaldığında beynimiz bunun meşgul olmaz ama kaslar arasındaki potasyum azaldığında meydana gelen exception bize ağrı olarak ulaştırılır.
İşte böyle...
Özetle, vücudumuzdaki her işlev bir nöron grubu tarafından kontrol edilseydi herhalde şu yazıyı yazmak benim yıllarımı alırdı...:)
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]