Итоги — Иерархия сотрудников
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy. Урок 40 из 107.
Задание
ЛегкоДавайте создадим систему иерархии сотрудников для компании, которая демонстрирует, как композиция элегантно моделирует реальные организационные структуры. Вы создадите базовый тип сотрудника, который специализированные роли смогут расширять собственным уникальным поведением.
Вы организуете код в трёх файлах:
employee.go: создайте основу со структуройEmployee, содержащей поляID,NameиBaseSalary(float64). Добавьте в неё два метода:Info() string, который возвращает[ID] [Name]CalculateBonus() float64, который возвращает 10% от базовой зарплаты
roles.go: создайте два специализированных типа сотрудников, встраивающихEmployee:Managerс полемTeamSize(int): менеджеры получают больший бонус — 20% от базовой зарплаты плюс 100 долларов за каждого участника команды. Спрячьте методCalculateBonus, чтобы реализовать это поведение.Developerс полемLanguage(string): разработчики сохраняют стандартный бонус, но скрывают методInfo, чтобы добавить свой язык программирования:[ID] [Name] ([Language])
main.go: прочитайте сведения о сотрудниках из входных данных, создайте одного Manager и одного Developer, затем выведите информацию о каждом сотруднике и рассчитанный бонус.
Будут предоставлены следующие входные данные:
- Строка 1: идентификатор Manager
- Строка 2: имя Manager
- Строка 3: базовая зарплата Manager (float64)
- Строка 4: размер команды Manager (целое число)
- Строка 5: идентификатор Developer
- Строка 6: имя Developer
- Строка 7: базовая зарплата Developer (float64)
- Строка 8: язык программирования Developer
Для каждого сотрудника выведите его информацию, а на следующей строке — его бонус. Форматируйте бонусы с двумя знаками после десятичной точки.
Например, если заданы M001, Sarah Chen, 80000, 5, D001, Alex Rivera, 65000 и Go, результат должен быть следующим:
M001 Sarah Chen
16500.00
D001 Alex Rivera (Go)
6500.00Обратите внимание, чем расчёт бонуса Manager (20% от 80000 + 5×100 = 16500) отличается от стандартного бонуса Developer в размере 10%, тогда как Developer настраивает способ отображения своей информации. Оба типа по-прежнему имеют доступ к встроенным полям Employee и могут при необходимости вызывать исходные методы.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Прочитать данные 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))
// Прочитать данные 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: Создать Manager, используя прочитанные значения
// Hint: Используйте композицию - Manager встраивает Employee
// TODO: Создать Developer, используя прочитанные значения
// Hint: Используйте композицию - Developer встраивает Employee
// TODO: Вывести информацию о manager и бонус (бонус отформатирован до 2 знаков после запятой)
// Используйте fmt.Printf с "%.2f" для форматирования
// TODO: Вывести информацию о developer и бонус (бонус отформатирован до 2 знаков после запятой)
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП в Go
Внешние файлыРабочее пространство и модули GoПакеты и импортыЭкспортируемые и неэкспортируемые именаВведение в ООП в GoСтруктуры как классыОпределение методов структурПолучатели-указатели и получатели-значенияИнициализация структурФункции-конструкторыИтоги — Простой калькулятор4Интерфейсы
Введение в интерфейсыНеявная реализацияИнтерфейс как контрактПустой интерфейс (any)Утверждение типаПереключатель типовКомпозиция интерфейсовИнтерфейсы Stringer и ErrorПовторение: Калькулятор фигур7Инкапсуляция
Экспортируемые и неэкспортируемые поляИнкапсуляция на уровне пакетовГеттеры и сеттерыСокрытие информации в GoИтоги — Записи о студентах10Обобщения (Generics) (Go 1.18+)
Введение в GenericsПараметры типовОграничения типовОбобщенные структурыОбходной путь для обобщенных методовИтоги — Обобщенная коллекция13Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн Abstract FactoryПаттерн ObserverПаттерн Strategy2Глубокое погружение в типы и структуры
Базовые и составные типыОпределение пользовательских типовТеги структурАнонимные структурыВложенные структурыНулевые значения и значения по умолчаниюПовторение — Контактная книга5Композиция вместо наследования
Почему в Go нет наследованияОсновы встраивания структурПродвижение методовВстраивание нескольких структурВстраивание против агрегацииЗатенение встроенных методовИтоги — Иерархия сотрудников8Обработка ошибок и ООП
Интерфейс errorПользовательские типы ошибокОбертывание ошибок (fmt.Errorf)Sentinel-ошибкиerrors.Is() и errors.As()Panic, Defer и RecoverИтоги — Парсер файлов11Стандартная библиотека и ООП
io.Reader и io.Writersort.InterfaceИнтерфейс fmt.Stringerencoding/json со структурамиИнтерфейс http.HandlerПовторение: модели REST API14Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикMiddleware как Декоратор3Указатели и память
Основы указателей в GoУказатели на структурыПередача по значению и по ссылкеФункция new()Сборка мусора в GoПовторение: Конструктор связного списка6Полиморфизм в Go
Полиморфизм через интерфейсыУтиная типизация в GoПравила реализации интерфейсовПолиморфные коллекцииВнедрение зависимостейИтоги — Обработчик платежей9Конкурентность и ООП
Основы горутинКаналы и взаимодействиеБуферизованные и небуферизованные каналыОператор selectsync.Mutex и sync.RWMutexsync.WaitGroupПроектирование потокобезопасных структурПовторение — Worker PoolПотренируйтесь самостоятельно: Онлайн-компилятор Go