Писане на JavaFX Script

,
Този урок е въведение в JavaFX Script. В него ще научите основите на променливите и функциите, чрез написване на прост калкулатор, който работи от команден ред. Всяка точка ще въведежда по една нова основна концепция. Предоставен е примерен код, който можете да компилирате и стартирате. Урока също съдържа "real world" код, откъсите показват как се използват функциите и променливите в реални JavaFX SDK приложения. Следвайки линка за всяко демо ще ви отведе до javafx.com сайта, където можете да получите пълния код, плюс допълнителните бележки от разработчика, които в по-късен етап може да бъдат преведени и публикувани на страницата на блога.

Съдържание
1.Деклариране на променливи
2.Дефиниране и извикване на скрипта
3.Функции
4.Подаване на аргументи към функциите
5.Връщане на резулатати от скрипт функциите
6.Достъп до аргументи от командния ред


Деклариране на променливи


В предишния урок се запознахмe със средата за разработка; тук ще погледнем по-отблизо в изходният код на calculator.fx. Кодът в червено по-долу декларира променливите. Променливите се декларират използвайки ключовите думи var или def . Разликата между двете е, че на var променливите могат да бъдат инициализирани нови стойности по време на жизнения цикъл на скрипта, докато def променливите остават с постоянни стойности след първата им инициализация. В долния код декларираме променливите numOne и numTwo, като им задаваме съответните стойности, а променливата result оставяме неинициализирана, защото в нея ще записваме резултата на нашия калкулатор:

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}");
}

Може да сте забелязали, че ние не специфицирахме типа на променливите (като низ, целочиселн, реален и т.н). Компилаторът е достатъчно умен да разбере Вашето намерение базирано на контекста, в който се използва променливата. Това е известно като тип по подразбиране (type inference). Типовете по подразбирене прави живота Ви като програмист малко по-лесен, тъй като Ви освобождава от бремето на обявяване на типовете данни за Вашите променливи.

Пример от реалнния свят: Effects Playground



Картинката по-горе "Effects Playground" показва едно примерно приложение. Откъса от код от дясно показва няколко от неговите скрипт променливи. Вие няма да разберете цялата част от кода показана - все още - но подчертаната част трябва да има смисъл на базата на това, което току-що научихте. Имайте в предвид, че тези уроци са фокусирани върху не-графични приложения, тук дискутираме само ядрото на писане на JavaFX Script, в последствиe вие ще използвате тези знания за писане на вашите собствени GUI-базирани приложения.



Дефиниране и извикване на функции

Нашият пример Калкулатор определя някои скрипт функции, като добавяне, изваждане, умножаване и делене на две числа. Функция е изпълним блок код, който изпълнява определена задача. Червеният код по-долу определя четири функции. Всяка от тях изпълнява прости математически изчисления и след това отпечатва резултата в командния ред (конзолата).

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

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}");
}

Трябва да знаете, че кода на функцията не се изпълнява докато не бъде изрично извикан. Това дава възможност да стартирате функцията от всяко място във вашия код. Няма значение дали функцията е извикана преди или след нейната дефиниция. (в нашият пример ще се извикат функциите по-рано в изходния файл, отколкото, когато те действително са дефинирани):

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}");
}


Пример от реалнния свят : Draggable MP3 Player




В "Draggable MP3 Player" демото, програмиста е дефинирал функциите за спиране или пускане на текущата песен. За именуване на тези функции са избрани stopCurrentSong и playCurrentSong, това прави кода самостоятелно документиран и следователно много по-лесен за анализиране. Когато именувате вашите променливи и функции, опитайте се да използвате винаги смислени думи. Конвенцията е първата дума да се пише само с малки букви, а всяка следваща дума в името с главна първа буква.

Подаване на аргументи към функциите

JavaFX Script функциите могат също да бъдат дефинирани да приемат аргументи. Аргументите са специфични променливи, които се предават по време на извикване на дадената функция. По този начин може нашето приложение калкулатор да извършва изчисления на всеки две числа, а не само на стойности, които са твърдо кодирани в numOne и numTwo променливите. В действителност в тази версия ние премахнахме numOne и numTwo изцяло, оставихме само result като единствена скрипт променлива:

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


Пример от реалнния свят : Interesting Photos


В този откъс от код "Interesting Photos", ние виждаме скрипт функция, наречена loadImage да приема списък от аргументи. Отново избора на имена на функции и аргументи прави кода леснен за разбиране. Разбирането на пълното изпълнение на тази функция не е важно в този момент. Какво е важно обаче, че функцията приема два аргумента. Когато започнете да пишете собствени приложения, вероятно ще разчитате на примерен код, като този за правилния синтаксис.


Връщане на резулатати от скрипт функциите

Функциите също така могат да връщат стойност на кода, който я извиква. Например, ние можем да променим, функцията add на нашето приложение калкулатор, така че тя да връща резултат на всяко изчисление:


function add(argOne: Integer, argTwo: Integer) : Integer {
 result = argOne + argTwo;
println("{argOne} + {argTwo} = {result}");
return result;
}

В първият код в червено се посочва, че функцията връща Integer, а вторият код в червено всъщност връща стойността.

Функцията add може да бъде извикана и по този начин:

var total;

total = add(1,300) + add(23,52);

Ако не е посочен типа на върнатата стойност, функция връща Void по подразбиране.


Пример от реалнния свят: Animating Photos from Flickr


В този откъс от код "Animating Photos from Flickr", ние виждаме връщаните стойности по време на работа в три различни функции. Върнатите стойности са малко по-сложни от това, което сте виждали досега, но основната концепция е една и съща: всяка функция изпълнява някои специфични изчисления, след което се връща резултат. В първите две функции се извиква едина математическа функция (за да се изчисли квадратен корен) и връща резултата. Третата функция връща нов Vector2D обект. Тъй като този код не е пълен, целта му е само да видите как точно се връщат стойности, но с пълния изходен код той ще има смисъл.


Достъп до аргументи от командния ред

Скриптовете съшо така могат да приемат аргументите от командния ред. В нашият пример Калкулатор, това ще даде възможност на крайните потребители да зададат числата, които да бъдат изчислени в Runtime на скрипта.

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 обекти.
За да стартирате този скрипт, трябва да посочите първото и второто число в Runtime:

javafx calculator 100 50

Изходът от кода е следният:

100 + 50 = 150
100 - 50 = 50
100 * 50 = 5000
100 / 50 = 2

Имайте предвид, че във всички предишни версии на калкулатор скрипта, ние не сме дефинирали run функция. Ние просто написахм код, който се изпълнява на Script ниво. В такива случаи, компилатора тихо генерира не-ARG run функция и поставя код, за да бъде изпълнен в рамките на скрипта. Когато посочвате своя собствена run функция, името args може да бъде всичко, което искате, ние използваме "args", но вие вероятно ще видите програмисти, който използват други варианти от него, като "ARG", "ARGS", "__ARGS__", "argv" и др. Също така имайте предвид, че в този вариант върнахме обратно 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 функции в скрипта е необходимо за по-голяма мощност към този иначе прост скриптов език.


Пример от реалнния свят: Brick Breaker


Този откъс от "Brick Breaker" показва run функцията, която служи като главната входна точка на играта. Макар че този конкретен пример, действително не използва аргументи от командния ред, ние можем да видим, че run функцията инициализира основната рамка на приложението, като заглавието му, ширина, височина и др.


0 коментара:

Публикуване на коментар