Podsumowanie — hierarchia pracowników
Część sekcji Programowanie obiektowe ścieżki GO w Coddy. Lekcja 40 z 107.
Wyzwanie
ŁatwyStwórzmy system hierarchii pracowników firmy, który pokazuje, jak kompozycja elegancko odwzorowuje rzeczywiste struktury organizacyjne. Utworzysz bazowy typ pracownika, który wyspecjalizowane role będą mogły rozszerzać o własne, unikalne zachowania.
Rozmieścisz kod w trzech plikach:
employee.go: Utwórz podstawę w postaci strukturyEmployeezawierającej polaID,NameiBaseSalary(float64). Dodaj do niej dwie metody:Info() string, która zwraca[ID] [Name]CalculateBonus() float64, która zwraca 10% wynagrodzenia podstawowego
roles.go: Utwórz dwa wyspecjalizowane typy pracowników, które osadzająEmployee:Managerz polemTeamSize(int): menedżerowie otrzymują wyższą premię: 20% wynagrodzenia podstawowego plus 100 $ za każdego członka zespołu. Przesłoń metodęCalculateBonus, aby to zaimplementować.Developerz polemLanguage(string): programiści otrzymują standardową premię, ale przesłaniają metodęInfo, aby dodać używany język programowania:[ID] [Name] ([Language])
main.go: Wczytaj dane pracowników z wejścia, utwórz jednego menedżera i jednego programistę, a następnie wyświetl informacje o każdym pracowniku i obliczoną premię.
Zostaną podane następujące dane wejściowe:
- Wiersz 1: ID menedżera
- Wiersz 2: Imię i nazwisko menedżera
- Wiersz 3: Wynagrodzenie podstawowe menedżera (float64)
- Wiersz 4: Wielkość zespołu menedżera (liczba całkowita)
- Wiersz 5: ID programisty
- Wiersz 6: Imię i nazwisko programisty
- Wiersz 7: Wynagrodzenie podstawowe programisty (float64)
- Wiersz 8: Język programowania programisty
Dla każdego pracownika wypisz jego informacje, a w następnym wierszu premię. Formatuj premie z dokładnością do dwóch miejsc po przecinku.
Na przykład dla danych M001, Sarah Chen, 80000, 5, D001, Alex Rivera, 65000 i Go wynik powinien wyglądać następująco:
M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00Zauważ, że sposób obliczania premii menedżera (20% z 80000 + 5×100 = 16500) różni się od standardowej premii programisty wynoszącej 10%, a programista dostosowuje sposób wyświetlania swoich informacji. Oba typy nadal mają dostęp do osadzonych pól Employee i mogą w razie potrzeby wywoływać oryginalne metody.
Spróbuj swoich sił
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Wczytaj dane Manager
managerID, _ := reader.ReadString('\n')
managerID = strings.TrimSpace(managerID)
managerName, _ := reader.ReadString('\n')
managerName = strings.TrimSpace(managerName)
managerSalaryStr, _ := reader.ReadString('\n')
managerSalary, _ := strconv.ParseFloat(strings.TrimSpace(managerSalaryStr), 64)
teamSizeStr, _ := reader.ReadString('\n')
teamSize, _ := strconv.Atoi(strings.TrimSpace(teamSizeStr))
// Wczytaj dane Developer
devID, _ := reader.ReadString('\n')
devID = strings.TrimSpace(devID)
devName, _ := reader.ReadString('\n')
devName = strings.TrimSpace(devName)
devSalaryStr, _ := reader.ReadString('\n')
devSalary, _ := strconv.ParseFloat(strings.TrimSpace(devSalaryStr), 64)
devLanguage, _ := reader.ReadString('\n')
devLanguage = strings.TrimSpace(devLanguage)
// TODO: Utwórz Manager na podstawie wczytanych wartości
// Wskazówka: Użyj kompozycji — Manager osadza Employee
// TODO: Utwórz Developer na podstawie wczytanych wartości
// Wskazówka: Użyj kompozycji — Developer osadza Employee
// TODO: Wyświetl informacje o menedżerze i premię (premia sformatowana do 2 miejsc po przecinku)
// Użyj fmt.Printf z "%.2f" do formatowania
// TODO: Wyświetl informacje o programiście i premię (premia sformatowana do 2 miejsc po przecinku)
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Podstawy OOP w Go
Pliki zewnętrzneObszar roboczy i moduły GoPakiety i importyNazwy eksportowane i nieeksportowaneWprowadzenie do OOP w GoStruktury jako klasyDefiniowanie metod dla strukturOdbiorniki wskaźnikowe i wartościoweInicjalizacja strukturFunkcje konstruktoraPodsumowanie – prosty kalkulator4Interfejsy
Wprowadzenie do interfejsówImplementacja niejawnaInterfejs jako kontraktPusty interfejs (any)Asercja typuPrzełącznik typówKompozycja interfejsówInterfejsy Stringer i ErrorPowtórka — kalkulator figur7Hermetyzacja
Pola eksportowane i nieeksportowaneHermetyzacja na poziomie pakietuMetody pobierające i ustawiająceUkrywanie informacji w GoPowtórka – dane studentów10Typy generyczne (Go 1.18+)
Wprowadzenie do typów generycznychParametry typówOgraniczenia typówStruktury generyczneObejście ograniczeń metod generycznychPodsumowanie — generyczna kolekcja2Typy i struktury w praktyce
Typy proste i złożoneDefiniowanie własnych typówTagi pól strukturStruktury anonimoweStruktury zagnieżdżoneWartości zerowe i domyślnePodsumowanie – książka kontaktów5Kompozycja zamiast dziedziczenia
Dlaczego Go nie ma dziedziczeniaPodstawy osadzania strukturPromowanie metodOsadzanie wielu strukturOsadzanie a agregacjaPrzesłanianie osadzonych metodPodsumowanie — hierarchia pracowników8Obsługa błędów i programowanie obiektowe
Interfejs błęduWłasne typy błędówOpakowywanie błędów (fmt.Errorf)Błędy wartowniczeerrors.Is() i errors.As()Panic, Defer i RecoverPodsumowanie — parser plików3Wskaźniki i pamięć
Podstawy wskaźników w GoWskaźniki do strukturPrzekazywanie przez wartość a przez referencjęFunkcja new()Odśmiecanie pamięci w GoPowtórka — kreator listy wiązanej6Polimorfizm w Go
Polimorfizm za pomocą interfejsówDuck typing w GoZasady spełniania interfejsówKolekcje polimorficzneWstrzykiwanie zależnościPowtórka — procesor płatności9Współbieżność i OOP
Podstawy goroutinesKanały i komunikacjaKanały buforowane i niebuforowaneInstrukcja selectsync.Mutex i sync.RWMutexsync.WaitGroupProjektowanie struktur bezpiecznych wątkowoPowtórka – pula workerów12Zaawansowane zagadnienia programowania obiektowego
Wzorzec opcji funkcyjnychWzorzec Builder w GoŁańcuchowe wywoływanie metodAliasy typów a definicje typówPodstawy refleksjiPrzegląd generowania koduPoćwicz samodzielnie: Kompilator Go online