Refaktoring dbcache.d rozpoczęty

Pisząc kolejne metody do cache DB ciężko było nie zauważyć, że znaczna część ich kodu się powtarza. Z tego powodu utworzyłem szablon CacheElement (nazwa robocza).

Jednocześnie operacje na samej bazie przeniosłem do osobnego szablonu DBElementDriver (nazwa jeszcze bardziej robocza), który jest odpowiedzialny za wykonywanie odpowiednich zapytań w bazie danych. Parametrami tego szablonu są: klasa elementu oraz nazwa pola odpowiadającego za klucz.

Przykładowo, w najnowszej na tę chwilę wersji Pieruna deklaracja cache dla postów wygląda następująco:

CacheElement!(DBElementDriver!(Post, "id")) posts;

Można tutaj zauważyć w działaniu jedną z największych zalet D: możliwość wykonywania kodu w czasie kompilacji. Pomimo, że “id” jest stringiem przekazanym jako parametr DBElementDriver, szablon tej struktury może go użyć do dedukcji typu klucza:

alias KeyType = typeof(mixin(Value.stringof ~ "." ~ Key));

Value.stringof to “Post”, więc w powyższym przykładzie wywołanie mixin wygląda tak: mixin(“Post.id”). Mixin zamienia string (lub szablon, ale nie o tym tu mowa) na kod wykonywalny. Właśnie dzięki temu typeof(mixin(“Post.id”)) jest równoznaczne z typeof(Post.id), co już jasno pozwala zrozumieć jak zachodzi dedukcja.

Osobiście, mam nadzieję, że C++20 również będzie pozwalał wykonywać podobne akrobacje za pomocą (na razie hipotetycznego) operatora reflexpr.

Leave a Reply

Your email address will not be published.