顕微鏡での日常的な計算を簡素化するために、javascript 計算機 (jquery モバイルを使用) を作成しています。私はより効率的なコードを作成することを検討しており、入力を歓迎します...誰もがすべてを掘り下げることを期待していませんが、参照用のプログラムへのリンクは次のとおりです: http://www.iscopecalc.com
(電卓の JavaScript はhttp://www.iscopecalc.com/js/calc.jsにあります)
電卓は基本的に、ユーザーが設定できる約 12 の入力で構成されています。これらの入力から受け取った値を使用して、計算機は約 15 の異なるパラメーターの値を生成し、結果をディスプレイに出力します。現在、入力の状態が変化するたびに、その入力の値を Cookie に書き込むクイック関数にその変更イベントをバインドします。しかし、プログラムの核心は「updateCalc()」関数に付属しています。この関数は、すべての入力 (保存された Cookie から) から値を読み取り、表示するすべてのパラメーターを再計算して出力します。簡単にアクセスできるように、ここではその機能だけに対処しました。
function updateCalc(){
readValues(); //load current calculator state into cookies
var data = $.cookie(); //puts all cookie data into object
var fluorData = fluoroTable[data['fluorophore']]; //fluorophore data taken from table at the end of the file depending on chosen fluorophore
var fluorem = fluorData['fluorem'];
var fluorex = fluorData['fluorex'];
var cameraData = cameraTable[data['camera']]; //camera data taken from table at the end of the file depending on chosen camera
var campix = cameraData['campix'];
var chipWidth = cameraData['chipWidth'];
var chipHeight = cameraData['chipHeight'];
var chipHpix = cameraData['chipHpix'];
var chipVpix = cameraData['chipVpix'];
var RefInd = data['media']; //simple variables taken directly from calculator inputs
var NA = data['NAslider'];
var obj = data['objective'];
var cammag = data['cameraRelay'];
var CSUmag = data['CSUrelay'];
var bin = data['binning'];
var pinholeRad;
var FOVlimit;
var mode;
if (data['modality']=='widefield'){ //FOVlimit, pinholeRad, and CSU mag will all depend on which modality is chosen
FOVlimit = 28;
pinholeRad = NaN;
mode = 'Widefield';
CSUmag = 1;
}
else if (data['modality']=='confocal'){
if (data['CSUmodel']=='X1'){
pinholeRad = 25;
if(data['borealis']=='true'){
mode = "Borealis CSU-X1";
FOVlimit = 9;
}
else {
mode = "Yokogawa CSU-X1";
FOVlimit = 7;
CSUmag = 1;
}
}
else if (data['CSUmodel']=='W1'){
mode = "Yokogawa CSU-W1";
FOVlimit = 16;
pinholeRad = data['W1-disk']/2;
CSUmag = 1;
}
}
//These are main outputs and they depend on the input variables above
var latRes = 0.61 * fluorem / NA;
var axRes = 1.4 * fluorem * RefInd / (NA*NA);
var BPpinhole = 1000 * pinholeRad / (obj * CSUmag);
var AU = BPpinhole / latRes;
var totalMag = obj * cammag * CSUmag;
var BPpixel = 1000 * campix * bin / totalMag;
var samples = latRes / BPpixel;
var pixperpin = BPpinhole * 2 / BPpixel;
var sampLit = 1000 * FOVlimit / (obj * CSUmag);
var coverage = FOVlimit * cammag / chipHeight;
if (coverage < 1) {
chipUsed = coverage;
FOV = sampLit;
}
else {
chipUsed = 1;
FOV = sampLit * chipHeight / (FOVlimit * cammag);
}
var sampWaste = 1 - FOV / sampLit;
var imgpix = 1000 * FOV / (chipVpix / bin);
//function goes on to update display with calculated values...
}
それは問題なく動作し、結果には概ね満足していますが、アドバイスが欲しいのは次のとおりです。
各入力変数は、実際には少数の出力にのみ影響します (たとえば、入力 #3 を変更しても、出力の一部の計算のみが実際に変更されるだけです... 15 個すべてではありません)。ただし、私の関数はすべての出力を再計算します。関連性に関係なく、入力のいずれかが変更されるたびに...変更された入力に基づいて変更された出力のみを選択的に更新する巨大なIf-Then関数を作成することを検討しました。これは明らかに大量のコードを必要としますが、電卓を使用するとコードが高速になるかどうか、時間の無駄でコードが乱雑になるかどうか疑問に思っています。
また、入力を Cookie に保存し、Cookie から値を読み取ることが合理的な方法であるかどうか、また電卓の状態を保存する代わりにグローバル変数を作成する必要があるかどうかも疑問に思っています。(Cookie には、後でアクセスするためにユーザーの計算機の状態を保存するという追加の利点があります)。
私はこのようなことにはかなり慣れていないので、コードの効率を改善する方法についてのすべてのコメントをいただければ幸いです (読むべきページ、または使用すべきメソッドに自由にリンクしてください)実例...)
ここまでたどり着いたら、お時間をいただきありがとうございます!!