Итоги — Записи о студентах
Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 35 из 110.
Задание
ЛегкоДавайте создадим систему учета студентов, которая объединит все концепции инкапсуляции, изученные вами в этой главе. Вы создадите класс Student, который должным образом защищает конфиденциальные академические данные, обеспечивая при этом контролируемый доступ через геттеры, сеттеры и вычисляемые свойства.
Вы организуете свой код в двух файлах:
student.dart: Определите классStudent, который управляет академическими записями с использованием надлежащей инкапсуляции:final String id— идентификатор студента не должен меняться после создания- Публичное поле
String name— имена могут обновляться - Приватный список
List<int> _grades— необработанный список оценок должен быть защищен - Конструктор, который принимает id, name и начальный список оценок
- Геттер
gradeCount, который возвращает количество записанных оценок - Вычисляемый геттер
average, который вычисляет и возвращает среднее значение всех оценок в видеdouble(возвращает0.0, если оценок нет) - Вычисляемый геттер
letterGrade, который возвращает букву на основе среднего балла:'A'для 90+,'B'для 80-89,'C'для 70-79,'D'для 60-69 и'F'для оценок ниже 60 - Метод
addGrade(int grade), который принимает только оценки от 0 до 100 (включительно). Если оценка валидна, добавьте её и выведитеGrade [grade] added for [name]. Если невалидна, выведитеInvalid grade: [grade] - Метод
getHighestGrade(), который возвращает самую высокую оценку или0, если оценок нет - Метод
displayRecord(), который показывает академическую сводку студента
main.dart: Импортируйте ваш класс студента и продемонстрируйте инкапсуляцию в действии:- Создайте студента с id
'STU001', именем'Emma'и начальными оценками[85, 92, 78] - Вызовите
displayRecord() - Добавьте оценку
95 - Попробуйте добавить невалидную оценку
150 - Добавьте оценку
88 - Вызовите
displayRecord() - Выведите
Highest grade: [highest]
- Создайте студента с id
Метод displayRecord() должен выводить данные в следующем формате:
===== Student Record =====
ID: [id]
Name: [name]
Grades Recorded: [gradeCount]
Average: [average]
Letter Grade: [letterGrade]Ожидаемый вывод:
===== Student Record =====
ID: STU001
Name: Emma
Grades Recorded: 3
Average: 85.0
Letter Grade: B
Grade 95 added for Emma
Invalid grade: 150
Grade 88 added for Emma
===== Student Record =====
ID: STU001
Name: Emma
Grades Recorded: 5
Average: 87.6
Letter Grade: B
Highest grade: 95Попробуйте сами
import 'student.dart';
void main() {
// TODO: Создайте студента с id 'STU001', именем 'Emma' и начальными оценками [85, 92, 78]
// TODO: Вызовите displayRecord()
// TODO: Добавьте оценку 95
// TODO: Попробуйте добавить недопустимую оценку 150
// TODO: Добавьте оценку 88
// TODO: Вызовите displayRecord()
// TODO: Выведите "Highest grade: [highest]"
}
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыБиблиотеки и импортВведение в ООПКлассы и объектыКлючевое слово thisМетодыПеременные экземпляраОсновы конструкторовИтоги — Простой калькулятор4Null-безопасность
Введение в Null-безопасностьNullable и Non-Nullable типыОператоры ? и !Ключевое слово Late и Null-безопасностьNull-aware операторыNull-безопасность в классахИтоги — Система профилей пользователей7Абстрактные классы и интерфейсы
Абстрактные классыАбстрактные методыИнтерфейсы в DartНеявные интерфейсыРеализация против наследованияМножественные интерфейсыИтоги — Калькулятор фигур10Коллекции и обобщения
Обзор List, Set, MapТипобезопасные коллекцииОбобщенные классыОбобщенные методыОграничения обобщенийIterable и IteratorИтоги: Обобщенное хранилище13Продвинутые концепции ООП
Композиция против наследованияМетоды расширенияВызываемые классыЗапечатанные классы (Dart 3)Записи (Dart 3)Паттерны и сопоставление (3.0)Перечисления с методами16Проект: Управление библиотекой
Обзор проектаКлассы Book и User2Конструкторы в Dart
Конструктор по умолчаниюИменованные конструкторыСписки инициализацииКонстантные конструкторыФабричные конструкторыПеренаправляющие конструкторыИтоги — Shape Builder5Инкапсуляция
Публичные и приватные членыСоглашение о префиксе _Приватность на уровне библиотекГеттеры и сеттеры: подробный разборСкрытие данныхИтоги — Записи о студентах8Mixins
Введение в MixinsСоздание MixinsИспользование нескольких MixinsКлючевое слово on в MixinsMixin и наследованиеMixin и интерфейсИтоги: Система животных11Специальные методы
Переопределение toString()Переопределение hashCode и ==Интерфейс ComparableМетод call()Переопределение noSuchMethodПовторение — Пользовательская коллекция14Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy3Свойства классов
Члены экземпляра и статические членыПоля Final и ConstПеременные LateСтатические методы и поляГеттеры и сеттерыИтоги — Менеджер банковского счета6Наследование
Основы наследованияКлючевое слово superПереопределение методовАннотация @overrideКлючевое слово final для классовКонструкторы и наследованиеИтоги: Иерархия сотрудников9Полиморфизм
Основы полиморфизмаПолиморфизм через интерфейсыПроверка типов во время выполненияОператоры is и asКлючевое слово covariantИтоги — Обработчик платежей12Асинхронное ООП
Futures и async/awaitОсновы StreamsКонтроллеры StreamАсинхронные конструкторыАсинхронность в методах классовИтоги — Data Fetcher15Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий