코드 폴딩

Code folding
Vim을 사용한 PHP 코드의 코드 폴딩 예

코드텍스트 폴딩,[1] 또는 드물게 홀로프라스트링은 사용자가 문서의 일부를 선택적으로 숨기거나 표시할 수 있는 그래픽 사용자 인터페이스의 기능입니다.이를 통해 사용자는 현재 관심 있는 하위 섹션만 표시하면서 대량의 텍스트를 관리할 수 있습니다.일반적으로 중첩된 요소로 구성된 자연스러운 트리 구조를 가진 문서에 사용됩니다.이러한 기능의 다른 이름으로는 확장 및 축소, 코드 숨기기, 아웃라인 등이 있습니다.Microsoft Word에서는 이 기능을 "collapsible outlining"이라고 합니다.

많은 사용자 인터페이스는 사이드바에서 코드 폴딩을 위한 공개 위젯을 제공합니다. 예를 들어 옆으로(접힌 경우) 또는 아래로(확장된 경우)를 가리키는 삼각형 또는[-]접을 수 있는(수직) 텍스트 상자 및[+]확장 가능(확장 가능) 텍스트 상자입니다.

코드 폴딩은 텍스트 편집기, 소스 코드 편집기 및 IDE에 있습니다.접이식 구조는 일반적으로 컴퓨터 언어로 정의된 프로그램의 구문 트리를 따릅니다.또한 들여쓰기 수준으로 정의하거나 인밴드 마커(소스 코드의 일부로 저장됨) 또는 아웃오브밴드를 사용하여 명시적으로 지정할 수도 있습니다.

텍스트 폴딩은 일반 텍스트에서 사용되는 유사한 기능으로 내포된 요소가 단락, 섹션 또는 아웃라인 수준으로 구성됩니다.이를 제공하는 프로그램에는 폴딩 에디터, 아웃라이너, 워드프로세서 등있습니다.

데이터 폴딩은 일부 16진수 편집기에서 볼 수 있으며 이진 파일을 구성하거나 액세스할 수 없는 데이터 [2]섹션을 숨기는 데 사용됩니다.

또한 접기는 데이터 비교, 버전 선택 또는 차이점만 위해 자주 사용됩니다.

역사

에디터에서 코드 폴딩의 가장 오래된 예는 NLS(컴퓨터 시스템)[3]입니다.IBM 370 메인프레임용 1974년식 SPF(Structured Programming Facility) 편집기로, 들여쓰기를 기반으로 선을 숨길 수 있었습니다.문자맵 3270 [4]단말기에 표시된다.그것은 COBOL과 같은 프롤릭스 언어에 매우 유용했다.Interactive System Productivity Facility(ISPF)로 진화했습니다.

사용하다

코드 폴딩은 다양한 사용 패턴을 가지고 있는데, 주로 코드를 정리하거나 덜 유용한 정보를 숨겨서 더 중요한 정보에 집중할 수 있습니다.일반적인 패턴은 [5]다음과 같습니다.

개요

기본적으로 응용 프로그램은 코드 폴딩을 사용하여 소스 코드를 개략적으로 설명하고 각 블록을 한 줄로 축소합니다.함수 및 클래스와 같은 최상위 블록, 중첩된 함수 및 메서드와 같은 중첩된 블록 또는 모든 블록(특히 제어 흐름 블록)일 수 있습니다.이를 통해 코드의 개요를 파악하여 쉽게 탐색하고 재배치할 수 있으며 필요에 따라 다른 코드로 인해 주의가 산만해지지 않고 상세하게 드릴다운할 수 있습니다.이를 통해 모든 기능의 목록을 (본문 없이) 빠르게 볼 수 있는 반면, 내비게이션의 경우 과거 긴 기능의 광범위한 페이징 또는 타깃 검색을 다음 기능으로 직접 이동하는 것으로 대체한다.

보일러 플레이트 코드 숨기기

일부 언어 또는 라이브러리는 광범위한 상용 코드를 필요로 합니다.따라서 코드가 매우 길어지고 요점이 불분명해질 수 있습니다.또, 보일러 플레이트내에서 실체 코드를 소실할 수 있다.

예를 들어 Java에서는 getter와 setter가 있는 단일 개인 필드에 각각 다른 행에 있는 경우 최소 3개의 행이 필요합니다.

