2012-01-04 9 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; 
} 

別の関数を作ることにしましたはい、それは吸います。 スラッシュ - >バックスラッシュは変更です。重複を取り除きたい

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

私はそれらを統合しました。重複が削除されました。しかし、追加のパラメータが来た。私はまだ不快感を感じる。 重複を削除する他の方法はありませんか?たとえば、高次関数を使用します。
お願いします。あなたはテンプレートパラメータとしてcharなくconst char*を渡していることを見るように、

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

あなたは、この目的のために、あなたのロジックビットを変更する必要があります。

+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は、このような問題のための答えです。代わりに、あなただけが必要であるスラッシュ文字を渡し、そしておそらくスラッシュ文字のデフォルトを持っている可能性がスラッシュタイプを示すブール値を渡すので

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

+1。ずっといい。 – Benjamin

+0

'path [0] == SLASH_TYPE'を比較する前に' path.size()== 0'をチェックしてはいけませんか? –

+0

btw、あなたの変更のために論理はもはや同じではありません。 'path [0] == SLASH_TYPE' – Benjamin

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

この方法で、あなたはまだ、後でコード

+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引数で使用することを避けることができます。

その後、必要な文字列を結果文字列に追加するだけです。

関連する問題