Forum: Ders Arası RSS
Nitelikler
@property
Sayfa:  önceki  1  2 
acehreli (Moderatör) #16
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ı
Yanıtlanan mesaj ID 6078
Şu notların aslında şablon katması (template mixin) kullanıyorlar:

  • "derleme hatası vermez ama çalışmaz da"

  • "derleme hatası verir" (aslında bir şablon ile kullanılsa derleme hatası vermez)

O söz dizimlerine uysun diye bir şablon tanımlıyorum:

import std.stdio: writeln;
 
template foo(T)
{
    T değişken;
}
 
void main()
{
    {
        mixin.foo!string;
        değişken = "merhaba";
        writeln(değişken);
    }
 
    {
        mixin foo!string;
        değişken = "dünya";
        writeln(değişken);
    }
}

Yukarıdaki iki bloktaki mixin'ler tek satırlık kod katıyorlar: 'değişken' isminde bir değişken tanımı. Aynı isimde iki değişken karışıklık yaratması diye farklı kapsamlarda tanımlamak zorunda kaldım.

Çıktısı:

merhaba
dünya


Ali
acehreli (Moderatör) #17
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ı
Söylemeyi unuttum... Aşağıdaki iki yazım birbirinin eşdeğeri oluyor:
    mixin.foo!string; (1)
    mixin foo!string; (2)

Birinci satırda mixin'den sonra boşluk olmasının gerekmemesi şaşırtıyor ama aslında birinci satır şunun eşdeğeri:

    mixin .foo!string; (1)

.foo da "modül isim alanında tanımlanmış olan foo" anlamına geldiği için bu kodda ikincisinin eşdeğeri oluyor.

Ali
zafer #18
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj ID 6062
acehreli:
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.)

enforce() için teşekkürler, hata yapmışım daha dikkatli olmam gerekiyordu. Neyseki sen farketmiş ve düzeltmişsin  ;-)

Ancak ikinci düzeltme yanlış olmuş, ben örnek kodlarımda erişim @property işlevi tanımlamamıştım.

Ben @property'nin doğası gereği dış dünyaya açık olduğu için erişim belirteçlerini kullanmıyorum ama senin yazdığın gibi örneklerde bunu açıkça yazarak bu konuyu inceleyenlere örnek olmak konusunda senin kodlamanı daha doğru buluyorum.

Ben tüm erişim belirteçlerini metot, üye değişken, @property v.s. olanaklarının en başına yazıyorum, sen @property kelimesinden sonra kullanmışsın sanırım arada bir fark yok?

Son olarak benim anladığım property konusuna bakış açımız farklı, belki ileride bir gün bu sohbeti yüz yüze devam ettiririz. :)
https://github.com/zafer06 - depo
Avatar
Salih Dinçer #19
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #17
acehreli:
Söylemeyi unuttum... Aşağıdaki iki yazım birbirinin eşdeğeri oluyor:
    mixin.foo!string; (1)
    mixin foo!string; (2)
Bence de, ben de şöyle denedim:
import std.stdio: write;
 
template foo(T)
{
    T değişken = "Merhaba ";
}
 
void main()
{
        mixin.foo!string; // noktasız da çalışyor!
       
        //değişken = "Merhaba ";
        write(değişken);
 
        değişken = "Dünya...\n";
        write(değişken);
}
Çıktısı:
Merhaba Dünya...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #20
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ı
Yanıtlanan mesaj #18
zafer:
Ancak ikinci düzeltme yanlış olmuş, ben örnek kodlarımda erişim @property işlevi tanımlamamıştım.

Haklısın; kafam karışıkmış: ÜtüyüAyarlananSıcaklığaGetir()'i niteliği oluşturan işlevlerden birisi sanmışım. O andaki anlayışıma göre ÜtüSıcaklığıAyarla() değerini değiştiriyor sanmışım ÜtüyüAyarlananSıcaklığaGetir()'i de o değeri döndürüyor sanmışım.

