web-dev-qa-db-ja.com

文字列内にテキストマーカーを配置するのは悪いスタイルですか?代わりはありますか?

私は多くの操作を必要とする巨大な文字列を扱います。

たとえば、次のような文字列を生成します。

パート1
ボート

セクションA
プログラミング

パート2
プログラミングのためのボートの分割。

セクションAA
セクションSQLエントリ。

文字列が大きすぎて手動ですべての部分をチェックすることはできません。次に、このsplitをセクションとパーツでstringstringlistする必要があります。私は2つのオプションを考えることができます:

正規表現:

QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)"));

動作するように見えますが、例外が発生することがあります(IE:Section SQL Entriesは誤って分割されます)

それ以外の場合は、最初の文字列を生成するときにマーカーを配置できます。

????????パート1
ボート

????????セクションA
プログラミング

????????パート2
プログラミングのためのボートの分割。

????????セクションAA
セクションSQLエントリ。

つまり、文字列の分割が簡単になります。

QStringList sl = s.split("????????"));

これらのどちらも優れたスタイルやプログラミングの実践ではないことはわかりますが、この時点まで、それについては説明しておらず、代替案も見つけていません。

  • あなたが私のプロジェクトマネージャーである場合、これらの方法のいずれかを受け入れますか?
  • そうでない場合、私がベストプラクティスとして何をすればよいと思いますか?
10
Akiva

ドキュメントのエンコーディングを文字列のテキストとして埋め込むことは悪い習慣ではありません。マークダウン、HTML、XML、JSON、YAML、LaTeXなどを考えてみてください。

悪い習慣は、車輪を再発明することです。独自のテキストプロセッサを作成するのではなく、既存の標準を使用することを検討してください。解析の大部分を行う無料のソフトウェアがたくさんあります。多くの無料ソフトウェアには、独自の専用ソフトウェアでそのソフトウェアを使用するための非制限的なライセンスがあります。

17
David Hammen

より大きな任意の文字列を分割する場合、いくつかの共通セパレーターを使用すると正常に機能しますが、任意の記号を使用しないことをお勧めします。その文字列をプレーンテキストとして読み取る人は、UTFの問題や、セクション内にシンボルが表示されるかどうかは言うまでもなく、混乱する可能性があります。

これの最も重要な部分は、各「セクションヘッダー」を適切に識別する必要がある一方で、各セクションはそのままであるということです。

共通のセパレーターを使用せずに、それを読みやすく保つのはなぜですか?何かのようなもの:

[SECTION]
Part 1
Boat

[SECTION]
Section A
Programming

[SECTION]
Part 2
Partitioning boats for programming.

[SECTION]
Section AA
Section SQL Entries.

問題は、separatorが何であるかを決定していることです。セクションが表示されないことが保証されている必要があるためです。 行の先頭およびその行のテキストのみであることを要求することにより、さらにセパレータとして識別することができます。 =。

各セクションでどのテキストが期待されるかについてのさらなる知識がなければ、この場合、どの共通セパレーターが最適であるかについて推奨することは困難です。

8
Erdrik Ironrose

受け入れられた回答は、コメントに書き込んだ内容を逃したようです:

その理由は、私が行う多くの操作には完全な文字列が必要だからです。

例としてこれを与えました:

s.replace( "boat"、 "programming");

これが必要な場合、文字列全体に「マークダウン」またはテキストセパレーターを使用するのは非常に悪い考えです。これは、操作に干渉する特定のリスクが常にあり、堅牢なコードにつながりません。特に、そのような結合された文字列で正規表現を使用しようとすると、おそらく 正規表現を使用してHTLMまたはXMLを解析しようとする場合 と同じ問題が発生します。

特にあなたが書いたので「何千もの[そのような操作]関数」があるかもしれず、そのリスクは実際の問題になるかもしれません。 XMLなどのマークダウンを使用して文字列リストを内部的に格納する場合でも、操作がマークダウンではなくコンテンツのみを処理することを確認する必要があります。これは、処理を行う前に文字列を分割して、結合することを意味します。その後、再び-thatは、パフォーマンスが低下するリスクが高くなります。

ここでのより良い設計の代替案は、抽象データ型(必要に応じてクラスを使用)を提供し、それをMyStringListと呼び、基本セットの小さなセットを提供することですオペレーションに関して「数千の機能」を実装できるオペレーション。たとえば、一般的なfindおよびreplace操作、または一般的な機能 map操作 がある場合があります。特定の目的のためにリスト全体を1つの文字列で本当に必要な場合は、JoinToString操作のようなものを追加することもできます。

これらの操作を使用すると、「forループですべてを実行する必要があるため」が原因でコードが複雑になるという恐れは無意味になります。これは、取得するforループのみが内部にカプセル化されるためです。データ型の操作。そして、実際に測定可能なパフォーマンスへの影響が出るまで、私はパフォーマンスについて心配しません(基本的な操作を正しく実装した場合、それは疑わしいでしょう)。

5
Doc Brown

説明されている形式は、INI files:

https://en.wikipedia.org/wiki/INI_file

その場合、セクションは角かっこ[]で囲まれているので、テキストに追加の意味を追加するためにセクションを何らかの方法でマークすることにより、説明した内容が意味をなすようになります。

1
Jon Raynor

たとえば、次のような文字列を生成します。

質問:この文字列を何から「生成」しますか?

それは操作が簡単ですか?

0
Phill W.