2012-01-04 3 views
2

Существует функция 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; 
} 

Я объединил их. Дублирование удалено. Но появился дополнительный параметр. Я все еще чувствую себя некомфортно. Нет ли других способов удалить дублирование? Например, используя функцию высокого порядка.
Любая идея, пожалуйста.

+0

Я полагаю, что вместо использования этих функций вы должны включить класс Path. В вашем пути к классу вы будете следить за действительностью строки пути. Используйте концепцию OO. – AlexTheo

+0

Укажите значение по умолчанию для 'bool backSlash = false'. – atoMerz

ответ

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"; 
+0

+1 для нахождения лишнего – Benjamin

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

+1. намного лучше. – Benjamin

+0

Разве вы не проверяете 'путь.size() == 0' перед сравнением' path [0] == SLASH_TYPE'? –

+0

Кстати, логика не то же самое из-за ваших изменений. 'path [0] == SLASH_TYPE' – Benjamin

3

Вы должны попытаться подумать о том, кто читает код позже. 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); 
} 

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

+1

+1. Сохраните читаемые имена функций, но передайте их общее поведение другой функции.Лично я передал бы символ, который будет добавлен, а не логический, но в остальном это будет подход, который я бы взял. –

+0

@CarlManaster Я полностью согласен. Сделайте это как можно более общим. – Default

+0

Я бы тоже принял этот подход. –

0

Одним из решений может быть использование 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.

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

Смежные вопросы