folder Tahribat.com Forumları
linefolder Programlama Genel
linefolder OOP 'De Kullanılan "Inherit" Terimi



OOP 'De Kullanılan "Inherit" Terimi

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek

    Selamlar,

    Bir kaynaktan JavaScript'de kullanmalık OOP (Object Oriented Programming) çalışırken "Adding methods to our object using prototype" konusuna geldim. Konuyu anladım, burada bir sıkıntı yok fakat OOP de sıkça kullanılan "inherit" terimine biraz kafam takıldı.

    Şimdi kaynakta diyor ki:  "We use it (prototype ı kastediyor) when we would like an object to inherit a method after it has been defined. "

    "inherit" kelimesi, Türkçe dilinde "miras olarak devralmak, kalıt kalmak, varis olmak" gibi anlamlara sahip. Yine tureng'de bilgisayar terimi olarak anlamı da "devralmak" olarak tercüme edilmiş.

    Biz prototype'ları niçin kullanıyoruz? Cevap yine kaynakta verilmiş: "Think of prototyping mentally as 'attaching' a method to an object after it's been defined..".  Yani özetle diyor ki: "her metodu constructor fonksiyonunda tanımlamak zorunda değiliz, prototype ile bir objeye daha sonra da yeni bir metod ekleyebiliriz".

    Şimdi tüm bunların içinde "devralmak, kalıt kalmak, miraz olarak devralmak" gibi anlamlara gelen "inherit" nasıl oluyor da yukarıda bahsettiğim bir objeye yeni bir metod ekleme anlamında kullanılabiliyor..

    Okuduğunuz için teşekkürler.

    faydalandığım kaynak (JS de OOP nasıl uygulanır merak edenler için faydalı) : http://www.javascriptkit.com/javatutors/oopjs2.shtml

     

    RockZs tarafından 13/Eki/16 12:45 tarihinde düzenlenmiştir
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    NmC
    NmC's avatar
    Kayıt Tarihi: 23/Kasım/2008
    Erkek

    Hocam soyle dusun, Memeli diye bir ust sinif olusturdun bunun altindan Maymun, insan gibi siniflar tureteceksin Memeli sinifi biraz hayali sinif gibi birsey ve sadece standartlari olusturuyosun burda ve bu standartlari olustururken diyorsun ki her memelinin yurumesi gerek ve bunun icin bir yuru() diye bir metodu olmasi lazim ama Memeli dedigin sey hayali oldugu icin burda kodlamiyorsun bu metodu. Alttan turetilen siniflara kodlama zorunlulugu getiriyorsun.

    Peki bu memeli sinifi ne icin var?

    Ileride yazdigin bir kod ile butun memelileri hareket ettiren bir kod yazman gerektiginde.

    Memeli a[0] = (Memeli)new Insan();

    Memeli a[1] = (Memeli)new Maymun();

    for(int i = 0; i < a.size; a++){

    a[i].yuru();

    }

    gibi atraksyonlar yapabiliyorsun.


    There are 10 types of people in the world. Those who knows binary and those who dont...
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek

    NmC verdiğin bilgiler için teşekkür ederim. Sanırım şunu demek istedin (JavaScript dilinde):

    //the constructor function (yapıcı fonksiyon)
    function Memeli(turkceAd, latinceAd) {
    	this.turkceAd = turkceAd;
    	this.latinceAd = latinceAd;
    }
    
    //instantiating new objects (yeni objelerin somutlaştırılmaları)
    var insan = new Memeli("insan", "homo sapiens");
    var maymun = new Memeli("maymun", "primate");
    var yunus = new Memeli("yunus", "delphinidae");
    
    //a new method for the constructor function (yapıcı fonksiyon için yeni bir metod)
    Memeli.prototype.yuru = function() {
    	this.yeniOzellik = "yuru";
    	console.log(this.turkceAd + "adli memeliye eklenen yeni kaabiliyet: " + this.yeniOzellik);
    }
    
    //an another new method for the constructor function (yapıcı fonksiyon için bir başka yeni bir metod)
    Memeli.prototype.zipla = function() {
    	this.yeniOzellik = "zipla";
    	console.log(this.turkceAd + "adli memeliye eklenen yeni kaabiliyet: " + this.yeniOzellik);
    }
    
    //applying new methods to objects (yeni metodların objelere uygulanması)
    insan.yuru();
    maymun.yuru();
    yunus.zipla();

    prototype kullanımı ile ilgili güzel bir örnek oldu. sanırım "inherit" yani devralmak/miras almak dan bahsedilen, metodun objeye değil de doğrudan class a eklenmesi ve objenin de bir komut ile o metodu uygulaması (yani devralması).

    RockZs tarafından 13/Eki/16 14:00 tarihinde düzenlenmiştir
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek
    RockZs bunu yazdı

    NmC verdiğin bilgiler için teşekkür ederim. Sanırım şunu demek istedin (JavaScript dilinde):

    function Memeli(turkceAd, latinceAd) {
    	this.turkceAd = turkceAd;
    	this.latinceAd = latinceAd;
    }
    
    var insan = new Memeli("insan", "homo sapiens");
    var maymun = new Memeli("maymun", "primate");
    var yunus = new Memeli("yunus", "delphinidae");
    
    Memeli.prototype.yuru = function() {
    	this.yeniOzellik = "yuru";
    	console.log(this.turkceAd + "adli memeliye eklenen yeni kaabiliyet: " + this.yeniOzellik);
    }
    
    Memeli.prototype.zipla = function() {
    	this.yeniOzellik = "zipla";
    	console.log(this.turkceAd + "adli memeliye eklenen yeni kaabiliyet: " + this.yeniOzellik);
    }
    
    insan.yuru();
    maymun.yuru();
    yunus.zipla();

    prototype kullanımı ile ilgili güzel bir örnek oldu. sanırım "inherit" yani devralmak/miras almak dan bahsedilen, metodun objeye değil de doğrudan class a eklenmesi ve objenin de bir komut ile o metodu uygulaması (yani devralması).

    Yukarıdaki kalıtımın örneği değil söylediğiniz gibi. Normalde kalıtım bizi kod tekrarından kurtarır. C# için:

    public class Memeli

    {

       private string _ad;

       private string _latincead;

        public Memeli(string Ad, string LatinceAd) {

       ...}

       public void Yuru(int Adım) { 

       ... }

    }

    public class Yarasa : Memeli {

       public void Uç(int Kulaç) {

       ... }

    }

    public class Yunus: Memeli {

       public void Yüz(int Metre) {

       ... }

    }

     

    Burada Yarasa ve Yunus; Memeli sınıfından kalıtım alıyor. Tüm memeliler yürüyebilirken, yunus ve yarasanın sırasıyla yüzmek ve uçmak gibi ek özellikleri var. Her seferinde memelinin yürüme özelliğini hem yunus hem yarasa için yazmaktansa basitçe memeliden miras aldık. Hatta ve hatta yunus ve yarasayı, memeliden türemiş bir nesne isteyen her yere yollayabilme kabiliyetine kavuştuk. Yine C# için konuşursak 

    List<Memeli> Memeliler = new List<Memeli>();

    Memeliler.Add(yarasa);

    Memeliler.Add(yunus); gibi tek yerde de saklayabiliriz. Tipinden emin olduğumuz nesneleri alt sınıfa kast edip kullanabiliriz.

    Oradaki örnek pek güzel olmamış (prototip tabanlı nyp biraz farklı bir konsept olmasına rağmen sınıf tabanlı nyp benzeri özellikleri de kullanabiliriz: https://www.sitepoint.com/simple-inheritance-javascript/ http://javascriptissexy.com/oop-in-javascript-what-you-need-to-know/

    Yukarıdaki bağlantılardan takip etmenizi tavsiye ederim.

     


    Olaylara karışmayın!
  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek
    YeniHarman bunu yazdı
    RockZs bunu yazdı

    NmC verdiğin bilgiler için teşekkür ederim. Sanırım şunu demek istedin (JavaScript dilinde):

    function Memeli(turkceAd, latinceAd) {
    	this.turkceAd = turkceAd;
    	this.latinceAd = latinceAd;
    }
    
    var insan = new Memeli("insan", "homo sapiens");
    var maymun = new Memeli("maymun", "primate");
    var yunus = new Memeli("yunus", "delphinidae");
    
    Memeli.prototype.yuru = function() {
    	this.yeniOzellik = "yuru";
    	console.log(this.turkceAd + "adli memeliye eklenen yeni kaabiliyet: " + this.yeniOzellik);
    }
    
    Memeli.prototype.zipla = function() {
    	this.yeniOzellik = "zipla";
    	console.log(this.turkceAd + "adli memeliye eklenen yeni kaabiliyet: " + this.yeniOzellik);
    }
    
    insan.yuru();
    maymun.yuru();
    yunus.zipla();

    prototype kullanımı ile ilgili güzel bir örnek oldu. sanırım "inherit" yani devralmak/miras almak dan bahsedilen, metodun objeye değil de doğrudan class a eklenmesi ve objenin de bir komut ile o metodu uygulaması (yani devralması).

    Yukarıdaki kalıtımın örneği değil söylediğiniz gibi. Normalde kalıtım bizi kod tekrarından kurtarır. ... 

    Selamlar,

    Aslında yukarıda verdiğim örnek bir kalıtım (inheritance) örneği. OOP'de sadece metodlar (davranışlar) değil, properties (özellikler) de kalıtım gösterebilirler. Bu örnekte de 3 tane memeli tanımladım (insan, maymun ve yunus), bunların hepsinin türkçe ve latince isimleri gibi aynı class'dan (prototiptik NYP 'de class yapısı yok, onun yerine Object üzerinden prototipler oluşturuluyor) özellikler taşıyorlar. 

    Bu örnekte, bütün objelere prototype ile yeni özellikler katmam kafa karıştırıcı gelmiş olabilir. Tabi bir de "nested" bir yapı söz konusu.

    Şimdi yukarıdaki yanıtınızda verdiğiniz örneği hatırlayalım:

    Burada Yarasa ve Yunus; Memeli sınıfından kalıtım alıyor. Tüm memeliler yürüyebilirken, yunus ve yarasanın sırasıyla yüzmek ve uçmak gibi ek özellikleri var. Her seferinde memelinin yürüme özelliğini hem yunus hem yarasa için yazmaktansa basitçe memeliden miras aldık. Hatta ve hatta yunus ve yarasayı, memeliden türemiş bir nesne isteyen her yere yollayabilme kabiliyetine kavuştuk.

    Bunu JavaScript dilinde Prototypal OOP kullanarak kalıtım sağlayacak şekilde dediğiniz gibi şöyle kodlayabiliriz:

    /*
    Yapılanlar:
    Yarasa ve Yunus; Memeli sınıfından kalıtım alıyor.
    Tüm memeliler yürüyebilirken, yunus ve yarasanın sırasıyla yüzmek ve uçmak gibi ek özellikleri var.
    Her seferinde memelinin yürüme özelliğini hem yunus hem yarasa için yazmaktansa basitçe memeliden miras aldık.
    Hatta ve hatta yunus ve yarasayı, memeliden türemiş bir nesne isteyen her yere yollayabilme kabiliyetine kavuştuk.
    */
    
    var islemTakibi = 1;
    //object constructor function (nesne yapıcı fonksiyon)
    function Memeli(yorgunluk, isim){
    	this.yorgunluk = yorgunluk;
    	this.isim = isim;
    	this.yuru = function(){
    		//mesela bir memeli yürürse yorgunluk 10 puan artsın.
    		var yorgunlukIlkDeger = this.yorgunluk;
    		this.yorgunluk = this.yorgunluk + 10;
    		console.log(islemTakibi + ". işlem: \n" + this.isim + " adlı hayvanın yorgunluğu " + yorgunlukIlkDeger  + " puandı. \n" + this.isim + " yürüdüğü için yorgunluğu 10 puan arttı.\nŞimdi yorgunluğu " + this.yorgunluk + " oldu.");
    		islemTakibi++;
    	};
    };
    
    //Adding methods to our object using prototype (prototip kullanarak yüzme metodunun tanımlanması)
    Memeli.prototype.yuz = function(){
    	var yorgunlukIlkDeger = this.yorgunluk;
    	//mesela yüzen bir memelinin yorgunluğu 30 puan artsın.
    	this.yorgunluk = this.yorgunluk + 30;
    	console.log(islemTakibi + ". işlem: \n" + this.isim + " adlı hayvanın yorgunluğu " + yorgunlukIlkDeger  + " puandı. \n" + this.isim + " yüzdüğü için yorgunluğu 30 puan arttı.\nŞimdi yorgunluğu " + this.yorgunluk + " oldu.");
    	islemTakibi++;
    };
    
    //Adding methods to our object using prototype (prototip kullanarak yeni uçma metodunun tanımlanması)
    Memeli.prototype.uc = function(){
    	var yorgunlukIlkDeger = this.yorgunluk;
    	//mesela uçan bir memelinin yorgunluğu 50 puan artsın.
    	this.yorgunluk = this.yorgunluk + 50;
    	console.log(islemTakibi + ". işlem: \n" + this.isim + " adlı hayvanın yorgunluğu " + yorgunlukIlkDeger  + " puandı. \n" + this.isim + " uçtuğu için yorgunluğu 50 puan arttı.\nŞimdi yorgunluğu " + this.yorgunluk + " oldu.");
    	islemTakibi++;
    }
    
    //aşağıda yeni objeler (maymun, yunus ve yarasa) somutlaştırıyoruz. 
    //bunların hepsi constructor fonk. sayesinde başta zaten Memeli objesinden(sınıfından) kalıtım alıyorlar.
    //yani burada da aslında bir inheritance (kalıtım) söz konusu.
    var maymun = new Memeli(15, "Charlie"); //maymun objesi tanımlandı. başlangıçta azıcık yorgun olsun (15). adı da "maymun" olarak girildi..
    var yunus = new Memeli(0, "Flipper"); //yunus obj. tanımlandı. başlangıçta hiç yorgun değil (0). adı "yunus".
    var yarasa = new Memeli(25, "Batman"); //yarasa obj. tanımlandı. bu da başlangıçta azıcık yorgun olsun (25). adı "yarasa".
    
    //şimdi, en üstte tanımladığımız yapıcı fonk. gereği zaten tüm hayvanlar yürüyebiliyorlar
    //şimdi önce maymun ve yarasayı yürütelim (yunusu yürütmüyoruz)
    maymun.yuru();
    yarasa.yuru();
    
    //şimdi yunus için yüzme, yarasa için uçma özelliklerini ilgili aynı şekilde ilgili objelere verelim.
    yunus.yuz();
    yarasa.uc();

    Yukarıdaki kod çalıştırıldığında çıktı şu şekilde oluyor:

    1. işlem:
    Charlie adlı hayvanın yorgunluğu 15 puandı.
    Charlie yürüdüğü için yorgunluğu 10 puan arttı.
    Şimdi yorgunluğu 25 oldu.
    2. işlem:
    Batman adlı hayvanın yorgunluğu 25 puandı.
    Batman yürüdüğü için yorgunluğu 10 puan arttı.
    Şimdi yorgunluğu 35 oldu.
    3. işlem:
    Flipper adlı hayvanın yorgunluğu 0 puandı.
    Flipper yüzdüğü için yorgunluğu 30 puan arttı.
    Şimdi yorgunluğu 30 oldu.
    4. işlem:
    Batman adlı hayvanın yorgunluğu 35 puandı.
    Batman uçtuğu için yorgunluğu 50 puan arttı.
    Şimdi yorgunluğu 85 oldu.

     

    RockZs tarafından 13/Eki/16 21:33 tarihinde düzenlenmiştir
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    YeniHarman
    YeniHarman's avatar
    Kayıt Tarihi: 17/Haziran/2012
    Erkek

    Uzun uzadıya alıntı yapmadan doğrudan söylemek istediğim kısma geçiyorum.

    Verdiğiniz JS kodunda sıkıntı var, kalıtım gibi davranıyor ama saf kalıtım değil. Sadece tek bir prototipiniz var ve tüm nesneleri bundan kopyalıyorsunuz. Kısaca eldeki maymun da insan da aynı sorulara aynı şekilde cevap veriyor (C# örneğinde durum böyle değildi, istemediğimiz kısmı almadık). İstediğimiz gerçekten bu mu? Yoksa overkill mi oluyor? Örneğinizde bir arabasamağı atlamış olabilir misiniz (önce memeli nesnesinin kopyasını oluşturup bu kopyaların prototiplerine ekleme yapmak ve örnek nesne olarak bunları almak gibi?) Aşağıda bağlantısını verdiğim tartışmalara göz gezdirin.

    http://javascript.info/tutorial/inheritance

    https://stackoverflow.com/questions/2064731/good-example-of-javascripts-prototype-based-inheritance

     


    Olaylara karışmayın!
  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    RockZs
    RockZs's avatar
    Kayıt Tarihi: 30/Haziran/2002
    Erkek

    YeniHarman hocam,

    Haklısınız, verdiğim örnek "inherit" için çok açıklayıcı olmamış. Sanki başka bir özelliğe ait gibi duruyor.

    yukarıdaki örnek JS de inherit kavramını çok basitçe açıklamış.

    OOP konusunu birçok kaynaktan araştırmaya devam ediyorum çünkü anladığım kadarıyla OOP (ve JS) ile çok temiz kodlar yazılabiliyor ve bu kodlar özellikle Agile "metodu" ile sürekli ve kolayca güncellenebiliyorlar. Birçok önemli nodejs modülünün kodlarına baktığımda oop'da kullanılan prototype yapısını görüyorum. Örneğin:

    https://github.com/Automattic/kue/blob/master/lib/kue.js

    adresindeki koda baktığınızda, önce:

    function Queue( options ) {
      options     = options || {};
      this.name   = options.name || 'kue';
      this.id = [ 'kue', require('os').hostname(), process.pid ].join(':');
      this._options   = options;
      this.promoter     = null;
      this.workers      = exports.workers;
      this.shuttingDown = false;
      Job.disableSearch = options.disableSearch !== false;
      options.jobEvents !== undefined ? Job.jobEvents = options.jobEvents : '';
      redis.configureFactory(options, this);
      this.client = Worker.client = Job.client = redis.createClient();
    }

    gibi bir değişken (object) tanımlıyor. Daha sonra aşağıdaki gibi bir çok prototype ile yukarıdaki Queue objesinden de kalıtım alarak, sanırım bunları extend ediyor. Mesela:

    Queue.prototype.setupTimers = function() {
      if( this.warlock === undefined ) {
        this.lockClient = redis.createClient();
        this.warlock    = new Warlock(this.lockClient);
      }
      this.checkJobPromotion(this._options.promotion);
      this.checkActiveJobTtl(this._options.promotion);
    };
    
    Queue.prototype.process = function( type, n, fn ) {
      var self = this;
    
      if( 'function' == typeof n ) fn = n, n = 1;
    
      while( n-- ) {
        var worker = new Worker(this, type).start(fn);
        worker.id  = [ self.id, type, self.workers.length + 1 ].join(':');
        worker.on('error', function( err ) {
          self.emit('error', err);
        });
        worker.on('job complete', function( job ) {
          // guard against emit after shutdown
          if( self.client ) {
            self.client.incrby(self.client.getKey('stats:work-time'), job.duration);
          }
        });
        // Save worker so we can access it later
        self.workers.push(worker);
      }
      this.setupTimers();
    };
    
    Queue.prototype.completeCount = function( type, fn ) {
      if( 1 == arguments.length ) {
        fn = type;
        return this.card('complete', fn);
      }
      return this.cardByType(type, 'complete', fn);
    };
    
    ...

    gibi.. Ne kadar sade bir yazım. Benim yazdığım kodlarda callback-hell den geçilmiyor ve bugüne kadar bir kez olsun prototype kullanmadım.. Daha bir çok eksiklik sayabiliriz. Madem bir iş yapıyorum, onu da sağlam yapayım istiyorum. Bu yüzden OOP yi yukarıdaki şekilde kullanarak düzgün ve kolay geliştirilebilir kodlar yazmak amacındayım.

    Yorumların için tekrar teşekkürler.

Toplam Hit: 1289 Toplam Mesaj: 7
yazılım lost in translation lost in oop