Forum: Ders Arası RSS
Nitelikler
@property
Sayfa:  1  2  sonraki 
Avatar
Salih Dinçer #1
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Nitelikler
Aslında bu konu şurada tartıştığımız JSON konusunun devamıdır.

Acaba D.ershane'de, nitelik dersinin (Nitelikler @property) kullanım anlamı, @safe ve pure gibi şeylerin anlatıldığı derste veya başka bir yerde bahsediliyor mu? Çünkü hala yapılar dışında kullanımının ne farkı olduğunu anlayamadım. Hatta varsayılan olarak bu şekilde (@property'li) kalması gerektiğini ve geriye uyumluluk için ön tanımlı olmaktan çıkarıldığını da yeni öğrendim...

Dip Not: Yukarıdaki paragrafta derdimi anlatamamış olabilirim çünkü diğer konuda uyarladım! Kısaca @property'nin yapı dışında kullanımını anlatan bir makale (İngilizce de olabilir) var mı? Bunun neyi fark ettirdiğini çok merak ediyorum...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
@property, yapılarda ve sınıflarda da olduğu gibi, parametre almayan işlevlerin parantezsiz olarak çağrılabilmelerini sağlar. Hayır, kitapta bu kullanım geçmiyor. İngilizceleştirdikçe geliştiriyorum; oraya gelince eklerim.

    int i = foo; // foo() @property olduğu için parantezsiz 

Ali
zafer #3
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih doğrusunu istersen bu konuyu öyle kısa bir mesajla anlatmak çok kolay değil, yinede bildiğim kadarıyla aktarmaya çalışayım yanlış veya eksiğim varsa Ali düzeltir diye düşünüyorum. Aklına takılanları zaten sen sorarsın.

class Ütü
{
    private int utuSicakligi;    // 0..100 derece
 
    public this()
    {
        this.utuSicakligi = 0;
    }
 
    public void ÜtüyüAyarlananSıcaklığaGetir()
    {
        // Gerekli işlemler
    }
 
    @property void ÜtüSıcaklığıAyarla(int sıcaklık)
    {
        enforce (sıcaklık > 100, "Ütü sıcaklığı bu değere ayarlanamaz.");
        
        utuSicakligi = sıcaklık;
    }
}

Ben her zaman ki gibi sınıflardan devam ediyorum. Elimizde Ütü isimli bir sınıf olduğunu düşünelim. Bu bildiğimiz ütü nesnesinin bilgisayar ortamına taşınmış hali. Ütümüz 0..100 derece arasındaki bir değere kadar ısınabiliyor. Bunu biz ütüSıcaklıgı isimli bir nitelik ile belirliyoruz. Ayrıca bu ısıtma işini yapan metodumuzuda ÜtüyüAyarlananSıcaklığaGetir() ismiyle tanımladık.

Dikkat ettiysen utuSicakligi niteliğimiz private yani dış dünyadan erişime kapalı olarak tanımlandı. Ancak bu sınıfı kullanan programcı doğal olarak bu sıcaklığı ayarlamak isteyecek oysa dışarı kapalı olan bu özelliğe ulaşması mümkün değil. Bunu aşmak için şöyle bir yol kulllanılıyor. Önce dışarıya açık public bir metot tanımlanıp buna gönderilen değer sınıf içinde ilgili nitelik değerine aktarılıyor. Bu yapıya NYP'de (Nesne Yönelimli Programlama) kapsülleme veya sarma ismi verilir. Neticede bu şekilde ilgili nitelik değeri düzenlenmiş olur. Bu tür nitelikler üzerinde işlem yapan metotlar özelleştirilmiş ve property anahtar sözcüğü ile tanımlanmaya başlamıştır. Property'nin espirisi budur.

Avantajı nedir dersen, örneğin sınıf içindeki utuSicakligi niteliğine direk erişebiliyor olsan şöyle bir kod yazmanı kimse engelleyemez.

utuSicakligi = 200; // Geçersiz 

Oysa kapsülleme sayesinde örneğin benim geliştirip sana verdiğim ve senin kullandığın bir ütü sınıfında utuSicakligi değerine 100 'den büyük bir değer veremezsin. Çünkü bu değer ilgili niteliğe aktarım esnasında sınıf tarafından kontrol edilir. Böylece sınıfın bütünlüğü korunmakla birlikte programcının hata yapma riskinide düşürmüş olursun. Aslında bu konu çok daha derin ve büyük bir konu ama benim bildiklerim böyle.
https://github.com/zafer06 - depo
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Zafer, söylediklerin doğru ama @property'yi açıklamıyor çünkü sarmayı @property olmadan da yapabiliyoruz zaten.

