Menu
Coddy logo textTech

Итоги — Иерархия сотрудников

Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy. Урок 40 из 107.

challenge icon

Задание

Легко

Давайте создадим систему иерархии сотрудников для компании, которая демонстрирует, как композиция элегантно моделирует реальные организационные структуры. Вы создадите базовый тип сотрудника, который специализированные роли смогут расширять собственным уникальным поведением.

Вы организуете код в трёх файлах:

  • 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 знаков после запятой)
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Go