Menu
Coddy logo textTech

Введение в Null-безопасность

Часть раздела Объектно-ориентированное программирование путешествия по Dart на Coddy — урок 23 из 110.

Одной из наиболее распространенных причин ошибок в программировании является попытка использовать значение, которое не существует. В Dart это специальное «отсутствие значения» представлено как null. Функция null safety в Dart помогает обнаруживать эти ошибки еще до запуска вашего кода.

Без null safety любая переменная потенциально может быть null, что приводит к сбоям во время выполнения при попытке её использования:

// В старых версиях Dart (без null safety)
String name;  // Может быть null!
print(name.length);  // Сбой, если name равно null

При включенной проверке на null (null safety) (Dart 2.12+), компилятор различает переменные, которые могут содержать null, и те, которые не могут. По умолчанию переменные являются не допускающими значение null (non-nullable) — они всегда должны содержать допустимое значение:

String name = 'Alice';  // Должна иметь значение
print(name.length);     // Безопасно — name никогда не равно null

Компилятор откажется компилировать код, в котором переменная, не допускающая значения null (non-nullable), может иметь значение null. Это переносит обнаружение ошибок со стадии выполнения на стадию компиляции, делая ваши программы более надежными. В следующих уроках вы узнаете, как объявлять типы, допускающие значение null (nullable), когда они вам действительно необходимы, и познакомитесь с операторами, которые предоставляет Dart для безопасной работы с потенциально нулевыми значениями.

challenge icon

Задание

Легко

Давайте создадим простую систему контактных карточек, которая демонстрирует важность не допускающих значения null переменных. Вы создадите систему, в которой каждый контакт должен иметь корректную, гарантированную информацию.

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

  • contact.dart: Определите класс Contact, который представляет контактную информацию человека. Поскольку мы работаем с null safety, каждое поле должно иметь корректное значение — отсутствие данных не допускается! Ваш класс должен содержать:
    • String firstName для имени контакта
    • String lastName для фамилии контакта
    • String email для адреса электронной почты контакта
    • int phoneDigits для количества цифр в номере телефона
    • Конструктор, принимающий все четыре значения
    • Геттер fullName, который возвращает имя и фамилию, объединенные пробелом
    • Метод displayCard(), который выводит информацию о контакте
  • main.dart: Импортируйте ваш класс контакта и создайте два контакта, чтобы продемонстрировать, что все поля гарантированно имеют значения:
    • Создайте контакт с именем 'Emma', фамилией 'Wilson', электронной почтой 'emma@mail.com' и количеством цифр в телефоне 10
    • Создайте контакт с именем 'James', фамилией 'Brown', электронной почтой 'james@work.com' и количеством цифр в телефоне 11
    • Вызовите displayCard() для каждого контакта в указанном выше порядке

Метод displayCard() должен выводить данные именно в таком формате:

--- Contact Card ---
Name: [fullName]
Email: [email]
Phone digits: [phoneDigits]

Обратите внимание, что каждая переменная должна быть инициализирована реальным значением — это null safety в действии! Компилятор гарантирует, что при доступе к fullName, email или любому другому полю они всегда будут содержать корректные данные.

Ожидаемый вывод:

--- Contact Card ---
Name: Emma Wilson
Email: emma@mail.com
Phone digits: 10
--- Contact Card ---
Name: James Brown
Email: james@work.com
Phone digits: 11

Попробуйте сами

import 'contact.dart';

void main() {
  // TODO: Создайте первый контакт со следующими данными:
  // - имя: 'Emma'
  // - фамилия: 'Wilson'
  // - email: 'emma@mail.com'
  // - количество цифр в номере: 10

  // TODO: Создайте второй контакт со следующими данными:
  // - имя: 'James'
  // - фамилия: 'Brown'
  // - email: 'james@work.com'
  // - количество цифр в номере: 11

  // TODO: Вызовите displayCard() для каждого контакта по порядку
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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