Ich arbeite mit massiven Saiten, die viel Manipulation erfordern.
Zum Beispiel könnte ich eine Zeichenfolge wie folgt generieren:
Teil 1
BootAbschnitt A
ProgrammierungTeil 2
Partitionieren von Booten zum Programmieren.Abschnitt AA
Abschnitt SQL-Einträge.
Die Zeichenfolge wäre zu groß, um jeden Teil manuell zu überprüfen. Jetzt muss ich split
dies string
in stringlist
Abschnitte und Teile umwandeln. Ich kann mir zwei Möglichkeiten vorstellen:
Ein regulärer Ausdruck:
QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)"));
Das sieht so aus, als ob es funktionieren sollte, aber manchmal rutschen Ausnahmen durch (IE: Section SQL Entries
würde fälschlicherweise aufgeteilt werden)
Andernfalls könnte ich beim Generieren der ersten Zeichenfolge einen Marker setzen:
🚤💻Teil 1
Boot🚤💻Abschnitt A
Programmierung🚤💻Teil 2
Partitionieren von Booten zum Programmieren.🚤💻
Abschnitt SQL-Einträge des Abschnitts AA .
Was bedeutet, dass das Teilen der Zeichenfolge einfach wird:
QStringList sl = s.split("🚤💻"));
Etwas sagt mir zwar, dass keines davon ein guter Stil oder eine gute Programmierpraxis ist, aber ich habe bis zu diesem Punkt weder darüber gesprochen noch eine Alternative gefunden.
- Wenn Sie mein Projektmanager wären, würden Sie eine dieser Methoden akzeptieren?
- Wenn nicht, was würden Sie mir als Best Practice vorschlagen?
Antworten:
Es ist keine schlechte Praxis, die Dokumentcodierung als Text in eine Zeichenfolge einzubetten. Denken Sie an Markdown, HTML, XML, JSON, YAML, LaTeX usw.
Was schlechte Praxis ist, ist das Rad neu zu erfinden. Anstatt einen eigenen Textprozessor zu schreiben, sollten Sie einen vorhandenen Standard verwenden. Es gibt viele freie Software, die einen Großteil des Parsens für Sie erledigt, und viele verfügen über eine nicht einschränkende Lizenz, mit der Sie diese Software in Ihrer eigenen proprietären Software verwenden können.
quelle
Die Verwendung eines gemeinsamen Trennzeichens sollte beim Teilen größerer beliebiger Zeichenfolgen gut funktionieren, ich würde jedoch empfehlen, kein beliebiges Symbol zu verwenden. Jemand, der diese Zeichenfolge als Klartext liest, könnte verwirrt sein, ganz zu schweigen von Problemen mit UTF und davon, ob das Symbol in den Abschnitten angezeigt wird oder nicht.
Der wichtigste Teil davon ist, dass jeder Abschnitt intakt bleibt, während jeder "Abschnittskopf" entsprechend identifiziert werden muss.
Warum nicht ein gemeinsames Trennzeichen verwenden, aber lesbar halten? Etwas wie:
Das Problem besteht darin, zu entscheiden, was das Trennzeichen sein soll, da es etwas sein muss, das garantiert keinen Abschnitt anzeigt. Sie können es außerdem als Trennzeichen identifizieren, indem Sie festlegen, dass es sich am Anfang einer Zeile befindet und der einzige Text in dieser Zeile ist .
Ohne weitere Kenntnisse darüber, welcher Text in den einzelnen Abschnitten erwartet wird, ist es schwierig, eine Empfehlung abzugeben, welches gemeinsame Trennzeichen in diesem Fall am besten geeignet ist.
quelle
Die akzeptierte Antwort scheint verfehlt zu haben, was Sie in einem Kommentar geschrieben haben:
und gab dies als Beispiel:
Wenn es das ist, was Sie wollen, ist es meiner Meinung nach eine wirklich schlechte Idee, einen "Markdown" oder ein Texttrennzeichen für Ihre gesamte Zeichenfolge zu verwenden. Dies birgt immer ein gewisses Risiko, die Manipulation zu stören, und führt nicht zu robustem Code. Insbesondere wenn Sie versuchen, reguläre Ausdrücke für eine solche kombinierte Zeichenfolge zu verwenden, werden Sie wahrscheinlich auf dieselben Probleme stoßen, die beim Parsen von HTLM oder XML mit regulären Ausdrücken auftreten .
Insbesondere, weil Sie geschrieben haben, dass es "Tausende von [solchen Manipulations-] Funktionen" geben könnte, könnte dieses Risiko zu einem echten Problem werden. Selbst wenn Sie einen Markdown wie XML verwenden, um die Zeichenfolgenliste intern zu speichern, müssen Sie sicherstellen, dass bei der Manipulation nur der Inhalt und nicht der Markdown verarbeitet wird. Dies bedeutet, dass Sie die Zeichenfolge vor der Verarbeitung in Teile aufteilen und beitreten müssen es danach wieder - so dass ein hohes Risiko besteht, dass Sie eine schlechte Leistung erbringen.
Die bessere Entwurfsalternative besteht darin, einen abstrakten Datentyp bereitzustellen (verwenden Sie eine Klasse, wenn Sie möchten), sie aufzurufen
MyStringList
und einen kleinen Satz grundlegender Operationen bereitzustellen, mit denen Sie Ihre "Tausenden von Funktionen" in Bezug auf diese Operationen implementieren können. Zum Beispiel könnte es generisch seinfind
undreplace
Operationen oder einen generischen funktionalenmap
Betrieb . Sie können auch so etwas wie eineJoinToString
Operation hinzufügen, wenn Sie für bestimmte Zwecke wirklich die gesamte Liste in einer Zeichenfolge benötigen.Wenn Sie diese Operationen verwenden, wird Ihre Befürchtung, dass der Code komplizierter wird, weil "alles in einer for-Schleife erledigt werden müsste", sinnlos, da die einzigen
for
Schleifen, die Sie erhalten, in den Operationen des Datentyps gekapselt sind. Und ich würde mir keine Sorgen um die Leistung machen, bis Sie eine echte, messbare Auswirkung auf die Leistung haben (was ich bezweifle, dass Sie sie erhalten, wenn Sie die grundlegenden Operationen korrekt implementieren).quelle
<
und>
, und es wird jede Instanz dieser Zeichenfolge erfassen, wo ich die Instanzen, die ich nicht möchte, leicht entfernen und sie sauber auf die gewünschte Weise bearbeiten kann. Dies ist gut, da reguläre Ausdrücke für sich genommen keine Teilzeichenfolgen wie diese verarbeiten: Nun,<boat <programming>>
wenn mehrere Ebenen von Klammern vorhanden sind.Das beschriebene Format ist INI-Dateien sehr ähnlich:
https://en.wikipedia.org/wiki/INI_file
In diesem Fall wird der Abschnitt in eckige Klammern [] eingeschlossen. Was Sie also beschreiben, ist sinnvoll, indem Sie den Abschnitt auf irgendeine Weise markieren, um diesem Text eine zusätzliche Bedeutung zu verleihen.
quelle
Frage: Woraus "generieren" Sie diesen String?
Wäre das einfacher zu manipulieren?
quelle
LaTeX
aufSSML
Dolmetscher, und eines der Probleme ist , dass Sie identische Bilder mit sehr unterschiedlichem Code erzeugen können, und so ist es nahezu unmöglich , konsequent zu sein , wenn der Benutzer seine Formeln zu erzeugen , schlecht oder esoterische Wege wählt. Letztendlich bedeutet dies nur, dass Menschen, die keine guten Praktiken anwenden, keine anständige Interpretation ihrer Skripte haben.