Month: July 2016

Nowe taktyki w Heroes 3

Posted on

Rzeczy których kiedyś nie doceniałem (bo grałem w tą grę w czasach gdy jeszcze internetu nie było/nie był taki jak dziś) są opisywane jako dobre strategie. Więc następnym razem gdy zagram warto o nich pamiętać:
– bardzo dobrym skillem jest dyplomacja, pozwala przyłączać dużo początkowych słabych przeciwników
– przeglądać stronki z listą artefaktów, żeby być pewnym co zyskamy pokonując przeciwników, po wyglądzie mamy jednoznaczność o jaki artefakt chodzi.

Błędy częste:
– zbyt często wymieniam surowce, czasem lepiej uzbierać trochę, bo zaraz zmieni się sytuacja (nowe miasto i będziemy potrzebować dużo kamienia i drewna.

Czytelność kodu/nazw – przykłady

Posted on Updated on

Taki przykład w javascript(typescript):

private deepClone(item) {
    return jQuery.extend(true, {}, item);
}

to że akurat deep copy zrobi “jQuery.extend(true, {}, item)” to implementacja. Myśląc “implementacja” myślę “szczegół implementacyjny”, a dalej myślę i traktuję to jako “szczegół”. Czytając metodę która coś tam robi (akurat tutaj zmienia relację parent-child na indeksy, zeby klonowanie nie miało cykli, klonuje delikwenta i ustatwia z powrotem relacje), wystarczy nam wiedza że robimy “deepClone”. Nie tylko wystarczy, ale większa wiedza byłaby szkodliwa.

private changeParentRelationsToIds(item: ItemViewModel): ItemViewModel {
    // Cloned data must be without parent and children relations but must be added again after copy finishes
    let parent = item.parent;
    let children = item.children;

    item.parentId = this.changeToNullIfParentIsRoot(item.parent.id);
    item.parent = undefined;
    item.children = [];

    let clonedItem = this.deepClone(item);

    item.parent = parent;
    item.children = children;

    return clonedItem;
}

Przytoczona tutaj implementacja deepCopy nie jest jedyną. http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone-an-object to pytanie na SO ma 3 tysiące łapek w górę i jest o czym dyskutować w odpowiedziach i komentarzach. W innym kontekście mógłbym użyć innej implementacji bo aktualna nie działa. A ja nie chcę o tym wszystkim wiedzieć, w mojej metodzie robiącej coś konkretnego chcę wywołać:

let clonedItem = this.deepClone(item);