Итоги — Записи о студентах
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy — урок 51 из 107.
Задание
ЛегкоДавайте создадим систему учета студентов, которая демонстрирует правильную инкапсуляцию. Вы создадите структуру управления студентами, в которой конфиденциальные академические данные защищены, но при этом обеспечивается контролируемый доступ через хорошо спроектированные методы.
Вы организуете свой код в двух файлах:
student.go: Создайте структуруStudent, которая защищает конфиденциальную информацию, открывая при этом безопасные публичные данные. Имя студентаNameдолжно быть экспортируемым (публично доступным), но егоgrade(float64) иstudentID(string) должны быть неэкспортируемыми для защиты этой конфиденциальной информации.Реализуйте следующее:
- Конструктор
NewStudent(name, id string, initialGrade float64) *Student, который создает студента. Начальная оценка должна устанавливаться только в том случае, если она находится в диапазоне от 0 до 100 (включительно); в противном случае установите значение по умолчанию 0. - Геттер
Grade() float64, который возвращает текущую оценку. - Геттер
StudentID() string, который возвращает ID студента. - Сеттер
SetGrade(newGrade float64) bool, который обновляет оценку только в том случае, если новое значение находится в диапазоне от 0 до 100 (включительно). Возвращаетtrue, если оценка была обновлена, иfalseв противном случае. - Метод
Summary() string, который возвращает строку в формате:[Name] (ID: [studentID]) - Grade: [grade]
- Конструктор
main.go: Считайте информацию о студенте из входных данных, создайте студента с помощью конструктора, а затем выполните операции с оценками. Выведите сводку (summary) студента после создания и после каждой попытки обновления оценки.
Будут предоставлены следующие входные данные:
- Строка 1: Имя студента
- Строка 2: ID студента
- Строка 3: Начальная оценка
- Строка 4: Первая новая оценка для установки
- Строка 5: Вторая новая оценка для установки
После создания студента выведите его сводку. Затем попытайтесь выполнить каждое обновление оценки — в случае успеха выведите обновленную сводку; если попытка отклонена, выведите Invalid grade rejected. Форматируйте все значения оценок с двумя знаками после запятой.
Например, для входных данных Emma Wilson, STU001, 85.5, 92.0 и 150 ваш вывод должен быть следующим:
Emma Wilson (ID: STU001) - Grade: 85.50
Emma Wilson (ID: STU001) - Grade: 92.00
Invalid grade rejectedПоследнее обновление не удается, так как 150 находится вне допустимого диапазона. Ваш метод-сеттер обеспечивает соблюдение этого правила, сохраняя данные студента корректными. Обратите внимание, что studentID и grade никогда не доступны напрямую — внешний код должен использовать ваши методы геттеры и сеттеры для взаимодействия с этими защищенными данными.
Попробуйте сами
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
// Чтение имени студента
name, _ := reader.ReadString('\n')
name = strings.TrimSpace(name)
// Чтение ID студента
id, _ := reader.ReadString('\n')
id = strings.TrimSpace(id)
// Чтение начальной оценки
initialGradeStr, _ := reader.ReadString('\n')
initialGrade, _ := strconv.ParseFloat(strings.TrimSpace(initialGradeStr), 64)
// Чтение первой новой оценки
newGrade1Str, _ := reader.ReadString('\n')
newGrade1, _ := strconv.ParseFloat(strings.TrimSpace(newGrade1Str), 64)
// Чтение второй новой оценки
newGrade2Str, _ := reader.ReadString('\n')
newGrade2, _ := strconv.ParseFloat(strings.TrimSpace(newGrade2Str), 64)
// TODO: Создайте нового студента, используя конструктор NewStudent
// TODO: Выведите сводку о студенте после создания
// TODO: Попробуйте выполнить первое обновление оценки
// Если обновление прошло успешно, выведите обновленную сводку
// Если отклонено, выведите "Invalid grade rejected"
// TODO: Попробуйте выполнить второе обновление оценки
// Если обновление прошло успешно, выведите обновленную сводку
// Если отклонено, выведите "Invalid grade rejected"
// Hint: Используйте fmt.Sprintf с %.2f для форматирования оценок в Summary()
_ = newGrade1 // Удалите эту строку, когда начнете использовать переменную
_ = newGrade2 // Удалите эту строку, когда начнете использовать переменную
}
Все уроки раздела Объектно-ориентированное программирование
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