Рубрика: Flutter и Dart

Бесплатные книги и видео-курсы по Flutter и Dart разработке кроссплатформенных приложений

  • Выражения, переменные и константы (MDFD0102)

    Теперь, когда вы настроили среду разработки Dart, пришло время начать писать код Dart!

    Следуйте примерам кодирования в этой главе. Просто создайте проект для собственного использования и вводите код по мере работы с примерами.

    Комментирующий код

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

    Глубина и сложность кода, который вы пишете, могут скрыть детали общей картины того, почему вы написали свой код определенным образом или даже какую проблему решает ваш код. Чтобы предотвратить это, рекомендуется документировать то, что вы написали, чтобы следующий пользователь, который пройдет через ваш код, смог понять смысл вашей работы. В конце концов, этот следующий человек может стать вами в будущем!

    Первый способ написать комментарий в Dart — начать строку с двух косых черт:

    // This is a comment. It is not executed.
    

    Это однострочный комментарий.

    Вы можете складывать однострочные комментарии, чтобы можно было писать многострочные комментарии, как показано ниже:

    // This is also a comment,
    // over multiple lines.
    

    Вы также можете создавать блоки комментариев, помещая текст вашего комментария между /*и*/:

    /* This is also a comment. Over many...
    many...
    many lines. */
    

    Начало обозначается /*, а конец обозначается */.

    Dart также позволяет вам вставлять комментарии, например, так:

    /* This is a comment.
    /* And inside it is
    another comment. */
    Back to the first. */
    

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

    /// I am a documentation comment
    /// at your service.
    
    /**
     * Me, too!
     */
    

    Комментарии к документации очень полезны, потому что вы можете использовать их для создания … как вы уже догадались … документации! Вы захотите добавлять комментарии к документации в свой код всякий раз, когда у вас есть общедоступный API, чтобы пользователи и вы сами в будущем знали, как работает ваш API. Хотя в этой книге не будет углубляться в это, комментарии к документации даже поддерживают форматирование Markdown, чтобы вы могли добавлять в свои комментарии такие элементы, как примеры кода или ссылки.

    ПримечаниеAPI, или интерфейс прикладного программирования, — это код, которым вы делитесь с другими людьми или программами. Вы узнаете, как создать свой собственный API в Dart Apprentice: за пределами основ.

    Документация Flutter и Dart хорошо известна своими подробными комментариями. И поскольку код для Flutter и Dart с открытым исходным кодом, простой просмотр его — отличный способ узнать, как написаны замечательные комментарии к документации.

    На самом деле, вы можете попробовать просмотреть эту документацию прямо сейчас. Возьмите программу Hello Dart из главы 1 “Привет, Дарт!”.:

    void main() {
      print('Hello, Dart!');
    }
    

    В VS Code введите ключевое слово Command+Click на компьютере Mac или Control+Click на компьютере PCprint. VS Code приведет вас к исходному коду для этого ключевого слова, и вы увидите комментарии к документации дляprint:

    Кстатиprint, это еще один полезный инструмент при написании Dart-кода.

    Выходные данные для печати

    print будет выводить все, что вы хотите, на консоль отладки.

    Например, рассмотрим следующий код:

    print('Hello, Dart Apprentice reader!');
    

    Запустите этот код, и он выведет приятное сообщение на консоль отладки, например:

    Добавление printоператоров в ваш код — это простой способ отслеживать, что происходит в определенной точке вашего кода. Позже, когда вы будете готовы перейти на следующий уровень отладки, вы можете ознакомиться с некоторыми более подробными пакетами ведения журнала на pub.dev.

    Вы можете напечатать любое выражение в Dart. Однако, чтобы узнать, что такое выражение, продолжайте читать.

    Заявления и выражения

    Два важных слова, которые вы часто услышите в документации по языку программирования, — это оператор и выражение. Полезно понимать разницу между ними.

    Заявления

    Оператор — это команда, то, что вы приказываете компьютеру выполнить. В Dart все простые операторы заканчиваются точкой с запятой. Вы уже видели это в printзаявлении:

    print('Hello, Dart Apprentice reader!');
    

    Точка с запятой справа завершает оператор.

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

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

    Одним из примеров сложного утверждения является ifутверждение:

    if (someCondition) {
      // code block
    }
    

    В строках с открывающими или закрывающими фигурными скобками точка с запятой не требуется. Вы узнаете больше об ifоператорах и других операторах потока управления в главе 5 “Поток управления”.

    Выражения

    В отличие от утверждения, выражение не делает что-то; это чтото. То есть выражение — это значение или нечто, что может быть вычислено как значение.

    Вот несколько примеров выражений в Dart:

    42
    3 + 2
    'Hello, Dart Apprentice reader!'
    x
    

    Значения могут быть числами, текстом или каким-либо другим типом. Они могут быть даже переменными, такими как x, значение которых неизвестно до времени выполнения.

    Далее вы увидите еще много примеров выражений.

    Арифметические операции

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

    Простые операции

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

    • Добавить: +
    • Вычтите: -
    • Умножать: *
    • Разделить: /

    Эти операторы используются следующим образом:

    2 + 6
    10 - 2
    2 * 4
    24 / 3
    

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

    Проверьте ответы самостоятельно в VS Code, используя printинструкцию:

    print(2 + 6);
    

    Примечание: Если вы напечатаете результат выражения 24 / 3в VS Code, вы увидите8.0, а не 8. Это потому, что вывод оператора деления равен a double. Подробнее об этом вы узнаете doubleпозже в этой главе и в главе 3 “Типы и операции”.

    С другой стороны, если вы печатаете 24 / 3на dartpad.dev, вы увидите только 8. Это потому, что в Интернете Dart компилирует ваш код в JavaScript, а JavaScript не делает различий между 8и 8.0.

    Dart игнорирует пробелы, поэтому вы можете удалить пробелы, окружающие оператор:

    2+6
    

    Однако часто легче читать выражения, когда у вас есть пробелы с обеих сторон. Фактически, инструмент форматирования dart в Dart SDK отформатирует ваш код в соответствии со стандартными правилами форматирования пробелов. В VS Code вы можете подать dart formatзаявку с помощью сочетания клавиш Shift + Option + F на Mac или Shift + Alt + F на ПК. В зависимости от настроек VS Code сохранение файла также может вызвать автоматическое форматирование.

    Примечание: Эта книга не всегда будет явно указывать вамprint(X), где Xнаходится какое-либо выражение Dart, о котором вы изучаете, но вы должны предварительно сделать это самостоятельно, чтобы проверить значение.

    Десятичные числа

    Во всех приведенных выше операциях используются целые числа, более формально известные как целые числа. Однако, как вы знаете, не каждое число является целым.

    Например, рассмотрим следующее:

    22 / 7
    

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

    3.142857142857143
    

    Если вы действительно хотели выполнить целочисленное деление, то вы могли бы использовать ~/оператор:

    22 ~/ 7
    

    Это приводит к результату 3.

    ~/Оператор официально называется оператором усечения деления, когда применяется к числам. Если прищуриться, тильда выглядит как слоновий хобот, так что это может помочь вам вспомнить, что она делает. Или нет.

    Евклидова операция по модулю

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

    Первым из них является евклидова операция по модулю. Это сложное название для простой задачи. При делении знаменатель переходит в числитель целое число раз плюс остаток. Этот остаток — это то, что вычисляет евклидова операция по модулю. Например, 10 по модулю 3 равно 1, потому что 3 трижды превращается в 10 с остатком 1.

    В Dart евклидов оператор по модулю является %символом. Вы используете это так:

    28 % 10
    

    В этом случае результат равен 8, потому что 10 дважды переходит в 28 с остатком 8.

    Порядок выполнения операций

    Конечно, вполне вероятно, что при вычислении значения вам потребуется использовать несколько операторов. Вот пример того, как это сделать в Dart:

    ((8000 / (5 * 10)) - 32) ~/ (29 % 5)
    

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

    Например, рассмотрим следующее:

    350 / 5 + 2
    

    Равно ли это 72(350, деленное на 5, плюс 2) или 50(350, деленное на 7)? Те из вас, кто обращал внимание в школе, кричат: “72”! И ты прав.

    Dart использует те же рассуждения и достигает этого с помощью так называемого приоритета операторов. Оператор деления (/) имеет более высокий приоритет, чем оператор сложения (+), поэтому в этом примере код сначала выполняет операцию деления.

    Если вы хотите, чтобы Dart сначала выполнил сложение — то есть, чтобы выражение возвращалось 50вместо 72— тогда вы могли бы использовать круглые скобки, например:

    350 / (5 + 2)
    

    Правила приоритета такие же, как вы изучали в школе. Умножение и деление имеют равный приоритет. Сложение и вычитание имеют одинаковый приоритет друг перед другом, но имеют более низкий приоритет, чем умножение и деление.

    Операторы ~/и %имеют тот же приоритет, что и операции умножения и деления. Если вы когда-либо не уверены в том, какой приоритет имеет оператор, вы всегда можете использовать круглые скобки, чтобы быть уверенным, что выражение вычисляется так, как вы хотите.

    Математические функции

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

    Чтобы использовать эти математические функции, добавьте следующий импорт в начало вашего файла:

    import 'dart:math';
    

    dart:math является одной из основных библиотек Dart. Добавление importинструкции сообщает компилятору, что вы хотите использовать что-то из этой библиотеки.

    Теперь вы можете написать следующее:

    sin(45 * pi / 180)
    // 0.7071067811865475
    
    cos(135 * pi / 180)
    // -0.7071067811865475
    

    Они преобразуют угол из градусов в радианы, а затем вычисляют синус и косинус соответственно. Обратите внимание, как оба используютpi, что постоянный Dart предоставляет вам. Мило!

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

    print(sin(45 * pi / 180));

    Тогда есть это:

    sqrt(2)
    // 1.4142135623730951
    

    Это вычисляет квадратный корень из 2.

    Не упомянуть об этом было бы стыдно:

    max(5, 10)
    // 10
    
    min(-5, -10)
    // -10
    

    Они вычисляют максимальное и минимальное из двух чисел соответственно.

    Если вы особенно предприимчивы, вы даже можете объединить эти функции следующим образом:

    max(sqrt(2), pi / 2)
    // 1.5707963267948966
    

    Упражнение

    Выведите значение из 1квадратного корня из 2. Подтвердите, что он равен синусу 45°.

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

    Присвоение имен данным

    В самом простом смысле компьютерное программирование — это манипулирование данными, потому что все, что вы видите на экране, можно свести к числам. Иногда вы представляете данные и работаете с ними в виде различных типов чисел, но в других случаях данные поступают в более сложных формах, таких как текст, изображения и коллекции.

    В вашем коде Dart вы можете присвоить каждой части данных имя, которое вы можете использовать для ссылки на эту часть данных позже. Имя содержит связанный с ним тип, который указывает, к какому типу данных относится имя, например, к тексту, числам или дате. Вы узнаете о некоторых основных типах в этой главе, и вы столкнетесь со многими другими типами на протяжении всей книги.

    Переменные

    Взгляните на следующее:

    int number = 10;
    

    Этот оператор объявляет переменную, вызываемую numberтипа int. Затем он устанавливает значение переменной в число 10intЧасть инструкции известна как аннотация типа, которая явно сообщает Dart, что это за тип.

    Примечание: Возвращаясь к операторам, вот еще один. Знак равенства, =, известен как оператор присваивания, поскольку он присваивает значение переменной. Это отличается от знака равенства, с которым вы знакомы по математике. Этот знак равенства больше похож на == оператор равенства в Dart, о котором вы узнаете в главе 5 “Поток управления”.

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

    int number = 10;
    number = 15;
    

    number начиналось как 10, но затем сменилось на 15.

    Тип intможет хранить целые числа. Способ хранения десятичных чисел выглядит следующим образом:

    double apple = 3.14159;
    

    Это похоже на intпример. На этот раз, однако, переменной является a double, тип, который может хранить десятичные дроби с высокой точностью.

    Читателям, знакомым с объектно-ориентированным программированием, будет интересно узнать, что 103.14159и любое другое значение, которое вы можете присвоить переменной, являются объектами в Dart. На самом деле, в Dart нет примитивных типов переменных, которые существуют в некоторых языках. Все является объектом. Хотя intи doubleвыглядят как примитивы, они являются подклассами num, которые являются подклассом Object.

    Используя числа в качестве объектов, это позволяет вам делать некоторые интересные вещи:

    10.isEven
    // true
    
    3.14159.round()
    // 3
    

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

    Безопасность типа

    Dart — это типобезопасный язык. Это означает, что как только вы сообщите Dart тип переменной, вы не сможете изменить его позже. Вот пример:

    int myInteger = 10;
    myInteger = 3.14159; // No, no, no. That's not allowed :]

    3.14159 является a double, но вы уже определили myIntegerкак an int. Никакие изменения не допускаются!

    Безопасность типов Dart сэкономит вам бесчисленное количество часов при написании кода, поскольку компилятор немедленно сообщит вам, когда вы попытаетесь присвоить переменной неправильный тип. Это избавит вас от необходимости исправлять ошибки после сбоев во время выполнения.

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

    num myNumber;
    myNumber = 10;      // OK
    myNumber = 3.14159; // OK
    myNumber = 'ten';   // No, no, no.

    numТип может быть либо an int, либо a double, поэтому первые два назначения работают. Однако строковое значение 'ten'имеет другой тип, поэтому компилятор жалуется.

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

    dynamic myVariable;
    myVariable = 10;      // OK
    myVariable = 3.14159; // OK
    myVariable = 'ten';   // OK

    Но, честно говоря, не делай этого. Друзья не позволяют друзьям использовать dynamic. Твоя жизнь слишком ценна для этого.

    В главе 3 “Типы и операции” вы узнаете больше о типах.

    Вывод типа

    Дарт умен во многих отношениях. Вам даже не нужно указывать тип переменной, и Dart все равно может понять, что вы имеете в виду. varКлючевое слово говорит Дарту: “Используйте любой подходящий тип”.

    var someNumber = 10;

    Нет необходимости указывать Dart, что 10это целое число. Dart определяет тип и делает someNumberint. Тем не менее, безопасность типа по-прежнему применяется:

    var someNumber = 10;
    someNumber = 15;      // OK
    someNumber = 3.14159; // No, no, no.

    Попытка установить someNumberзначение a doubleприведет к ошибке. Ваша программа даже не будет компилироваться. Быстрый улов; сэкономленное время. Спасибо, Дарт!

    Константы

    Dart имеет два разных типа “переменных”, значения которых никогда не меняются. Они объявляются с constfinalпомощью ключевых слов и, и в следующих разделах будет показана разница между ними.

    Постоянные константы

    Переменные, значение которых можно изменять, называются изменяемыми данными. Изменяемые файлы, безусловно, имеют свое место в программах, но также могут создавать проблемы. Легко потерять все места в вашем коде, которые могут изменить значение определенной переменной. По этой причине вы должны использовать константы, а не переменные, когда это возможно. Эти неизменяемые переменные известны как неизменяемые данные.

    Чтобы создать константу в Dart, используйте constключевое слово:

    const myConstant = 10;

    Так жеvar, как и в случае, Dart использует вывод типа, чтобы определить, что myConstantэто an int.

    Как только вы объявили константу, вы не можете изменить ее данные. Например, рассмотрим следующий пример:

    const myConstant = 10;
    myConstant = 0; // Not allowed.

    Предыдущий код выдает ошибку:

    Constant variables can't be assigned a value.

    В VS Code вы бы увидели ошибку, представленную таким образом:

    Если вы думаете, что “постоянная переменная” звучит немного оксюморонно, просто помните, что это в хорошей компании: виртуальная реальность, продвинутый БАЗОВЫЙ, читаемый Perl и интернет-безопасность.

    Конечные константы

    Часто вы знаете, что вам понадобится константа в вашей программе, но вы не знаете, каково ее значение во время компиляции. Вы узнаете значение только после запуска программы. Константа такого типа известна как константа времени выполнения.

    В Dart constиспользуется только для констант времени компиляции; то есть для значений, которые могут быть определены компилятором до запуска программы.

    Если вы не можете создать constпеременную, потому что вы не знаете ее значение во время компиляции, тогда вы должны использовать finalключевое слово, чтобы сделать его константой времени выполнения. Есть много причин, по которым вы можете не знать значение до тех пор, пока ваша программа не будет запущена. Например, вам может потребоваться получить значение с сервера, или запросить настройки устройства, или попросить пользователя ввести свой возраст.

    Вот еще один пример значения во время выполнения:

    final hoursSinceMidnight = DateTime.now().hour;

    DateTime.now() это функция Dart, которая сообщает вам текущую дату и время выполнения кода. Добавление hourк этому показывает количество часов, прошедших с начала дня. Поскольку этот код будет выдавать разные результаты в зависимости от времени суток, это, безусловно, значение времени выполнения. Итак, чтобы создать hoursSinceMidnightконстанту, вы должны использовать finalключевое слово вместо const.

    Если вы попытаетесь изменить finalконстанту после того, как она уже была установлена:

    hoursSinceMidnight = 0;
    

    это приведет к следующей ошибке:

    The final variable 'hoursSinceMidnight' can only be set once.
    

    На самом деле вам не нужно слишком беспокоиться о разнице между constfinalконстантами и . Как правило, constсначала попробуйте, и если компилятор жалуется, то сделайте этоfinal. Преимущество использования constзаключается в том, что оно дает компилятору свободу вносить внутренние оптимизации в код перед его компиляцией.

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

    Использование значимых имен

    Всегда старайтесь выбирать значимые имена для ваших переменных и констант. Хорошие имена действуют как документация и делают ваш код легким для чтения.

    Хорошее имя конкретно описывает роль переменной или константы. Вот несколько примеров хороших имен:

    • personAge
    • numberOfPeople
    • gradePointAverage

    Часто плохое имя просто недостаточно красноречиво. Вот несколько примеров плохих имен:

    • a
    • temp
    • average

    Ключ в том, чтобы убедиться, что вы поймете, к чему относится переменная или константа, когда будете перечитывать их позже. Не совершайте ошибку, думая, что у вас безошибочная память! В компьютерном программировании принято оглядываться на свой собственный код уже через день или два и забывать, что он делает. Упростите себе задачу, дав своим переменным и константам понятные и точные имена.

    Кроме того, обратите внимание, как написаны приведенные выше имена. В Dart это стандартно используется lowerCamelCaseдля имен переменных и констант. Следуйте этим правилам, чтобы правильно прописать свои имена:

    • Начинайте со строчной буквы.
    • Если имя состоит из нескольких слов, соедините их вместе и начинайте каждое слово после первого с заглавной буквы.
    • Относитесь к аббревиатурам как к словам, например, sourceUrlи urlDescription.

    Упражнения

    Если вы не выполняли эти упражнения в VS Code, сейчас самое время создать новый проект и попробовать несколько упражнений, чтобы проверить себя!

    1. Объявите константу типа intcalled myAgeи установите для нее свой возраст.
    2. Объявите переменную типа doublecalled averageAge. Изначально задайте переменной свой собственный возраст. Затем установите его на среднее значение вашего возраста и возраста вашего лучшего друга.
    3. Создайте вызываемую константу testNumberи инициализируйте ее любым целым числом, которое вы хотите. Затем создайте другую вызываемую константу evenOddи установите ее равной по testNumberмодулю 2. Теперь измените testNumberна другие числа. На что вы обращаете evenOddвнимание ?

    Увеличение и уменьшение

    Обычная операция, которая вам понадобится, — это иметь возможность увеличивать или уменьшать переменную. В Dart это достигается следующим образом:

    var counter = 0;
    
    counter += 1;
    // counter = 1;
    
    counter -= 1;
    // counter = 0;
    

    Переменная счетчика начинается как 0. Приращение устанавливает его значение равным 1, а затем при уменьшении его значение возвращается к 0.

    Операторы +=and -=аналогичны оператору присваивания (=), за исключением того, что они также выполняют сложение или вычитание. Они принимают текущее значение переменной, добавляют или вычитают заданное значение и присваивают результат обратно переменной.

    Другими словами, приведенный выше код является сокращением для следующего:

    var counter = 0;
    counter = counter + 1;
    counter = counter - 1;
    

    Если вам нужно только увеличить или уменьшить значение на 1, то вы можете использовать операторы ++или--:

    var counter = 0;
    counter++; // 1
    counter--; // 0
    

    Операторы *=и /=выполняют аналогичные операции для умножения и деления соответственно:

    double myValue = 10;
    
    myValue *= 3;  // same as myValue = myValue * 3;
    // myValue = 30.0;
    
    myValue /= 2;  // same as myValue = myValue / 2;
    // myValue = 15.0;
    

    Деление в Dart приводит к результату с типом double, поэтому myValueне может быть an int.

    Проблемы

    Прежде чем двигаться дальше, вот несколько заданий для проверки ваших знаний о переменных и константах. Лучше всего, если вы попытаетесь решить их самостоятельно, но решения доступны в дополнительных материалах к этой книге, если вы застряли.

    Задача 1: Изменчивые собаки

    Объявите intпеременную с именем dogsи установите ее равной количеству собак, которыми вы владеете. Затем представьте, что вы купили нового щенка, и увеличьте dogsпеременную на единицу.

    Задача 2: заставить его скомпилироваться

    Учитывая следующий код:

    age = 16;
    print(age);
    age = 30;
    print(age);
    

    Измените первую строку, чтобы код компилировался. Вы использовали varintfinalили const?

    Задача 3: Вычислите ответ

    Рассмотрим следующий код:

    const x = 46;
    const y = 10;
    

    Определите, чему равен каждый ответ, когда вы добавляете следующие строки кода к приведенному выше коду:

    const answer1 = (x * 100) + y;
    const answer2 = (x * 100) + (y * 100);
    const answer3 = (x * 100) + (y / 10);

    Задача 4: Средний рейтинг

    Объявите три вызываемые константы rating1rating2и rating3типа doubleи присвоите каждой значение. Вычислите среднее значение из трех и сохраните результат в именованной константе averageRating.

    Задача 5: Квадратные уравнения

    Квадратное уравнение имеет вид

    a⋅x² + b⋅x + c = 0.

    Значения xкоторых удовлетворяют этому, могут быть решены с помощью уравнения

    x = (-b ± sqrt(b² - 4⋅a⋅c)) / (2⋅a).

    Объявите три константы с именем abи cтипом double. Затем вычислите два значения для xиспользования приведенного выше уравнения (отметив, что ±означает плюс или минус, поэтому по одному значению xдля каждого). Сохраняйте результаты в константах, вызываемых root1и root2типа double.

    Ключевые моменты

    • Комментарии к коду обозначаются строкой, начинающейся с //, или несколькими строками, заканчивающимися /*и */.
    • Комментарии к документации обозначаются строкой, начинающейся с ///или несколькими строками, заканчивающимися /**и */.
    • Вы можете использовать printдля записи в консоль отладки.
    • Арифметическими операторами являются:
    Addition: +
    Subtraction: -
    Multiplication: *
    Division: /
    Integer division: ~/
    Modulo (remainder): %
    • Dart имеет множество функций, в том числе minmaxsqrtsinи cos.
    • Константы и переменные дают имена данным.
    • Как только вы объявили константу, вы не можете изменить ее данные, но вы можете изменить данные переменной в любое время.
    • Если можно определить тип переменной, вы можете заменить тип varключевым словом.
    • constКлючевое слово используется для констант времени компиляцииfinal, в то время как используется для констант времени выполнения.
    • Всегда давайте переменным и константам осмысленные имена, чтобы избавить себя и своих коллег от головной боли позже.
    • Следующие операторы выполняют арифметические вычисления, а затем присваивают обратно переменной:
    Add and assign: +=
    Subtract and assign: -=
    Multiply and assign: *=
    Divide and assign: /=
    Increment by 1: ++
    Decrement by 1: --

    Куда идти дальше?

    В этой главе вы узнали, что комментарии к документации поддерживают форматирование Markdown. Если вы не знакомы с Markdown, вам стоит потратить время на его изучение. Dart поддерживает CommonMark, поэтому commonmark.org это хорошее место для начала.

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

    В следующей главе вы еще глубже погрузитесь в систему типов Dart. Увидимся там!

  • Введение в язык программирования Dart (MDFD0101)

    Dart — это современный и мощный язык программирования. Google намеренно разработал его так, чтобы это не вызывало удивления. Во многих отношениях это скучный язык, и это хорошо! Это означает, что Dart быстро и легко освоить. Хотя Dart обладает некоторыми уникальными характеристиками, если у вас есть опыт работы с другими объектно-ориентированными языками или языками в стиле C, вы сразу почувствуете себя как дома с Dart. Даже если вы пришли сюда как полный новичок в программировании, Dart — хорошее место для начала. Концепции, которые вы изучите в этой книге, дадут вам прочную основу для вашей карьеры программиста.

    Есть большая вероятность, что вы взяли эту книгу, потому что хотите создать приложение для Flutter, и вы слышали, что вам нужно изучить Dart. Не случайно Flutter выбрал Dart в качестве своего языка. Виртуальная машина Dart обеспечивает молниеносную перестройку во время разработки, а ее компилятор с опережением времени создает собственные приложения для каждой основной платформы. Как один из самых универсальных языков на рынке сегодня, вы можете использовать Dart для написания чего угодно, от приложений командной строки и серверных серверов до собственных приложений для Android, iOS, web, Mac, Windows, Linux и даже встраиваемых устройств.

    Неудивительно, что разработчики по всему миру обратили на это внимание. Вместо того чтобы полностью переписывать одно и то же приложение на разных языках для нескольких платформ, разработчики экономят бесчисленное количество часов, используя один язык и общую кодовую базу. Это также приводит к выигрышу для компаний, поскольку они экономят деньги, не жертвуя скоростью.

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

    Существует несколько различных инструментов, которые разработчики Dart используют при создании приложений:

    • DartPad: Это простой браузерный инструмент для написания и выполнения Dart-кода. Он доступен на dartpad.dev.
    Подставка для дротиков
    Подставка для дротиков
    • IntelliJ IDEA: IntelliJ — это мощная интегрированная среда разработки, или IDE, которая поддерживает разработку Dart с помощью плагина Dart. Хотя Android Studio, популярная среда разработки для Flutter, построена на IntelliJ, в этой книге рекомендуется использовать обычный IntelliJ для проектов с использованием Dart. Плагин IntelliJ Dart упрощает эту задачу, чем написание кода Dart в Android Studio.
    ИДЕЯ IntelliJ
    ИДЕЯ IntelliJ
    • Visual Studio Code: Также известный как VS Code, это легкая среда разработки с чистым и простым интерфейсом. Он полностью поддерживает разработку Dart с помощью своего расширения Dart.
    Код Visual Studio
    Код Visual Studio
    • Другие редакторы: Есть также плагины Dart от сообщества для EclipseEmacs и Vim. Вы даже можете создать свой собственный плагин Dart для других редакторов и IDE, поддерживающих протокол Language Server (LSP). Однако, если вы знаете, как это сделать, вы можете пропустить эту главу. На самом деле, вы, вероятно, можете пропустить всю книгу.

    В этой книге используется код Visual Studio для всех примеров, содержащихся в ней, но если у вас есть другая среда разработки, которую вы предпочитаете, то, во что бы то ни стало, продолжайте использовать ее для разработки Dart. Однако, если у вас нет каких-либо предпочтений, вы обнаружите, что использование VS Code доставит вам удовольствие. VS Code также поддерживает разработку Flutter с помощью расширения, поэтому вы не будете ограничивать себя в дальнейшей разработке Flutter, если решите пойти по пути VS Code сейчас.

    Установка кода Visual Studio

    Visual Studio Code — это кроссплатформенная среда разработки с открытым исходным кодом от Microsoft. Он работает на Windows, macOS и Linux, так что, если единственное устройство, которое у вас есть в вашем распоряжении, — это мобильный телефон, тогда вы застрахованы!

    Если у вас есть только мобильный телефон, не отчаивайтесь! Вы можете запустить большинство примеров кода из этой книги на dartpad.dev, который должен отлично работать в любом современном мобильном браузере.

    Загрузите код Visual Studio по адресу code.visualstudio.com , и следуйте инструкциям, приведенным на сайте, чтобы установить его.

    Вам также понадобится Dart SDK, который вы установите в следующем разделе.

    Установка Dart SDK

    Dart Software Development Kit, или SDK, представляет собой набор инструментов командной строки, которые позволяют разрабатывать приложения Dart.

    Перейдите на dart.dev/get-dart и следуйте инструкциям на этом сайте, чтобы загрузить и установить Dart SDK на вашей платформе. Если вы получаете сообщение об ошибке, попробуйте скопировать сообщение об ошибке и выполнить поиск по нему в Google. Скорее всего, вы не первый, у кого такая проблема!

    Flutter поставляется с копией Dart SDK, поэтому, если вы уже установили последнюю версию Flutter, тогда все готово. На момент написания этой статьи текущей стабильной версией Flutter была версия 3.3, которая включает Dart 2.18.

    Проверка установки Dart SDK

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

    dart --version

    Вы должны увидеть отображаемую текущую версию Dart.

    Dart SDK version: 2.18.2 (stable)

    Если ваш меньше 2.18, вам следует перейти на последнюю версию. Некоторые примеры в этой книге не будут работать со старыми версиями Dart.

    Для тех, кто использует Dart SDK в комплекте с Flutter, вы можете выполнить обновление следующим образом:

    flutter upgrade

    Содержимое SDK

    Теперь проверьте, что предлагает вам Dart SDK, введя следующую команду в терминале:

    dart help

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

    • analyze (анализ): ваша среда разработки использует этот инструмент, чтобы сообщить вам, когда вы допустили ошибку в своем коде. Чем раньше вы узнаете, тем скорее сможете это исправить!
    • compile (компиляция): Этот инструмент компилирует код Dart в оптимизированную собственную исполняемую программу для Windows, Linux или macOS. Это известно как компиляция с опережением времени, или AOT. Наряду с собственными исполняемыми файлами, веб-технологии являются еще одним важным направлением для Dart, поэтому вы также можете использовать compileинструмент для преобразования кода Dart в JavaScript.
    • create (создать): Это для создания новых проектов Dart, которые вы сделаете сами всего за минуту.
    • devtools: это набор инструментов, которые помогут вам в таких задачах, как отладка или профилирование использования процессора и памяти запущенного приложения.
    • doc: Если в вашем коде есть комментарии к документации, о которых вы узнаете в следующей главе, этот инструмент сгенерирует HTML, необходимый для отображения комментариев в виде веб-страницы.
    • fix (исправление): Одна из целей Dart — продолжать развиваться как язык, не раздуваясь из-за устаревшего или устаревшего кода. Этот fixинструмент предназначен для того, чтобы помочь разработчикам обновить свои старые проекты, чтобы использовать новый блестящий синтаксис Dart.
    • format (формат): отступы в вашем коде легко перепутать. Этот приятный маленький инструмент автоматически исправит это за вас.
    • migrate (миграция): версия 2.12 была основным обновлением языка Dart с добавлением безопасности звуковых нулей, о которой вы узнаете в главе 11 “Возможность обнуления”. Этот инструмент помогает перенести старые проекты, чтобы использовать нулевую безопасность. Однако, поскольку вы начинаете с нуля, вам не нужно будет ничего переносить. Повезло тебе!
    • pub: Pub — это имя менеджера пакетов (package manager) для Dart, и pubэто инструмент, который обрабатывает задание. Пакет — это набор стороннего кода, который вы можете использовать в своем проекте Dart. Это может сэкономить вам невероятное количество времени, поскольку вам не нужно писать этот код самостоятельно. Вы можете просмотреть пакеты, доступные для вас на Pub, посетив pub.dev.
    • run (выполнить): это запускает вашу программу Dart на виртуальной машине Dart (the Dart Virtual Machine) или VM. Вы будете использовать виртуальную машину Dart для компиляции вашего кода непосредственно перед тем, как он понадобится. В отличие от AOT, это называется компиляцией точно в срок (just-in-time), или JIT, которая позволяет вносить небольшие изменения в ваш код и перезапускать его практически мгновенно. Это особенно полезно для таких приложений, как Flutter, где вам нужно внести множество небольших изменений по мере улучшения пользовательского интерфейса.
    • test (тест): Dart полностью поддерживает модульное тестирование, и этот инструмент поможет вам в этом.

    Dart в командной строке

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

    Запуск одного файла Dart

    Найдите или создайте на своем компьютере удобную папку, в которую вы можете сохранять проекты Dart, созданные вами в этой книге. Создайте новый текстовый файл в этой папке и назовите его hello.dart.

    Написание кода

    Затем добавьте следующий код Dart в этот пустой файл:

    void main() {
      print('Hello, Dart!');
    }

    main это имя функции, с которой запускаются все программы Dart. Внутри этой функции вы вызываете другую функцию, print, которая отображает текст Hello, Dart! на экране.

    Запуск кода

    Сохраните файл, а затем выполните следующую команду терминала в той же папке, что и hello.dart:

    dart run hello.dart

    Ключевое слово run — это run инструмент из Dart SDK, о котором вы узнали ранее. Он запускает код в hello.dart в виртуальной машине Dart.

    Теперь вы должны увидеть следующий вывод в консоли:

    Hello, Dart!

    Поздравляю! Вы написали и запустили свою первую программу Dart.

    Настройка полного проекта Dart

    Приятно иметь возможность запускать один файл, но по мере создания более крупных проектов вам захочется разделить свой код на управляемые части, а также включить файлы конфигурации и ресурсов. Для этого вам необходимо создать полноценный проект Dart. Помните этот create инструмент? Время пришло.

    Создание проекта

    Перейдите в папку, в которой вы хотите создать папку проекта, а затем выполните следующую команду в терминале:

    dart create hello_dart

    Это создает простой проект Dart с некоторым кодом по умолчанию.

    Запуск проекта

    Введите новую папку, которую вы только что создали, следующим образом:

    cd hello_dart

    Теперь запустите проект с помощью следующей команды:

    dart run bin/hello_dart.dart

    Вы увидите текст Hello world: 42!, который является результатом кода в проекте по умолчанию, сгенерированном create инструментом.

    runКлючевое слово является необязательным. Запустите проект снова без него:

    dart bin/hello_dart.dart

    Опять же, Hello world: 42! это результат.

    Структура проекта Dart

    Взгляните на структуру и содержимое папки hello_dart:

    Назначение наиболее важных элементов в этой папке заключается в следующем:

    • .gitignore: сообщает Git, какие файлы, связанные с Dart, ему не нужно сохранять в GitHub. Или любой другой репозиторий Git, который вы используете.
    • analysis_options.yaml: содержит специальные правила, которые помогут вам обнаружить проблемы с вашим кодом, процесс, известный как компоновка.
    • bin: содержит исполняемый код Dart.
    • hello_dart.dart: инструмент с именем, совпадающим с именем папки проекта, createсгенерировал этот файл, в который вы должны поместить свой код Dart.
    • CHANGELOG.md : Содержит подготовленный вручную список последних обновлений вашего проекта в формате Markdown. Всякий раз, когда вы выпускаете новую версию проекта Dart, вы должны сообщать другим разработчикам, что вы изменили.
    • lib: означает “библиотека”. В более крупных проектах у вас их будет много файлы .dart, которые вы организуете в папке lib. Подобно тому, как в обычной библиотеке хранится коллекция книг, которые вы можете взять, библиотека в мире Dart содержит коллекцию кода, который вы можете использовать в другом месте.
    • pubspec.yaml: содержит список сторонних зависимостей Pub, которые вы хотите использовать в своем проекте. Название “pubspec” означает “Спецификации паба”. Вы также задаете номер версии вашего проекта в этом файле.
    • pubspec.lock: указывает точную версию каждой зависимости, используемой проектом. Это полезно для команд, чтобы убедиться, что все используют одни и те же зависимости.
    • README.md : Описывает, что делает ваш проект и как его использовать. Другие разработчики будут очень признательны за это.
    • test: хранит ваши тестовые файлы. Хорошие разработчики пишут код, чтобы убедиться, что их программы ведут себя так, как ожидалось.

    YAML расшифровывается как “YAML — это не язык разметки” (YAML Ain’t Markup Language), одна из тех рекурсивных аббревиатур, которыми любят развлекаться программисты. YAML — это простой и понятный способ форматирования файлов конфигурации, и вы часто будете сталкиваться с этим типом файлов в своей карьере Dart.

    Использование VS Code для разработки Dart

    Вы создали и запустили проект из командной строки, но то же самое можно сделать и из VS Code. В этом разделе вы познакомитесь с этим процессом.

    Установка расширения Dart

    Откройте Visual Studio Code, и с левой стороны вы увидите вертикальную панель инструментов, называемую «Activity Bar» (панелью действий). Щелкните «Extensions icon» (значок расширений), который выглядит как четыре поля. Затем введите dart в области поиска. Когда появится расширение Dart, нажмите «Install button» (кнопку Установить), чтобы установить его.

    Теперь ваша установка VS Code поддерживает Dart. Далее вы узнаете, как создать проект Dart в VS Code.

    Создание нового проекта Dart

    Расширение Dart в VS Code упрощает создание нового проекта Dart. Чтобы увидеть, как это работает, вы воссоздадите тот же проект, который ранее создали из командной строки.

    Для начала удалите старую папку hello_dart и ее содержимое.

    Вы можете создать новый проект с помощью «Command Palette» (палитры команд). Чтобы получить доступ к палитре команд, перейдите в меню «View ▸ Command Palette…» (Вид ▸ Палитра команд…) в меню или нажмите сочетание клавиш «Command+Shift+P» на компьютере Mac или «Control+Shift+P» на ПК.

    Начните вводить dart, чтобы отфильтровать список команд. Затем выберите «Dart: Новый проект».

    Затем выберите «Console Application» (Консольное приложение) из списка.

    Выберите местоположение для сохранения папки проекта, которую создаст VS Code, и назовите проект hello_dart.

    Если вы увидите диалоговое окно с вопросом, следует ли использовать рекомендуемые настройки VS Code для Dart и Flutter, выберите Yes.

    Просмотр сгенерированного кода

    Откройте файл hello_dart.dart в каталоге bin, и вы увидите, что он содержит следующий код:

    import 'package:hello_dart/hello_dart.dart' as hello_dart;
    void main(List<String> arguments) {
      print('Hello world: ${hello_dart.calculate()}!');
    }

    Вам пока не нужно знать, как все это работает, но вот несколько замечаний:

    • Строка, начинающаяся с import, захватывает calculate функцию из файла hello_dart.dart в папке lib. Об импорте и функциях вы узнаете позже в книге.
    • Часть List<String> arguments необходима только при создании приложений командной строки, которые принимают аргументы. В этой книге вы не будете создавать приложения из командной строки.

    Упрощение проекта

    Сгенерированный код отлично подходит для демонстрации того, как работает Dart, но эта книга начнется еще проще. Это означает, что вы можете вырезать некоторые вещи.

    Замените код в bin/hello_dart.dart следующими тремя строками:

    void main() {
      print('Hello, Dart!');
    }

    Затем удалите папки lib и test. Вы найдете вариант для удаления, если щелкните правой кнопкой мыши на названиях папок.

    Эти папки выполняют важные функции, но они не нужны, когда вы только начинаете.

    Запуск Dart в VS Code

    Чтобы запустить свой код, убедитесь, что у вас открыт файл bin/hello_dart.dart. Затем нажмите на слово «Run» (Выполнить), которое появляется непосредственно над функцией main.

    Вы увидите Hello, Dart!, появится в консоли отладки.

    Изучение пользовательского интерфейса VS Code

    Это хорошая возможность изучить различные части пользовательского интерфейса Visual Studio Code.

    Приведенные ниже цифры соответствуют различным частям среды разработки:

    1. Activity Bar (Панель действий): выберите, какой контент будет отображаться на боковой панели.
    2. Side Bar (Боковая панель): Проводник отображает текущий проект и файл.
    3. Editor (Редактор): Напишите свой код Dart здесь.
    4. Panels (Панели): Отображение выходных данных программы, выполнение команд терминала и многое другое.
    5. Status Bar (Строка состояния): отображение информации о текущем проекте.

    Больше способов запустить ваш проект

    Вы запустили свой проект ранее, нажав на ярлык «Run» над main функцией. Вот еще три способа, которыми вы можете запустить свой проект:

    1. Выберите в меню «Run ▸ Start Debugging» (Выполнить ▸ Начать отладку).
    2. Нажмите клавишу «F5».
    3. Нажмите «Start Debugging button» (кнопку «Начать отладку») в правом верхнем углу.

    Все они делают одно и то же. На этот раз используйте «F5» для запуска программы, и вы снова увидите Hello, Dart! появившуюся консоль отладки.

    Превосходно! Вы готовы к дальнейшему изучению Dart в остальной части этой книги.

    Ключевые моменты

    • Visual Studio Code — это интегрированная среда разработки (IDE), которую можно использовать для написания кода Dart, если у вас установлено расширение Dart.
    • Dart SDK предоставляет базовые инструменты, необходимые для компиляции и запуска приложений Dart.
    • Код Dart, выполняемый из командной строки или в VS Code, использует виртуальную машину Dart.
    • Окно VS Code разделено на панель действий, боковую панель, Редактор, панель и строку состояния.
    • Pub — это менеджер пакетов, который Dart использует для добавления исходного кода сторонних разработчиков в ваши проекты.

    Куда идти дальше?

    Если вы новичок в Visual Studio Code, вам предстоит узнать об этом гораздо больше. Вы можете найти множество учебных ресурсов, перейдя в меню «Справка».

    Большую часть времени вы будете писать Dart-код с помощью VS Code на компьютере, но если вам придется стоять в длинной очереди в супермаркете, вы можете скоротать время, написав Dart-код на dartpad.dev, который будет запускаться в вашем мобильном браузере. Попробуйте образцы проектов Dart и Flutter там. Если экран вашего устройства слишком мал, чтобы легко редактировать код, перейдите в настройки браузера и просмотрите страницу как сайт на рабочем столе.

    Теперь, когда у вас полностью настроена среда программирования, в следующей главе вы приступите к написанию реального кода Dart. Увидимся там!