April 11, 2023

Merhaba,

Dün Walter'in yayınladığı kodun temizliğini görünce hayran kaldım. Bildiğiniz ağızcazım açık kaldı. Özellikle BuildRule with MethodInitializer bölümü, büyük usta dedirtiyor çünkü sadece opDispatch() kullanarak öyle bir teknik geliştirmiş ki (!) bu kadar değil, aşağıdaki aslında en ham hali! Özetle, esneklik ve genişleyebilir olması hayranlık uyandırıcı:

class BuildRule { string action, description; }
enum rootRules = [ &clean, &install ];

alias install = Init!(BuildRule, (MI, rules) => MI
      .action("install")
      .description("Legacy alias for install")
);

alias clean = Init!(BuildRule, (MI, rules) => MI
      .action("clean")
      .description("Remove the generated directory")
);

T Init(T, alias Func)() {
  struct MethodInitializer {
     ref MethodInitializer opDispatch(string name)
     //(typeof(__traits(getMember, T, name)) arg)/*
     (string arg)//*/
     {
       __traits(getMember, obj, name) = arg;
       return this;
     }
     T obj;
  }
  auto MI = MethodInitializer(new BuildRule());
  Func(MI, MI.obj);
  return MI.obj;
}

void main()
{
  import std.algorithm, std.range, std.stdio;
  foreach (rule; rootRules.map!(a => a()).array)
  {
    with(rule) action.writeln(": ", description);
  }
} /* ÇIKTISI:

clean: Remove the generated directory
install: Legacy alias for install

*/

Kodu epey değiştirdim ve biraz Voldemort yapısına sokup gereksiz şeylerden izole ettim. Kodun tamamına (2K satır) bakmanızı tavsiye ederim!

Sevgiler, saygılar...