私は、C++で教えられている2番目のOOPコースのプログラミング学生です。コードでマジックナンバーを使用することは一般的に悪い習慣であることを私は知っているので、ここに私の質問があります:
このクラスのために作成する必要がある次のプログラムでは、税の表に120を超える数値が与えられており、それらを使用して税やその他の関連情報を計算する必要があります。数が多いので、数ごとに定数を定義しますか?それとも私にできることが他にありますか?
私は、C++で教えられている2番目のOOPコースのプログラミング学生です。コードでマジックナンバーを使用することは一般的に悪い習慣であることを私は知っているので、ここに私の質問があります:
このクラスのために作成する必要がある次のプログラムでは、税の表に120を超える数値が与えられており、それらを使用して税やその他の関連情報を計算する必要があります。数が多いので、数ごとに定数を定義しますか?それとも私にできることが他にありますか?
定数はマジックナンバーよりも適切です-
ただし、その数が多く、時間の経過とともに変化するもの(税率表)があるため、個人的には構成ファイルを介してこれらをロードし、個々の値に対して何らかの辞書ルックアップを使用します。これにより、再コンパイルせずに新しい税テーブルに調整するのがはるかに簡単になります。
最終的にどのようなデータ構造になるかを考えてから、必要な定数または列挙型を決定します。(税の専門家ではないので、ここで少し推測します)
さまざまな州の税率
std::map<std::string, double> stateRates;
stateRates["CA"] = 20.7;
stateRates["MN"] = 1.2;
....
州名を列挙する人もいますが、ここでは定数の必要性はわかりません。
enum States
{
CA, MN
};
std::map<States, double> stateRates;
stateRates[CA] = 20.7;
stateRates[MN] = 1.2;
ただし、文字列CAから列挙型CAに変換する必要もあります
しかし、非表形式のものについては、本当に定数が必要です
const int EXTRA_TAX_FOR_BIG_HOUSE = 2;
const int BIG_HOUSE_LIMIT = 6000; // sqft
if(houseSize > BIG_HOUSE_LIMIT)
rate += EXTRA_TAX_FOR_BIG_HOUSE;
問題は、コードがそれらをどのように使用するかということです。これらのそれぞれを特定の特異な方法で使用するコードを実際に作成する必要がある場合は、それらをすべて定数に変換することをお勧めします。
一方、それらを反復処理する場合は、ある種の関連データ構造(「STLマップ」と考えてください)の方が役立つ場合があります。
もう1つの考慮事項:プログラムが新しいセットを頻繁にダイジェストすることを誰かが期待している場合は、名前の定数と、値をロードするデータ構造が必要です。
通常、このような割り当てでは、ファイルからの読み取り/書き込み方法が学習されます。次に、それらの数値を配列やベクトル、または必要に応じてロードできます。ファイルからの読み取りと書き込みを教えられていない場合は、簡単に理解できます。
これがあなたが見ることができるチュートリアルです、しかし速いグーグル検索でもっとたくさんあります http://fredosaurus.com/notes-cpp/io/readtextfile.html
リードコプシーは正しい答えを持っていますが、答えが十分に明確であったかどうかはわかりません。
非常に多くの異なる「定数」がある場合は、ファイルやデータベースなどの外部のものにそれらを配置することをお勧めします。これらのいわゆる「定数」は変化する傾向があります。立法府がより多くのお金が必要であると決定すると、さまざまな州の税率が変化します。
これらのマジックナンバーをファイルに保存する場合は、を使用ifstream
してこれらの定数を読み取ります。データベースを使用してこれらのマジックナンバーを保存する場合は、そのデータベースのドキュメントを読む必要があります。
番号を何に保存するかは、それらを何に使用するかによって異なります。たとえば、州税がある場合は、aを使用しmap
て州名(または略語)からその税率に移動します。
幸運を!