Ali
Avatar
Salih Dinçer #5
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #3
Kapsüllemeyi az/çok biliyorum ama JSON çalışmamızda bunları kullanmadan da çalışabileceğini görünce insan ister istemez ne farkı/avantajı olduğunu merak ediyor!

Parantezsiz kullanmaya gelince...

UCFS'den dolayı mı bilmiyorum (gerçi o zaman opCastJSONValue!Öğrenci.mixin; demeliydik) ama zaten parantezsiz kullanılabiliyor:
string opCastJSONValue(T)() {
    :    :    :
}
struct Öğrenci
{
    string isim;
    ulong numara;
    uint[string] notlar;
    // Katma (mixin) ifadeleri, derleme anında buraya gelecek...
    mixin(opCastJSONValue!Öğrenci);
}
Tıpkı tek türlü (T)ype işlevlerde ünlemden sonra paranteze ihtiyaç duymamamız gibi. Bunlar ilginç ve belki de çok önemli olmayan şeyler. Aslında @safe, @trusted, @system ve pure gibi türler (function type) üzerinde durmalı ki henüz onlara pek ihtiyaç duymuyorum. Ama kesinlikle kapsamlı projelerde (örn. siPIC-D projemde) kullanmak gerekiyor.

Sevgiler, saygılar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
zafer #6
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #4
acehreli:
Zafer, söylediklerin doğru ama @property'yi açıklamıyor çünkü sarmayı @property olmadan da yapabiliyoruz zaten.

Haklısın Ali, zaten C ve C++ gibi dillerde bildiğim kadarıyla property yapısı yok. Onun yerine get ve set metodlarını kullanıyorlar ancak Delphi, C#, Java ve D gibi modern dillere bakarsan bu get, set metodlarının yerini property olarak tanımlanmış metodların aldığını görürüsün.

Property özelleşmiş bir yapı, şöyle bir baktığında bir metotla property arasında bir fark görebiliyor musun? Sadece bir fark metot parantezlerinin kullanılmaması, o da property metotların daha temiz ve okunaklı yazılması için. Neticede bunlar arkaplanda sadece bir niteliği yönetmek için kullanılıyorlar. Tıpkı ütünün ısı ayarı düğmesi gibi görevi sadece ısıyı ayarlamak, ancak istersen sen ütünün içini açıp bunu yapabilirsin, bu düğme kapsülleme yaparak bu işlemi güvenli hale geitriyor.

Yani tersinden gidersek bizim property olarak nitelediğimiz yapı C ve C++ zamanında kullanılan ve get ve set işlemlerini yaptığımız basit metotların ta kendisi. Yanlışlarım olabilir konuyu böyle biliyorum. Yinede hep beraber bir araştıralım, mühim olan doğruyu öğrenmek :)
https://github.com/zafer06 - depo
zafer #7
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #5
Salih Dinçer:
Kapsüllemeyi az/çok biliyorum ama JSON çalışmamızda bunları kullanmadan da çalışabileceğini görünce insan ister istemez ne farkı/avantajı olduğunu merak ediyor!

Kapsülleme (Encapsulation) çok değerli bir özelliktir. Kesinlikle bu konuyu daha fazla araştırmanı ve bunu öğrenmeni öneririm. Kapsülleme programcıya nesneleri koruma gücünü verir.
https://github.com/zafer06 - depo
acehreli (Moderatör) #8
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Zafer, söylediklerinin hepsi gerçekten bütünüyle doğru ve üstelik @property'nin kullanımıyla ilgili konular ama @property'yi anlatmıyorlar.

@property, bir üye işlevin sanki işlev değil de bir üye değişkenmiş gibi kullanılmasını sağlar. Evet, sarma vardır ama @property sözcüğünün sağladığı tek olanak o işlevi parantezsiz olarak çağırabilmek.

"Sanki bir üye değişkenmiş" olabilmesi için de @property işlevlerin isimlerinin "get", "set", "getir", "ayarla", vs. gibi eylem içermemesi önemli. O zaman üye değişken gibi olmuyorlar.

Senin örneğini aşağıdaki gibi değiştirmek isterim. Önce nitelik işlevleri ile karışmasın diye üyenin isminin sonuna alt çizgi ekliyorum. Hmmm... ve değişken ve işlev isimlerinde "ütü"leri de kaldırıyorum; zaten bir ütü sınıfı içindeyiz.

