如何删除这个简单代码中的重复?

时间:2012-01-04 09:14:31

标签: c++ design-patterns refactoring code-duplication

我制作了一个AppendLastSlashIfNotExist函数 今天,我决定制作另一个函数AppendLastBackSlashIfNotExist

wstring AppendLastSlashIfNotExist(__in const wstring& path)
{
    if (path == L"/")
    {
        return path;
    }

    if (path.size() == 0 || path[path.size() - 1] != L'/')
    {
        return path + L"/";
    }
    return path;
}

wstring AppendLastBackSlashIfNotExist(__in const wstring& path)
{
    if (path == L"\\")
    {
        return path;
    }

    if (path.size() == 0 || path[path.size() - 1] != L'\\')
    {
        return path + L"\\";
    }
    return path;
}

是的,很糟糕。只有斜杠 - > BackSlash 是更改。我想删除重复。

wstring AppendLastSlashIfNotExist(__in const wstring& path, bool backSlash)
{
    if (path == (backSlash ? L"\\" : L"/"))
    {
        return path;
    }

    if (path.size() == 0 || path[path.size() - 1] != (backSlash ? L'\\' : L'/'))
    {
        return path + (backSlash ? L"\\" : L"/");
    }
    return path;
}

我整合了它们。删除重复。但是另外一个参数来了。我还是觉得不舒服。 是否有其他方法可以删除重复?例如,通过高阶函数使用 请问。

4 个答案:

答案 0 :(得分:6)

template是解决此类问题的答案:

template<char SLASH_TYPE>
wstring AppendLastSlashIfNotExist(__in const wstring& path)
{
    if (path[0] == SLASH_TYPE)  // <--- comparing char (not const char*)
    {
        return path;
    }

    if (path.size() == 0 || path[path.size() - 1] != SLASH_TYPE)
    {
        return path + SLASH_TYPE;
    }
    return path;
}

您需要为此目的稍微改变一下逻辑,因为您发现您正在传递char而不是const char*作为模板参数。

该函数将被称为:

y = AppendLastSlashIfNotExist<'/'>(x);
y = AppendLastSlashIfNotExist<'\\'>(x);

答案 1 :(得分:6)

不是传递布尔值来指示斜杠类型,而是可以传递所需的斜杠字符,并且可能有斜杠字符的默认值:

wstring AppendLastSlashIfNotExist(__in const wstring& path,
                                  wchar_t slash = L'\\')
{
    // This is superfluous and is handled in next if condition.
    /*if (1 == path.length() && path[0] == slash)
    {
        return path;
    }*/

    if (path.size() == 0 || path[path.size() - 1] != slash)
    {
        return path + slash;
    }
    return path;
}

std::wstring s(L"test");
std::wcout << AppendLastSlashIfNotExist(s) << "\n";
std::wcout << AppendLastSlashIfNotExist(s, L'/') << "\n";

答案 2 :(得分:3)

您应该尝试考虑稍后阅读代码的人。 bool不是可读代码,但AppendLastSlashIfNotExistsAppendLastBackSlashIfNotExists是。我的建议是保留这两个功能,然后从它们调用普通功能。

wstring AppendLastSlashIfNotExistInternal(__in const wstring& path, bool backSlash)
{
    // as before..
    return path;
}

wstring AppendLastBackSlashIfNotExist(__in const wstring& path){
    return AppendLastSlashIfNotExistInternal(path, true);
}

wstring AppendLastSlashIfNotExist(__in const wstring& path)
{
    return AppendLastSlashIfNotExistInternal(path, false);
}

这样,您仍然可以让以后维护代码的人

答案 3 :(得分:0)

一种解决方案可能是使用带参数的TrimEnd,以便从字符串末尾删除所有不需要的字符:

template<class T> 
T TrimEnd( const T& arg, const T& unwantedCharacters )
{
  // Do manipulations here using stringstream in order to cut unwanted characters.
}

或者您可以避免使用模板,并使用字符串和wstring参数使用此函数的2个版本。

之后,您只需在结果字符串上附加所需的字符尾部。