Forum: D Programlama Dili RSS
Bildirirken import yöntemi (the self-important idiom)
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Bildirirken import yöntemi (the self-important idiom)
(Bu yöntemin ismi şakayla karışık olarak "self-important" olarak kalıyor.)

Seçerek import[1] ve yerel import[2,3] olanaklarını çok çok kolaylaştıran ve hatta işlev parametresi kullanımında önceden import gerektirmeyen bir yöntem keşfedildi:
// Bu şablon Phobos'a ekleniyor:
template from(string moduleName) {
    mixin("import from = " ~ moduleName ~ ";");
}
 
// Yöntem, aşağıdaki kullanımı sağlıyor.
// (Derleyicide değişiklik gerekmiyor; deneyebilirsiniz.)
void foo(from!"std.datetime".SysTime zaman) {
    // ...
}
 
void main() {
    // İşin güzel ve kötü tarafı, from'un eklediği SysTime sembolü yalnızca
    // foo() içinde görülüyor. Çağıranların da hangi SysTime'dan
    // bahsettiklerini belirtmeleri şart (modül düzeyinde import da olabilirdi):
    import std.datetime : SysTime;
    foo(SysTime.init);
}
Konusu şuradaydı:

  http://forum.dlang.org/thread/tzqzmqhankrkbrfsrmbo@forum.d…

Blogu şurada:

  https://dlang.org/blog/2017/02/13/a-new-import-idiom/

Reddit konusu:

  https://www.reddit.com/r/programming/comments/5tt33y/a_new…

Ali

[1] http://ddili.org/ders/d/moduller.html#ix_moduller.import,%…

[2] http://ddili.org/ders/d/moduller.html#ix_moduller.import,%…

[3] http://ddili.org/ders/d/katmalar.html#ix_katmalar.import,%…
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Blog yazısının sonunda bir soru var: Aşağıdaki STD yapısı olayı daha da kolaylaştırıyormuş ama yazarın söylediğine göre bir sorunu varmış (ama düzeltilebiliyormuş). Sorununun ne olduğunu bilmiyorum ama aşağıdaki kod std.datetime hiçbir yerde açıkça eklenmeden derleniyor:
// Bunun da Phobos'a eklendiğini varsayalım:
static struct STD {
    template opDispatch(string moduleName) {
        mixin("import opDispatch = std." ~ moduleName ~ ";");
    }
}
 
void foo(STD.datetime.SysTime zaman) {
    import std.stdio : writeln;
    writeln(zaman);
}
 
void main() {
    foo(STD.datetime.SysTime(42));
}
Bayıldım... :)

Ali
zafer #3
Üye Tem 2009 tarihinden beri · 687 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ben daha önce böyle bir gereksinim duymadığım için bana çok elzem gelmedi. İşin doğrusu bu özellik nasıl bir kullanım senaryosunda alternatiflerinden daha etkili ve verimli olur bunuda bilemiyorum. Böyle bir örnek aklına geliyor mu Ali?
https://github.com/zafer06 - depo
erdem (Moderatör) #4
Üye Tem 2009 tarihinden beri · 894 mesaj · Konum: Eskişehir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Çok ilginç bir konuya benziyor. Ben şimdilik hızlıca bakabildim.

Günce yazısında derleme zamanının ilk duruma göre %30'a düştüğünü ve çalıştırılabilir boyutunun ilk duruma göre %41 düştüğünü söylemiş. Ama benim denediğimde olmadı. Bunu örnek üzerinde derleme seçenekleri ile gösterebilecek var mı acaba.
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yalnızca derleme zamanına etkisi olacağı düşünülüyor ama Erdem gibi başkaları da pek etkisini göremiyorlar.

Temelde, bu yöntem başka yollarla mümkün olmayan bir import tembelliği getiriyor.

Normalde modülün başına import std.datetime; yazarız ve herşey yolunda gider. Ancak, o durumda derleyicinin o modülün tamamını okuması ve bir ölçüde derlemesi gerekir. Onun yerine seçerek import yeğlenir çünkü derleyici yalnızca eklenen isimleri okur ve derler:
import std.datetime : SysTime;
Onun sakıncası, SysTime'ın yalnızca tek işlev içinde kullanıldığı durumdur. O zaman da yerel import kullanırız:
void foo() {
    import std.datetime : SysTime;
    // ...
}
Onun yararı, foo() programda hiç çağrılmadığı zamanlarda öne çıkar: Derleyici std.datetime'ı hiç açmaz bile. (Aslında sanırım bu yalnızca foo'nun şablon olduğu durumda doğru. Yoksa, normal işlev olduğunda yine de o modülü açıp foo'nun içindeki kodları derlemesi gerekir.)

Seçerek import'un ve yerel import'un başka bir yararı, isim kirlenmesini aza indirmesidir: Yalnızca belirtilen isimler ve olabiliyorsa yalnızca belirli kapsamlara eklenirler.

Buraya kadar güzel. Bir de SysTime'ın foo'nun parametrelerinde geçtiğini düşünelim. Bu durumda SysTime'ın yerel import edilmesi olanaksızdır:
import std.datetime : SysTime;
void foo(SysTime zaman) {
    // ...
}
Yani, parametrenin derlenebilmesi için import'un foo'nun dışına alınması gerekir. İşte bu yeni yöntem, bunun önüne geçiyor: SysTime ismi çok yerel olarak ve seçilerek ekleniyor. Hem işlevin parametre listesini kapsıyor hem de içini. (Bir derleyici hatasına veya açığına dayandığını düşünmeden edemiyorum. :) )

Beni bu konuda hâlâ rahatsız eden bir şey var: Eğer SysTime işlevin arayüzünde geçiyorsa, o işlevi çağıran herkesin SysTime'ı bir şekilde eklemiş olması gerekir. N adet kullanıcı ayrı ayrı ekleyeceğine tek burada eklemek yetebilir ve böylece foo'yu kullanabilmek için başka modül eklemek gerekmemiş olur:
public import std.datetime : SysTime;
void foo(SysTime zaman) {
    // ...
}
Yani, zaten böyle olması daha kullanışlı olduğundan, from yöntemi ne kadar güzel olursa olsun, ben her durumda kullanışlı olduğunu düşünmüyorum.

Ali
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4389 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Eğer SysTime işlevin arayüzünde geçiyorsa, o işlevi çağıran herkesin SysTime'ı bir şekilde eklemiş olması gerekir.

O söylediğimde yanılıyorum çünkü foo'nun içinde bulunduğu modülü ekleyen herkes foo'yu çağırmak zorunda değil. Dolayısıyla, std.datetime'ın foo'dan önce public import edilmesi yanlış kabul edilmelidir çünkü SysTime ismini herkese ekleyerek bazı durumlarda gereksiz isim kirliliği oluşturmuş demektir.

Ali
zafer #7
Üye Tem 2009 tarihinden beri · 687 mesaj · Konum: Ankara
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Şimdi denedim Ali aynen söylediğin gibi modül içinde foo yerine başka bir işlevi çağırdığımda herhangi bir hata vermeden çalıştı ancak foo çağrılınca SysTime tanımını istedi. public import tekniğini bende çok kullanıyordum bundan sonra daha dikkatli olacağım.
https://github.com/zafer06 - depo
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:
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-03-23, 11:21:31 (UTC -07:00)