사적인 스트링 이름. = 무효; 일반의 스트링 getName() { 돌아가다 이름.; } 일반의 무효 setName(스트링 이름.) { 이것..이름. = 이름.; } 

이는 기존 기능 라인 중단 및 기능 간 간격(후행 줄바꿈 포함)을 사용하여 10개 라인으로 확장됩니다.

사적인 스트링 이름. = 무효;  일반의 스트링 getName() {     돌아가다 이름.; }  일반의 무효 setName(스트링 이름.) {     이것..이름. = 이름.; } 

Javadoc을 사용한 문서에서는 이를 20줄로 확장합니다.

/** * 속성 <코드> 이름 </code> 읽기/쓰기 가능. */ 사적인 스트링 이름. = 무효;  /** * 속성 <code> 이름 </code>의 Getter */ 일반의 스트링 getName() {     돌아가다 이름.; }  /** * 속성 <code> 이름 </code> 설정기. * @param name */ 일반의 무효 setName(스트링 이름.) {     이것..이름. = 이름.; } 

이러한 필드가 많으면 수백 줄의 코드와 매우 적은 "대상" 콘텐츠를 쉽게 얻을 수 있습니다.코드를 접으면 필드당 한 줄 또는 모든 필드에 대해 한 줄로 줄일 수 있습니다.또한 모든 루틴 필드가 접혀 있지만 비루틴 필드(게터 또는 설정자가 단순히 개인 필드를 반환하거나 할당하는 것이 아닌 경우)가 접혀 있지 않으면 실질적인 코드를 쉽게 볼 수 있다.

메타데이터를 접는 중

메타데이터는 장황할 수 있으며 일반적으로 설명하는 데이터보다 덜 중요합니다.메타데이터를 축소하면 주로 메타데이터가 아닌 데이터에 집중할 수 있습니다.예를 들어 [6]C#Atribute 목록을 다음과 같이 수동으로 축소할 수 있습니다.

#지역 속성 [당황(거짓)] [Mergable Property (false)] [기본값(null)] [Persistence Mode(Persistence Mode)]이너 프로퍼티)] [Template Container(Type of(MyType)] [템플릿]인스턴스(템플릿)사례.싱글)]  #엔드리젼 일반의 IT 템플릿 콘텐츠 템플릿 {     얻다 { 돌아가다 _개요; }     세트 { _개요 = 가치; } } 

결과 코드는 다음과 같이 표시됩니다.

특성 일반의 IT 템플릿 콘텐츠 템플릿 {     얻다 { 돌아가다 _개요; }     세트 { _개요 = 가치; } } 

코멘트를 접다

코멘트는 사람이 읽을 수 있는 메타데이터의 한 형태이며, 코멘트가 길면 코드의 흐름이 중단될 수 있습니다.이는 한 줄 설명하는 단락과 같은 코드의 짧은 섹션에 대한 긴 주석이나 Javadoc 또는 XML Documentation과 같은 문서 생성기에 대한 주석 중 하나입니다.코드 폴딩을 사용하면 긴 주석을 달 수 있지만 필요할 때만 표시할 수 있습니다.긴 코멘트에 Python 문서 문자열과 같이 요약 행이 하나일 경우 섹션이 축소될 때 요약이 계속 표시될 수 있으므로 요약/상세 보기를 사용할 수 있습니다.

구조화 프로그래밍에서 구조 또는 샌드위치 코드 표시

구조화된 프로그래밍은 중첩된 코드 블록으로 구성되며 긴 스위치 문과 같은 긴 코드 블록은 전체 구조를 모호하게 할 수 있습니다.코드 폴딩을 통해 전체 구조를 보고 특정 수준까지 확장할 수 있습니다.또한 일부 용도, 특히 엄격한 구조화 프로그래밍(단일 함수 종료)에서는 확장된 코드를 볼 때 보기 어려운 코드 패턴이 있습니다.예를 들어 구조화 프로그래밍에서의 자원 관리에서는 일반적으로 자원을 취득하고 이어서 자원을 이용한 코드 블록을 취득하여 자원을 해방하는 것으로 종료한다.획득/해제 쌍은 그 사이에 긴 코드 블록이 있는지 확인하기 어렵지만, 그 블록이 접혀 있는지 여부는 쉽게 알 수 있습니다.마찬가지로, 다음과 같은 조건부 코드에서는if...then...elsesecondary blocks는 condition 스테이트먼트와는 거리가 멀 수 있습니다.