Ben @property'nin doğası gereği dış dünyaya açık olduğu için erişim belirteçlerini kullanmıyorum ama senin yazdığın gibi örneklerde bunu açıkça yazarak bu konuyu inceleyenlere örnek olmak konusunda senin kodlamanı daha doğru buluyorum.

Aslında ben public'leri sen kodunda öyle yazdın diye eklemiştim. Ben C++'takine alışmışım; erişim bölgeleri gözüme biraz daha iyi görünüyor:

class S
{
private:
    // ...
public:
    // ...
}

@property kelimesinden sonra kullanmışsın sanırım arada bir fark yok?

Onu da yanlışlıkla öyle yazmışım. Aslında dönüş türü dışındakileri parametre listesinden sonra yazmayı seviyorum:

struct S
{
// ...
    const(int)[] değerler() const @property
    {
        // ...
    }
}

Hatta pure, @safe, vs. de sona gelir. (Yakında pure üzerine bir makaleyi Türkçeleştireceğim.)

Son olarak benim anladığım property konusuna bakış açımız farklı, belki ileride bir gün bu sohbeti yüz yüze devam ettiririz. :)

Tabii ki! :) Seni doğru anlıyorsam sen sarmayı ön plana çıkartıyorsun. Kabul ama sarma zaten üye işlevler ve erişim hakları ile sağlanabiliyor. Nitelik yapan şu: Üye değişken gibi kullanılmalı ama bir işlev tarafından sunulmalı. O yüzden ben işlev isminde eylem olmasının nitelik kavramına uymadığını düşünüyorum.

Ali
Avatar
Salih Dinçer #21
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Tabii ki! :) Seni doğru anlıyorsam sen sarmayı ön plana çıkartıyorsun. Kabul ama sarma zaten üye işlevler ve erişim hakları ile sağlanabiliyor. Nitelik yapan şu: Üye değişken gibi kullanılmalı ama bir işlev tarafından sunulmalı. O yüzden ben işlev isminde eylem olmasının nitelik kavramına uymadığını düşünüyorum.
Ben de ECMA'ya ne kadar çok yaklaşırsak o kadar hayırlı olacağını düşünüyorum. UFCS ile buna bir miktar yaklaşıldığını gördüm ama bir gün -property parametresinin kaldırılacağını (yanlış anlaşılmasın varsayılan @property özelliği demek istiyorum) öğrenince açıkçası hayal kırıklığına uğruyorum. Yani gönül istiyor ki Fibonacci aralığını tek parametre vererek ve parantezler ile uğraşmayarak şöyle bir şey (kafadan attım, yanlış olabilir) mümkün olsa:
struct Fibonacci { ... }
 
void main {
    :    :    :
    Fibonacci.take(100).cycle.writeln;
}
Ama o gün gelirse ki (parametreyi kullanırsak) şimdi de öyle her nesne sağına parantezler ile uğraşıyoruz. Bu böyle olmamalı ve yazılımcı bunlar ile vakit kaybetmemeli. Gerçi Fibonacci(). ile başlayıp devam etme şartı var ama sanırım bu (new ile) yeni bir nesne oluşturularak aşılabilir.

Neyse anlayış farklılıklarımız var ama bence ECMA diye bir standart varken bütün diller ona doğru kayması hoş olurdu...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #22
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:
Ben de ECMA'ya ne kadar çok yaklaşırsak o kadar hayırlı olacağını düşünüyorum.

Onu daha önce de söyledin. Yanılmıyorsam ECMA bir standartlaşma kurumuymuş. Özellikle ECMAScript dilinin söz dizimine yaklaşmaktan mı bahsediyorsun?

UFCS ile buna bir miktar yaklaşıldığını gördüm ama bir gün -property parametresinin kaldırılacağını (yanlış anlaşılmasın varsayılan @property özelliği demek istiyorum) öğrenince açıkçası hayal kırıklığına uğruyorum.

Seninle aynı fikirde olanlar çok. Bu kural gelene kadar parametre almayan her işlev parantezsiz çağrılabiliyordu. Tartışmaları olmuştu.

    Fibonacci.take(100).cycle.writeln;

