Czyżby nie było dobrego rozwiązania tej metody? Przecież musi istnieć. Może po prostu powinniśmy zrobić po prostu "paczkę" zmiennych. Utworzylibyśmy klasę PrzepracowaneGodziny, która by się składała z 2óch zmiennych, dzienne i nocne. Zróbmy to:
class PrzepracowaneGodziny
{
private UInt16 dzienne;
public UInt16 Dzienne
{
get { return dzienne; }
}
private UInt16 nocne;
public UInt16 Nocne
{
get { return nocne; }
}
public PrzepracowaneGodziny(UInt16 dzienne, UInt16 nocne)
{
this.dzienne = dzienne;
this.nocne = nocne;
}
}
Dobrze skoro mamy już klasę "paczkę", to podepnijmy ją do naszego systemu.
Musimy zmienić IPracownik.ObliczWynagrodzenie, teraz nie będzie przyjmować zmiennej iloscPrzepracowanychGodzin, lecz naszą klasę PrzepracowaneGodziny
interface IPracownik
{
float ObliczWynagrodzenie(PrzepracowaneGodziny przepracowaneGodziny);
}
no to skoro zdecydowaliśmy się na taki krok, to musimy pozmieniać we wszystkich klasach implementujących interface IPracownik.
class Nauczyciel : IPracownik
{
private const UInt16 STAWKA_GODZINOWA = 21;
public float ObliczWynagrodzenie(PrzepracowaneGodziny przepracowaneGodziny)
{
return STAWKA_GODZINOWA * przepracowaneGodziny.Dzienne;
}
}
wygląda nieźle, ale zobaczymy dalej czy to się sprawdzi.
class Kierownik : IPracownik
{
private const UInt16 STAWKA_GODZINOWA = 50;
private const UInt16 PODSTAWOWY_CZAS_PRACY = 160;
private static bool CzyPodstawowyCzasPracyZostalPrzekroczony(UInt16 iloscPrzepracowanychGodzin)
{
return iloscPrzepracowanychGodzin > PODSTAWOWY_CZAS_PRACY;
}
private static int ObliczGodzinyNadliczbowe(UInt16 iloscPrzepracowanychGodzin)
{
return iloscPrzepracowanychGodzin - PODSTAWOWY_CZAS_PRACY * STAWKA_GODZINOWA;
}
private static int ObliczPodstawoweWynagrodzenie()
{
return STAWKA_GODZINOWA * PODSTAWOWY_CZAS_PRACY;
}
public float ObliczWynagrodzenie(PrzepracowaneGodziny przepracowaneGodziny)
{
if (CzyPodstawowyCzasPracyZostalPrzekroczony(przepracowaneGodziny.Dzienne))
{
return ObliczPodstawoweWynagrodzenie() +
ObliczGodzinyNadliczbowe(przepracowaneGodziny.Dzienne);
}
return STAWKA_GODZINOWA * przepracowaneGodziny.Dzienne;
}
}
tutaj też niczego sobie. Okey, to brnijmy w to dalej. Teraz na warsztat bierzemy klasę Piekarz:
public float ObliczWynagrodzenie(PrzepracowaneGodziny przepracowaneGodziny)
{
return ((STAWKA_GODZINOWA + BONUS_ZA_PRACE_W_NOCY) * przepracowaneGodziny.Nocne) +
(STAWKA_GODZINOWA * przepracowaneGodziny.Dzienne);
}
i znów miłe zaskoczenie, gładko, rzekłbym zbyt łatwo ;). Uporządkujmy ciało tej metody, znów tak jakoś skomplikowanie jest. Zastosujmy wydzielenie metod poznane w 2 części
class Piekarz : IPracownik
{
private const UInt16 STAWKA_GODZINOWA = 10;
private const UInt16 BONUS_ZA_PRACE_W_NOCY = 5;
private static int ObliczWynagrodzenieNocne(UInt16 przepracowaneGodzinyNocne)
{
return (STAWKA_GODZINOWA + BONUS_ZA_PRACE_W_NOCY) * przepracowaneGodzinyNocne;
}
private static int ObliczWynagrodzenieDzienne(UInt16 przepracowaneGodzinyDzienne)
{
return STAWKA_GODZINOWA * przepracowaneGodzinyDzienne;
}
public float ObliczWynagrodzenie(PrzepracowaneGodziny przepracowaneGodziny)
{
return ObliczWynagrodzenieNocne(przepracowaneGodziny.Nocne) +
ObliczWynagrodzenieDzienne(przepracowaneGodziny.Dzienne);
}
}
wow i w sadzie zakończyliśmy zlecenie.
Wciągnięci pracą nie słyszeliśmy jak dzwonił do nas klient. Nagrał się na automatyczną sekretarkę:
Właśnie jadę do was by obejrzeć gotowy produkt. Mam nadzieję że pamiętaliście o tym, że piekarz w święta za przepracowane godziny otrzymuje podwójną stawkę.
Cholera! Zapomnieliśmy o tym. Ale zaraz! Przecież nasza aplikacja jest wspaniale napisania. Drobna zmiana powinna załatwić sprawę. Pomyślmy, potrzebujemy jeszcze zmienną: swiateczne, w klasie PrzepracowaneGodziny:
class PrzepracowaneGodziny
{
private UInt16 dzienne;
public UInt16 Dzienne
{
get { return dzienne; }
}
private UInt16 nocne;
public UInt16 Nocne
{
get { return nocne; }
}
private UInt16 swiateczne;
public UInt16 Swiateczne
{
get { return swiateczne; }
}
public PrzepracowaneGodziny(UInt16 dzienne, UInt16 nocne, UInt16 swiateczne)
{
this.dzienne = dzienne;
this.nocne = nocne;
this.swiateczne = swiateczne;
}
}
teraz musimy zmienić Piekarz.ObliczWynagrodzenie
class Piekarz : IPracownik
{
private const UInt16 STAWKA_GODZINOWA = 10;
private const UInt16 BONUS_ZA_PRACE_W_NOCY = 5;
private const UInt16 MNOZNIK_STAWKI_SWIATECZNEJ = 2;
private static int ObliczWynagrodzenieNocne(UInt16 przepracowaneGodzinyNocne)
{
return (STAWKA_GODZINOWA + BONUS_ZA_PRACE_W_NOCY) * przepracowaneGodzinyNocne;
}
private static int ObliczWynagrodzenieDzienne(UInt16 przepracowaneGodzinyDzienne)
{
return STAWKA_GODZINOWA * przepracowaneGodzinyDzienne;
}
private static int ObliczWynagrodzenieZaSwieta(UInt16 przepracowaneGodzinySwiateczne)
{
return STAWKA_GODZINOWA * MNOZNIK_STAWKI_SWIATECZNEJ * przepracowaneGodzinySwiateczne;
}
public float ObliczWynagrodzenie(PrzepracowaneGodziny przepracowaneGodziny)
{
return ObliczWynagrodzenieNocne(przepracowaneGodziny.Nocne) +
ObliczWynagrodzenieDzienne(przepracowaneGodziny.Dzienne) +
ObliczWynagrodzenieZaSwieta(przepracowaneGodziny.Swiateczne);
}
}
TYLE! W sam raz, bo właśnie przyszedł klient. Ufff udało nam się, tym razem, lecz coś nam chodzi po głowie, że ten kod, który stworzyliśmy wcale nie jest taki dobry... cdn.
Kod źródłowy
Brak komentarzy:
Prześlij komentarz