그룹코드

폴드 그룹은 모듈을 섹션으로 분리하는 주석 블록과 마찬가지로 명시적으로 그룹화하거나 클래스 멤버를 관련 그룹으로 그룹화하거나 액세스레벨에 따라 클래스 멤버를 자동으로 그룹화하는 등 암묵적으로 코드를 그룹화하는 데 사용할 수 있습니다.

레거시 코드 숨기기

레거시 코드(개발자가 특정 시점에서 표시 또는 변경을 원하지 않는 코드)는 프로그래머가 고려 중인 코드에 집중할 수 있도록 접을 수 있습니다.

원본 데이터 테이블 숨기기

관습

코드 폴딩을 지원하려면 텍스트 편집기가 텍스트 파일 내에서 "폴딩 포인트"를 식별하는 메커니즘을 제공해야 합니다.일부 텍스트 편집기는 이 메커니즘을 자동으로 제공하는 반면, 다른 텍스트 편집기는 사용자가 재정의하거나 추가할 수 있는 기본값을 제공합니다.

자동과 수동의 다양한 메커니즘이 있습니다. 프로그래머의 사양이 필요합니까?접힌 점은 일반적으로 다음 메커니즘 중 하나 이상을 사용하여 결정됩니다.이들 각각은 고유한 장점과 어려움을 가지고 있으며, 기본적으로 텍스트 에디터 소프트웨어를 만드는 개발자가 어떤 것을 구현할지를 결정할 수 있습니다.일반적으로 여러 개의 폴딩 메커니즘을 지원하는 텍스트 편집기를 사용하면 편집 중인 파일에 가장 적합한 항목을 선택할 수 있습니다.

구문에 의존하다

구문에 의존하는 폴딩 포인트는 특정 폴딩 영역의 시작 및 종료 위치를 지정하기 위해 편집되는 파일의 내용에 의존하는 폴딩 포인트입니다.구문 기반 폴딩 포인트는 일반적으로 사용 중인 마크업 언어 또는 프로그래밍 언어의 표준 하위 기능 중 하나 또는 전체에 대해 정의됩니다.이것들은 자동적이고 코드 구조에 동의하기 때문에 바람직하지만, 실장하기 위해서는 상당한 작업이나 파일 편집 시 계산 시간이 필요할 수 있습니다.

들여쓰기 기반

들여쓰기 기반 접기 점은 일반적으로 텍스트 내에서 탭 및 공백과 같이 인쇄되지 않는 공백의 위치와 순서로 지정됩니다.들여쓰기는 거의 항상 구조화된 프로그래밍 언어의 들여쓰기 스타일에서 중첩 수준을 반영하기 때문에 이것은 구문 기반 접기의 단순한 형태로 가장 많이 사용됩니다.

이 규칙은 오프사이드 규칙을 가진 구문에 특히 적합하기 때문에 구조가 들여쓰기와 대부분 일치합니다.예를 들어 Python과 들여쓰기를 원칙으로 하는 텍스트 파일이 있습니다.그러나 이러한 경우에도 구조는 행 연속과 같이 들여쓰기와 정확히 일치하지 않으므로 구문 의존적인 접기가 선호됩니다.

토큰 베이스

토큰 기반 접기 점은 접기 점의 경계를 식별하는 것 외에 텍스트에서 다른 목적이 없는 특수 구분 기호를 사용하여 지정됩니다.이 규칙은 공백 대신 인쇄 가능한 문자가 사용되는 들여쓰기 기반 접기 점과 비교할 수 있습니다.가장 일반적인 딜리미터 토큰은 다음과 같습니다.{{{접힌 섹션을 시작합니다.}}}끝내기 위해서요

또 다른 주목할 만한 토큰은#region(C#지시)#Region (Visual Basic 지시어), Microsoft Visual Studio Code Editor에서 사용됩니다.이것들은 컴파일러 명령어로서 구문적으로 취급되지만 컴파일러 명령어에는 영향을 주지 않습니다.

수동적인 방법으로서 토큰 베이스 폴딩은 구문 분석에서 추론할 수 없는 "특정 태스크와 관련된 함수"와 같은 임의의 기준에 따라 코드를 그룹화할 수 있는 재량권을 부여한다.

