Итоги — Записи о студентах
Часть раздела Объектно-ориентированное программирование путешествия по GO на Coddy. Урок 51 из 107.
Задание
ЛегкоДавайте создадим систему Student Records, демонстрирующую proper инкапсуляцию. Вы создадите структуру управления студентами, в которой конфиденциальные академические data защищены, но при этом обеспечивается контролируемый доступ через хорошо спроектированные method.
Вы организуете код в двух файлах:
student.go: Создайте структуруStudent, которая защищает конфиденциальную information, предоставляя безопасные публичные data. ПолеNameстудента должно быть Exported (публично accessible), а поляgrade(float64) иstudentID(string) должны быть неэкспортируемыми, чтобы защитить эту конфиденциальную information.Implement следующее:
- constructor
NewStudent(name, id string, initialGrade float64) *Student, который creates студента. initial оценка должна устанавливаться only, если она находится between 0 и 100 (inclusive); otherwise следует использовать default значение 0. - getter
Grade() float64, который возвращает current оценку - getter
StudentID() string, который возвращает идентификатор студента - setter
SetGrade(newGrade float64) bool, который обновляет оценку only, если newGrade находится between 0 и 100 (inclusive). Вернитеtrue, если оценка была обновлена, иfalseotherwise. - method
Summary() string, который возвращает формат:[Name] (ID: [studentID]) - Grade: [grade]
- constructor
main.go: Считайте информацию о студенте из входных data, создайте студента, используя constructor, а затем выполните операции с оценками. Выведите сводку о студенте после creation и после каждой Attempt обновления оценки.
Будут предоставлены следующие входные data:
- line 1: Имя студента
- line 2: Идентификатор студента
- line 3: Initial оценка
- line 4: Первая новая оценка для установки
- line 5: Вторая новая оценка для установки
После creation студента выведите его сводку. Затем выполните Attempt каждого обновления оценки: если операция успешна, выведите обновлённую сводку; если обновление отклонено, выведите 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 находится за пределами допустимого диапазона. Ваш setter обеспечивает соблюдение этого правила, сохраняя data студента корректными. Обратите внимание, что studentID и grade никогда не доступны напрямую: внешний код должен использовать ваши getter и setter method для взаимодействия с этими защищёнными data.
Попробуйте сами
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: Попытаться обновить первую оценку
// Если успешно, вывести обновлённую сводку
// If rejected, print "Invalid grade rejected"
// TODO: Попытаться обновить вторую оценку
// Если успешно, вывести обновлённую сводку
// If rejected, print "Invalid grade rejected"
// Подсказка: Используйте 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Потренируйтесь самостоятельно: Онлайн-компилятор Go