December 24, 2021

Merhaba,

Yabancı forumda da dile getirdiğim gibi çok belirgin olmayan bir protect ve private ikişkisi var. Ama gelen ilk cevaba bakılırsa protected:

  • Miras alınan sınıfın üyesine, alt sınıf (onu miras alan) için ekstradan erişim imkanı tanıyormuş.

En azından benim anladığım bu; bir başkası:

  • Bütün bu özellikleri, sadece modüller arası çalışırken görebilmemiz. Zaten bu konuyu 3 Ekim 2021 Zoom toplantısında konuşmuştuk. Özellikle package çerçevesinde...

Örneğin bu 3 özelliği şu 2 modülde görebiliyoruz:

module app;

package
{
  class Any
  {
    //protected/*
    private//*/
    string Data;

    this(string data) {
      this.Data = data;
    }

    @property getData() {
      return Data;
    }
  }
}

// package içine girebiliyor...
Any getClass(string d) {
  return new Any(d);
}

// private özelliğini deliyor...
string getData(Any test) {
  return test.Data;
}

main.d

import app;
void main()
{
  enum str = "int";
  auto any = str.getClass();
  assert(any.getData() == str);
}

Aslında bu programda hata vermemesi dışında hiçbir şey göremiyoruz! Hata vermediği için de sınıfa ve onun içerdiği veriye dolaylı yoldan erişebiliyoruz...

Hoş, bu kod hiçbir işe de yaramıyor :)

Ama getClass() ve getData() işlevleri olmayınca app.d modülüne ve onun içindeki pakete erişmenin hiçbir yolu yok. Yani dış modüllere kapalı bir kutu. Paket içindekilere sınırsız açık tabi.

Son Bir Not: Diyelim ki package içinde korumalı şekilde çalışırken, sınıflardan birini bu izolasyonun dışına almak istediğiniz de 2 seçeneğiniz var:

  • Başına public eklemek veya
  • Fiziki olarak package dışına (cut&paste almak.

Başarılar...

December 24, 2021
On 12/24/21 7:22 AM, Salih Dincer wrote:

> * Miras alınan sınıfın üyesine, alt sınıf (onu miras alan) için
> ekstradan erişim imkanı tanıyormuş.

Evet. Ben de öyle demişim:

  http://ddili.org/ders/d/sarma.html#ix_sarma.protected

> En azından benim anladığım bu; bir başkası:
>
> * Bütün bu özellikleri, sadece modüller arası çalışırken görebilmemiz.

Evet. D'de modül içindeki olanakların birbirinden gizlenmesi diye bir kavram yok. C++ gibi dillerle karşılaştırıldığında garip gibi görünse de aslında D'nin iş bitirici tarafını ortaya seriyor: Bir programcı bir modülde çalışırken neden modülün içindeki olanaklara erişemesin? Kimi kimden koruyoruz? Mantık o. O yüzden, D'de private'ın aynı modül içinde bir gücü yok.

Kendi deneyimlerime dayanarak, ben bu koruma olanaklarının yalnızca başka insanların kullanacakları kütüphanelerde anlamlı olduklarını düşünmeye başladım. Kendi kodlarımda private'ı yalnızca özel bir "mutlak değişmez" (invariant) bulunduğunda ve kendimi bile hatalardan korumak gerektiğinde kullanıyorum.

Programlarımda yalnızca bir kaç tane private kullandığımı (protected, vs. hiç yok) bir sunum sırasında söylediğimde ustalar beklendiği gibi bana katılmadılar.

Ali