토큰 기반 폴딩은 인밴드 시그널링을 필요로 하며, 폴딩 토큰은 기본적으로 구조화된 코멘트이며 다른 방법과는 달리 소스 코드에 존재하며 다른 프로그래머가 볼 수 있습니다.이것에 의해, 공유는 가능하지만, 특정의 파일에 작업하는 모든 프로그래머에 의한 사용(또는 보존)이 필요하게 되어, 마찰이나 유지보수의 부담이 될 가능성이 있습니다.

사용자 지정

사용자가 지정한 폴딩을 사용하면 일반적인 선택 방법을 사용하여 텍스트 섹션을 접을 수 있지만 소스 코드(아웃 오브 밴드)를 변경하지 않고 에디터에서만 지정할 수 있습니다.예를 들어, 프로그래머는 텍스트의 몇 줄을 선택하고, 그것들을 접어야 한다고 지정할 수 있습니다.접힌 텍스트는 익명 또는 이름일 수 있으며 편집 세션에 걸쳐 보존되거나 폐기될 수 있습니다.토큰 기반 폴딩과 달리 소스 텍스트는 변경되지 않습니다.따라서 파일의 다른 편집기와 공유되지 않으며 코드에도 표시되지 않습니다.

다음 문서에는 접이식 토큰이 포함되어 있습니다.{{{ ... }}}):

제목 1 {{본체}} 제목 2 {{본체}} 제목 3 {{본체}}}

폴딩 편집기에 로드하면 다음과 같은 아웃라인 구조가 표시됩니다.

