프로그래밍 스타일
Programming style코드 스타일이라고도 하는 프로그래밍 스타일은 컴퓨터 프로그램의 소스 코드를 작성할 때 사용되는 규칙 또는 지침 세트입니다.특정 프로그래밍 스타일을 따르는 것은 프로그래머가 해당 스타일에 맞는 소스 코드를 읽고 이해하는 데 도움이 되며 오류가 발생하는 것을 방지하는 데 도움이 된다고 종종 주장됩니다.
이 주제에 관한 고전적인 작품은 1970년대에 쓰여진 프로그래밍 스타일의 요소이며, 당시 널리 퍼져 있던 Fortran 및 PL/I 언어의 예를 들어 설명했습니다.
특정 프로그램에서 사용되는 프로그래밍 스타일은 기업 또는 기타 컴퓨팅 조직의 코딩 규칙과 코드 작성자의 선호도에서 파생될 수 있습니다.프로그래밍 스타일은 특정 프로그래밍 언어(또는 언어 패밀리)용으로 설계되는 경우가 많습니다.C 소스 코드에서 양호한 것으로 간주되는 스타일은 BASIC 소스 코드 등에 적합하지 않을 수 있습니다.하지만, 어떤 규칙들은 많은 언어에 일반적으로 적용된다.
좋은 스타일의 요소
좋은 스타일은 주관적인 문제로 정의하기 어렵다.그러나 다수의 프로그래밍 스타일에 공통되는 몇 가지 요소가 있습니다.보통 프로그래밍 스타일의 일부로 간주되는 문제에는 들여쓰기, 연산자 및 키워드 주위의 공백 사용, 키워드 및 변수 이름의 대문자화 또는 기타, 함수, 프로시저 및 변수 이름과 같은 사용자 정의 식별자의 스타일과 철자, 미국, 그리고 미국 등이 포함됩니다.e 및 코멘트 스타일.
코드 어피아런스
프로그래밍 스타일은 일반적으로 가독성을 목표로 소스 코드의 시각적 외관을 다룹니다.소스 코드를 자동으로 포맷하는 소프트웨어는 오래전부터 사용 가능하여 코더가 이름 지정, 논리 및 고급 기술에 집중할 수 있게 되었습니다.실용적으로 컴퓨터를 사용하여 소스 코드를 포맷하면 시간을 절약할 수 있으며, 논의 없이 전사적인 표준을 적용할 수 있습니다.
들여쓰기
식별 스타일은 제어 흐름과 코드 블록을 식별하는 데 도움이 됩니다.일부 프로그래밍 언어에서는 코드 논리 블록을 구분하기 위해 들여쓰기가 사용됩니다. 이러한 경우 올바른 들여쓰기는 스타일의 문제가 아닙니다.다른 언어에서는 들여쓰기 및 공백이 기능에 영향을 주지 않지만 논리적이고 일관된 들여쓰기가 코드를 더 잘 읽을 수 있게 합니다.비교:
한다면 (몇시간. < > 24 & & 회의록 < > 60 & & 초수 < > 60) { 돌아가다 진실의; } 또 다른 { 돌아가다 거짓의; }
또는
한다면 (몇시간. < > 24 & & 회의록 < > 60 & & 초수 < > 60) { 돌아가다 진실의; } 또 다른 { 돌아가다 거짓의; }
같은 것으로
한다면 ( 몇시간. < > 24 & & 회의록 < > 60 & & 초수 < > 60 ) {돌아가다 진실의 ;} 또 다른 {돌아가다 거짓의 ;}
처음 두 예제는 확립된 방식('행잉 패러그래프' 스타일)으로 들여쓰기되어 있기 때문에 읽기 훨씬 쉬울 것입니다.이 들여쓰기 스타일은 여러 개의 중첩된 구성을 처리할 때 특히 유용합니다.
ModuLiq
들여쓰기 대신 캐리지 리턴이 포함된 ModuLiq 제로 들여쓰기 스타일 그룹.위의 모든 것을 다음 항목과 비교해 보십시오.
한다면 (몇시간. < > 24 & & 회의록 < > 60 & & 초수 < > 60) 돌아가다 진실의; 또 다른 돌아가다 거짓의;
루아
Lua는 기존의 물결 괄호나 괄호를 사용하지 않습니다. if/else 문이 식 뒤에 와야 하는 경우then
, 및 if/internal 스테이트먼트를 종료합니다.end
.
한다면 몇시간. < > 24 그리고. 회의록 < > 60 그리고. 초수 < > 60 그리고나서 돌아가다 진실의 또 다른 돌아가다 거짓의 끝.
들여쓰기는 옵션입니다. and
,or
,not
true/false 스테이트먼트 사이에 사용됩니다.
이는 다음과 같은 참/거짓 진술입니다.
인쇄물(것은 아니다. 진실의)
거짓이 될 수도 있어요
파이썬
Python은 제어 구조를 나타내기 위해 들여쓰기를 사용하므로 올바른 들여쓰기가 필요합니다.이를 통해 괄호를 곱슬곱슬하게 묶을 필요가 있습니다(즉,{
그리고.}
)은(는)한편 Python 코드를 복사하여 붙여넣으면 현재 줄의 들여쓰기 수준과 다를 수 있으므로 문제가 발생할 수 있습니다.이러한 재포맷은 수작업으로 하는 것이 귀찮을 수 있지만 일부 텍스트 에디터 및 IDE에는 자동으로 실행할 수 있는 기능이 있습니다.Python 코드가 빈 공간을 제거하는 포럼이나 웹 페이지에 게시되었을 때 사용할 수 없게 되는 문제도 있지만, "<pre>"와 같은 빈 공간을 유지하는 태그로 코드를 묶을 수 있는 경우에는 이 문제를 피할 수 있습니다.</pre>" (HTML의 경우), "[code]"..."/code" (bbcode의 경우) 등
한다면 몇시간. < > 24 그리고. 회의록 < > 60 그리고. 초수 < > 60: 돌아가다 진실의 또 다른: 돌아가다 거짓의
Python은 물결 괄호를 사용하지 않고 일반 콜론(예: 콜론)을 사용합니다.else:
).
많은 Python 프로그래머들은 PEP8로 [1]알려진 일반적인 합의된 스타일 가이드를 따르는 경향이 있다.PEP8 컴플라이언스를 자동화하도록 설계된 툴이 있습니다.
하스켈
Haskell은 마찬가지로 오프사이드 규칙을 가지고 있습니다.즉, 들여쓰기가 블록을 정의하는 데 의미가 있는 2차원 구문이 있습니다(단, 대체 구문은 물결 괄호와 세미콜론을 사용합니다).Haskell은 선언적인 언어이며, 문장이 있지만 Haskell 스크립트 내의 선언입니다.예:
허락하다 c_1 = 1 c_2 = 2 에 f x y = c_1 * x + c_2 * y
는 다음과 같이 한 줄에 쓸 수 있습니다.
허락하다 {c_1=1;c_2=2} 에 f x y = c_1 * x + c_2 * y
Haskell은 확장된 텍스트가 코드의 기원을 설명하는 리터럴 프로그래밍 사용을 권장합니다.읽고 쓸 수 있는 Haskell 스크립트(이름은lhs
확장자)는 코드로 표시된 블록을 제외하고 모두 코멘트입니다.이 프로그램은 LaTeX로 작성될 수 있습니다.이 경우,code
환경은 코드를 표시합니다.또한 각 활성 코드 단락은 빈 행으로 시작 및 종료하고 각 코드 행을 큰 기호와 공백으로 시작함으로써 마킹할 수 있다.LaTeX 마크업을 사용하는 예를 다음에 나타냅니다.
그 기능. \동사.+isValidDate+ 시험 한다면 날짜. 이 유효한 \시작한다.{코드} isValidDate :: 날짜. -> 불 isValidDate 날짜. = 아하>=0 & & 음.>=0 & & ss>=0 & & 아하< >24 & & 음.< >60 & & ss< >60 어디에 (아하,음.,ss) = 날짜부터 날짜. \끝.{코드} 관찰하다 그거 에 이것. 사례. 그 과부하 기능. 이 \동사.+날짜부터 :: 날짜. -> (내부,내부,내부)+.
일반 텍스트를 사용한 예:
그 기능. isValidDate 시험 한다면 날짜. 이 유효한 > isValidDate :: 날짜. -> 불 > isValidDate 날짜. = 아하>=0 & & 음.>=0 & & ss>=0 > & & 아하< >24 & & 음.< >60 & & ss< >60 > 어디에 (아하,음.,ss) = 날짜부터 날짜. 관찰하다 그거 에 이것. 사례. 그 과부하 기능. 이 날짜부터 :: 날짜. -> (내부,내부,내부).
수직 정렬
유사한 요소를 수직으로 정렬하여 오타가 발생한 버그를 보다 명확하게 하는 것이 도움이 되는 경우가 많습니다.비교:
$search(검색) = 배열('a', 'b', 'c', 'd', 'e'); 교환비 = 배열('푸', '바', '바즈, '쿵'); // 또 다른 예: $value($value) = 0; 다른 값 = 1; 또 다른 가치 = 2;
포함:
$search(검색) = 배열('a', 'b', 'c', 'd', 'e'); 교환비 = 배열('푸', '바', '바즈, '쿵'); // 또 다른 예: $value($value) = 0; 다른 값 = 1; 또 다른 가치 = 2;
후자의 예는 직감적으로 명확하지 않은 두 가지를 명확히 한다.
- 검색 및 치환 용어는 관련이 있고 일치합니다.이러한 용어는 이산 변수가 아닙니다.
- 대체 용어보다 검색어가 하나 더 있습니다.이것이 버그라면, 검출될 가능성이 높아집니다.
단, 수직 정렬에 반대하는 주장도 있습니다.
- 행간 false 의존관계.표 형식에서는 행간에 의존관계가 생성됩니다.예를 들어 긴 이름을 가진 식별자를 표 형식 레이아웃에 추가할 경우 이를 수용하기 위해 열 너비를 늘려야 할 수 있습니다.이로 인해 소스 코드가 필요 이상으로 크게 변경되어 노이즈로 인해 본질적인 변경이 손실될 수 있습니다.버전 간 차이를 검사해야 하는 경우 개정판 제어에 악영향을 미칩니다.
- 취약성; 프로그래머가 변경 시 테이블을 깔끔하게 포맷하지 않으면, 아마도 이전 사항을 염두에 두고 합법적으로 포맷하지 않으면, 결과는 더 이상 변경과 함께 악화될 수 있습니다.검색 및 치환과 같은 간단한 리팩터링 작업도 형식을 해제할 수 있습니다.
- 수정에 대한 저항. 표 형식 지정은 유지 보수에 더 많은 노력이 필요합니다.이것은 프로그래머가 식별자의 이름을 추가, 수정 또는 개선하는 것과 같은 유익한 변경을 하는 것을 지연시킬 수 있다. 왜냐하면 그것은 포맷을 망치기 때문이다.
- 단일 간격 글꼴에 의존합니다. 표 형식에서는 편집기가 고정 너비 글꼴을 사용하는 것으로 가정합니다.현대의 많은 코드 에디터는 비례 글꼴을 지원하며 프로그래머는 가독성을 위해 비례 글꼴을 사용하는 것을 선호할 수 있습니다.
- 도구 의존성. 정렬을 유지하는 작업의 일부는 도구(예: 탄력적인 탭스톱을 지원하는 소스 코드 편집기)에 의해 완화될 수 있지만, 이러한 도구에 대한 의존도는 높아집니다.
예를 들어, 변수 "$replactering"을 "$r"로, "$anothervalue"를 "$a"로 이름을 변경하는 간단한 리팩터링 작업을 수행하면 다음과 같은 코드가 생성됩니다.
$search(검색) = 배열('a', 'b', 'c', 'd', 'e'); $r = 배열('푸', '바', '바즈, '쿵'); // 또 다른 예: $value($value) = 0; $a = 1; 또 다른 가치 = 2;
이러한 변경 후에도 원래의 시퀀셜 포맷은 정상적으로 표시됩니다.
$search(검색) = 배열('a', 'b', 'c', 'd', 'e'); $r = 배열('푸', '바', '바즈, '쿵'); // 또 다른 예: $value($value) = 0; $a = 1; 또 다른 가치 = 2;
스페이스
공백이 필요한 상황에서는 대부분의 자유 형식 언어의 문법은 표시되는 양과는 무관합니다.가독성을 높이기 위해 일반적으로 공백과 관련된 스타일이 사용됩니다.현재 어떤 공백 스타일이 가장 읽기 쉬운지에 대한 알려진 확실한 사실(연구의 결론)은 없습니다.
예를 들어, C 코드의 구문적으로 동등한 다음 예를 비교합니다.
인트 i; 위해서(i=0;i< >10;++i){ 인쇄물(%d,i*i+i); }
대
인트 i; 위해서 (i = 0; i < > 10; ++i) { 인쇄물(%d, i * i + i); }
탭
탭을 사용하여 공백 공간을 만들면 사용하는 도구와 사용자의 기본 설정에 따라 집계 지점의 위치가 다를 수 있으므로 충분한 주의를 기울이지 않을 때 특정 문제가 발생합니다.
예를 들어, 한 프로그래머는 탭스톱을 4개 선호하며 툴셋을 이렇게 설정하고 이를 사용하여 코드를 포맷합니다.
인트 ix; // 어레이를 검색할 인덱스 긴 합; // 합계의 축전지
다른 프로그래머는 탭 스톱이 8개인 것을 선호하며 툴셋은 이렇게 구성되어 있습니다.다른 사람이 원래 사람의 코드를 검사하면 읽기 어려울 수도 있습니다.
인트 ix; // 어레이를 검색할 인덱스 긴 합; // 합계의 축전지
이 문제에 대해 널리 사용되는 해결책 중 하나는 정렬 또는 탭 중지 방법을 설정할 때 탭 사용을 금지하는 것입니다.탭은 논리 들여쓰기로만 제한되고 정렬에 사용되지 않는 경우 정상적으로 작동합니다.
학급 마이클래스 { 인트 푸바( 인트 쿼크, // 첫 번째 파라미터 인트 큐스); // 두 번째 파라미터 인트 푸바2( 인트 쿼크, // 첫 번째 파라미터 인트 큐스, // 두 번째 파라미터 인트 큐우); // 세 번째 파라미터 };
「 」를 참조해 주세요.
레퍼런스
- ^ "PEP 0008 -- Style Guide for Python Code". python.org.