Prosty widok na macierz 2D w C++

Dziś tak bardziej o C++. Dość często widzę kod mający w zamierzeniu obsługiwać macierze wyglądający mniej więcej tak:

int** matrix = new int*[h];
for(int i = 0; i < h; ++i) {
    matrix[i] = new int[w];
}

Pomijając nawet kwestię wydajności (to taka macierz JP na 100%, gdzie P to Prefetch), jest to okropny kod. Korzystanie z nagiego new i delete to antyidiom w C++ (szczególnie delete, szerzej opisałem to n.p. tutaj). Jest to:

  • niewygodne: kłopotliwa inicjalizacja, kolejność rząd/kolumna wymaga sprawdzenia sposobu inicjalizacji,
  • niebezpieczne: brak RAII, trzeba pamiętać o odpowiednim zwolnieniu zasobów, można niechcący nadpisać wskaźnik jednego rzędu innym rzędem,
  • niezgrabne: nie ma żadnego mechanizmu upewniającego, że wszystkie wiersze (lub kolumny) macierzy będą tej samej długości.

Ruby a if __name__ == ‘__main__’:

Ten wpis jest niepowiązany z Pierunem, jest to swoista notatka dla mnie. Dość często zdarza się, że googluję tę samą rzecz (może napisanie tego pozwoli mi na lepsze przyswojenie wyniku poszukiwań – zawsze tego samego): jak zmusić Ruby’ego do wykonania pewnych działań wyłącznie jeśli dany skrypt został włączony bezpośrednio, a nie poprzez require z innego skryptu. Inaczej mówiąc, szukam alternatywy dla tytułowego idiomatycznego kodu w Pythonie:

if __name__ == '__main__':
    foo()

Na szczęście w Rubym jest to równie proste:

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.

Zanim użyjesz projektu open-source, upewnij się, że nie został porzucony

Do użycia ORM-a przekonał mnie znajomy. W założeniu: super. Nie będę się rozpisywał czym jest ORM i jakie funkcjonalności ma spełniać – na pewno jest to wielokrotnie opisane przez bardziej kompetentnych w tym zakresie ludzi. Dość powiedzieć, że dzięki temu korzystam z natywnych klas reprezentujących dane, np.:

class PostData
{
    @Generated @Id int id;
    Post post;
    string title;
    string markdown;
    string excerpt;
    Nullable!string gpg;
    DateTime timestamp;
    @ManyToMany Tag[] tags;
}