Il posizionamento dei marcatori di testo all'interno delle stringhe è di cattivo stile? C'è un'alternativa?


10

Lavoro con stringhe enormi che richiedono molta manipolazione.

Ad esempio, potrei generare una stringa come questa:

Parte 1
Barca

Sezione A
Programmazione

Parte 2
Partizionare le barche per la programmazione.

Sezione AA
Sezione Voci SQL.

La stringa sarebbe troppo grande per controllare manualmente ogni sua parte. Ora ho bisogno di splitquesto stringin a stringlistsezioni e parti. Mi vengono in mente due opzioni:

Un'espressione regolare:

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

Sembra che dovrebbe funzionare, ma a volte le eccezioni sfuggono (IE: Section SQL Entriesverrebbero erroneamente divise)

Altrimenti ciò che potrei fare è posizionare un marcatore quando generi la stringa iniziale:

🚤💻Parte 1
barca

🚤💻 Sezione A
Programmazione

🚤💻Parte 2
Partizionare le barche per la programmazione.

🚤💻
Sezione Sezione AA Voci SQL.

Ciò significa che dividere la stringa diventerebbe facile:

QStringList sl = s.split("🚤💻"));

Qualcosa mi dice però che nessuno di questi sono buoni stili o pratiche di programmazione, ma fino a questo punto non ne ho discusso né trovato un'alternativa.

  • Se tu fossi il mio project manager, accetteresti uno di questi metodi?
  • In caso contrario, cosa suggeriresti di fare come best practice?

6
Se il tuo programma sa dove posizionare questi marcatori, perché non generare le sezioni come stringhe separate per cominciare?
Jacob Raihle,

Non penso che un marcatore che non si traduca bene nella tua attuale codifica sia una buona idea.
Tulains Córdova,

2
i simboli reali usati sono in gran parte irrilevanti, ciò che farà la differenza è la grammatica della cosa che stai cercando di analizzare
jk.

4
@Akiva sei sicuro del successo delle prestazioni? In ogni caso stai lavorando con la stessa quantità di dati, dubito che ci sarebbe una differenza significativa. Componi le migliaia di funzioni in un'unica funzione, invocale in un ciclo e prendi alcune misure.
Jacob Raihle,

2
@Akiva Il recupero e la sostituzione di elementi in un elenco dovrebbe nel peggiore dei casi essere paragonabile alla divisione di una stringa di grandi dimensioni.
Jacob Raihle,

Risposte:


17

Non è una cattiva pratica avere la codifica di documenti incorporata come testo in una stringa. Pensa a markdown, HTML, XML, JSON, YAML, LaTeX, ecc.

Ciò che è cattiva pratica è reinventare la ruota. Invece di scrivere il tuo elaboratore di testi, pensa a utilizzare uno standard esistente. Esistono molti software gratuiti che eseguono gran parte dell'analisi per te e molti hanno una licenza non restrittiva che ti consente di utilizzare tale software nel tuo software proprietario.


Nel mio caso, sto inventando una ruota, se quello che sto cercando di fare è costruire un interprete unico per un linguaggio markdown. Ad esempio, uno dei miei progetti era interpretare Latex come SSML leggibile dall'orecchio umano: meta.wikimedia.org/wiki/Grants:IdeaLab/… . << C'è un punto alla fine di quell'URL, altrimenti non funzionerà
Akiva,

2
@Akiva Devo lavorare con un formato di testo personalizzato sviluppato dal mio posto di lavoro che reinventa letteralmente la ruota. Devo mantenere 4 parser in 3 lingue (Javascript, Java e Objective-C) per questo, ed è un incubo da capogiro . Fai la cosa giusta ora e abolisci queste sciocchezze in formato testo personalizzato . Non posso sottolineare abbastanza quanto sia grande l' incubo della manutenzione che diventerà tra qualche anno. Usa i formati strutturati esistenti, XML, JSON, ecc.
Chris Cirefice,

@ChrisCirefice Puoi darmi un esempio di come sia un incubo?
Akiva,

1
@Akiva Penso che il fatto che tu debba mantenere anche un solo parser (nel mio caso più e in diverse lingue) è orribile. I formati standard esistono per una ragione - possono rappresentare i dati di cui hai bisogno - e con uno sforzo estremamente piccolo da parte tua, perché quei parser sono stati creati, perfezionati e mantenuti. Il formato di testo personalizzato è anche una conoscenza estremamente specializzata, il che significa che di solito solo uno o due sviluppatori avranno familiarità con il formato per mantenerlo con successo. Questo dovrebbe parlare di volumi. Molte persone hanno familiarità con CML, JSON - pochi conoscono formati personalizzati.
Chris Cirefice,

1
@Akiva Indeed! Il formato Markdown (ciò che SE e molti altri siti utilizzano per la formattazione del testo) è in qualche modo standard , come lo è SQL. Ma ci sono molti "sapori" diversi con estensioni personalizzate (ad es. Come SE). Esiste una libreria standard che analizza il "core", quindi si estende la libreria se si desidera funzionalità aggiuntive. Ma costruire e mantenere il proprio formatter sarebbe ridicolo - ne esistono già diversi (markdown, codice BB, ecc.), Quindi perché reinventare la ruota e mantenere tutto quel codice? Può anche usare solo una libreria esistente :)
Chris Cirefice,

8