제목 1 {{...제목 2 {{...제목 3 {{... 

보통 클릭을 클릭합니다.{{{마크는 적절한 본문 텍스트를 표시합니다.

코드 폴딩 기능이 있는 소프트웨어

최초의 폴딩 에디터 중 하나는 1977년 Mike Cowlishaw가 VM/CMS 운영체제용으로 작성한 에디터 STET입니다.STET는 줄의 블록을 기반으로 파일을 접는 텍스트 편집기(문서, 프로그램 등)입니다.줄의 모든 블록을 접고 이름줄로 대체할 수 있습니다(줄은 다시 접을 수 있는 블록의 일부가 될 수 있습니다).

폴딩 에디터는 1983년경에 Inmos Transputer Development System(TDS;[7],[8] Inmos 트랜스퓨터 개발 시스템)이라고 불리는 Occam IDE에 등장했습니다.f 에디터(아래 목록에 있음)는 아마도 이 작업의 가장 온전한 유산일 것입니다.

매킨토시 컴퓨터는 역사적으로 "공개 삼각형"을 통해 코드의 일부를 "접는" 소스 코드 편집기를 다수 가지고 있었다.UserLand 소프트웨어 제품 프런티어는 이 기능을 [9]갖춘 스크립트 환경입니다.

폴딩은 많은 최신 텍스트 편집기에서 제공되며 구문 기반 또는 의미 기반 폴딩은 현재 많은 소프트웨어 개발 환경의 구성요소입니다.편집자는 다음과 같습니다.

이름. 상품권 들여쓰기 구문 사용자
ABAP 에디터 네. ? 네. ?
아켈패드 ? ? 네. ?
안주타 IDE ? 네. 네. ?
아톰[a] ? 네. ? 네.
BBEdit ? ? 네. ?
괄호 플러그인 네. 네. 아니요.
코드애니웨어 네. 네. 네. ?
코덴비 네. 네. 네. ?
코드: IDE 블록 네. 네. 네. 네.
큐빅 IDE 네. 네. 네. 네.
Cuda Text ? ? ? ?
델파이 IDE 네. ? 네. ?
드림위버 ? ? ? 네.
이클립스 ? ? 네. ?
편집 플러스 아니요. 네. 아니요. 아니요.
에맥스 네, 그렇습니다[b]. 무슨 일입니까?[c] 네, 그렇습니다[d]. 네, 그렇습니다[e].
EmEditor Professional ? 네. 네. ?
플래시 IDE 개발 ? ? 네. ?
지질 ? 네. 네. ?
편집 네. 네. 네. ?
ISPF ? 네. ? 네.
JED 네. 네, 그렇습니다[f]. ? 아니요.
j편집 네. 네. 네. 네.
케이트 네. 네. 네. 네.
매트랩 아니요. 아니요. 네. 아니요.
MS Visual Studio 네. 네. 네. 네.
NetBeans IDE 네. 네. 네. 네.
메모장++ ? 네. 네. 네.
NuSphere PHPEd ? ? 네. 네.
QT 크리에이터 ? ? 네. ?
SciTE 네. 네. 네. ?
스틱[g] ? ? ? ?
텍스트메이트 네. 네. 네. 네.
Ultra Edit(Ultra Edit) 아니요. 아니요. 네. 네.
VIM 네. 네. 네. 네.
비주얼 엑스퍼트 ? ? 네. ?
Visual Studio 코드 네. 네. 네. 아니요.
X코드 네. 네. 네. 네.
젠드 스튜디오 ? ? ? ?


기타 에디터

「 」를 참조해 주세요.

메모들

  1. ^ http://flight-manual.atom.io/using-atom/sections/folding/
  2. ^ 토큰 기반 폴딩은 폴딩 마이너 모드로 구현됩니다.프로그램 소스를 분할하기 위해 아웃라인 전체 마이너 모드를 사용할 수도 있습니다.
  3. ^ 를 사용할 수 있습니다.set-selective-displayEmacs에서 기능을 수행하여 유니버설 코드 폴딩 노트에 제시된 대로 들여쓰기 수준을 기준으로 선을 숨깁니다.
  4. ^ 구문 의존 폴딩은 특별한 전용 아웃라인 구문, 일부 프로그래밍 언어의 hiddeshow 마이너모드, 의미 태그 폴딩 마이너모드 및 allout 모드에서 지원됩니다.senator-fold-tag시멘틱(CEDET의 컴포넌트), JavaDoc 또는 Doxygen 코멘트의 Doc 모드, TeX-fold 모드,sgml-fold-elementnxml-outln 라이브러리, 대응하는 언어 고유의 모드 및 특정 구문에 대한 다른 모드일 수 있습니다.표준 심플 아웃라인 마이너모드를 사용하여 구문 기반의 폴딩을 시뮬레이트할 수 있습니다.예를 들어 올바르게 삽입된 Emacs Lisp 소스 코드에서의 폴딩 사용, 올바르게 삽입된 HTML을 위한 사용(페이지 끝 부근 참조).폴딩 메커니즘은 폴딩-딤 인터페이스에 의해 통합됩니다.'카테고리'도 참조해 주세요.숨기다.
  5. ^ Emacs에서 사용자가 선택한 영역의 폴딩은 에 의해 구현됩니다.hide-region-hide명령어를 입력합니다.
  6. ^ set_selective_display함수를 사용하여 지정된 양을 초과하여 들여쓴 선을 숨길 수 있습니다.
  7. ^ STET은 폴딩을 지원하는[citation needed] 최초의 텍스트 에디터일 수 있습니다.

레퍼런스

  1. ^ Simon Gauvin, Omid Banyasad, "투명성, 홀로프라스트링 및 자동 레이아웃이 비주얼 데이터 플로우 프로그래밍 언어의 제어 구조에 적용됨", 소프트웨어 시각화에 관한 2006년 ACM 심포지엄, 67-75페이지
  2. ^ "Data folding in HxD hex editor (listed as feature of RAM-Editor)". Retrieved 2007-04-30.
  3. ^ The Mother of All Demos, presented by Douglas Engelbart (1968), retrieved 2019-12-29
  4. ^ "History of ISPF". Retrieved 2015-10-27.
  5. ^ 앳우드 2008.
  6. ^ 포스트 번호 31, Rob, 2008년7월
  7. ^ North American Transputer Users Group. Conference (2nd : 1989 : Durham, N.C.) (1990). Transputer research and applications, 2 : NATUG-2, proceedings of the Second Conference of the North American Transputer Users Group, October 18-19, 1989, Durham, NC. Board, John A., Duke University. Amsterdam: IOS Press. p. 85. ISBN 9051990278. OCLC 35478471.
  8. ^ Cormie, David (1986). "INMOS Technical Note 03 - Getting started with the TDS" (PDF). transputer.net. Retrieved 2019-07-19.
  9. ^ "Outliners.com". Archived from the original on 2006-12-23. Retrieved 2006-12-27.
  10. ^ LEXX – IBM Journal of Research and Development, Vol. 31, 1987년 1호, IBM 재인쇄 주문 번호 G322-0151

외부 링크