Colocar marcadores de texto dentro de seqüências de caracteres é um estilo ruim? Existe uma alternativa?

10

Eu trabalho com cordas maciças que precisam de muita manipulação.

Por exemplo, eu posso gerar uma string como esta:

Parte 1
Barco

Seção A
Programação

Parte 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 splitdisso stringem stringlistseçõ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 Entrieserroneamente se dividem)

Caso contrário, o que eu poderia fazer é colocar um marcador quando eu gerar a string inicial:

🚤💻Parte 1
Barco

Seção A
Programação

Parte 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?
Akiva
fonte
6
Se o seu programa sabe onde colocar esses marcadores, por que não gerar as seções como sequências separadas para começar?
Jacob Raihle
Não acho que o usuário um marcador que não se traduza bem na sua codificação atual seja uma boa ideia.
Tulains Córdova
2
os símbolos atuais usados ​​são em grande parte irrelevantes, o que fará diferença é a gramática daquilo que você está tentando analisar
jk.
4
@ Akiva, você tem certeza sobre o desempenho atingido? Você está trabalhando com a mesma quantidade de dados em qualquer caso, duvido que haja uma diferença significativa. Componha as milhares de funções em uma função, invoque isso em um loop e faça algumas medições.
Jacob Raihle
2
@Akiva A recuperação e a substituição de elementos em uma lista devem, na pior das hipóteses, ser comparáveis ​​à divisão de uma string grande.
Jacob Raihle

Respostas:

17

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.

David Hammen
fonte
No meu caso, estou inventando uma roda, se o que estou tentando fazer é criar um intérprete exclusivo para uma linguagem de remarcação. Por exemplo, um dos meus projetos foi interpretar o Latex como SSML, legível pelo ouvido humano: meta.wikimedia.org/wiki/Grants:IdeaLab/… . << Existe um período no final desse URL, caso contrário ele não funcionará #
217 Akiva
2
@Akiva Eu tenho que trabalhar com um formato de texto personalizado desenvolvido pelo meu local de trabalho que literalmente reinventa a roda. Eu tenho que manter 4 analisadores em 3 idiomas (Javascript, Java e Objective-C) para isso, e é um pesadelo . Faça a coisa certa agora e abula esse absurdo de formato de texto personalizado . Eu não posso enfatizar o suficiente quão grande de um pesadelo de manutenção isso vai se tornar alguns anos abaixo da estrada. Use formatos estruturados existentes, XML, JSON etc.
Chris Cirefice
@ ChrisCirefice Você pode me dar um exemplo de como é um pesadelo?
Akiva
1
@ Akiva Eu acho que o fato de que você precisa manter um analisador (no meu caso, vários e em diferentes idiomas) é horrível. Formatos padrão existem por uma razão - eles podem representar os dados que você precisa - e com muito pouco esforço de sua parte, porque esses analisadores foram criados, refinados e mantidos. O formato de texto personalizado também é um conhecimento extremamente especializado, o que significa que geralmente apenas um ou dois desenvolvedores estão familiarizados o suficiente com o formato para mantê-lo com êxito. Isso deve falar muito. A maioria das pessoas está familiarizada com CML, JSON - poucas conhecem formatos personalizados.
Chris Cirefice
1
@Akiva Indeed! O formato Markdown (que o SE e muitos outros sites usam para formatação de texto) é um pouco padrão , como o SQL. Mas existem muitos "sabores" diferentes com extensões personalizadas (por exemplo, SE). Existe uma biblioteca padrão que analisa o 'núcleo' e, em seguida, você amplia a biblioteca se desejar recursos adicionais. Mas, criar e manter seu próprio formatador seria ridículo - já existem vários (remarcação, código BB, etc.), então por que reinventar a roda e manter todo esse código? Pode também apenas usar um :) biblioteca existente
Chris Cirefice
8

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:

[SECTION]
Part 1
Boat

[SECTION]
Section A
Programming

[SECTION]
Part 2
Partitioning boats for programming.

[SECTION]
Section AA
Section SQL Entries.

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.

Erdrik Ironrose
fonte
Gosto da ênfase da sua resposta na legibilidade. As strings são geradas por meio de texto gerado pelo usuário com raspagem de dados, por exemplo, a linguagem de marcação usada no SE para escrever perguntas e respostas. Assim, você pode facilmente imaginar que tipo de problemas de manipulação de cordas podem entrar em jogo.
Akiva
5

A resposta aceita parece ter perdido o que você escreveu em um comentário:

A razão é que muitas das manipulações que faço exigem a sequência completa

e deu isso como um exemplo:

s.replace ("barco", "programação");

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 MyStringListe 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ções finde genéricos replaceou uma mapoperação funcional genérica . Você também pode adicionar algo como uma JoinToStringoperaçã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 forloops 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).

Doc Brown
fonte
Voto positivo, porque eu realmente criei algo assim. Ele permite que eu defina colchetes personalizados, digamos, <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.
Akiva
1

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.

Jon Raynor
fonte
0

Por exemplo, eu posso gerar uma string como esta:

Pergunta: Do que você "gera" essa string?

Teria que ser mais fácil de manipular?

Phill W.
fonte
String é gerada a partir do conteúdo do usuário Datascraping de um site.
Akiva
1
Esta não é uma maneira confiável de recuperar dados de um site, simplesmente porque eles mudam e as coisas são movidas ou desaparecem completamente. Seria muito melhor recuperar os dados de algum tipo de API publicada (e, portanto, confiável). Além disso, o uso de muitos sites comerciais proíbe especificamente esse tipo de coisa.
precisa
Às vezes, não consigo escolher quais dados são valiosos para mim e, portanto, sempre há a necessidade de fazer verificações de integridade para o que você está vendo, ou simplesmente comprometer e esperar o melhor. Por exemplo: eu escrevi um LaTeXpara SSMLinté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.
Akiva