Bense Fibonacci yazıldığında bir nesne oluşmasını görmek isterim. Tabii dediğin gibi, cycle ve writeln UFCS'ten yararlanıyorlar onlara diyecek yok. Ama örneğin writeln'ı da yazarı '@property' olarak işaretleyebilir ve parametresiz olarak writeln() diye çağrılacağına yalnızca writeln yazılabilir.

Yalnız Fibonacci'de bile hemen bir sorun görülebiliyor. Abartılı bir örnek ama türün stringof() diye bir üye işlevini tanımlasam, aşağıdaki çağrı Fibonacci türü üzerinde mi stringof'u çağırsın, yani "Fibonacci" mi yazdırsın, yoksa bir nesne oluştursun benim belki de "merhaba" döndürecek biçimde tanımladığım Fibonacci.stringof işlevini mi çağırsın?

        Fibonacci.stringof.writeln;

Yani türün stringof'u mu yoksa otomatik olarak oluşturulan bir nesnenin stringof'u mu? Yanılmıyorsam şablon kodlarında da benzer soru işaretleri oluşabiliyor.

Ama o gün gelirse ki (parametreyi kullanırsak) şimdi de öyle her nesne sağına parantezler ile uğraşıyoruz. Bu böyle olmamalı ve yazılımcı bunlar ile vakit kaybetmemeli.

Kesinlikle. Anlaşılabildiği sürece her şey otomatik olmalı. Ama bazen farklı olanakların etkileşimleri güçlükler doğurabiliyor.

Ali
zafer #23
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #20
acehreli:
Aslında ben public'leri sen kodunda öyle yazdın diye eklemiştim. Ben C++'takine alışmışım; erişim bölgeleri gözüme biraz daha iyi görünüyor:

class S
{
private:
    // ...
public:
    // ...
}

Delphi ile çalışırken ve daha sonra C++ ile uğraştığım zamanlar bu yapı banada daha düzenli ve hoş görünüyordu. Hatta C# ile çalışmaya başladığım ilk zamanlar her metodun önüne erişim belirteci yazmak zor bile gelmişti. Ancak daha sonra farkettim ki bence bu hem daha özgür hem daha güvenli hemde daha kolay bir kullanım sunuyordu.

Neticede birazda sürekli kullanmanın verdiği aşinalık ile blok yapısını terk edip bu şekilde tekli tanımı kullanmaya başladım. Doğrusu D dilininde bu yapıyı desteklediğini gördüğümde çok mutlu olmuştum. Zaten D'yi benim gözümde kullanılabilir yapan özelliklerden birisi, geçmişin iyi taraflarını alırken yeni ortaya çıkan özellikleride bünyesinde barındırabilmesi.

acehreli:
Kesinlikle. Anlaşılabildiği sürece her şey otomatik olmalı. Ama bazen farklı olanakların etkileşimleri güçlükler doğurabiliyor.

Doğrusu bu UFCS özelliğine bir türlü ısınamadım. İşleri basitleştirmek isterken daha çok karmaşık hale getiriyor gibi geliyor bana, bazen insanların güzel olarak gördüğü bazı özellikler pratikte isteneni veremiyor.
https://github.com/zafer06 - depo
Avatar
Salih Dinçer #24
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Aslında UFCS bir özellik, kullanırsınız veya kullanmazsınız; bu size kalmış. Ama kullanmak isteyenleri kısıtlayıcı yenilikler gelirse bu henüz yeni doğmuş bir bebeğin ölmesi anlamına gelir. Çekirdek geliştiricileri bu serzenişimi bir duysa...:)
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
zafer #25
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Salih Dinçer:
Aslında UFCS bir özellik, kullanırsınız veya kullanmazsınız; bu size kalmış.

Bir açıdan böyle düşünülebilir. Ancak dile yeni başlayanlar anlamadıkları karışık bu tür yapılar karşısında D dili anlaması zor bir dil gibi yanlış algı içine düşerseler bu sefer durum gerçekten kötü olur. Dolayısyla bir özellik eklenirken etraflıca düşünmek ve tartmak gerekir diye düşünüyorum.

