Основы синтаксиса языка программирования Dart

Этот курс охватывает фундаментальные конструкции языка Dart, необходимые для старта в разработке мобильных и веб-приложений. Вы изучите базовые типы данных, логику управления потоком, функции, объектно-ориентированный подход и современные особенности языка.

1. Введение в Dart: Переменные, типы данных и константы

Введение в Dart: Переменные, типы данных и константы

Добро пожаловать в курс по основам синтаксиса языка программирования Dart! Это первая статья, с которой начнется ваше погружение в мир современной кроссплатформенной разработки. Dart — это язык, разработанный компанией Google, который стал фундаментом для популярного фреймворка Flutter. Однако Dart прекрасен и сам по себе: он лаконичен, строго типизирован и производителен.

В этой статье мы разберем «кирпичики», из которых строится любая программа: как хранить данные, какие виды данных существуют и как заставить программу запоминать информацию навсегда.

Точка входа: Где начинается программа?

Прежде чем говорить о переменных, нужно понять, где вообще пишется код. В Dart, как и во многих C-подобных языках (C++, Java, C#), выполнение программы всегда начинается с функции main.

Если вы напишете код вне этой функции, он не запустится сам по себе. Минимальная программа на Dart выглядит так:

Разберем этот код: * void — означает, что функция ничего не возвращает (она просто выполняет действие). * main — зарезервированное имя главной функции. * () — круглые скобки для аргументов (сейчас они пусты). * {} — фигурные скобки ограничивают тело функции (блок кода). * print(...) — команда вывода текста в консоль. * ;точка с запятой обязательна в конце каждой инструкции. Это важное отличие от языков вроде Python или Swift, где она часто опускается.

!Поток выполнения программы Dart, начинающийся с функции main.

Переменные: Хранение данных

Представьте, что оперативная память компьютера — это огромный склад с ячейками. Чтобы не запоминать адрес каждой ячейки (например, 0x7fff5694), мы даем им понятные имена. Эти именованные ячейки и есть переменные.

В Dart объявить переменную можно двумя основными способами: с явным указанием типа и с помощью вывода типа.

1. Вывод типа (Type Inference)

Ключевое слово var говорит компилятору: «Посмотри на значение, которое я присваиваю, и сам догадайся, какой это тип данных».

Как только вы присвоили переменной var значение определенного типа, этот тип закрепляется за ней навсегда. Вы не сможете потом записать в age строку.

2. Явное указание типа

Вы можете (и часто это рекомендуется для ясности) явно написать тип переменной вместо var.

Это делает код более читаемым для других программистов: сразу видно, что именно должно храниться в переменной.

!Различие между автоматическим определением типа и строгой типизацией.

Основные типы данных

Dart — строго типизированный язык. Это значит, что каждая переменная имеет свой тип, и операции между несовместимыми типами запрещены (например, нельзя вычесть слово из числа). Рассмотрим основные типы, встроенные в язык.

Числа (Numbers)

В Dart есть два основных типа для чисел, которые наследуются от общего типа num:

  • int (Integer) — целые числа. Их размер зависит от платформы, но обычно это 64-битные числа.
  • * Примеры: -10, 0, 42, 100000.
  • double — числа с плавающей точкой (дробные). Они соответствуют 64-битному стандарту IEEE 754.
  • * Примеры: 3.14, -0.001, 10.0.

    Строки (Strings)

    Строки в Dart — это последовательность символов в кодировке UTF-16. Для создания строк можно использовать как одинарные ', так и двойные " кавычки.

    Интерполяция строк — это мощная возможность встраивать значения переменных прямо в текст. Для этого используется символ name набрал {score + 50}'); dart bool isRaining = false; bool isDartFun = true; dart dynamic box = 'Кот'; print(box); // Выведет: Кот

    box = 42; // Теперь здесь число print(box); // Выведет: 42 dart final DateTime now = DateTime.now(); // Значение будет получено при запуске // now = DateTime.now(); // Ошибка! final переменную нельзя переназначить. dart const double pi = 3.14159; const int secondsInMinute = 60; const int secondsInHour = 60 * 60; // Вычисляется до запуска dart int a; // print(a); // Ошибка компиляции! Переменная не инициализирована.

    int b = null; // Ошибка! Тип int не может быть null. dart int? c; // Теперь c может хранить число или null c = null; // Это допустимо dart int? x; // x равно null int y = 0; // y равно 0, мы обязаны дать значение `

    Заключение

    Мы рассмотрели фундамент языка Dart. Теперь вы знаете:

  • Программа начинается с void main().
  • Переменные — это именованные ячейки памяти.
  • var позволяет не писать тип, если он очевиден, но Dart все равно строго следит за ним.
  • Основные типы: int, double, String, bool.
  • Интерполяция строк через $ удобнее, чем сложение через +.
  • const — для значений, известных до запуска, final — для значений, вычисляемых при запуске.
  • В следующей статье мы научимся управлять потоком выполнения программы: использовать условные операторы if/else` и циклы, чтобы заставить наш код принимать решения.

    2. Управление потоком выполнения: Условные операторы и циклы

    Управление потоком выполнения: Условные операторы и циклы

    В предыдущей статье мы научились создавать «контейнеры» для данных — переменные, и узнали, какими они бывают. Но пока наши программы напоминают поезд, который едет строго по прямым рельсам: от первой строчки кода к последней, без остановок и поворотов.

    В реальной жизни (и в программировании) всё сложнее. Мы постоянно принимаем решения: «Если на улице дождь, я возьму зонт, иначе пойду в футболке». Мы повторяем действия: «Пока не выучу урок, буду читать книгу».

    Сегодня мы научим Dart принимать решения и выполнять рутинную работу за нас. Мы разберем условные операторы (стрелки на рельсах) и циклы (движение по кругу).

    Логические условия: Основа выбора

    Прежде чем писать конструкции if или while, нужно понять, как компьютер отвечает на вопросы. В Dart, как мы помним, есть тип данных bool, который может быть только true (истина) или false (ложь).

    Любое решение в коде базируется на сравнении. Для этого используются операторы сравнения:

    * == — равно (не путайте с =, который присваивает значение). * != — не равно. * > — больше. * < — меньше. * >= — больше или равно. * <= — меньше или равно.

    Логические операторы

    Часто нам нужно проверить сразу несколько условий. Например: «Если у пользователя есть деньги И магазин открыт». Для этого служат логические операторы:

  • && (И / AND) — возвращает true, только если оба условия верны.
  • || (ИЛИ / OR) — возвращает true, если хотя бы одно из условий верно.
  • ! (НЕ / NOT) — инвертирует значение (превращает true в false и наоборот).
  • Условный оператор if-else

    Самая базовая конструкция управления потоком — это if (если). Она позволяет выполнить блок кода, только если условие истинно.

    Простой if

    Если batteryLevel будет равен 20, программа просто пропустит код внутри фигурных скобок {}.

    Конструкция if-else

    Часто нам нужно не просто выполнить действие при успехе, но и предложить альтернативу. Для этого используется else (иначе).

    !Схема работы условного оператора if-else.

    Цепочка else if

    Если вариантов больше двух, можно выстраивать цепочки проверок.

    Обратите внимание: как только Dart находит первое истинное условие, он выполняет его блок и выходит из всей конструкции. Остальные проверки игнорируются.

    > Важное отличие Dart: В отличие от JavaScript или C++, в Dart условие внутри if обязано быть типа bool. Вы не можете написать if (1), надеясь, что 1 превратится в true. Это вызовет ошибку компиляции.

    Тернарный оператор

    Иногда if-else занимает слишком много места для простой операции присваивания. В таких случаях используют тернарный оператор ? :.

    Синтаксис: условие ? значение_если_true : значение_если_false

    Используйте этот оператор аккуратно. Если условие сложное, лучше написать обычный if для читаемости.

    Оператор switch

    Когда нужно сравнить одну переменную с множеством конкретных значений, конструкция if-else становится громоздкой. Здесь на помощь приходит switch (переключатель).

    Разберем ключевые слова: * case: вариант значения. Если переменная совпадает с ним, выполняется код ниже. * break: команда «выход». Она останавливает выполнение switch. Если её забыть, в старых версиях языков выполнение «проваливалось» бы в следующий кейс (в современном Dart есть защита от случайного проваливания для непустых кейсов). * default: выполняется, если ни один case не подошел (аналог последнего else).

    Циклы: Искусство повторения

    Компьютеры превосходны в выполнении рутинных задач. Если вам нужно вывести фразу «Привет» 1000 раз, глупо писать print 1000 раз. Для этого существуют циклы.

    Цикл for

    Это классический цикл, пришедший из языка C. Он идеально подходит, когда вы точно знаете, сколько раз нужно повторить действие.

    Синтаксис: for (инициализация; условие; обновление)

    Этот код читается как обычное английское предложение: «Для каждого имени в именах...».

    Цикл while

    Цикл while (пока) используется, когда мы не знаем точное количество повторений, но знаем условие, при котором нужно продолжать.

    Осторожно: Если вы забудете изменить переменную внутри цикла (например, убрать hunger--), условие всегда будет истинным, и программа зависнет в бесконечном цикле.

    Цикл do-while

    Очень похож на while, но с одним отличием: проверка условия происходит после выполнения тела цикла. Это гарантирует, что код внутри выполнится хотя бы один раз, даже если условие изначально ложно.

    В примере выше number (10) явно не больше 100, но сообщение все равно появится в консоли один раз.

    Управление внутри циклов: break и continue

    Иногда нам нужно вмешаться в стандартный ход цикла.

    break

    Команда break немедленно прерывает весь цикл и выходит из него.

    continue

    Команда continue прерывает текущую итерацию и переходит к следующей. Цикл не останавливается полностью.

    Заключение

    Теперь ваша программа на Dart умеет думать и работать усердно:

  • if-else и switch позволяют выбирать путь выполнения в зависимости от условий.
  • Циклы (for, while) позволяют повторять код сотни и тысячи раз без дублирования строк.
  • break и continue дают тонкий контроль над работой циклов.
  • Это были базовые конструкции управления потоком. В следующей статье мы перейдем к одной из самых важных тем в программировании — Функциям. Мы узнаем, как упаковывать логику в переиспользуемые блоки, чтобы наш код был чистым и модульным.