0

http クライアント用の C++ ライブラリを作成しています。私はプログラミングの経験があまりないので、助けてください。

という名前のメソッドがありaddます。2 つのパラメーターを取得します。1 番目は型の名前で、2 番目はパラメーター q です。0 から 1 までの数値 <0,1> です。ドットの後に 0 ~ 4 桁の数字が必要です。

私はそれを書くことができますが、何が良いのかわかりません:

  1. void add(std::string type, double q)-> このメソッドの本体で q を std::string に変換する必要があります。

  2. void add(std::string type, std::string q)-> わかりました。数値 (?) であるため、より高速ですが、ユーザーにとって直感的ではない可能性があります。

1) と 2) の 2 つの方法があるのは良い考えですか?

私を助けてください。私は経験がありません... この方法のうち 2 つが機能することは知っていますが、より優れているのは、より一般的な方法です。どう思いますか?これをどのように書きますか?

4

3 に答える 3

5

通常は、ユーザーがメソッド シグネチャを確認するだけで、ユーザーに何を期待しているかを明確にする必要があります。あなたのコードは、それを使っている人に役立つヒットを提供するべきです (つまり、あなたのコードが何をしていて、何を期待しているのかをより明確にする必要があります)。

最悪のものから始めましょう:

void add(std::string type, std::string q)
  • それが数字であることを明確にするものは何もありませんq
  • qあまりわかりやすい名前ではありません。

上記の例では、呼び出し元が混乱して逆のパラメーターでメソッドを呼び出す可能性がadd("5.0123", "someType")あります。パラメーターを使用する必要があるまで、何か間違ったことをユーザーに通知するものは何もありません。最悪の部分は、今どこで爆発するかわからないことです。これにより、適切なタイプが強制されていないという理由だけで、バグを追跡するのが非常に困難になる場合があります。

少し良い:

void add(std::string type, double q)
  • これで、ユーザーが何らかの型と double 値を追加していることは明らかです。
  • qまだわかりやすい名前ではありません

私がお勧めします:

void add(std::string type, double value)
  • これで、ユーザーが何らかの型と double 値を追加していることは明らかです。
  • double のパラメーター名は になりましたvalue(これは よりも説明的ですq)。

これで、ユーザーはパラメーターの順序が正しくないメソッドを呼び出すことができなくなりました。つまりadd(5.0123, "someType")、コンパイラ エラーが発生するためです。明らかでない場合: すぐに修正できるため、コンパイラ エラーが発生する方がはるかに優れています。このようにして、ゼロからより安全なコードを作成しています。

doubleもちろん、これは を に変換する必要があることを意味しますが、string上記のすべての利点を考えると、ほとんどの場合、支払うのは少額です。

値が何を表しているのかはわかりませんが、パラメーターが表す「現実世界」のエンティティに近い名前を付けることができれば、より良いものになります。

于 2012-11-11T17:41:11.893 に答える
2

メソッドの役割と、ユーザーがメソッドを呼び出す方法について考えてください。2 番目のパラメーターが数値の場合は、適切な数値型を使用する必要があります。一般に、より「自然」と思われる方法でコードを記述する必要があります。リンクによる上記の投稿は素晴らしく、これについてさらに詳しく説明しています。

何が「速い」かについての懸念については、それについて考えるのをやめる必要があります。この種のマイクロ最適化がパフォーマンスに測定可能な影響を与える可能性は低く、新しいプログラマーとして心配する必要はありません。正しいコードに焦点を当てます。

于 2012-11-11T17:50:05.817 に答える
1

ここには 2 つのインターリーブの問題があります。

  1. 浮動小数点型floatdouble、およびlong doubleは、10 進数が数桁しかない場合でも、10 進数を正確に表すことができません。たとえば、0.1これらの型の 1 つとして表すと、丸められた値が得られます。標準ライブラリは、この値を読み取って再度書き込むと、元の値が返されるようにします (末尾のゼロを除く:0.1000としてフォーマットされる場合があります0.1)。書式設定では、丸め誤差はそれほど問題ではありませんが、算術演算を開始した瞬間に、小さな誤差が興味深い問題を引き起こす可能性があります。a などの正確な表現を渡すstd::stringことには、これらの値を処理する関数が正しいことを実行できるという利点があります。
  2. std::string数値の代わりに使用する問題には、インターフェイスが引数が何を表しているかを示しておらず、コンパイラが型チェックを使用して引数を直接取得するのを支援できないという問題があります。実際の型は a 内に隠されていstd::stringます。理想的には、値を正確に保持しながら、そのセマンティクスも示す引数を使用します。

必要に応じて、浮動小数点型または a を使用するstd::stringのが正しい選択かもしれません。関数を介して数値を渡したい場合で、末尾の小数桁が失われても構わない場合は、浮動小数点型を使用するのがおそらく最善です。正確な算術演算が必要で、末尾のゼロを保持する必要があるstd::string場合は、a を選択することをお勧めします。ただし、10 進数値の正しい表現専用の型を使用することをお勧めします (将来的には使用できるようになることを願っていますstd::decimal64が、まだ標準の一部ではありません)。

于 2012-11-11T17:58:06.357 に答える