Теперь, когда все необходимые системные настройки сделаны, настало время написать свой первый скрипт! В этом уроке мы исследуем основы программирования на примере небольшого приложения — калькулятора. Таким образом, мы сможем на практике рассмотреть следующие вопросы: компиляцию исходного кода, запуск приложения, объявление скриптовых переменных, определение и вызов функций, передачу параметров функциям и использование аргументов командной строки. |
Содержание
Для начала, создадим новый файл с именем calculator.fx .
Скопируйте следующий код в этот файл и сохраните изменения:
def numOne = 100;
def numTwo = 2;
var result;
add();
subtract();
multiply();
divide();
function add() {
result = numOne + numTwo;
println("{numOne} + {numTwo} = {result}");
}
function subtract() {
result = numOne - numTwo;
println("{numOne} - {numTwo} = {result}");
}
function multiply() {
result = numOne * numTwo;
println("{numOne} * {numTwo} = {result}");
}
function divide() {
result = numOne / numTwo;
println("{numOne} / {numTwo} = {result}");
}
|
Язык программирования JavaFX Script является компилируемым (транслируемым) языком, а это означает, что любой исходный код, который вы напишете, преобразуется в Java-байткод - язык виртуальной Java-Машины - перед непосредственным запуском приложения.
Следующая команда используется для компиляции кода скрипта:
После компиляции вы обнаружите, что соответствующий Java-байткод был помещен в файл calculator.class .
Вы также можете заметить, что был создан еще один файл - calculator$Intf.class . Это - вспомогательный класс, необходимый для запуска приложения. Не обращайте на него внимания, но не удаляйте.
Теперь запустим скомпилированный класс (с помощью Виртуальной Java-машины), используя следующую команду:
Результат работы программы будет таким:
100 + 2 = 102
100 - 2 = 98
100 * 2 = 200
100 / 2 = 50
|
Хотя это приложение и небольшое, оно демонстрирует наиболее важные конструкции языка программирования. Изучение этих конструкций - это ваш первый шаг к освоению языка программирования JavaFX Script.
Примечание: Освоить язык программирования JavaFX Script совсем не сложно, но поскольку это ваше первое знакомство с ним, мы будем обсуждать каждую новую языковую конструкцию на уровне детализации, необходимом для разработки этого приложения. Цель этого подхода - простота и наглядность. Более сложные особенности языка будут рассмотрены в последующих уроках по мере необходимости.
Давайте посмотрим на наш пример,
calculator.fx. Мы будем постепенно усложнять его.
В первом фрагменте кода определяются скриптовые переменные:
def numOne = 100;
def numTwo = 2;
var result;
|
Скриптовые переменные объявляются с помощью зарезервированного слова var или def . Эти слова отличаются тем, что переменные var могут изменять свое значение в теле скрипта, в то время как переменные def остаются константами и не меняют первоначально присвоенное значение. Мы присвоили некоторые значения переменным numOne и numTwo ,
но не инициализировали переменную result , т. к. эта переменная будет хранить результат наших вычислений.
Имена переменных обычно состоят из букв и цифр, но не должны начинаться с цифры. Традиционно используются буквы нижнего регистра; если имя состоит из нескольких слов, то первые буквы всех последующих слов являются прописными, как показано в предыдущем примере.
Примечание: Как вы могли заметить, мы не делаем ничего особенного для объявления переменных, которые будут хранить числовые данные (в отличие от текстовых строк и других типов данных). Компилятору достаточно информации, чтобы разобраться, для чего эти переменные будут использоваться. Это называется определением типа. Такая особенность существенно облегчает работу программиста, поскольку избавляет от необходимости объявлять все типы данных, совместимых с вашими переменными.
Остальная часть исходного кода определяет несколько скриптовых функций, которые используются для сложения, вычитания, умножения и деления двух чисел:
function add() {
result = numOne + numTwo;
println("{numOne} + {numTwo} = {result}");
}
function subtract() {
result = numOne - numTwo;
println("{numOne} - {numTwo} = {result}");
}
function multiply() {
result = numOne * numTwo;
println("{numOne} * {numTwo} = {result}");
}
function divide() {
result = numOne / numTwo;
println("{numOne} / {numTwo} = {result}");
}
|
Функция представляет собой исполняемый блок кода, который реализует какую-либо конкретную задачу. В нашем примере каждая функция осуществляет арифметическое действие и выводит результат на консоль. Организация кода в функции является общей практикой, применяемой для наиболее удобного чтения, модификации и отладки программы. Тело функции обычно смещено относительно ее заголовка. Это делается для того, чтобы было лучше видно, где функция начинается и где заканчивается.
На самом деле, функция не выполняется до тех пор, пока она однозначно не вызвана. Это дает возможность запускать функцию из любого места внутри скрипта. Совершенно не важно, вызывается ли функция до того, как она была определена или после. В нашем примере вызовы функций расположены в исходном файле до того места, где они определяются.
Вызовы функций выглядят следующим образом :
add();
subtract();
multiply();
divide();
|
Теперь давайте изменим скриптовые функции калькулятора таким образом, чтобы они могли принимать параметры. Параметры - это конкретные значения, передаваемые функции в момент вызова. Используя этот подход, мы модифицировали наше приложение, чтобы калькулятор мог осуществлять арифметические действия над двумя любыми числами, а не только над теми, которые жестко прописаны в константах
numOne и numTwo .
var result;
add(100,10);
subtract(50,5);
multiply(25,4);
divide(500,2);
function add(argOne: Integer, argTwo: Integer) {
result = argOne + argTwo;
println("{argOne} + {argTwo} = {result}");
}
function subtract(argOne: Integer, argTwo: Integer) {
result = argOne - argTwo;
println("{argOne} - {argTwo} = {result}");
}
function multiply(argOne: Integer, argTwo: Integer) {
result = argOne * argTwo;
println("{argOne} * {argTwo} = {result}");
}
function divide(argOne: Integer, argTwo: Integer) {
result = argOne / argTwo;
println("{argOne} / {argTwo} = {result}");
}
|
Результат работы этого кода будет таким:
100 + 10 = 110
50 - 5 = 45
25 * 4 = 100
500 / 2 = 250
|
В этой версии примера мы удалили переменные numOne и numTwo ,
поскольку они нам больше не нужны. Вместо этого мы модифицировали определение функции, чтобы запросить передачу двух чисел в качестве параметров. Каждый параметр имеет имя и тип, которые разделяются двоеточием. Если функция принимает несколько параметров, то параметры отделяются друг от друга запятой.
Функция может возращать значение в то место кода, откуда она была вызвана. Например, функция add может быть модифицирована для возвращения результата — выделено жирным шрифтом:
function add(argOne: Integer, argTwo: Integer) : Integer {
result = argOne + argTwo;
println("{argOne} + {argTwo} = {result}");
return result;
}
|
Функция add может вызываться следующим образом:
var total;
total = add(1,300) + add(23,52);
|
Если возвращаемое значение не определено, функция по умолчанию возвращает значение
Void .
Кроме того, мы можем изменить наше приложение таким образом, чтобы оно работало с использованием аргументов командной строки. Это позволит нам задавать числа для вычисления непосредственно в процессе работы программы.
var result;
function run(args : String[]) {
// Convert Strings to Integers
def numOne = java.lang.Integer.parseInt(args[0]);
def numTwo = java.lang.Integer.parseInt(args[1]);
// Invoke Functions
add(numOne,numTwo);
subtract(numOne,numTwo);
multiply(numOne,numTwo);
divide(numOne,numTwo);
}
function add(argOne: Integer, argTwo: Integer) {
result = argOne + argTwo;
println("{argOne} + {argTwo} = {result}");
}
function subtract(argOne: Integer, argTwo: Integer) {
result = argOne - argTwo;
println("{argOne} - {argTwo} = {result}");
}
function multiply(argOne: Integer, argTwo: Integer) {
result = argOne * argTwo;
println("{argOne} * {argTwo} = {result}");
}
function divide(argOne: Integer, argTwo: Integer) {
result = argOne / argTwo;
println("{argOne} / {argTwo} = {result}");
}
|
Это изменение дает нам возможность рассмотреть еще несколько новых конструкций. Наиболее интересная из них - это добавление функции run() . В отличие от других функций, run() является своеобразной точкой входа скрипта. Функция хранит все параметры командной строки в переменной args , которая представляет собой последовательность объектов типа String .
(Последовательности - это упорядоченные списки объектов, аналогичные массивам в других языках программирования. Последовательности будут рассмотрены подробнее в уроках Выражения и
Операторы.)
Для запуска скрипта пользователю теперь необходимо задать первый и второй параметр командной строки:
Результат работы программы:
100 + 50 = 150
100 - 50 = 50
100 * 50 = 5000
100 / 50 = 2
|
Примечание: Во всех предыдущих версиях нашего скрипта мы не задавали функцию run() . Мы просто указывали код, который должен быть запущен стандартным образом. В таких ситуациях компилятор невидимо для пользователя создает не имеющую аргументов функцию run() и размещает код для выполнения внутри нее.
Мы также вернули обратно переменные numOne и numTwo , в этот раз, ограничивая область их распространения функцией run() , который, собственно, их и содержит. Функции нашего калькулятора работают с числами, а параметры командной строки являются символьными строками, поэтому нам необходимо использовать преобразование типов данных. Каждый элемент командной строки будет преобразован из типа String к типу Integer перед передачей его для обработки.
// Convert Strings to Integers
def numOne = java.lang.Integer.parseInt(args[0]);
def numTwo = java.lang.Integer.parseInt(args[1]);
|
Для этого нам потребуется помощь языка программирования Java. Использование существующей экосистемы Java по мере необходимости может существенно обогатить довольно простой скриптовый язык.
|
|