문자열 안에 텍스트 마커를 배치하는 것이 나쁜 스타일입니까? 대안이 있습니까?


10

나는 많은 조작이 필요한 거대한 문자열로 작업합니다.

예를 들어 다음과 같은 문자열을 생성 할 수 있습니다.

1 부
보트

섹션 A
프로그래밍

Part 2
프로그래밍을위한 파티션 보트.

AA
섹션 SQL 항목.

문자열이 너무 커서 모든 부분을 수동으로 확인할 수 없습니다. 지금은 필요 splitstringstringlist섹션 및 부품에 의해. 두 가지 옵션을 생각할 수 있습니다.

정규식 :

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

그것은 효과가있는 것처럼 보이지만 때로는 예외가 사라집니다 (IE : Section SQL Entries잘못 스플릿 될 것입니다)

그렇지 않으면 내가 할 수있는 것은 초기 문자열을 생성 할 때 마커를 배치하는 것입니다.

🚤💻1 부
보트

A💻 섹션 A
프로그래밍

2💻Part 2
프로그래밍을위한 파티션 보트.

AA💻
섹션 AA 섹션 SQL 항목.

이는 문자열을 쉽게 분리 할 수 ​​있음을 의미합니다.

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

이것들 중 어느 것도 좋은 스타일이나 프로그래밍 연습이 아니라고 말하지만, 지금까지 논의하지 않았거나 대안을 찾지 못했습니다.

  • 내 프로젝트 관리자 인 경우 다음 방법 중 하나를 수락 하시겠습니까?
  • 그렇지 않은 경우 모범 사례로 무엇을 제안 하시겠습니까?

6
프로그램에서 이러한 마커를 배치 할 위치를 알고 있다면 섹션을 별도의 문자열로 생성하여 시작하지 않겠습니까?
Jacob Raihle

사용자에게 현재 인코딩으로 잘 번역되지 않는 마커가 좋은 생각이라고 생각하지 않습니다.
Tulains Córdova

2
실제로 사용되는 기호는 크게 관련이 없으며, 차이를 만들려는 것은 구문 분석하려는 문법
jk입니다.

4
@Akiva 성능에 대한 확신이 있습니까? 어쨌든 같은 양의 데이터로 작업하고 있지만 큰 차이가 있을지 의심됩니다. 수천 개의 함수를 하나의 함수로 구성하고 루프에서 호출 한 후 측정을 수행하십시오.
Jacob Raihle

2
@Akiva 검색하고 목록에서 대체 요소는해야 최악의 큰 문자열 분할 비교합니다.
Jacob Raihle

답변:


17

문서 인코딩을 문자열에 텍스트로 포함시키는 것은 좋지 않습니다. 마크 다운, HTML, XML, JSON, YAML, LaTeX 등을 생각하십시오.

나쁜 습관은 바퀴를 재창조하는 것입니다. 자체 텍스트 프로세서를 작성하는 대신 기존 표준을 사용하는 것을 고려하십시오. 많은 구문 분석 작업을 수행하는 무료 소프트웨어가 많이 있으며, 대부분의 독점 소프트웨어에서 해당 소프트웨어를 사용할 수있는 비 제한적 라이센스가 있습니다.


필자의 경우, 마크 다운 언어에 대한 고유 한 통역사를 구축하려는 경우 바퀴를 발명하고 있습니다. 예를 들어, 내 프로젝트 중 하나는 인간의 귀에서 읽을 수 SSML로 라텍스를 해석했다 meta.wikimedia.org/wiki/Grants:IdeaLab/... . << 해당 URL의 끝에 마침표가 있습니다. 그렇지 않으면 작동하지 않습니다.
Akiva

2
@ Akiva 문자 그대로 바퀴를 재창조하는 직장에서 개발 한 사용자 정의 텍스트 형식으로 작업해야합니다. 나는 그것을 위해 3 개의 언어 (Javascript, Java 및 Objective-C)로 4 개의 파서를 유지해야하며 그것은 악몽 입니다. 옳은 일을 할 지금 하고 이 사용자 정의 텍스트 형식의 넌센스를 폐지 . 나는 어떻게 충분히 강조 할 수없는 거대한 유지 보수 악몽의이 도로 아래로 몇 년이 될 것입니다. 기존의 구조화 된 형식, XML, JSON 등을 사용하십시오.
Chris Cirefice