L'uso di un separatore comune dovrebbe funzionare bene quando si suddividono stringhe arbitrarie più grandi, ma sconsiglio di utilizzare un simbolo arbitrario. Qualcuno che legge quella stringa come testo in chiaro potrebbe essere confuso, per non parlare dei problemi con UTF e se il simbolo appare o meno all'interno delle sezioni o meno.

La parte più importante di questo è che ogni sezione rimane intatta, mentre ogni "intestazione di sezione" deve essere opportunamente identificata.

Perché non usare un separatore comune ma tenerlo leggibile? Qualcosa di simile a:

[SECTION]
Part 1
Boat

[SECTION]
Section A
Programming

[SECTION]
Part 2
Partitioning boats for programming.

[SECTION]
Section AA
Section SQL Entries.

Il problema è decidere quale dovrebbe essere il separatore , in quanto deve essere garantito che non venga visualizzata alcuna sezione. È possibile identificarlo ulteriormente come separatore richiedendo che sia all'inizio di una riga e l' unico testo su quella riga .

Senza un'ulteriore conoscenza del testo previsto in ogni sezione, è difficile formulare una raccomandazione su quale separatore comune sarebbe meglio in questo caso.


Mi piace l'enfasi della tua risposta sulla leggibilità. Le stringhe vengono generate tramite lo scraping dei dati generato dall'utente, ad esempio il linguaggio Markup utilizzato in SE per scrivere domande e risposte. Quindi puoi facilmente immaginare quale tipo di problemi di manipolazione delle stringhe potrebbero entrare in gioco.
Akiva,

5

La risposta accettata sembra aver perso quello che hai scritto in un commento:

Il motivo è che molta della manipolazione che faccio richiede l'intera stringa

e ha dato questo come esempio:

s.replace ("barca", "programmazione");

Se è quello che vuoi, è davvero una cattiva idea usare IMHO come "markdown" o separatore testuale per tutta la tua stringa, questo ha sempre un certo rischio di interferire con la manipolazione e non porterà a un codice robusto. Soprattutto quando si tenta di iniziare a utilizzare espressioni regolari su una stringa così combinata, probabilmente si incontreranno gli stessi problemi osservati dalle persone quando si tenta di analizzare HTLM o XML con espressioni regolari .

Soprattutto perché hai scritto che potrebbero esserci "migliaia di [tali manipolazioni] funzioni", che il rischio potrebbe diventare un vero problema. Anche se usi un markdown come XML per memorizzare l'elenco di stringhe internamente, devi assicurarti che la manipolazione elaborerà solo il contenuto, non il markdown, quindi ciò significherebbe dividere la stringa in parti prima di eseguire qualsiasi elaborazione e unire in seguito di nuovo - quindi questo avrà un alto rischio di darti una cattiva prestazione.

La migliore alternativa di progettazione qui è quella di fornire un tipo di dati astratto (utilizzare una classe se lo si desidera), chiamarlo MyStringListe fornire un piccolo insieme di operazioni di base che consentono di implementare le "migliaia di funzioni" in termini di tali operazioni. Ad esempio, ci potrebbe essere generico finde replaceoperazioni, o un generico funzionale mapoperazione . Puoi anche aggiungere qualcosa come JoinToStringun'operazione se hai davvero bisogno dell'intero elenco in una stringa per determinati scopi.

Usando queste operazioni, la tua paura che il codice diventi più complicato perché "tutto dovrebbe essere fatto in un ciclo for" diventa inutile, perché gli unici forloop che ottieni sono incapsulati all'interno delle operazioni del tipo di dati. E non sarei preoccupato per le prestazioni fino a quando non avrai un impatto reale e misurabile sulle prestazioni (che dubito che otterrai se eseguirai correttamente le operazioni di base).


Ho votato perché in realtà ho creato qualcosa del genere. Mi permette di impostare parentesi personalizzate dire, <e> , e afferrerà ogni istanza di quella stringa in cui posso facilmente rimuovere le istanze che non voglio e manipolarla in modo pulito come voglio. Questo è positivo perché le espressioni regolari da sole non gestiscono sottostringhe come questa: <boat <programming>>bene dove ci sono più strati di parentesi.
Akiva,

1

Il formato descritto è molto simile ai file INI:

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

In tal caso la sezione è racchiusa tra parentesi quadre [], quindi ciò che descrivi ha senso contrassegnando la sezione in qualche modo per aggiungere ulteriore significato a quel testo.


0

Ad esempio, potrei generare una stringa come questa:

Domanda: Da cosa "generi" questa stringa?

Sarebbe che essere più facile da manipolare?


La stringa viene generata da Datascraping contenuto utente da un sito Web.
Akiva,

1
Questo non è un modo affidabile per recuperare i dati da un sito Web, semplicemente perché cambiano e le cose vengono spostate o scompaiono del tutto. Sarebbe molto meglio recuperare i dati da una sorta di API pubblicata (e quindi affidabile). Inoltre, l'uso di molti siti Web commerciali vieta specificamente questo genere di cose.
Phill W.

A volte non riesco a scegliere quali dati sono preziosi per me, quindi c'è sempre la necessità di fare controlli di integrità per quello che stai guardando, o semplicemente un compromesso e sperare per il meglio. Per esempio: ho scritto una LaTeXper SSMLinterprete, e uno dei problemi è che è possibile generare immagini identiche con il codice di molto diverso, e così è quasi impossibile essere coerenti se l'utente sceglie modi poveri o esoteriche di generare le sue formule. Tutto ciò che significa alla fine della giornata è che le persone che non usano le buone pratiche non avranno interpretazioni decenti dei loro script.
Akiva,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.