오브젝트 파스칼 스타일 가이드 - Charles Calvert 작성
(오브젝트 파스칼 코딩 스타일 가이드 - 번역자: Tommy Tong)
우리는 많은 잘 알려진 스튜디오나 개인이 이 기사에 설명된 것과 다른 자체 프로그래밍 방식을 가지고 있다는 것을 인정합니다. 그러나 도구를 사용하여 코드를 Borland 스타일 코드로 변환한 다음 Borland에 제출할 것을 강력히 권장합니다. 프로젝트 JEDI 또는 기타 공개 소스 코드 저장소. 우리는 습관을 바꾸도록 강요하고 싶지는 않지만 Borland 제품과 함께 작동하는 모든 코드는 이 기사에 설명된 습관을 따르도록 주장합니다.
오브젝트 파스칼은 아름다운 디자인 언어입니다. 강력한 가독성은 장점 중 하나입니다. 이 기사에서 고안된 표준은 오브젝트 파스칼 코드의 가독성을 향상시킵니다. 개발자가 이 기사에서 설명하는 이러한 간단한 습관을 따르면 표준이 될 것이며, 이는 통합되고 읽기 쉬운 코딩 스타일을 사용하는 모든 Delphi 개발자에게 도움이 될 것입니다. 이러한 표준을 시행하려는 노력은 특히 유지 관리 및 디버깅 주기 단계에서 개발자를 위한 소스 코드의 가치를 높일 것입니다.
우리는 이 기사에서 홍보하는 스타일을 믿고 존경하지만, 그 자체로는 옳고 다른 것에서는 그르기 때문에 반드시 그것을 지지하는 것은 아닙니다. 그러나 우리는 대다수의 개발자가 따르는 표준에 타당성이 있다고 믿기 때문에 여전히 이 스타일을 지원하고 유지합니다. 인간의 두뇌는 항상 표준에 적응하고 익숙한 패턴을 빠르게 구성하여 그 의미를 빠르고 효율적으로 이해할 수 있는 방법을 찾습니다. 많은 사람들이 코드를 최대한 쉽게 읽을 수 있도록 표준을 설정하는 것이 바로 이러한 요구 사항입니다. 우리의 지침이 처음으로 낯설게 느껴지신다면, 잠시 동안 지침을 따라가시면 익숙해지실 것입니다. 또는 원하는 경우 자신만의 스타일을 유지하고 당사 표준을 준수하는 프로그램을 통해 변환한 다음 코드를 Borland 또는 기타 저장소에 제출할 수 있습니다.
Visual SlickEdit과 같은 일부 텍스트 편집기를 사용하면 코드 형식을 특정 스타일로 지정할 수 있습니다.
Egbert van Nes가 개발한 무료 포맷터는 다음 위치에서 구할 수 있습니다.
http://www.slm.wau.nl/wkao/delforexp.html
Delphi의 또 다른 상용 프로그램은 CrackerJax입니다.
http://www.dynamicsoftware.com/html/products.html
------------------------------------- ----
1.0 소개
이 기사는 오브젝트 파스칼 언어의 구문 규칙을 정의하려는 시도가 아닙니다. 예를 들어, else 앞에 ";"을 붙이는 것은 불법입니다. 컴파일러는 이러한 사용을 허용하지 않습니다. 그래서 이 글에서는 문법 규칙을 보여주지 않겠습니다. 이 글은 언어가 선택을 제공하는 적절한 행동을 정의하는 것을 목표로 합니다. 나는 통제 방법이 단 하나뿐인 곳에서는 대개 침묵을 지킨다.
1.1 배경
이 기사에 제시된 지침은 Delphi 소스 코드의 일부를 기반으로 합니다. Delphi 소스 코드는 이러한 지침을 정확히 따릅니다. 이러한 원칙에 대한 위반을 발견한 경우 불확실한 소스 코드가 아닌 이러한 원칙을 지침으로 삼아야 합니다. 그러나 최소한 자신의 코드 형식에 대한 일반적인 아이디어를 얻는 데 도움이 되도록 원본 코드를 이러한 원칙에 대한 보충 자료로 사용할 수 있습니다.
1.2 감사합니다
이 기사의 형식은 Java 언어에 대한 스타일 표준을 정의하기 위해 수행된 작업을 기반으로 합니다. Java는 오브젝트 파스칼 소스 코드 형식 지정 규칙에 영향을 미치지 않지만 Sun 웹 사이트의 문서는 이 기사의 기초입니다. 일부 특별한 부분에서 이 기사의 스타일과 형식은 "A Coding Style Guide for Java WorkShop and Java Studio 프로그래밍"(Achut Reddy, "Coding Guide for Java WorkShop and Java Studio")에서 크게 영감을 받았습니다. 기사는 다음 URL에서 찾을 수 있습니다: http://www.sun.com/workshop/java/wp-coding
델파이 팀은 이 글을 완성하는 데 상당한 기여를 했습니다. 사실 그들의 도움이 없었다면 이 글은 완성되지 못했을 것입니다.
2.0 소스 파일
오브젝트 파스칼 소스 코드는 크게 단일 소스 파일과 프로젝트 파일로 구분되며 모두 동일한 규칙을 따릅니다. Delphi 프로젝트 파일의 확장자는 .DPR입니다. 프로젝트의 메인 파일입니다. 프로젝트에 사용되는 모든 유닛 파일은 .PAS 확장자를 갖습니다. 배치 파일, HTML 파일 또는 DLL과 같은 다른 파일도 프로젝트에서 역할을 할 수 있지만 이 문서에서는 프로젝트 파일과 유닛 파일만 다룹니다.
2.1 소스 파일 이름 지정
오브젝트 파스칼은 긴 파일 이름을 지원합니다. 여러 단어를 사용하여 단일 이름을 구성하는 경우 각 단어의 첫 글자를 대문자로 사용하는 것이 가장 좋습니다(MyFile.pas). 이는 괄호 또는 camelCase로 간주됩니다. 확장자는 소문자여야 합니다. 역사적인 이유로 Delphi 소스 코드는 종종 8:3 명명 패턴을 사용하지만 개발자는 위 규칙에 제한을 받지 않고 Delphi 팀의 사용법을 따릅니다.
C/C++ 헤더 파일을 번역하는 경우 번역하는 파스칼 파일은 C/C++ 헤더 파일과 동일한 기본 파일 이름을 유지해야 하며 확장자로 .PAS를 사용해야 합니다. 예: Windows.h -> Windows.pas. 파스칼 구문을 사용하여 여러 헤더 파일을 단일 유닛 파일로 결합해야 하는 경우 다른 헤더 파일을 포함하는 헤더 파일의 파일 이름이 새 유닛 파일의 이름으로 사용됩니다. 예: Windows.h에는 WinBase.h 파일이 포함되어 있으며 새 유닛 파일의 이름은 Windows.pas입니다.
2.2 소스 파일 구성
모든 오브젝트 파스칼 유닛 파일은 다음 요소를 다음 순서로 포함해야 합니다.
저작권/신원 블록 댓글
단위 이름
인터페이스 세그먼트
구현부분
터미네이터 "엔드".
각 섹션 사이에는 빈 줄이 하나 이상 있어야 합니다.
다른 요소는 가장 적절하다고 생각되는 순서로 구성되어야 합니다. 그러나 저작권은 파일의 맨 처음에 나타나야 하며 그 다음에는 단위 이름, 조건부 정의, 컴파일러 지시어 또는 include 문, 사용 절이 나와야 합니다.
{************************************************ * *****}
{ }
{ 볼랜드 델파이 비주얼 컴포넌트 라이브러리 }
{ }
{ 저작권 (c) 1995,98 Inprise Corporation }
{ }
{************************************************ * *****}
단위 버튼;
{$S-,W-,R-}
{$C 사전 로드}
인터페이스
용도
윈도우, 메시지, 클래스,
컨트롤, 양식, 그래픽,
StdCtrls, ExtCtrls, CommCtrl;
type 섹션을 const 섹션 앞에 놓거나 두 섹션을 혼합하면 아무런 효과가 없습니다.
구현 부분에서는 먼저 구현을 작성하고 그 다음 사용 절, 기타 포함 선언 또는 기타 표시기를 작성해야 합니다.
구현
용도
Consts, SysUtils, ActnList,
ImgList;
{$R 버튼.RES}
2.2.1 저작권/신원 블록 댓글
모든 소스 파일은 버전 정보와 표준 저작권 고지가 포함된 블록 주석으로 시작해야 합니다. 버전 정보는 다음과 같습니다.
{************************************************ * *****}
{ }
{ 풍부한 위젯 }
{ }
{ 저작권 (c) 1995,98 귀하의 회사 }
{ }
{************************************************ * *****}
저작권 표시에는 최소한 다음 줄이 포함되어야 합니다.
저작권(C) 연도 저작권 소유자
Borland용 소프트웨어를 개발하는 제3자라면 저작권 끝에 자신의 이름을 추가할 수 있습니다.
{************************************************ * *****}
{ }
{ 볼랜드 델파이 비주얼 컴포넌트 라이브러리 }
{ 저작권 (c) 1995,99 볼랜드 인터내셔널 }
{ 프로젝트 JEDI에서 작성함 }
{ }
{************************************************ * *****}
2.2.2 단위 선언
각 유닛 파일에는 유닛 선언이 있어야 합니다. 단위는 예약어이므로 소문자로 입력해야 합니다. 유닛 이름은 대소문자를 혼용할 수 있으나, 유닛 파일의 파일명과 동일해야 합니다. 예를 들어:
단위 MyUnit;
그러면 유닛 파일의 이름은 MyUnit.pas가 되어야 합니다. 파일 시스템에서는 이 파일의 항목 역할을 합니다.
2.2.3 사용문
유닛 내에서 사용 선언은 더 작은 사용으로 부트스트랩되어야 합니다. 참조된 단위 이름은 자체 단위로 정의될 때 사용되는 대문자 표기 규칙을 따릅니다.
용도MyUnit;
각 장치 이름은 쉼표로 인접한 장치 이름과 구분되며 마지막 장치 이름 뒤에는 세미콜론이 옵니다.
용도
Windows, SysUtils, 클래스, 그래픽, 컨트롤, 양식,
유형정보;
또한, 사용 다음 줄부터 유닛명을 붙이고, 사용 직후 유닛명을 붙이는 것도 옳습니다.
Windows, SysUtils, 클래스, 그래픽, 컨트롤, 양식을 사용합니다 .
유형정보;
단위 이름 목록의 형식을 80자 제한 내에서 줄 바꿈하거나 단위 이름당 한 줄로 구성할 수 있습니다.
2.2.4 클래스 및 인터페이스 정의
클래스 정의는 두 개의 공백으로 시작하고 그 뒤에 접두사 "T"가 옵니다. 접두사는 대문자여야 하며, 포함된 각 단어는 대문자로 시작해야 합니다. 오브젝트 파스칼 소스 코드에서는 탭 문자 "Tab"을 사용하지 마십시오. 예:
TMyClass
식별자 뒤에는 공백, 등호, class라는 단어가 옵니다. 이 단어는 소문자여야 합니다.
TMyClass = 클래스
클래스가 조상으로부터 상속받는 경우 조상 클래스를 포함하는 왼쪽 및 오른쪽 대괄호를 추가해야 합니다.
TMyClass = 클래스(TObject)
범위 표시기는 여백에서 두 칸 떨어져 있으며 다음 순서로 나타납니다.
TMyClass = clss(TObject)
사적인
보호하다
공공의
출판됨
끝;
데이터는 일반적으로 비공개 섹션에서만 선언되며 해당 식별자는 "F"로 시작합니다. 이러한 모든 진술은 여백에서 4칸 떨어져 있어야 합니다.
TMyClass = 클래스 (TObject)
사적인
FMyDate: 정수;
함수 GetDate: 정수;
절차 SetData(값: 정수);
공공의
출판됨
속성 MyData: 정수 읽기 GetData 쓰기 SetData;
끝 ;
인터페이스는 범위 표시와 개인 데이터를 무시하고 클래스라는 단어 대신 인터페이스라는 단어를 사용해야 한다는 점을 제외하고는 해당 부분과 동일한 규칙을 따릅니다.
명명 규칙
소문자인 예약어와 표시자를 제외하고 모든 파스칼 식별자는 카멜케이스(camelCase) 형식을 사용해야 합니다. 즉, 각 식별자의 첫 글자를 대문자로 써야 하며, 삽입된 단어의 첫 글자도 대문자로 써야 합니다. 첫 번째 문자만 사용합니다.
내 식별자
내FTP클래스
이 규칙의 주요 예외는 헤더 파일 번역의 경우이며 원본 헤더 파일의 명명 규칙을 따라야 합니다. 예를 들어:
WM_LBUTTONDOWN, wm_LButtonDown을 쓰지 마십시오.
헤더 파일 번역을 제외하고 단어를 구분하기 위해 밑줄을 사용하지 마십시오. 클래스 이름은 명사 또는 명사구이어야 합니다. 인터페이스나 클래스의 이름은 인터페이스의 명확한 목적과 용도에 따라 달라집니다.
좋은 이름:
AddressForm, ArrayIndexOutOfBoundsException
나쁜 이름:
ManageLayout //동사구 사용
delphi_is_new_to_me //밑줄 사용
3.1 단위 명칭
단위 선언 참조
3.2 클래스/인터페이스 이름 지정
클래스/인터페이스 선언 참조
3.3 도메인/필드 명명
CamelCase 형식을 사용하세요. 대문자 "F"로 시작하고 모든 데이터를 비공개로 선언하고 속성이나 getter 및 setter를 사용하여 공개 액세스를 제공합니다. 예를 들어 GetSomething이라는 이름을 사용하여 내부 필드/필드 값을 반환하는 함수의 이름을 지정하고 SetSomething을 사용하여 필드/필드 값을 설정하는 프로시저의 이름을 지정합니다.
헤더 파일 변환에 필요한 경우가 아니면 const 섹션에 모두 대문자를 사용하지 마십시오.
Delphi는 캘리포니아에서 개발되었으므로 헤더 파일 변환에 필요한 경우가 아니면 토큰 사용을 권장하지 않습니다.
옳은:
FMyString: 문자열;
잘못된:
lpstrMyString: 문자열;
물론 헝가리어 명명법은 열거 유형 정의에 보존됩니다.
TBitBtnKind = (bkCustom, bkOK, bkCancel, bkHelp,
bkYes, bkNo, bkClose, bkAbort, bkRetry,
bkignore, bkAll);
이 경우 이 열거 유형의 각 요소 앞에 문자 bk가 삽입됩니다. bk는 ButtonKind를 의미합니다.
명명 규칙을 고려할 때 제로 타임 변수 및 루프 변수를 제외하고 단일 문자 이름을 사용하지 마십시오.
프린터나 모니터에서 "1"(일)을 구별하기 어렵기 때문에 "l"(L) 변수를 사용하지 마십시오.
3.4 메소드 명명
메소드 이름 지정에도 camelCase 형식이 사용됩니다. 메소드 명명 규칙은 const가 아닌 필드의 명명과 동일하지만 컨텍스트와 구별될 수 있습니다. 메소드 이름 지정에서는 동사나 동사구의 사용을 강제해야 합니다. 예를 들어:
//좋은 메소드 이름 지정:
ShowStatus, DrawCircle, AddLayoutComponent
//잘못된 메소드 이름 지정:
MouseButton //명사구, 설명 기능 없음
drawCircle //소문자로 시작
add_layout_comComponent //밑줄이 사용됨
//다음 메소드의 기능이 충분히 명확하지 않습니다. 서비스 실행을 시작합니까(더 좋음: StartServer) 아니면 서비스가 실행 중인지 확인합니까(더 좋음: IsServerRunning)?
ServerRunning //동사구(명령은 아님)
일부 클래스 속성을 가져오거나 설정하는 메서드는 각각 GetProperty 또는 SetProperty를 호출해야 합니다. 여기서 Property는 속성의 이름을 나타냅니다. 예를 들어:
GetHeight, SetHeight
클래스의 부울 속성을 테스트하는 메서드의 이름은 IsVisible로 지정해야 합니다. 여기서 Visible은 속성의 이름을 나타냅니다. 예를 들어:
크기 조정 가능, IsVisible
3.5 지역변수 이름 짓기
지역 변수의 명명 규칙은 "F"가 사용되지 않는다는 점을 제외하면 필드/필드의 명명 규칙과 동일합니다. 섹션 3.3을 참조하세요.
3.6 예약어
예약어와 표시자는 모두 소문자여야 합니다. 이것은 때때로 약간 혼란스러울 수 있습니다. 예: 정수는 식별자이며 첫 글자가 대문자로 표시됩니다. 문자열 예약어는 모두 소문자입니다.
3.7 유형 선언
모든 유형 이름 선언은 문자 T로 시작하고 클래스와 동일한 이름을 따릅니다.
4.0 공백 사용법
4.1 빈 줄
빈 줄은 논리적으로 관련된 코드 세그먼트를 그룹화하여 가독성을 향상시킬 수 있습니다. 빈 줄은 다음 위치에서도 사용할 수 있습니다.
저작권 주석 블록 뒤에는 패키지 선언(package) 및 가져오기 섹션(import)이 있습니다.
클래스 선언 사이.
메소드 선언 사이.
4.2 공간
오브젝트 파스칼은 매우 명확하고 읽기 쉬운 언어입니다. 일반적으로 코드에서 줄을 구분하기 위해 많은 공백을 추가할 필요는 없습니다. 다음 문서에서는 공백 사용에 대한 몇 가지 지침을 제공합니다.
4.2.2 공백을 사용해서는 안 됩니다.
메소드 이름과 여는 괄호 사이.
.(점) 연산자 앞이나 뒤;
단항 연산자와 피연산자 사이;
유형과 유형이 캐스트하는 표현식 사이;
왼쪽 괄호 뒤와 오른쪽 괄호 앞;
왼쪽 대괄호 뒤, 오른쪽 대괄호 앞;
금지 전;
예를 들어:
//올바른 사용법:
function TMyClass.MyFunc(var 값: 정수);
MyPointer := @MyRecord;
MyClass := TMyClass(MyPointer);
MyInteger := MyIntegerArray[5];
//잘못된 사용법:
function TMyClass.MyFunc( var Value: Integer );
MyPointer := @MyRecord;
MyClass := TMyClass(MyPointer) ;
MyInteger := MyIntegerArray [ 5 ] ;
4.3 들여쓰기
모든 들여쓰기 수준은 항상 두 칸씩 들여쓰기해야 합니다. 즉, 첫 번째 수준은 공백 2개 들여쓰기되고, 두 번째 수준은 공백 4개 들여쓰기되고, 세 번째 수준은 공백 6개 들여쓰기됩니다. 탭 문자 Tab을 사용하지 마십시오.
물론 여전히 몇 가지 예외가 있습니다. 단위, 용도, 유형, 인터페이스, 구현, 초기화 및 종료와 같은 예약어는 항상 최상위 문자입니다. 셀의 마지막 끝 식별자도 최상위 수준입니다. 프로젝트 파일에서 프로그램과 기본 시작 및 끝도 상단 그리드에 있습니다. 기본 시작..끝 블록은 최소한 두 개의 공백으로 들여쓰기되어야 합니다.
4.4 계속
행은 80개 열로 제한되어야 합니다. 80개 이상의 열이 있는 행은 여러 연속 행으로 나누어야 합니다. 모든 후속 라인은 이 선언의 첫 번째 라인을 따라야 하며 두 문자의 공백으로 들여쓰기되어야 합니다.
예를 들어:
//옳은:
함수 CreateWindowEx(dwExStyle: DWord;
lp클래스이름: PChar; lpWindow이름: PChar;
dwStyle: DWORD, X, Y, nWidth, nHeight: 정수;
hWndParent: HWND; hMenu: HMENU: HINST;
lpParam: 포인터): HWND ;
if ((X = Y) 또는 (Y = X) 또는
(Z = P) 또는 ( F = J)
시작하다
S := J;
끝 ;
목록이 쉼표로 구분되지 않는 한 매개변수와 해당 유형 사이에 줄을 줄 바꿈하지 마십시오. 이 경우 유형 이름이 다음 줄에서 시작되도록 마지막 매개변수 앞에 줄 바꿈합니다. 콜론과 해당 변수 사이에는 공백이 없어야 하며, 콜론과 유형 이름 사이에는 공백이 하나 있어야 합니다.
//옳은:
Procedure Foo(Param1: 정수; Param2: 정수);
//실수:
절차 Foo( Param:Integer; Param2:Integer);
다음 줄은 이항 연산자로 시작하면 안 됩니다. 메서드 이름과 여는 괄호 사이, 배열 이름과 여는 괄호 사이 등 일반적으로 공백이 발생하지 않는 줄을 자르지 마세요. 위와 같은 상황에서 줄을 끊어야 하는 경우에는 여는 괄호나 여는 대괄호 뒤에서 줄을 끊어야 합니다. 다른 코드와 같은 줄에 시작을 넣지 마십시오.
예를 들어:
//실수:
while (LongExpression1 또는 LongExpression2)이 시작 됩니다 .
//뭔가를 해라
//DoSomethingElse;
끝 ;
//옳은
while (LongExpression1 또는 longExpression2) do
시작하다
//뭔가를 해라
//DoSomethingElse;
끝 ;
if (LongExpressiong1) 또는
(LongExpression2) 또는
(LongExpression3) 그런 다음
5.0 댓글
오브젝트 파스칼 언어는 블록 주석과 한 줄 주석이라는 두 가지 유형의 주석을 지원합니다. 다음은 몇 가지 주석 사용 지침입니다.
·단원 상단에 단원의 목적을 설명하는 코멘트를 배치하는 것이 도움이 됩니다.
·클래스 선언 앞에 주석을 달면 도움이 됩니다.
·메서드 선언 전에 주석을 설정하는 것이 도움이 됩니다.
·의미가 뻔한 댓글은 피하세요
i := i + 1; //i에 1을 추가합니다.
·잘못 해석되기 쉬운 댓글은 아예 댓글을 달지 않는 것보다 더 해롭다는 점을 기억하세요.
·댓글에 유효하지 않을 것 같은 정보를 넣지 마세요.
·댓글 테두리에 별표나 기타 인쇄 기호를 삽입하지 마세요.
·제로아워 댓글, 즉 변경이나 삭제가 필요한 댓글은 앞에 "???:"로 표시하여 쉽게 찾을 수 있도록 하여야 합니다. 개념적으로는 프로그램이 출시되기 전에 모든 제로타임 댓글을 삭제해야 합니다.
// ???: 수정되면 Sort를 호출하도록 변경합니다.
List.MySort;
5.1 댓글 차단
오브젝트 파스칼은 두 가지 유형의 블록 주석을 지원합니다. 가장 일반적으로 사용되는 주석은 중괄호 {}로 묶인 주석입니다. Delphi 팀은 주석을 가능한 한 적고 단순하게 유지했습니다. 예: 주석에 패턴이나 선을 만들기 위해 별표를 사용하는 것을 피해야 합니다. 대신, 워드 프로세싱 문서에서와 마찬가지로 공백을 사용하여 주석을 구분하세요. 주석의 단어는 DsgnIntf.pas에서 발췌한 다음과 같이 첫 번째 중괄호와 같은 줄에서 시작해야 합니다.
{ TPropertyEditor
구성 요소의 속성이나 구성 요소 목록을 편집합니다.
Object Inspector에서 선택한 속성입니다.
편집기는 유형에 따라 생성됩니다.
유형에 따라 결정되는 편집 중인 특성
으로 등록됨...
등...
Xxx값 가져오기
첫 번째 속성의 값을 가져옵니다.
속성 속성을 호출합니다.
TProperty GetXxxValue 메소드를 사용하여
값.
SetXxxValue 모든 속성의 값을 설정합니다.
Properties 속성에서 적절한 것을 호출합니다.
값을 설정하는 TProperty SetXxxxValue 메소드 }
차단 댓글은 저작권 댓글에 자주 사용됩니다. 일부 코드 줄을 주석 처리하는 데에도 사용됩니다.
메소드의 목적을 설명하는 블록 주석 앞에는 메소드 선언이 와야 합니다.
예를 들어:
// 옳은
{ TMyObject.MyMethod
이 루틴을 사용하면 코드를 실행할 수 있습니다. }
프로시저 TMyObject.MyMethod;
시작하다
끝;
// 잘못된
프로시저 TMyObject.MyMethod;
{************************************************ * ****
TMyObject.MyMethod
이 루틴을 사용하면 코드를 실행할 수 있습니다.
************************************************** * *****}
시작하다
끝;
두 번째 유형의 블록 주석에는 두 개의 문자, 괄호와 별표(* *)가 포함됩니다. 이를 별표 괄호 주석이라고도 합니다. 이러한 주석은 일반적으로 코드 개발 중에만 유용하며 주요 이점은 중첩된 주석의 깊이를 2레벨 미만으로 허용한다는 것입니다. 오브젝트 파스칼은 동일한 유형의 주석 중첩을 지원하지 않으므로 실제로 중첩 수준은 별표 중괄호 안에 중괄호, 중괄호 안에 별표 중괄호로 구성됩니다. 이 유형의 주석 내에 있는 다른 유형의 표준 파스칼 주석은 중첩하지 않는 한 무시됩니다. 따라서 이 구문을 사용하여 코드와 주석이 모두 포함된 큰 코드 블록을 주석 처리할 수 있습니다.
(* 프로시저 TForm1.Button1Click(Sender: TObject);
시작하다
DoThis; // 프로세스를 시작합니다.
DoThat; // 반복을 계속합니다.
{ 여기에서 오류를 보고할 수 있는 방법이 필요합니다.
마침내 차단해 보세요 ???
CallMoreCode; // 프로세스를 마무리합니다.
끝 ; *)
이 경우 해당 메서드 내의 모든 하위 주석을 포함하여 전체 Button1Click 메서드가 주석 처리됩니다.
5.2 한 줄 주석
한 줄 주석은 주석 문자 //와 해당 선행 텍스트로 구성되며, 텍스트와 주석 문자 사이에는 공백이 있습니다. 한 줄 주석이 코드와 다른 줄에 있는 경우 코드와 동일한 들여쓰기 수준을 가져야 합니다. 여러 개의 한 줄 주석을 사용하여 큰 주석을 만들 수 있습니다.
블록의 첫 번째 줄이 아닌 한, 한 줄 주석이나 주석 그룹 앞에는 빈 줄이 필요합니다. 주석이 여러 문에 사용되는 경우 주석과 주석 그룹 뒤에는 빈 줄이 와야 합니다. 주석이 그 뒤에 오는 줄의 명령문만 설명하는 경우에는 뒤에 빈 줄이 올 필요가 없습니다.
예를 들어:
// 데이터베이스를 엽니다.
표1.열기;
한 줄 주석은 설명하는 코드 선언 뒤에도 올 수 있습니다. 이러한 댓글을 추적 댓글이라고도 합니다. 이들과 코드 사이에는 최소한 하나의 공백이 있어야 합니다. 여러 추적 주석이 코드 블록에 동시에 나타나는 경우 이러한 주석을 정렬해야 합니다.
예를 들어:
if (IsVisible 이 아님 ) 그러면
종료; // 할 일이 없습니다.
Inc(StrLength); // 널 종결자를 위한 공간을 확보합니다.
실행 가능한 코드의 각 줄에 대한 주석 추적을 피하세요. 일반적으로 메서드나 함수의 start..end 블록 사이에 주석 사용을 제한하거나 주석을 비워 두는 것이 가장 좋습니다. 긴 주석은 메서드와 함수 정의 전에 블록 주석에 나타날 수 있습니다.
친절한
6.1 수업 구성
학급 조직의 조직은 다음 순서를 따라야 합니다.
·도메인/필드 선언
·메소드 선언
·속성 정의
도메인/필드, 속성 및 메서드는 이름별로 알파벳순으로 색인이 지정되어야 합니다.
6.1.1 액세스 수준
IDE에서 생성된 코드를 제외하고 클래스의 범위 지정자는 다음 순서를 따라야 합니다.
·개인 성명
·보호문
·공개 성명
·발표문
오브젝트 파스칼에서 클래스 멤버는 액세스 기능이 감소하는 순서대로 게시, 공개, 보호, 비공개의 네 가지 액세스 수준을 갖습니다. 기본 액세스 수준이 게시됩니다. 일반적으로 구성원에게는 가장 적합한 가장 낮은 액세스 수준이 할당되어야 합니다. 예를 들어, 동일한 유닛의 다른 클래스에서만 액세스할 수 있는 멤버는 비공개로 선언해야 합니다. 동시에 액세스 수준이 낮은 멤버를 선언하면 컴파일러에 최적화를 향상할 수 있는 기회도 제공됩니다. 물론, 반면에 낮은 액세스 수준을 사용하면 하위 클래스를 확장하기가 어렵습니다. 클래스가 미래의 어느 시점에 서브클래싱될 것이라고 믿을 만한 이유가 있는 경우 서브클래스에 의해 상속되고 확장되어야 하는 멤버를 보호됨으로 선언해야 하며 개인 데이터에 액세스하는 데 사용되는 속성도 이러한 보호를 제공할 수 있습니다.
데이터에 대한 공개적인 접근을 금지해야 합니다. 데이터는 일반적으로 비공개 섹션에서 선언되며 데이터에 대한 모든 공개 액세스는 GetXXX, SetXXX 메서드 또는 속성을 통해 수행되어야 합니다.
6.1.8 생성자 선언
메소드는 알파벳 색인으로 정렬되어야 합니다. 생성자와 소멸자는 공용 섹션의 시작 부분에 배치하거나 알파벳순으로 정렬하는 것이 맞습니다.
생성자가 여러 개 있거나 동일한 이름의 생성자를 여러 개 사용하는 경우 매개 변수 목록에 따라 매개 변수가 가장 적은 생성자가 매개 변수가 가장 많은 생성자 앞에 정렬되어야 합니다. 즉, 매개변수가 없는 생성자가 있으면 해당 생성자가 먼저 나타나야 합니다. C++Builder와의 최상의 호환성을 유지하려면 생성자의 매개변수 목록이 고유해야 합니다. C++에서는 이름을 기준으로 생성자를 호출하지 않으므로 여러 생성자를 구별하는 유일한 방법은 인수 목록을 이용하는 것입니다.
6.2 메소드 선언
가능하다면 메소드 선언은 한 줄에 나타나야 합니다.
예를 들어:
예:
절차 ImageUpdate(이미지 img, infoflags: 정수,
x: 정수, y: 정수, w: 정수, h: 정수)
7.0 인터페이스
인터페이스 선언은 클래스 선언과 형식이 동일합니다.
InterfaceName = 인터페이스 ([ 상속된 인터페이스 ])
인터페이스바디
끝 ;
인터페이스 선언은 공백 2개, 인터페이스 본문은 공백 4개, 끝 문자는 공백 2개로 들여쓰기해야 합니다.
인터페이스 선언에는 필드/필드가 없습니다. 그러나 속성이 나타날 수 있습니다.
모든 인터페이스 메서드는 본질적으로 공개적이고 추상적이므로 인터페이스 선언에 이러한 키워드를 포함할 필요가 없습니다.
달리 명시하지 않는 한 인터페이스 선언은 동일한 유형의 선언과 동일한 스타일을 갖습니다.
7.1 인터페이스 본체 구성
인터페이스 본문은 다음 순서로 구성될 수 있습니다.
·인터페이스 메소드 선언
·인터페이스 속성 선언
인터페이스 메서드와 속성은 클래스와 동일한 스타일로 선언됩니다.
8.0 선언문
명령문은 봉인으로 끝나는 코드 라인입니다. 단일 명령문에는 금지 번호가 하나만 있고, 복합 명령문에는 금지 이름이 여러 개 있습니다.
//이것은 단일 명령문입니다:
A := B;
//복합문입니다:
시작하다
B := C;
A := B;
끝 ;
8.0.1 단일 선언
단일 문을 래핑해야 하는 경우 이전 줄을 기준으로 두 칸 들여쓰기해야 합니다.
//예를 들어:
내값 :=
MyValue + (SomeVeryLongStatement / OtherLongStatement);
8.1.1 할당 및 표현식 선언
한 줄에 최대 하나의 명령문이 있을 수 있습니다.
예를 들어:
a := b + c; //오류
a := b + c; //맞습니다.
Inc(개수); //정확함
8.1.2 지역변수 선언
지역 변수는 또한 camelCase 형식을 사용합니다. 클래스 선언의 필드/필드용으로 예약된 리더 "F"를 사용하지 마십시오.
예를 들어:
var
마이데이터: 정수;
MyString: 문자열 ;
같은 줄에 같은 유형의 여러 변수를 선언할 수 있습니다.
var
ArraySize, ArrayCount: 정수;
클래스 선언에서는 이러한 선언 습관을 권장하지 않습니다.
8.1.3 배열 선언
여는 괄호 앞과 닫는 괄호 뒤에 항상 공백을 두는 것이 일반적입니다.
유형
TMyArray = Char 배열 [0..100];
8.2.3 if 문
if 문은 최소한 두 줄에 나타나야 합니다.
예를 들어:
//실수:
A = B 이면 DoSomething ;
//옳은
A = B 이면
뭔가를 하세요;
복합 if 문인 경우 각 구분 기호에 대해 새 줄이 있어야 합니다.
//실수:
A = B 이면 시작
뭔가를 하세요;
DoSomethingElse;
끝 아니면 시작
이렇게 하세요;
그렇게 하세요;
끝 ;
//옳은
A = B 이면
시작하다
뭔가를 하세요;
DoSomethingElse;
끝
또 다른
시작하다
이렇게 하세요;
그렇게 하세요;
끝 ;
다음과 같은 몇 가지 변형이 채택될 수 있습니다.
//옳은
조건 이면
시작하다
이렇게 하세요;
다른 끝
시작하다
그렇게 하세요;
끝 ;
//옳은
조건 이면
시작하다
이렇게 하세요;
끝
또 다른
뭔가를 하세요;
//옳은
조건 이면
시작하다
이렇게 하세요;
다른 끝
뭔가를 하세요;
//다음 메소드는 신경쓰지 않을 수도 있지만 칭찬할 가치가 있습니다.
조건 이면
이것을 해라
그렇지 않으면 DoThat;
8.2.4 for 문
예:
// 잘못된
for i := 0 ~ 10 시작 하세요
뭔가를 하세요;
DoSomethingElse;
끝 ;
// 옳은
for i := 0 ~ 10 do
시작하다
뭔가를 하세요;
DoSomethingElse;
끝 ;
8.2.5 while 문
예:
// 잘못된
x < j가 시작 되는 동안
뭔가를 하세요;
DoSomethingElse;
끝 ;
// 옳은
x & lt ;
시작하다
뭔가를 하세요;
DoSomethingElse;
끝 ;
8.2.6 반복문까지
예:
// 옳은
반복하다
x := j;
j := 업데이트값;
j = 25일 때까지 ;
8.2.7 사례 진술
예:
// 옳은
케이스 제어. 정렬
alLeft, alNone: NewRange := Max(NewRange, Position);
alRight: Inc(AlignMargin, Control.Width);
끝 ;
// 옳은
x 의 경우
CS시작:
시작하다
j := 업데이트값;
끝 ;
csBegin: x := j;
csTimeOut:
시작하다
j := x;
x := 업데이트값;
끝 ;
끝 ;
// 옳은
스크롤코드 의 경우
SB_LINEUP, SB_LINEDOWN:
시작하다
Incr := FIncrement div FLineDiv;
FinalIncr := FIncrement 모드 FLineDiv;
개수 := FLineDiv;
끝 ;
SB_PAGEUP, SB_PAGEDOWN:
시작하다
증분 := FPageIncrement;
FinalIncr := 증가 모드 FPageDiv;
Incr := 증분 div FPageDiv;
개수 := FPageDiv;
끝 ;
또 다른
개수 := 0;
증분 := 0;
FinalIncr := 0;
끝 ;
8.2.8 try 문
//옳은
노력하다
노력하다
EnumThreadWindows(CurrentThreadID, @Disable, 0);
결과 := TaskWindowList;
제외하고
EnableTaskWindows(TaskWindowList);
들어올리다 ;
끝 ;
마지막으로
TaskWindowList := SaveWindowList;
TaskActiveWindow := SaveActiveWindow;
끝 ;
작성자 블로그: http://blog.csdn.net/sailerbai/