Sözüm UFCS'ye değil ama bana işleri karıştırıyor gibi geldiğini itiraf etmeliyim.
https://github.com/zafer06 - depo
acehreli (Moderatör) #26
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:
karışık bu tür yapılar karşısında D dili anlaması zor bir dil gibi yanlış algı

Benim de kitapta öyle bir sıkıntım var (veya olacak). Geç gelen bir olanak olduğu için UFCS kitapta geçmiyor. Onu İngilizceleştirme sırasında çok yakın bir zaman sonra yeni bir bölüm olarak ekleyeceğim. Ama sanırım "bu olanağı karışıklığa neden olmasın diye örneklerde kullanmayacağım" diyeceğim ve ta en sonlardaki aralıklar bölümüne gelene kadar da yararlanmayacağım. Aralıklar bölümünde de "hani UFCS olanağı vardı ya... bakın yazım kolaylığı sağlıyor" diyeceğim.

Ali
Avatar
Salih Dinçer #27
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Bence de doğru bir karar...
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
zafer #28
Üye Tem 2009 tarihinden beri · 700 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #26
Ali sana katılıyorum bencede doğru bir yaklaşım. Çünkü UFCS her nekadar basit bir özellik gibi görünsede arka planında derin bir bilgiye ihtiyaç duyuyor. Kişi bu bilgiye sahipse bu özelliği kullanmasında bir sıkıntı yok bence.
https://github.com/zafer06 - depo
Avatar
Salih Dinçer #29
Üye Ock 2012 tarihinden beri · 1912 mesaj · Konum: İstanbul
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Hayret, burada da UFCS konusuna girmişiz ve hatta ilerisi için Ali hocam bazı hedefler belirlemiş. Biliyorum ki bu hedefleri gerçekledi. Bir de kitabın basılı sürümünü elimize alırsak (İstanbul'da şu sıralar kitap fuarı var) süper olacak. Belki 2014 yılında bize bu sürpriz yaparsın ha hocam...:)

Önce şu başlığa referans vereyim: http://ddili.org/forum/post/10344

Burada UFCS'nin bir tehlikeli yanından söz ettim. Gerçi bu bir özellik olmalı. Yani çıkarsama yaparken nesneden başlıyor, bulamazsa dışarıya doğru ve belki başka modüllere kadar ilerliyor olmalı. Orada bir soru soracağımdan bahsetmiştim. İşte şu:

Bir yapımız var ve onun sonlarında doğru şöyle üyelere sahip:
    :    :    :
      int front() const @property {
          return baştaki;
      }
   
      void popFront() {
          int ikiSonraki = baştaki + sonraki;
          baştaki = sonraki;
          sonraki = ikiSonraki;
      }
 
      @property:
    :    :    :
Acaba hemen yukarıdaki @property'nin sonunda iki nokta üstüste kullanarak tüm benzer özelliktekileri bir yerde toplamam mümkün olabilir miydi? Gerçi denediğimde derleyici bir hata vermedi ama güzel olurdu hani. Çünkü bazen işlevler, parametreleri ile birlikte uzun olmaktalar ve hatta bazıları static, public, override gibi şeyler de almaktalar. Zaten bu son saydıklarımı bu şekilde yapabiliyoruz.

Peki ya sorduğumuda?
Bilgi paylaştıkça bir bakmışız; kar topu olmuş ve çığ gibi üzerimize geliyor...:)
acehreli (Moderatör) #30
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ı
Evet, bildiğim kadarıyla öyle. Bütün nitelikler üç biçimde beliltilebiliyor:
@property int yalnızcaBu() { return 42; }
 
@property:
    // bu bölümdekilerin hepsi
 
@property {
    // bu kapsamdakilerin hepsi
}
Ali
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:  önceki  1  2 
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-18, 03:51:22 (UTC -08:00)