Difference between revisions of "Mod:Cookbook"
From Roll20 Wiki
m (→Revealing Module Pattern) |
(→Memoization) |
||
Line 33: | Line 33: | ||
myRevealingModule.myVar = 'So I can change it all I want'; | myRevealingModule.myVar = 'So I can change it all I want'; | ||
log(myRevealingModule.myVar); // "So I can change it all I want"</pre> | log(myRevealingModule.myVar); // "So I can change it all I want"</pre> | ||
+ | |||
+ | == Memoization == | ||
+ | Memoization is an optimization technique which stores the result for a given input, allowing the same output to be produced without computing it twice. This is especially useful in expensive computations. Of course, if it is rare that your function will receive the same input, memoization will be of limited utility while the storage requirements for it continue to grow. | ||
+ | <pre data-language="javascript">var factorialCache = {}; | ||
+ | function factorial(n) { | ||
+ | var x; | ||
+ | |||
+ | n = parseInt(n || 0); | ||
+ | if (n < 0) { | ||
+ | throw 'Factorials of negative numbers are not well-defined'; | ||
+ | } | ||
+ | |||
+ | if (n === 0) { | ||
+ | return 1; | ||
+ | } else if (factorialCache[n]) { | ||
+ | return factorialCache[n]; | ||
+ | } | ||
+ | |||
+ | x = factorial(n - 1) * n; | ||
+ | factorialCache[n] = x; | ||
+ | return x; | ||
+ | }</pre> | ||
+ | |||
+ | In a Roll20 API script, the cached values could potentially be stored in <code>state</code>, which will persist between game sessions. If you have a large number of potential inputs, however, be aware that Roll20 may throttle your use of <code>state</code>. | ||
[[Category:API|Cookbook]] | [[Category:API|Cookbook]] |
Revision as of 22:21, 29 December 2014
The following are not full scripts. They are meant to be stitched together along with business logic to assist in the creation of full scripts, not create scripts on their own.
Revealing Module Pattern
The Module Pattern emulates the concept of classes from other languages by encapsulating private and public members within an object. The Revealing Module Pattern improves upon the Module Pattern by making the syntax more consistent.
var myRevealingModule = myRevealingModule || (function() { var privateVar = 'This variable is private', publicVar = 'This variable is public'; function privateFunction() { log(privateVar); } function publicSet(text) { privateVar = text; } function publicGet() { privateFunction(); } return { setFunc: publicSet, myVar: publicVar, getFunc: publicGet }; })(); log(myRevealingModule.getFunc()); // "This variable is private" myRevealingModule.setFunc('But I can change its value'); log(myRevealingModule.getFunc()); // "But I can change its value" log(myRevealingModule.myVar); // "This variable is public" myRevealingModule.myVar = 'So I can change it all I want'; log(myRevealingModule.myVar); // "So I can change it all I want"
Memoization
Memoization is an optimization technique which stores the result for a given input, allowing the same output to be produced without computing it twice. This is especially useful in expensive computations. Of course, if it is rare that your function will receive the same input, memoization will be of limited utility while the storage requirements for it continue to grow.
var factorialCache = {}; function factorial(n) { var x; n = parseInt(n || 0); if (n < 0) { throw 'Factorials of negative numbers are not well-defined'; } if (n === 0) { return 1; } else if (factorialCache[n]) { return factorialCache[n]; } x = factorial(n - 1) * n; factorialCache[n] = x; return x; }
In a Roll20 API script, the cached values could potentially be stored in state
, which will persist between game sessions. If you have a large number of potential inputs, however, be aware that Roll20 may throttle your use of state
.