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


10

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

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

パート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("🚤💻"));

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

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

6
プログラムがこれらのマーカーを配置する場所を知っている場合は、まずセクションを個別の文字列として生成しないでください。
Jacob Raihle

現在のエンコーディングにうまく変換できないマーカーをユーザーに使用することは良い考えではないと思います。
TulainsCórdova16年

2
使用される実際のシンボルは違いを作るために何が起こっているか、大部分は無関係であるあなたが解析しようとしているものの文法である
JKを。

4
@Akivaはあなたがパフォーマンスのヒットについて確信していますか?あなたはどのような場合でも同じ量のデータを扱っていますが、大きな違いはないと思います。何千もの関数を1つの関数にまとめ、それをループで呼び出し、いくつかの測定を行います。
Jacob Raihle

2
@Akivaリスト内の要素を取得および置換することは、最悪の場合、大きな文字列を分割することに相当します。
Jacob Raihle 2016年

回答:


17

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

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


私の場合、私がしようとしているのがマークダウン言語用のユニークなインタープリターを構築することである場合、私はホイールを発明しています。たとえば、私のプロジェクトの1つは、人間の耳で読み取り可能なSSMLとしてLatexを解釈することでした:meta.wikimedia.org/wiki/Grants : IdeaLab / 。<<そのURLの末尾にはピリオドがあり、それ以外の場合は機能しません
Akiva '21

2
@Akiva私は職場で開発された、文字通りホイールを再発明するカスタムテキスト形式を使用する必要があります。そのために、3つの言語(Javascript、Java、Objective-C)で4つのパーサーを維持する必要があり、それは大変な悪夢です。正しいことを今行ってこのカスタムテキスト形式をナンセンスにしてください。メンテナンスの悪夢がこれから数年後にどれほどの規模になるか、私は十分に強調できません。既存の構造化フォーマット、XML、JSONなどを使用します
Chris Cirefice

@ChrisCirefice悪夢の例を教えてください。
Akiva 2016年

1
@Akivaパーサーを1つ(私の場合は複数の異なる言語で)さえ維持する必要があるという事実は恐ろしいと思います。標準のフォーマットは、理由があって存在します-それらは必要なデータを表すことができます-そしてそれらのパーサーは構築され、洗練され、維持されているので、あなたの側でほとんど努力する必要がありません。カスタムテキスト形式も非常に専門的な知識です。つまり、通常、1人または2人の開発者だけが、その形式を十分に維持するのに十分な知識を持っています。それはボリュームを語るはずです。ほとんどの人はCML、JSONに精通しています-カスタム形式を知っている人はほとんどいません。
Chris Cirefice 2016年

1
@Akiva確かに!マークダウン形式(SEや他の多くのサイトがテキストの書式設定に使用する形式)は、SQLのように、やや標準的です。しかし、カスタム拡張(SEなど)を使用したさまざまな「フレーバー」があります。「コア」を解析する標準ライブラリがあり、追加機能が必要な場合はライブラリを拡張します。しかし、独自のフォーマッタを作成して維持するのは面倒です-すでにいくつか存在している(マークダウン、BBコードなど)ので、なぜホイールを再発明してすべてのコードを維持するのでしょうか。既存のライブラリを使用することもできます:)
Chris Cirefice

8

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

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

なぜ一般的なセパレータを使用しないで、それを読みやすく保つのですか 何かのようなもの:

[SECTION]
Part 1
Boat

[SECTION]
Section A
Programming

[SECTION]
Part 2
Partitioning boats for programming.

[SECTION]
Section AA
Section SQL Entries.

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

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


私はあなたの答えが読みやすさに重点を置いているのが好きです。文字列は、ユーザーが生成したテキストをスクレイピングして生成されます。たとえば、SEで質問と回答を書くために使用されるマークアップ言語などです。したがって、どのような種類の文字列操作の問題が発生するかを簡単に想像できます。
Akiva 2016年

5

受け入れられた答えは、あなたがコメントで書いたものを逃したようです:

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

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

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

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

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

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

これらの操作を使用すると、「forループですべてを実行する必要があるためにコードが複雑になるのではないかという不安が生じforます。そして、実際に測定可能なパフォーマンスへの影響が出るまで、基本的な操作を適切に実装した場合に、そのパフォーマンスについて心配する必要はありません。


私は実際にそのようなものを作成したので賛成票を投じます。それは言う、セットカスタムブラケットに私を可能に<して>、そしてそれは、私は簡単に私が望んでいないインスタンスを削除し、きれいに私が好きな方法でそれを操作することができ、その文字列のすべてのインスタンスを取得します。正規表現自体は次のような部分文字列を処理しないため、これは適切<boat <programming>>です。
Akiva 2016年

1

説明されている形式は、INIファイルに非常に似ています。

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

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


0

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

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

それ操作が簡単ですか?


文字列は、ウェブサイトのDatascrapingユーザーコンテンツから生成されます。
Akiva

1
これは、Webサイトからデータを取得するための信頼できる方法ではありません。単にデータが変化し、物事が移動したり完全に消えたりするからです。ある種の公開された(したがって信頼できる)APIからデータを取得する方がはるかに良いでしょう。さらに、多くの商用Webサイトの使用は、特にこの種のものを禁止します。
Phill W.

時々私はどのデータが私にとって価値があるかを選択することができないので、あなたが見ているものの完全性チェックを行う必要があるか、または単に妥協して最高のものを期待する必要があります。例:私はLaTeXto SSMLインタープリターを作成しましたが、問題の1つは、大幅に異なるコードで同一の画像を生成できることです。そのため、ユーザーが式を生成する方法として貧弱または難解な方法を選択した場合、一貫性を保つことはほぼ不可能です。つまり、結局のところ、適切な実践を行わない人々は、脚本をきちんと解釈できないということです。
Akiva
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.