句読点の処理にマジックストリングまたは定数を使用していますか?
-
05-07-2019 - |
質問
任意の句読点を含む任意の文字列を使用して、多くの字句処理を行います。魔法の文字/文字列を使用するか、記号定数を使用するかについては分かれています。
例は言語に依存しないものとして読む必要がありますが、ほとんどはJavaです。
句読点にセマンティックな役割があり、定数として識別する必要がある明確な例があります:
" /"
または" \\"
ではなく、 File.separator
; // OSに依存しないため、非常に簡単です
そして XML_PREFIX_SEPARATOR =":"
;
ただし、""
のすべての例を空の文字列 ``で置き換える必要があるとしましょう。私は書くことができます:
s = s.replaceAll("\"\"", "");
または
s = s.replaceAll(S_QUOT+S_QUOT, S_EMPTY);
(すべての一般的な句読点をS_FOO(string)およびC_FOO(char)として定義しました)
魔法の文字列/文字を好む:
- 短いです
- 読むことは自然なことです(時々)
- 名前付き定数はおなじみではないかもしれません(
C_APOS
vs'\' '
)
定数を支持する
- タイプミスをするのは難しいです(例:
" ''" + '"'
とS_APOS + S_APOS + C_QUOT
とのコントラスト) - 正規表現が
" \\ s +"
または" \ s +"
または" \\\である場合、エスケープの問題を取り除きます\ s +"
? - 句読点のコードを検索するのは簡単です
(これには制限があります-正規表現構文はすべてのプログラミングの中で最も認知機能不全の部分の1つですが、このように正規表現を記述しません。より良い構文が必要だと思います。)
解決
定義が時間の経過やインストール間で変更される可能性がある場合、これらを構成ファイルに入れ、起動時またはオンデマンドで(状況に応じて)情報を取得する傾向があります。次に、静的クラスに読み取り専用インターフェイスを提供し、情報をシステムに公開するためのプロパティの名前をクリアします。
使用法は次のようになります。
s = s.replaceAll(CharConfig.Quotation + CharConfig.Quotation, CharConfig.EmtpyString);
他のヒント
一般的な文字列処理では、特別な記号は使用しません。スペースは常にスペースになります。読み取り(および書き込み)する方が自然です:
s.replace("String", " ");
より:
s.replace("String", S_SPACE);
" \ t"のようなものを使用する場合は特に注意しますたとえば、タブは文字列内のスペースと簡単に区別できないため、タブを表します。
XML_PREFIX_SEPARATOR
や FILE_SEPARATOR
などの場合、ライブラリを使用する必要があるため、そのような定数を扱う必要はないでしょう。あなたのために仕事をする。たとえば、手書きは dir + FILE_SEPARATOR + filename
ではなく、 file_system_library.join(dir、filename)
(またはこれに相当するもの)を呼び出す必要があります。 「使用しています」。
これにより、定数などの答えが得られるだけでなく、実際にはおそらく今考えていないさまざまなエッジケースの処理が大幅に向上します