Помещает ли текстовые маркеры внутри строк плохой стиль? Есть ли альтернатива?

10

Я работаю с массивными струнами, которые требуют много манипуляций.

Например, я мог бы сгенерировать такую ​​строку:

Часть 1
Лодка

Раздел А
Программирование

Часть 2
Разбиение лодок для программирования.

Раздел AA
Раздел SQL Записи.

Строка будет слишком большой, чтобы вручную проверять каждую ее часть. Теперь мне нужно splitэто stringразделить stringlistна части и части. Я могу придумать два варианта:

Регулярное выражение:

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

Похоже, что это должно работать, но иногда исключения проскальзывают (IE: Section SQL Entriesошибочно разделится)

В противном случае, я мог бы поместить маркер, когда я генерирую исходную строку:

BoatЧасть 1
Лодка

Раздел A
Программирование

2Часть 2 Разделительная
лодка для программирования.

AAСекция AA
Раздел SQL Записи.

Что означает, что разделение строки станет простым:

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

Что-то подсказывает мне, что ни один из них не является хорошим стилем или практикой программирования, но я до этого момента не обсуждал это и не нашел альтернативы.

  • Если бы вы были моим руководителем проекта, вы бы приняли любой из этих методов?
  • Если нет, что бы вы посоветовали мне сделать в качестве лучшей практики?
Акива
источник
6
Если ваша программа знает, где разместить эти маркеры, почему бы не сгенерировать разделы как отдельные строки для начала?
Джейкоб Райле
Я не думаю, что пользовательский маркер, который плохо переводит вашу текущую кодировку, - это хорошая идея.
Тулаинс Кордова
2
фактические используемые символы в значительной степени не имеют значения, и что будет иметь значение, так это грамматика того, что вы пытаетесь проанализировать
jk.
4
@ Акива, ты уверен в успехе? В любом случае вы работаете с одним и тем же количеством данных, я сомневаюсь, что будет существенная разница. Сложите тысячи функций в одну функцию, вызовите ее в цикле и проведите несколько измерений.
Джейкоб Райле
2
@Akiva Извлечение и замена элементов в списке в худшем случае должны быть сопоставимы с разбиением большой строки.
Джейкоб Райле

Ответы:

17

Неплохая практика - вставлять кодировку документа в виде текста в строку. Подумайте об уценке, HTML, XML, JSON, YAML, LaTeX и т. Д.

Плохая практика - это изобретать велосипед. Вместо того, чтобы писать собственный текстовый процессор, подумайте об использовании существующего стандарта. Существует множество бесплатных программ, которые выполняют большую часть анализа за вас, и многие из них имеют неограничительную лицензию, которая позволяет использовать указанное программное обеспечение в ваших собственных проприетарных программах.

Дэвид Хаммен
источник
В моем случае я изобретаю колесо, если я пытаюсь создать уникальный интерпретатор для языка уценки. Например, один из моих проектов интерпретировал Latex как SSML, который читается человеческим ухом: meta.wikimedia.org/wiki/Grants:IdeaLab/… . << В конце этого URL есть точка, иначе это не сработает
Акива
2
@Akiva Мне нужно работать с пользовательским текстовым форматом, разработанным моим рабочим местом, который буквально заново изобретает колесо. Я должен поддерживать 4 парсера на 3 языках (Javascript, Java и Objective-C), и это ужасный кошмар . Делайте правильные вещи сейчас и отмените эту чепуху в пользовательском текстовом формате . Я не могу не подчеркнуть, насколько ужасным из этого станет кошмар обслуживания через несколько лет. Используйте существующие структурированные форматы, XML, JSON и т. Д.
Chris Cirefice
@ChrisCirefice Можете ли вы дать мне пример того, как это кошмар?
Акива
1
@ Akiva Я думаю, что тот факт, что вам нужно поддерживать даже один парсер (в моем случае несколько и на разных языках), ужасен. Стандартные форматы существуют по определенной причине - они могут представлять данные, в которых вы нуждаетесь, - и с минимальными усилиями с вашей стороны, потому что эти анализаторы были созданы, усовершенствованы и поддерживаются. Пользовательский текстовый формат также является чрезвычайно специализированным знанием, означающим, что обычно только один или два разработчика будут достаточно знакомы с форматом, чтобы успешно поддерживать его. Это должно говорить о многом. Большинство людей знакомы с CML, JSON - мало кто знает пользовательские форматы.
Крис Cirefice
1
@Akiva Действительно! Формат разметки (который SE и многие другие сайты используют для форматирования текста) несколько стандартный , как SQL. Но есть много разных «разновидностей» с пользовательскими расширениями (например, как SE). Существует стандартная библиотека, которая анализирует «ядро», затем вы расширяете библиотеку, если вам нужны дополнительные функции. Но создание и поддержка вашего собственного форматера было бы смешно - некоторые уже существуют (уценка, BB-код и т. Д.), Так зачем же изобретать велосипед и поддерживать весь этот код?
Можно
8

Используя некоторые общего разделителя должно работать нормально при разбиении произвольных строк большего размера, но я бы рекомендовал не использовать произвольный символ. Кто-то, читающий эту строку как открытый текст, может быть сбит с толку, не говоря уже о проблемах с UTF и о том, появляется ли символ внутри разделов или нет.

