0

これを行う最善の方法は何ですか: 大きなコレクション クラスListCompletions(string digits, Lexicon & lex)(lex) を取得しました。メソッドでアクセスする必要がありますcontainsPrefix(string prefix)。メソッド間で参照によってレキシコンを渡すオプションがありました (使用しないメソッドの場合)。またはcontainsPrefix(string prefix)、プライベート インスタンス変数として保存する際にコピーを作成することもできます。

私の推測では、プライベート インスタンス変数としてコピーを作成することは、パラメーター内でそれを渡すとコードがさらに複雑になるため、はるかに最良のオプションですが、プライベート インスタンス変数はデバッグが難しいため、デバッグが難しくなります。どのメソッドがそれを使用しているかを知っています。しかし、私は完全に確実であるように求めているので、悪いコーディングの習慣を身につけることはありません.

#include "CellPhoneMindReading.h"

void CellPhoneMindReading :: ListCompletions(string digits, Lexicon & lex)
{
    //cout << lex.contains("fedora") << endl;

    RecursiveMnemonics("", "72");
}



/*
 * Function: containsPrefix
 * Usage: containsPrefix(prefix);
 * ----------------------------------------
 * This function returns the given prefix passed as argument if it
 * is found in the Lexicon database. prefixes that are not found
 * is discarded and the return value is a empty string.
 */
string CellPhoneMindReading :: containsPrefix(string prefix)
{
    if (
    return "";
}



/*
 * Function: RecursiveMnemonics
 * Usage: RecursiveMnemonics(prefix, rest);
 * ----------------------------------------
 * This function does all of the real work for ListMnemonics and
 * implements a more general problem with a recursive solution
 * that is easier to see. The call to RecursiveMnemonics generates
 * all mnemonics for the digits in the string rest prefixed by the
 * mnemonic string in prefix. As the recursion proceeds, the rest
 * string gets shorter and the prefix string gets longer.
 */
void CellPhoneMindReading :: RecursiveMnemonics(string prefix, string rest)
{
    if (rest.length() == 0)
    {
        cout << prefix << endl;
        containsPrefix(prefix);
    }
    else {
        string options = DigitLetters(rest[0]);
        for (int i = 0; i < options.length(); i++)
        {
            RecursiveMnemonics(prefix + options[i], rest.substr(1));
        }
    }
}



/*
 * Function: DigitLetters
 * Usage: digits = DigitLetters(ch);
 * ---------------------------------
 * This function returns a string consisting of the legal
 * substitutions for a given digit character. Note that 0 and
 * 1 are handled just by leaving that digit in its position.
 */
string CellPhoneMindReading :: DigitLetters(char ch)
{
    switch (ch) {
        case '0': return ("0");
        case '1': return ("1");
        case '2': return ("ABC");
        case '3': return ("DEF");
        case '4': return ("GHI");
        case '5': return ("JKL");
        case '6': return ("MNO");
        case '7': return ("PRS");
        case '8': return ("TUV");
        case '9': return ("WXY");
        default: cout << "Illegal digit" << endl;
    }
}
4

2 に答える 2

2

ここに2つのコメント。

  1. レキシコン参照がconstであることを確認してください。私が思う他の何かは疑わしいように思われるでしょう。
  2. あなたの本能は正しいです-プライベートメンバーに保存することを使用するよりも、引数としてレキシコンを渡すことが望ましいです。ただし、すべての引数の受け渡しが多すぎる場合は、メンバーインスタンスをオプションにすることができます。そこで最適なトレードオフを選択できるのはあなただけです。

ボーナスコメント:なぜDigitLettersメンバーを機能させるのですか?メンバーデータを参照しないため、無料の関数として使用する方が適切です。

于 2012-12-13T01:28:28.170 に答える
2

クラスのメソッドに渡された引数を保存して、メソッド呼び出し中にアクセスするだけの場合、それはコードの匂い、つまり何かがおかしいことを示していると言えます。

クラスのメンバー変数はその状態を定義します。この場合、レキシコンは単一の関数呼び出し中に (外部の観点から) 使用されるだけで、クラスによって使用されないため、クラスの状態に属していないように見えます。その後。

したがって、あなたが与えた2つのオプションのうち、私は明らかに引数を渡すことを好みます.

3 番目のオプションは、参照をコンストラクター引数として追加することです。

4 番目のオプションは、'RecursiveMnemonics'、'DigitLetters'、および 'containsPrefix' を含む新しいクラスを作成し、その新しいクラスに Lexicon への参照をコンストラクタ引数として持たせることです。次に、「ListCompletions」によって新しいクラスがスタック上に作成されます。

于 2012-12-13T01:03:32.807 に答える