Eu trabalho com cordas maciças que precisam de muita manipulação.
Por exemplo, eu posso gerar uma string como esta:
Parte 1
BarcoSeção A
ProgramaçãoParte 2
Particionando barcos para programação.Seção AA
Seção SQL Entradas.
A cadeia seria muito grande para verificar manualmente cada parte dela. Agora eu preciso split
disso string
em stringlist
seções e partes. Eu posso pensar em duas opções:
Uma expressão regular:
QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)"));
Parece que deve funcionar, mas às vezes as exceções passam despercebidas (IE: Section SQL Entries
erroneamente se dividem)
Caso contrário, o que eu poderia fazer é colocar um marcador quando eu gerar a string inicial:
🚤💻Parte 1
BarcoSeção A
ProgramaçãoParte 2
Particionando barcos para programação.
Seção SQL Entradas da Seção AA .
O que significa que dividir a string se tornaria fácil:
QStringList sl = s.split("🚤💻"));
Algo me diz que nenhum desses é um bom estilo ou prática de programação, mas até agora não discuti nem encontrei uma alternativa.
- Se você fosse meu gerente de projeto, aceitaria um desses métodos?
- Caso contrário, o que você sugere que eu faça como uma prática recomendada?
Respostas:
Não é uma prática ruim ter a codificação de documento incorporada como texto em uma string. Pense em descontos, HTML, XML, JSON, YAML, LaTeX, etc.
O que é má prática é reinventar a roda. Em vez de escrever seu próprio processador de texto, pense em usar um padrão existente. Há muitos softwares gratuitos que fazem a maior parte da análise para você, e muitos têm uma licença não restritiva que permite usar o software em seu próprio software proprietário.
fonte
O uso de um separador comum deve funcionar bem ao dividir cadeias arbitrárias maiores, mas eu recomendaria não usar um símbolo arbitrário. Alguém que lê essa string como texto simples pode ficar confuso, sem mencionar problemas com a UTF e se o símbolo aparece ou não nas seções ou não.
A parte mais importante disso é que cada seção permanece intacta, enquanto cada "cabeçalho da seção" precisa ser identificado adequadamente.
Por que não usar um separador comum, mas mantê-lo legível? Algo como:
O problema é decidir qual deve ser o separador , pois precisa ser algo que garante a não exibição de nenhuma seção. Você pode identificá-lo ainda mais como um separador , solicitando que ele esteja no início de uma linha e o único texto nessa linha .
Sem um conhecimento adicional do texto esperado em cada seção, é difícil fazer uma recomendação sobre qual separador comum seria melhor nesse caso.
fonte
A resposta aceita parece ter perdido o que você escreveu em um comentário:
e deu isso como um exemplo:
Se é isso que você deseja, é uma péssima idéia usar um "markdown" ou separador de texto para toda a sua string, isso sempre tem um certo risco de interferir na manipulação e não leva a um código robusto. Especialmente quando você tenta começar a usar expressões regulares em uma sequência combinada, provavelmente encontrará os mesmos problemas observados pelas pessoas ao tentar analisar HTLM ou XML com expressões regulares .
Especialmente porque você escreveu que pode haver "milhares de funções [dessa manipulação]", esse risco pode se tornar um problema real. Mesmo se você usar alguma remarcação como XML para armazenar a lista de cadeias internamente, precisará garantir que a manipulação processe apenas o conteúdo, não a remarcação, de modo que isso significaria dividir a cadeia em partes antes de qualquer processamento e ingressar depois novamente - para que haja um alto risco de apresentar um desempenho ruim.
A melhor alternativa de design aqui é fornecer um tipo de dados abstrato (use uma classe, se quiser), vamos chamá-lo
MyStringList
e fornecer um pequeno conjunto de operações básicas que permitem implementar "milhares de funções" em termos dessas operações. Por exemplo, pode haver operaçõesfind
e genéricosreplace
ou umamap
operação funcional genérica . Você também pode adicionar algo como umaJoinToString
operação, se realmente precisar da lista inteira em uma sequência para determinadas finalidades.Usando essas operações, seu medo de que o código se torne mais complicado porque "tudo teria que ser feito em um loop for" se torna inútil, porque os únicos
for
loops obtidos são encapsulados nas operações do tipo de dados. E eu não ficaria preocupado com o desempenho até que você tenha um impacto real e mensurável no desempenho (o qual duvido que você obtenha se implementar corretamente as operações básicas).fonte
<
e>
, e ele captura todas as instâncias dessa cadeia de caracteres em que eu posso remover facilmente as instâncias que não desejo e manipulá-las da maneira que desejar. Isso é bom porque expressões regulares por si só não lidam com substrings como este:<boat <programming>>
bem, onde existem várias camadas de colchetes.O formato descrito é muito semelhante aos arquivos INI:
https://en.wikipedia.org/wiki/INI_file
Nesse caso, a seção é delimitada por colchetes [], de modo que o que você descreve faz sentido marcando a seção de alguma maneira para adicionar significado adicional ao texto.
fonte
Pergunta: Do que você "gera" essa string?
Teria que ser mais fácil de manipular?
fonte
LaTeX
paraSSML
intérprete, e um dos problemas é que você pode gerar imagens idênticas com código muito diferente e, portanto, é quase impossível ser consistente se o usuário escolher formas pobres ou esotéricas de gerar suas fórmulas. Tudo o que significa no final do dia é que as pessoas que não usam boas práticas não terão uma interpretação decente de seus scripts.