@ChrisCirefice 어떻게 악몽인지 예를 들어 주시겠습니까?
Akiva

1
@ Akiva 나는 하나의 파서 (내 경우에는 여러 언어로)를 유지해야한다는 사실이 끔찍하다고 생각합니다. 표준 형식은 이유에 따라 존재하며 필요한 데이터를 나타낼 수 있으며 파서가 작성, 수정 및 유지 관리되기 때문에 사용자가 거의 노력하지 않아도됩니다. 사용자 정의 텍스트 형식은 매우 전문적인 지식이므로 일반적으로 한두 명의 개발자 만 해당 형식을 잘 유지 관리 할 수있을 것입니다. 그것은 볼륨을 말해야합니다. 대부분의 사람들은 CML, JSON에 익숙합니다. 사용자 정의 형식을 아는 사람은 거의 없습니다.
크리스 Cirefice

1
@Akiva 참으로! 마크 다운 형식 (SE 및 기타 여러 사이트에서 텍스트 형식에 사용하는 형식)은 SQL과 같이 다소 표준 입니다. 그러나 사용자 정의 확장명 (예 : SE)을 가진 여러 가지 '맛'이 있습니다. '코어'를 구문 분석하는 표준 라이브러리가 있으며 추가 기능을 원할 경우 라이브러리를 확장합니다. 그러나 자체 포맷터를 작성하고 유지 관리하는 것은 어리석은 일입니다. 이미 존재하는 마크 다운, BB 코드 등이 있습니다. 왜 바퀴를 재발 명하고 모든 코드를 유지합니까? 기존 라이브러리를 사용할 수도 있습니다 :)
Chris Cirefice

8

더 큰 임의의 문자열을 분할 할 때 일반적인 구분 기호를 사용하면 잘 작동하지만 임의의 기호를 사용하지 않는 것이 좋습니다. UTF에서 문제가 있거나 기호가 섹션 내부에 나타나는지 여부를 언급하지 않고 해당 문자열을 일반 텍스트로 읽는 사람은 혼란 스러울 수 있습니다.

이것의 가장 중요한 부분은 각 섹션이 손상되지 않고 각 "섹션 헤더"가 적절하게 식별되어야한다는 것입니다.

공통 구분 기호를 사용하지 말고 읽을 수있는 상태로 유지 하는 이유는 무엇 입니까? 다음과 같은 것 :

[SECTION]
Part 1
Boat

[SECTION]
Section A
Programming

[SECTION]
Part 2
Partitioning boats for programming.

[SECTION]
Section AA
Section SQL Entries.

문제는 구분 기호 가 무엇인지를 결정하는 것인데, 구분 기호 가 표시되지 않아야 할 것이기 때문입니다. 줄의 시작 부분 과 해당 유일한 텍스트를 요구 하여 구분 기호 로 구분할 수 있습니다 .

각 섹션에서 어떤 텍스트가 예상되는지에 대한 추가 지식이 없으면 이 경우 어떤 일반적인 구분 기호 가 가장 적합한 지 권장하기가 어렵습니다 .


나는 당신의 대답이 가독성에 중점을 두는 것을 좋아합니다. 문자열은 사용자가 생성 한 텍스트를 스크래핑하는 데이터 (예 : 질문 및 답변 작성에 SE에서 사용되는 마크 업 언어)를 통해 생성됩니다. 따라서 어떤 유형의 문자열 조작 문제가 발생할 수 있는지 쉽게 상상할 수 있습니다.
Akiva

5

수락 된 답변은 귀하가 의견에 쓴 것을 놓친 것 같습니다.

그 이유는 내가하는 많은 조작에 전체 문자열이 필요하기 때문입니다.

이것을 예로 들어 봤습니다.

