Merhaba,
Ali hocam, yakın bir zaman DConf (<dconf.org/talks/cehreli.html>)'a katılmış ve oradaki izlenimlerini bu forumda dile getirmişti. Paragraf aralarında (geliştiricisi orada bulunduğundan) D ile yazılmış ve sanırım yine D için "Dependency Injection (http://en.wikipedia.org/wiki/Dependency_injection)" yazılımından bahsetti:
https://github.com/bgertzfield/deject
Bu terimi ilk defa duydum ve Türkçesi konusunda Ali hocamdan yardım almalıyım. Anladığım kadarıyla yazılım geliştirirken nesnelerin bağımlı oldukları başka nesneleri bize özet şekilde gösteren bir yazılım? Ha keza notlara baktığımda HTML ve JS kullanılan bir UI olduğunu gördüm. Yani mutfak kısmı D'de yazılırken ürettiği veriyi görsel bir şekilde takip ediyoruz (?), sanırım!
Anlamadığım şeyleri, kodlara bakarak anlayacağımı zannederken kendimi bir an içinde (kodlar basit olsa da) GitHub'da buldum. Başladım, kod takip yapmaya ama git gide (adı Git Hub ya...:) ) bir keşmekeş girdiğimi hissettim...:)
Yahu bir yazılım yaparken niye bu kadar karıştırıyorlar? Örneğin Linker (https://github.com/bgertzfield/deject/blob/master/deject/detail/linker.d):
module deject.detail.linker;
import deject.detail.binding;
import deject.detail.bindingkey;
import deject.detail.bindingmap;
import std.conv;
import std.stdio;
class Linker {
this(BindingMap newBindingMap) {
bindingMap = newBindingMap;
}
Binding!T requestBinding(T)() {
BindingKey key = { typeid(T) };
auto variant = bindingMap[key];
auto binding = variant.get!(Binding!T);
if (key !in linkedBindings) {
binding.attach(this);
linkedBindings[key] = true;
}
return binding;
}
private BindingMap bindingMap;
private bool[BindingKey] linkedBindings;
}
Tamam basit görünüyor ama anlamak için gezinmeye devam etmeliyim...:)
"BindingMap" ne ola ki (?) başlıyoruz yeni bir yolculuğa...
Alıntı (bindingmap.d):
>> alias Variant[BindingKey] BindingMap;
> ```
>
Evet, bu aslında bir Variant imiş. Eee peki BindingKey'e bakalım şimdi de...:)
Alıntı (bindingkey.d):
>
>
> struct BindingKey {
TypeInfo typeInfo;
}
>
Aman Allahım, işte burada tosladım çünkü type() ile öğrendiğimiz ve bu nesneyi döndüren TypeInfo ne maksatla kullanıyor olabilir? Düşünüyorum, herhalde nesnelerin kimliklerini en ince ayrıntısına kadar belgelemek için. Peki devam edelim nasıl kullanmış:
BindingKey key = { typeid(T) }; // Vaouvvv...:)
auto variant = bindingMap[key]; // Hmm...
auto binding = variant.get!(Binding!T); // ?
if (key !in linkedBindings) { // Eee, tamam..:)
binding.attach(this); // sınıfın attach() işlevinin ne yaptığını bilmemiz gerekiyor...
linkedBindings[key] = true; // bu satır 2. bool üyesi => private bool[BindingKey]
}
Başlangıçta Binding ne ki sorusu akla geliyor. Çünkü tek bilinmeyen o sanki ve meğer Interface imiş:
Alıntı (binding.d):
>> interface Binding (T) : Provider!T {
> void attach(Linker linker);
> }
> ```
>
Vallahi burada her şey birbirine bağlanmış ama benim kafadaki bilgileri de bağlamak için zaman vermem gerekecek. Çünkü parçalar gerçekten çok ufak ve neler yaptığını anlamak vakit alacak... :blush:
Özetle; belki herkesin vakit bulamayacağı bu maceraya anlam veremesem de yazılım geliştirirken her şey küçük parçalara bölüp birleştirme (kullanma) geleneğimizin bir eseri olmalı. Yani yöntem doğru olmalı. Belki bu aşamada olmasa da zamanla yazılım geliştirirken büyüyen ve iyice içinde çıkılmaz bir hale gelen projelerin üstesinden gelmek için iyi bir yöntem olabilir. Her ne kadar bu yöntemde kod takibinde zorlansam da...:)
Sevgiler, saygılar...
--
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]