Наиболее важной частью этого является то, что каждый раздел остается неизменным, в то время как каждый «заголовок раздела» должен быть соответствующим образом идентифицирован.

Почему бы не использовать общий разделитель, но оставить его читаемым? Что-то вроде:

[SECTION]
Part 1
Boat

[SECTION]
Section A
Programming

[SECTION]
Part 2
Partitioning boats for programming.

[SECTION]
Section AA
Section SQL Entries.

Проблема состоит в том, чтобы решить, каким должен быть разделитель , поскольку он должен быть чем-то, что гарантированно не будет отображаться ни в одном разделе. Вы могли бы далее идентифицировать это как разделитель , требуя, чтобы это было в начале строки и единственного текста в этой строке .

Без дальнейшего знания того, какой текст ожидается в каждом разделе, трудно дать рекомендацию о том, какой общий разделитель будет лучшим в этом случае.

Эрдрик Айронроуз
источник
Мне нравится акцент вашего ответа на удобочитаемости. Строки генерируются посредством извлечения данных, сгенерированных пользователем, например, на языке разметки, используемом в SE для написания вопросов и ответов. Таким образом, вы можете легко представить, какие проблемы со строками могут возникнуть.
Акива
5

Принятый ответ, кажется, пропустил то, что вы написали в комментарии:

Причина в том, что многие манипуляции, которые я выполняю, требуют полной строки

и привел это в качестве примера:

s.replace («лодка», «программирование»);

Если это именно то, что вам нужно, имхо очень плохая идея использовать некоторую «разметку» или текстовый разделитель для всей вашей строки, это всегда имеет определенный риск помешать манипуляциям и не приведет к надежному коду. Особенно, когда вы пытаетесь начать использовать регулярные выражения для такой объединенной строки, вы, вероятно, столкнетесь с теми же проблемами, с которыми люди сталкивались при попытке проанализировать HTLM или XML с регулярными выражениями. .

Тем более, что вы написали, что могут быть «тысячи [таких манипуляций] функций», этот риск может стать реальной проблемой. Даже если вы используете некоторую разметку, такую ​​как XML, для внутреннего хранения списка строк, вам необходимо убедиться, что манипуляции будут обрабатывать только содержимое, а не разметку, так что это будет означать разделение строки на части перед выполнением какой-либо обработки и присоединение. это потом снова - так что это будет иметь высокий риск плохой работы.

Лучшей альтернативой дизайна здесь является предоставление абстрактного типа данных (если хотите, используйте класс), давайте вызовем его MyStringListи предоставим небольшой набор базовых операций, которые позволят вам реализовать «тысячи функций» в терминах этих операций. Например, это могут быть общие операции findи replaceоперации или общая функциональная mapоперация . Вы также можете добавить что-то вродеJoinToString операции, если вам действительно нужен весь список в одной строке для определенных целей.

Используя эти операции, ваш страх, что код становится более сложным, потому что «все должно быть сделано в цикле for», становится бессмысленным, потому что единственные forциклы, которые вы получаете, инкапсулированы внутри операций типа данных. И я не буду беспокоиться о производительности до тех пор, пока вы не окажете реальное, измеримое влияние на производительность (что, я сомневаюсь, вы получите, если будете правильно выполнять основные операции).

Док Браун
источник
Upvote, потому что я действительно создал что-то подобное. Это позволяет мне устанавливать пользовательские скобки, скажем, <и >, и он будет захватывать каждый экземпляр этой строки, где я могу легко удалить ненужные экземпляры, и чисто манипулировать им так, как я хочу. Это хорошо, потому что регулярные выражения сами по себе не обрабатывают подстроки, как это: <boat <programming>>хорошо, когда есть несколько слоев скобок.
Акива
1

Описанный формат очень похож на INI-файлы:

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

В этом случае раздел заключен в квадратные скобки [], поэтому то, что вы описываете, имеет смысл, пометив раздел таким образом, чтобы добавить дополнительный смысл этому тексту.

Джон Рейнор
источник
0

Например, я мог бы сгенерировать такую ​​строку:

Вопрос: Из чего вы «генерируете» эту строку?

Будет , что будет легче манипулировать?

Фил В.
источник
Строка генерируется из Datascraping пользовательского контента с веб-сайта.
Акива
1
Это не надежный способ извлечения данных с веб-сайта, просто потому, что они меняются и все перемещается или полностью исчезает. Вам было бы гораздо лучше получить данные из какого-то опубликованного (и, следовательно, надежного) API. Кроме того, использование многих коммерческих веб-сайтов специально запрещает подобные вещи.
Фил В.
Иногда я не могу выбрать, какие данные являются ценными для меня, и поэтому всегда нужно проверять целостность того, на что ты смотришь, или просто идти на компромисс и надеяться на лучшее. Например: я написал LaTeXдля SSMLпереводчика, и один из вопросов является то , что вы можете создать идентичные изображения с абсолютно другим кодом, и поэтому почти невозможно быть последовательным , если пользователь выбирает бедный или эзотерические способы получения его формулы. В конце концов, все это означает, что люди, не пользующиеся хорошей практикой, не получат достойной интерпретации своих сценариев.
Акива