s.replace ( "boat", "programming");

그것이 당신이 원하는 것이라면, IMHO는 전체 문자열에 대해 "마크 다운"또는 텍스트 구분 기호를 사용하는 것이 정말로 나쁜 생각입니다. 특히 이러한 결합 된 문자열에서 정규식 사용을 시작 하려고하면 HTLM 또는 XML을 정규식으로 구문 분석 할 때 사람들이 발견 한 것과 동일한 문제가 발생할 수 있습니다.

특히 "수천 개의 [그런 조작] 기능"이있을 수 있기 때문에 이러한 위험은 실제 문제가 될 수 있습니다. XML과 같은 일부 마크 다운을 사용하여 문자열 목록을 내부적으로 저장하더라도 마크 다운이 아닌 내용 만 조작하여 처리하도록해야합니다. 그것은 나중에 다시 - 그래서 그것은 당신에게 나쁜 성능을 제공하는 높은 위험이 있습니다.

여기서 더 나은 디자인 대안은 추상 데이터 유형 (원하는 경우 클래스 사용)을 MyStringList제공하고 이를 호출 할 수 있으며 해당 작업 측면에서 "수천 개의 함수"를 구현할 수있는 작은 기본 작업 세트를 제공하는 것입니다. 예를 들어, 일반 findreplace오퍼레이션 또는 일반 기능 map오퍼레이션 이있을 수 있습니다 . JoinToString특정 purporses에 대해 하나의 문자열로 전체 목록이 실제로 필요한 경우 작업 과 같은 것을 추가 할 수도 있습니다 .

이러한 연산을 사용하면 "for 루프에서 모든 작업을 수행해야하기 때문에 " 코드가 더 복잡해질 것이라는 두려움 이 무의미 해집니다. 왜냐하면 유일한 for루프는 데이터 유형의 연산 내에 캡슐화 되기 때문 입니다. 그리고 실제로 측정 가능한 성능에 영향을 줄 때까지 성능에 대해 걱정하지 않습니다 (기본 작업을 올바르게 구현하면 의심 스럽습니다).


실제로 그런 것을 만들었 기 때문에 공감합니다. 커스텀 괄호를 말하고, <그리고 >원하지 않는 인스턴스를 쉽게 제거하고 원하는 방식으로 깨끗하게 조작 할 수있는 해당 문자열의 모든 인스턴스를 가져옵니다. 이것은 정규 표현식 자체가 다음과 같은 하위 문자열을 처리하지 않기 때문에 좋습니다 <boat <programming>>.
Akiva


0

예를 들어 다음과 같은 문자열을 생성 할 수 있습니다.

질문 :이 문자열을 무엇으로부터 "생성"합니까?

조작하기 쉬워 수?


문자열은 웹 사이트의 Datascraping 사용자 콘텐츠에서 생성됩니다.
Akiva

1
웹 사이트에서 데이터를 검색하는 신뢰할 수있는 방법은 아닙니다. 단순히 데이터가 변경되고 사물이 이동하거나 완전히 사라지기 때문입니다. 어떤 종류의 게시 된 (따라서 신뢰할 수있는) API에서 데이터를 검색하는 것이 훨씬 좋습니다. 또한 많은 상용 웹 사이트를 사용하면 이러한 종류의 행위가 금지됩니다.
Phill W.

때로는 나에게 중요한 데이터를 선택하지 못하기 때문에 항상보고있는 내용에 대해 무결성 검사를 수행해야하거나 최선을 다해 명백한 타협과 희망을 가져야합니다. 예를 들어 내가 쓴 LaTeXSSML통역하고 문제 중 하나는 매우 다른 코드와 동일한 이미지를 생성 할 수 있다는 것입니다, 그리고 사용자가 자신의 공식을 생성 가난한 또는 비의 방법을 선택하는 경우 일치하는 것은 불가능 가까이 그래서. 하루가 끝났다는 것은 좋은 습관을 사용하지 않는 사람들은 자신의 대본을 제대로 해석하지 못한다는 것입니다.
Akiva
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.