Wątek przeniesiony 2014-11-14 13:51 z Newbie przez furious programming.

Gra webowa - wzorzec dekorator

0

Witam

Piszę turową grę webową w Javie, z wykorzystaniem Springa i Hibernete'a. W grze tej gracz może budować i ulepszać budynki, które z poziomu na poziom stają się coraz droższe, ale zarazem wzrasta ich efektywność: np. farma na poziomie 1 produkuje 15 jednostek, na 2 już 30. Obecnie mam to rozwiązane przez zapis danych w encji Budynek, w której to znajdują się podstawowe informacje takie jak: poziom i właściciel budynku. Gdy chce się np. wyświetlić informacje o danym budynku pobierane są dane z bazy danych, a następnie w fabryce tworzone są obiekty 'pamięciowe', w których znajdują pola zawierające opisy, umiejętności (są to specjalne implementacje interfejsów 'Skill', 'Description') itp. Do tworzenia obiektów wykorzystuję wzorzec Dekorator. Tak wygląda kod fabryki:

public Building create(BuildingType buildingType, int level)
    {
        Building building = null;

        if (buildingType == BuildingType.FARM)
        {
            building = new Farm();
        }

        (...)

        for (int i = 0; i < level - 1; i++)
        {
            building = upgrade(building);
        }

        return building;
}

private Building upgrade(Building building)
    {
        BuildingType type = BuildingType.valueOf(building.
getDescription().name);
        int level = building.getLevel();

        switch (type)
        {
            case FARM:
            {
                switch (level)
                {
                    case 4:
                        return new FarmLevel5(building);

                    default:
                        return new FarmUpgrade(building);
                }

            }

(...)
}

Chciałem zapytać czy zaproponowane przeze mnie rozwiązanie ma sens.
Czy może ktoś ma pomysł na inne rozwiązanie problemu? Może dziedziczenie w Hibernetcie i dekorowanie?

0

Dlaczego FarmLevel5? Nie lepiej napisać jakąś funkcję (w sensie matematycznym, a nie programistycznym), która będzie na podstawie argumentu wyznaczała wartości parametrów.
Przykładowo:
f(LVL) = BAZA*LVL + FLOOR((BAZA+LVL)*0.2)

Sam switch też boli, szczególnie, że masz Springa i możesz w nim pokonfigurować w całkiem fajny sposób strategie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1