Ek olarak sanırım enforce()'un mantığı ters olmuş. Yüzden fazla olmaması gerekiyor, değil mi? (Bir düzeltme daha: erişim @property işlevinin void olmaması gerekiyor.)

import std.stdio;
import std.exception;
 
class Ütü
{
    int sicaklik_;    // 0..100 derece
 
    this()
    {
        sicaklik_ = 0;
    }
 
    @property public int sicaklik()
    {
        return sicaklik_;
    }
 
    @property public void sicaklik(int yeniSicaklik)
    {
        enforce((yeniSicaklik >= 0) && (yeniSicaklik <= 100),
                "Ütü sıcaklığı bu değere ayarlanamaz.");
 
        sicaklik_ = yeniSicaklik;
    }
}
 
void main()
{
    auto ütü = new Ütü();
 
    /* Sanki ütü'nün 'sicaklik' isminde bir üyesi vardır. Onu
     * bir üye değişken gibi kullanabiliriz:*/
    ütü.sicaklik = 42;
    writeln(ütü.sicaklik);
}

(Not: @propert'yi denemek isteyenler dmd'yi mutlaka -property seçeneği ile kullansınlar yoksa zaten her üye işlev parantezsiz çağrılabildiği için @property'nin anlamı kalmıyor.)

Ali
Avatar
Salih Dinçer #9
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
(Not: @propert'yi denemek isteyenler dmd'yi mutlaka -property seçeneği ile kullansınlar yoksa zaten her üye işlev parantezsiz çağrılabildiği için @property'nin anlamı kalmıyor.)
Şimdi anladım...:)

Bu parametreyi kullanmıyorsak aslında her işlevin yanında @property olduğu varsayılıyor, bu her şeyi açıklıyor...

Bu durumda UFCS'de çalışmayacaktır!
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Bu durumda UFCS'de çalışmayacaktır!

Öyle mi? Küçücük bir örnekle gösterir misin. ;) (JSON ile ilgili olmasın ama çünkü o kod çok ilgisiz olanaklar içeriyor.)

Düşünelim:

  • @property, işlevleri parantezsiz çağırabilme olanağı

  • UFCS, işlevleri ilk parametrelerinin üye işleviymiş gibi çağırabilme olanağı

Ben işlev çağırma dışında ilgi kuramıyorum. :(

Ali
Avatar
Salih Dinçer #11
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
import std.stdio;
 
string naim()
{
    return "UFFFFFFFFCS...:)";
}
 
void main()
{
    naim.writeln;
}
Çıktısı:
salih@salih-NB:~/d.ders/JSON$ dmd ufcs
salih@salih-NB:~/d.ders/JSON$ dmd ufcs -property
ufcs.d(10): Error: not a property naim
salih@salih-NB:~/d.ders/JSON$ ./ufcs
UFFFFFFFFCS...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #12
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Son mesajını anlamadım. :(

Ali
Avatar
Salih Dinçer #13
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanlış anlaşılmasın UFCS demek istedim, UFFFF'dan çağrışım yapıyorum: vurgu...:)

Bir de yabancılar foo ve bar kullanıyor ya. Düşünüyorum da bizden bir şeyler kullanabilir miyiz diye?

Aklıma main'e benzeyen naim (bir Türk ismi mi?) ve varyasyonları anim, mina ve inam gibi şeyler geldi. Ne dersiniz?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #14
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Bence foo ve bar'a devam. Zaten yabancılar da nereden geldiğinden emin değiller. (Benim bu güne kadar rastladığım hiç bir açıklaması kesin değildi.)

Ali
Avatar
Salih Dinçer #15
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Sabah uyandığımda dün ki mixin@property macerasından emin olmak istedim de şöyle bir sonuç elde ettim:
import std.stdio: writeln;
 
string yaz(T)()
{
    return `writeln("Merhaba");`;
}
 
void main()
{
    mixin(yaz!string()); // nasıl derlersen derle...:)
    mixin(yaz!string  ); // -property ile derlenirse hata verir
    mixin.yaz!string;    // derleme hatası vermez ama çalışmaz da...:)
    //mixin yaz!string;  // derleme hatası verir 
    mixin(`writeln("Merhaba");`); // özetle yukarıdaki hariç hepsi derleniyor ama biri çalışmıyor...
    writeln("bitti, 4. nire?");    
}
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  1  2  sonraki 
Forum: Ders Arası RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-19, 04:20:56 (UTC -08:00)