ボタン電卓を書いています。コードをモデル、ビュー、コントローラーに分割しました。モデルは書式設定について何も知らず、数値のみに関係しています。すべての書式設定はビューで行われます。モデルはキー押下として入力を取得し、各キー押下は列挙型の一部です:
typedef enum {
kButtonUnknown = 0,
kButtonMemoryClear = 100,
kButtonMemoryPlus = 112,
kButtonMemoryMinus = 109,
kButtonMemoryRecall = 114,
kButtonClear = 99,
…
};
ユーザーがボタンを押すと (たとえば1)、モデルはボタン コードを受け取り ( kButtonNum1
)、対応する数値を文字列入力バッファーに追加し ( "1"
)、数値出力値を更新します ( 1.0
)。次に、コントローラーは数値出力値を、それをフォーマットするビューに渡します ( 1
)。
これはすべて単純明快でクリーンですが、実際には機能しません。問題は、ユーザーが数字の一部を入力すると (たとえば0.00
、 を入力しようとすると0.001
)、入力がモデルを介して表示されず、ディスプレイ0
に の代わりに表示されることです0.00
。なぜこれが起こるのか知っています("0.00"::string
に解析0::double
され、 としてフォーマットされます0
)。私が知らないのは、コードがクリーンでシンプルなままで、ユーザーが入力したとおりに数値が画面に表示されるように電卓を設計する方法です。
私はすでに何らかの解決策を考え出していますが、それは本質的にハックであり、電卓モデルからディスプレイへの美しくシンプルなフローを壊しています。
アイデア?
現在のソリューションは、電卓の状態を追跡します。電卓が数値を作成している場合は、電卓の入力バッファー (文字列) を取得し、表示内容 (これも文字列) を直接設定します。そうでなければ、私は適切な道をたどります。数値計算機の出力を としてビューに渡すdouble
と、ビューは内部フォーマッタを使用して表示用の文字列を作成します。入力例:
入力 | ディスプレイ | モード ------+---------+------------ 0 | 0 | 文字列から 0. | 0. | 文字列から 0.0 | 0.0 | 文字列から 0.0+ | 0 | 番号から
これは醜いです。(1) 電卓は、その入力バッファと状態を公開する必要があります。(2) ビューはその表示を公開し、文字列を使用してその内容を直接設定できるようにする必要があります。(3) 電卓の入力バッファから取得した文字列をフォーマットするために、フォーマット コードの一部を複製する必要があります。ユーザー12345.000
が を入力した場合、表示12,345.000
する必要があるため、文字列のコミフィケーション コードが必要です。うん。