一些编码惯例/标准练习题

时间:2017-03-29 15:38:21

标签: c++

我有这个函数从main获取一个字符串。该字符串包含用户可以从某些菜单选项输入的所有有效字符。函数将字符输入放入变量并与字符串的每个字符进行比较。将输入变量与字符串字符进行比较,直到输入有效输入。

我的问题是,实现此循环的最佳方法是什么?我不喜欢在中间使用while (true)并使用return,因为它看起来像一个无限循环,中间有一个例外,这使得它稍微难以阅读,但我'我不知道我怎么能做我想做的事。实现目标的最佳做法是什么?感谢。

char getValidKey(string validKeys)
{
    char letter;

    while (true) {
        cout << "Operation ? ";
        cin >> letter;
        cin.ignore(numeric_limits<streamsize>::max(), '\n');

        for (int i = 0; i < validKeys.length(); i++) {

            if (letter == validKeys[i])
                return letter;
        }

        cout << "Error. Invalid input.\n";
    }
}

另外,我有一个带有多个返回的switch语句。是否更常见/首选将计算分配给变量并在结尾处返回一个或者这种方式通常是否合适?

string opStr;

switch (myOperation) {
    case 1:
        opStr = "RIGHT";
        break;
    case 2:
        opStr = "LEFT";
        break;
    case 3:
        opStr = "CENTER_ONLY";
        break;
    case 4:
        opStr = "CENTER_MISSING";
        break;
    default:
        opStr = "Error. Invalid input.";
        break;
}

return opStr;

OR

switch (myOperation) {
    case 1:
        return "RIGHT";
        break;
    case 2:
        return "LEFT";
        break;
    case 3:
        return "CENTER_ONLY";
        break;
    case 4:
        return "CENTER_MISSING";
        break;
    default:
        return "Error. Invalid input.";
        break;
}

1 个答案:

答案 0 :(得分:4)

对于第一种情况,在较小的自包含函数中重构代码,即使从getValidKey开始理解while(true)的逻辑也很清楚:

char isKeyValid(char x, const string& validKeys)
{
    return validKeys.find(x) != string::npos;
}

char readCharFromCin()
{
    char letter;

    cout << "Operation ? ";
    cin >> letter;
    cin.ignore(numeric_limits<streamsize>::max(), '\n');

    return letter;
}

char getValidKey(const string& validKeys)
{
    while (true) 
    {
        const char key = readCharFromCin();
        if(isKeyValid(key, validKeys)) return letter;

        cout << "Error. Invalid input.\n";
    }
}

对于第二种情况,请避免break,只需从switch返回。使包含switch的函数只做一件事。

string switchOperation(int myOperation)
{
    switch (myOperation) 
    {
        case 1:  return "RIGHT";
        case 2:  return "LEFT";
        case 3:  return "CENTER_ONLY";
        case 4:  return "CENTER_MISSING";
    }

    return "Error. Invalid input.";
}

此外,尝试最大限度地使用const,并传递string仅仅const&读取的sed -i.bak 's/Sports Communication[^P]/College of Architecture\, Arts and Humanities\/Sports Communication/' out.csv 个实例,以避免不必要的副本。