Klasa i jej fabryka - gdzie logika tworzenia obiektu i obsługa błędów

0

Cześć,

Mam za zadanie napisać własną implementację klasy kalendarza. Na początek zastanawiam sie nad jedną rzeczą. Mam klasę Miesiąc (przechowującą numer, nazwę, liczbę dni...). Chcę aby stworzenie obiektu tej klasy było maksymalnie proste więc pomyślałem o prostej fabryce, która będzie posiadała jakąś tablicę danych i wg numeru miesiąca zwróci nam gotowy obiekt. Ale jak to najlepiej zrobić pod kątem obsługi błędnych danych. Jeśli obiekt dostaniemy z fabryki to nie ma problemu, ale jeśli ktoś zechce utworzyć obiekt "ręcznie" (nie powinno się?) to trzeba sprawdzić kilka warunków, np ile dni max ma dany miesiąc itp. I teraz pytanie jak to najlepiej zrobić. Czy to w klasie miesiąc odbywa się sprawdzanie danych? Czy może to spada na fabrykę. Można też zagniezdzic klase miesiąc w fabryce i mieć dostęp jedynie przez nią? Pozdrawiam.

0

Jeśli ograniczasz się do kalendarza gregoriańskiego to po co pozwalać użytkownikom tworzyć miesiące? Miesiące w ramach danego kalendarza się nie zmieniają. Zrób sobie enuma w którym będą wszystkie instancje miesięcy i ewentualnie jakieś statyczne metody do dynamicznego wyciągania danych. Swoją drogą odpowiedziałem też na pytanie jak nie pozwolić użytkownikom na tworzenie instancji - konstruktory enumów muszą być prywatne.

0

Ale z drugiej strony muszę mieć możliwość zmiany pól obiektu poprzez settery, bo w trakcie operacji na dacie może być np sytuacja gdzie trzeba będzie zmienić ilość dni w miesiącu z racji na rok przestępny. Nie wiem czy tutaj enum spełni swoje zadanie

0

Jeśli chcesz używać settera to oznacza to że logika obsługi lat przestępnych i tak jest umieszczona gdzieś indziej, a wiec pytanie czemu chcesz umieszczać tę informację w miesiącu, zamiast odpytywać tą drugą klasę?

1

Można też sobie zobaczyć na nowe API Javy, tam osiągnięto kompromis przez podanie przez użytkownika tego, czy miesiąc jest przestępny. Jeśli chcesz zweryfikować swoje rozwiązania polecam popatrzyć jak to jest zrobione właśnie tam:

 /**
     * Gets the length of this month in days.
     * <p>
     * This takes a flag to determine whether to return the length for a leap year or not.
     * <p>
     * February has 28 days in a standard year and 29 days in a leap year.
     * April, June, September and November have 30 days.
     * All other months have 31 days.
     *
     * @param leapYear  true if the length is required for a leap year
     * @return the length of this month in days, from 28 to 31
     */
    public int length(boolean leapYear) {
        switch (this) {
            case FEBRUARY:
                return (leapYear ? 29 : 28);
            case APRIL:
            case JUNE:
            case SEPTEMBER:
            case NOVEMBER:
                return 30;
            default:
                return 31;
        }
    }

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