ウェブアプリの開発(2)

前回に続き, 電卓アプリ(昭和な電卓のシミュレータ)を対象として, ウェブアプリ開発を漸進的に実施してみよう.

単なる「作成(いきなり完成)」ではなく 「開発(徐々に育成,完成度向上)」です.

今回は,加算式電卓(前回の宿題)を元に, 逐次四則演算機能を追加実装し, 基本的な実務電卓(business calculator)として完成させよう.


作業方法
作業内容
加算式電卓の解答例の確認・考察

calc.htmlおよびreg.htmlからacc.htmlへの統合・改変の例: (あくまでも例.他の書き方もあり得る.)

...
<h1>加算式電卓</h1>
...	// HTMLコンテンツについてはcalc.htmlを元にして適切に変更...

<script id="VIEW">		// VIEW部には変更なし
...
</script>

<script id="REGISTER">	// reg.htmlからREGISTER部をすべて流用
class REGISTER {
	...
}
</script>

<script id="MODEL">
let stts = 'res';
let buf = '0';
const dat = new Register('データレジスタ', 4);	// データレジスタの準備
const acc = new Register('アキュムレータ', 6);	// アキュムレータの準備

function show(reg) {		// 引数としてレジスタを追加
	if (reg.err) {		// そのレジスタがエラーなら電卓全体もエラー状態に
		stts = 'err';
		disp('Error');
	} else if (stts == 'err') {	// 電卓全体がエラー状態の場合
		disp('Error');
	} else {
		disp(reg.str());	// レジスタ内容を表示
	}
}
function set(k) {
	buf = k;		// バッファに書込
	dat.read(buf);		// データレジスタにバッファを書込
}
function upd(k) {
	buf += k;		// バッファに追加
	dat.read(buf);		// データレジスタにバッファを追加
}
function exec(k) {
	acc.add(dat);		// アキュムレータにデータレジスタの数値を加算
//	acc.load(acc.val() + dat.val());	// or これでも同じ,むしろ他の演算への拡張性が出現
}
function start() {
	stts = 'res';	// 開始時は結果表示中になるので...
	...
	show(acc);	// ...アキュムレータを表示
}
</script>

<script id="CONTROLLER">
function entNum(k) {	// 数字入力中には...
	...
	show(dat);	// ...データレジスタを表示
}
function entExe(k) {	// 計算したら結果表示中になるので...
	...

	show(acc);	// ...アキュムレータを表示
}
start();
</script>

...

以上の変更で加算式電卓として, 一般ピープル向けの通常の利用方法に対する動作は完全となった. 数字入力→「=」キーの反復によって,加算を正しく重ねてゆける.

しかし,通常とは異なる利用方法... 数字入力せず「=」キー連打した場合の挙動 (状態遷移res→resのアクション)について, これで良いのだろうか?

計算関数exec() の設計思想として, 次の3通りの考え方があるだろう:

妥当性・利便性について各自で熟考し, 計算関数exec() の定義内容を変更しよう. そして,今後の開発過程でも同じ考え方を貫くこと!! (あるいは,動作モードの切替機能を追加実装しても良いだろう.)

どちらにせよ,柔軟性を考慮すれば, 関数exec() の定義を次のように変更しておくべきだろう:

function exec(k, reg) {
	acc.add(reg);	// アキュムレータにレジスタdatまたはaccの数値を加算
//	acc.load(acc.val() + reg.val());	// or これでも同じ,むしろ...
}
ちなみに,市販の実務電卓の定数計算機能の操作方法については, メーカやモデルによって異なる. 本物を再現するには, 定数専用のレジスタの追加や 状態遷移図の変更も必要となりそう.
実務電卓への拡張

加算式電卓acc.html を元に, 四則演算(二項演算子+−×÷の入力・計算)機能を追加実装し, 昭和な逐次演算式の実務電卓bc.html へ改変せよ.

演算子の優先順位は考慮しない. 入力順に計算を進めるので「逐次」式. '1+2*3='→(1+2)*3 = 9 ...1+(2*3) = 7 ではない!!
便利機能の追加

余裕があれば,bc.html に市販の電卓によくある便利機能を追加せよ.

参考資料

教科書: とほほのWWW入門

本日の課題

開発した実務電卓アプリを提出せよ.

担当教員へレポートを送信せよ:

JSプログラミングで思い通りの動作にならない場合... 問題の発見・解決のためには, 怪しい部分のオブジェクト(変数とか要素とか)を コンソール表示「console.log(オブジェクト);」 してみるとよいでしょう.