If you're seeing this message, it means we're having trouble loading external resources on our website.

Եթե գտնվում ես վեբ զտիչի հետևում, խնդրում ենք համոզվել, որ *.kastatic.org և *.kasandbox.org տիրույթները հանված են արգելափակումից։

Հիմնական նյութ

Ստատիկ ֆունկցիաների ու մեթոդների տարբերությունը

Ալգորիթմ #3-ին անցնելուց առաջ՝ դեպի մկնիկ արագացում, վեկտորների հետ աշխատանքի և PVector օբյեկտի ևս մեկ կարևոր կողմ պետք է քննարկենք՝ հաստատուն ֆունկցիաների և մեթոդի օրինակի կիրառման տարբերությունը։
Արի մի պահ մոռանանք վեկտորների մասին և դիտարկենք այս կոդը.
var x = 0;
var y = 5;
x = x + y;
Պարզ է թվում, չէ՞։ x-ը 0 է, գումարում ենք y, x-ը դառնում է 5։ PVector-ի մասին մեր սովորածից ելնելով՝ կարող ենք սրան համապատասխանող կոդը հեշտությամբ գրել։
var v = new PVector(0,0);
var u = new PVector(4,5);
v.add(u);
v վեկտորի արժեքը (0,0) է, դրան գումարում ենք u-ն, որից հետո v-ն հավասարվում է (4,5)-ի։ Հեշտ է, չէ՞։
Այժմ մեկ այլ պարզ մաթեմատիկական օրինակ դիտարկենք։
var x = 0;
var y = 5;
var z = x + y;
x-ը 0 է, գումարում ենք y և ստացված արժեքը պահում նոր փոփոխական z-ի մեջ։ Այս օրինակում ոչ x-ի արժեքն է փոխվում, ոչ y-ինը։ Թվում է, թե սա պարզ դիտարկում է, և, իրոք, թվերի հետ կատարված պարզ մաթեմատիկական հաշվարկների դեպքում շատ դյուրըմբռնելի է։ Այնուամենայնիվ, դա այնքան էլ ակնհայտ չէ PVector-ի հետ մաթեմատիկական գործողություններ կատարելիս։ Փորձենք սրան համապատասխանող կոդը գրել՝ ելնելով մեր իմացածից։
var v = new PVector(0,0);
var u = new PVector(4,5);
var w = v.add(u); // Չխաբվես, սա սխալ է։
Կարող է թվալ, որ վերնոշյալ կոդը ճիշտ է, սակայն PVector օբյեկտը պարզապես այդպես չի աշխատում։ Եթե դիտարկենք add() ֆունկցիայի սահմանումը…
PVector.prototype.add = function(v) {
    this.x = this.x + v.x;
    this.y = this.y + v.y;
 };
… տեսնում ենք, որ կոդը չի վերադարձնում այն, ինչ մեզ պետք է։ Նախ՝ նոր PVector չի վերադարձնում (return պնդում չկա), և երկրորդ՝ այն փոխում է PVector-ի արժեքը, որի համար այն կանչվել է։ Երկու PVector օբյեկտ գումարելու և արդյունքը որպես նոր PVector վերադարձնելու համար պետք է «հաստատուն» (static) add() ֆունկցիա կիրառենք։
«Հաստատուն» ֆունկցիան օբյեկտի վրա սահմանած ֆունկցիա է, որն օբյեկտի հատկությունները չի փոխում։ Այդ դեպքում ի՞նչ իմաստ ունի օբյեկտի վրա ֆունկցիա սահմանել։ Դե, սովորաբար այդ ֆունկցիաները կապ ունեն օբյեկտի հետ, հետևաբար տրամաբանական է դրանք օբյեկտին կցելը։ Օրինակ՝ PVector-ի բոլոր հաստատուն ֆունկցիաներն իրենց փոխանցած PVector-ներով ինչ-որ գործողություններ են կատարում և արժեք վերադարձնում։ Իհարկե, այդ ֆունկցիաները կարող ենք որպես ընդհանրական ֆունկցիաներ սահմանել, սակայն այս մոտեցման արդյունքում խուսափում ենք ընդհանրական ֆունկցիաներից և գործառույթներով իրար հետ կապված ֆունկցիաներն ավելի լավ ենք խմբավորում։
Արի հակադրենք։ add() օրինակի մեթոդն այսպես ենք կիրառում.
v.add(u);
Այս կոդը կփոխի v-ն, հետևաբար վերադարձվող արժեքը պահելու կարիք չկա։ Հակառակ դրան, add() հաստատուն ֆունկցիան այսպես ենք կիրառում.
var w = PVector.add(v, u);
Եթե այդ ֆունկցիայի արդյունքը փոփոխականում չպահենք, կոդի այդ տողը անիմաստ կդառնա, որովհետև հաստատուն ֆունկցիան հենց օբյեկտի վրա փոփոխություն չի իրականացնում։ PVector-ի հաստատուն ֆունկցիաները մեզ թույլ են տալիս PVector օբյեկտներով մաթեմատիկական գործողություններ կատարել՝ առանց ներմուծած PVector-ների արժեքը փոփոխելու։
add() ֆունկցիայի հաստատուն տարբերակն այսպես է գրվում.
PVector.add = function(v1, v2) {
  var v3 = new PVector(v1.x + v2.x, v1.y + v2.y);
  return v3;
};
Տարբերությունները շատ են.
  • Ֆունկցիան սահմանում ենք օբյեկտի վրա, ոչ թե նախատիպի:
  • Ֆունկցիայի ներսում երբեք this բանալի բառը չենք կիրառում:
  • Ֆունկցիան արժեք է վերադարձնում։
PVector օբյեկտը պարունակում է add(), sub(), mult() և div() ֆունկցիաների հաստատուն տարբերակները։ Այն ունի նաև հաստատուն ֆունկցիաներ, որոնք որպես օրինակի մեթոդներ չկան, օրինակ՝ angleBetween(), dot() և cross()։ PVector-ներով ծրագրեր գրելիս այս ֆունկցիաները հաճախ ենք կիրառելու։

«Բնական նմանակիչներ» դասընթացը ստեղծվել է Դանիել Շիֆմանի «Կոդի բնույթը» գրքի հիման վրա և կիրառվում է ըստ Creative Commons Attribution-NonCommercial 3,0 Unported License-ի։

Ուզո՞ւմ ես միանալ խոսակցությանը։

Առայժմ հրապարակումներ չկան։
Անգլերեն հասկանո՞ւմ ես: Սեղմիր այստեղ և ավելի շատ քննարկումներ կգտնես «Քան» ակադեմիայի անգլերեն կայքում: