Как убрать дублирование в этом простом коде? - PullRequest
2 голосов
/ 04 января 2012

Есть функция 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;
}

Да, это отстой.Только Slash -> 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 ]

6 голосов
/ 04 января 2012

Вместо передачи логического значения для обозначения типа косой черты вы можете просто передать требуемый символ косой черты и, возможно, иметь значение по умолчанию для символа косой черты:

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";
6 голосов
/ 04 января 2012

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);
3 голосов
/ 04 января 2012

Вы должны попытаться подумать о том, кто читает код позже.Bool не читаемый код, но AppendLastSlashIfNotExists и AppendLastBackSlashIfNotExists.Я предлагаю сохранить обе эти функции, а затем вызывать у них общую.

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);
}

Таким образом, вы по-прежнему сохраняете ее читабельной для того, кто позже поддерживает код

0 голосов
/ 04 января 2012

Одним из решений может быть использование TrimEnd с аргументом для удаления всех нежелательных символов из конца строки:

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

или вы можете избежать использования шаблона и использовать 2 версии этой функции с аргументами string и wstring.

после этого вы просто добавляете необходимые символы в строку результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...