코딩 스타일 정보 - 페이지 3

 

코드가 명확한 구조를 갖도록 기능을 별도의 작업으로 분리하는 것을 선호합니다 .. 최적화하기가 더 쉽습니다 ..

 
Mathemat >> :

원칙적으로 중첩된 if 구문과 동일한 계산을 수행하는 일반 코드입니다. 하지만 어디선가 함수에 반환이 하나만 있어야 한다고 들었습니다. 아마도 혼란스러워하지 않기 위해서일 것입니다. 나는 이 규칙을 엄격하게 따르지 않습니다.

그렇지 않으면 내 접근 방식은 몇 가지 세부 사항을 제외하고 C-4에 매우 가깝습니다.


네, 그런 의견이 있습니다. 그러나 return 문은 GOTO와 동일하지 않습니다. 실제로, 나는 예기치 않은 리턴 드로를 만난 적이 없습니다. 오히려 그러한 연산자와 조건을 사용하는 프로그램은 더 읽기 쉽고 구조화됩니다(모든 검사는 위에서 아래로 순차적으로 진행되어 말하자면 열을 형성합니다). 또한 return 문은 if()와 달리 함수의 종료를 보장하며, 이는 대부분의 경우에 정확히 필요한 것입니다. 일부 조건이 충족되지 않으면 데이터를 더 이상 계산할 의미가 없기 때문입니다.

 

저는 마지막 규칙이 정말 마음에 들었습니다. "절대 "복사하여 붙여넣기" 작업을 사용하지 마십시오." 그러나 슬프게도 나는 그를 따르지 않습니다. 글쎄, 어떻게 개발 환경 편집기를 사용하고 많은 시간을 절약하는 "복사 및 붙여 넣기"를 사용하지 않을 수 있습니까?!

아니오, 저장하지 않는 것으로 나타났습니다. 바로 이 때문에 포착하기 어려운 논리적 오류를 발견하는 경우가 많습니다.

추신 포럼 엔진은 내 첫 번째 게시물의 이 조각을 형식화하는 것을 허용하지 않습니다.

// open
// .pairsToOpen
// .combineAndVerify( )
// Собирает из двух валют символ и выполняет все проверки, нужные для его открытия.
// Возвращает валидность пары для открытия.
// Последний аргумент - [...]
bool
combineAndVerify ( string quoted, string base, double& fp1 )

정확히 내가 한 방식: 처음 세 줄은 나와 다르게 보이고 더 구조적으로 보입니다. 좋아요, 세탁이 아니라 스케이트로:


기능에 주석을 달려면 어떻게 해야 하나요?

 

다음은 최근에 생각났고 이미 집에서 구현한 몇 가지 규칙입니다.


1. 전역 변수(GP)는 코드 시작 부분에 선언하지 않고 필요에 따라 이를 사용하는 해당 함수 앞에 선언합니다.

2. 또한 각 함수에 앞서 실제로 호출될 때 어떤 GPU를 사용(입력)하고 수정(출력)하는지 설명합니다. 그리고 함수 후에 어떤 GPU가 더 이상 사용되지 않을 것인지 설명할 수도 있습니다.

3. 이 모든 주석은 함수 사이의 빈 구분선과 함께 "함수 길이는 20줄 이하"라는 제한이 있어도 코드 파일의 크기를 1.5-2배 늘립니다. 컴파일할 때 더 어려워지지 않으며 여기에 저장할 문서가 없습니다.

4. 공기업은 무엇에 좋은가요? foo( ..., <type>& variable ) 함수에서 복잡한 유형 변수를 평가하여 참조로 전달한다고 가정해 보겠습니다. 그런 다음 코드의 다른 부분에서 이 변수를 반복적으로 사용하면 매번 foo() 함수를 호출해야 합니다. 이 변수를 계산하는 데 시간을 할애할 때마다, 심지어 변수를 사용하는 각 함수에서도 몇 줄(변수 선언 및 함수 호출에)을 추가한다는 사실을 제외하고는 전혀 끔찍하지 않은 것 같습니다. 무엇 때문에? 이것이 소위 코드 재사용 이라면 어떻게 든 차선책입니다. foo() 함수를 너무 자주 사용하는 것 외에도 함수 호출의 구조를 깨고 사용자 정의 함수 foo()를 "out"으로 만듭니다. 범주" 및 해당 호출은 계층적이지 않습니다. 변수를 "범주 외" 변수로 선언하는 것이 더 쉽습니다. 글로벌.

개인적으로 나는 그러한 모호한 코드 재사용보다 엄격한 함수 계층 구조를 선호합니다. 나는 이미 계층 구조에 대해 이야기했습니다. 호출의 n번째 순서의 각 함수는 (n-1)번째 순서의 함수에 의해서만 호출되고 "자체"만 호출됩니다. 위의 녹색 배경 그림에서 함수 계층을 설명하는 내 예를 참조하십시오.

5. 물론 계층 구조 측면에서 코드가 항상 최적인 것은 아니며 "외부" 함수를 호출해야 하는 경우도 있습니다. 이 경우 "외부" 함수 이름 앞에 대괄호 /* */ 안에 함수 계층 구조에서 해당 위치를 입력할 수 있습니다.


어쩌면 이 모든 것이 말도 안 되고 과한 것일 수도 있지만, 나는 내가 코드를 작성하고 있다는 것을 분명히 알고 있습니다. 이 코드는 높은 확률로 두 번 이상 편집해야 합니다. 여기에서는 댓글과 구성에서 안전하게 플레이하는 것이 좋다고 생각합니다.

 
Vinin >> :
함수 크기. 기능을 한 화면에 맞추려고 합니다. 다 볼 수 있도록.

소스코드를 블럭 단위로 편집할 수 있고 추가 및 변경이 편리한 방식으로 작성하려고 합니다.

주석은 코드 볼륨의 30% 이상이어야 합니다.

(UNIX 운영 체제, RT11의 소스 코드를 보고 80x에서 이것을 배웠습니다)

반년 안에 코드가 잊혀질 것입니다 - 수정해야 하는 경우 - 댓글을 통해 해당 주제에 빠르게 진입

(실제 프로덕션 경험이었기 때문에 5년 후 내 코드를 읽었을 때

댓글 덕분에 하루만에 다 기억하고 저녁에 수정했습니다)

가독성을 위해 코드를 정렬하려고 합니다. 공백과 들여쓰기를 절약하지 않습니다.

두 가지 예를 비교하십시오! 가장 읽기 좋은 코드는 무엇입니까?


하나)

 extern string gslM001rus = "Все что касается индикации" ;
// 
extern bool gpInfoParameter = false ; // выводить параметры
extern bool gpInfoLevel = true ; // выводить параметры
extern bool _gDeleteObjectGrafic = 0 ; // 1-Удалять объекты на графике при завершении 0-не удалять
extern double FlatSBuy = 0.0010 ; // =0.00050; // пипов на пробой ТОЛЬКО ДЛЯ ИНДИКАТОРА!!!
extern double FlatSSell = 0.0010 ; // =0.00050; // пипов на пробой ТОЛЬКО ДЛЯ ИНДИКАТОРА!!!
extern int DayHistory = 50 ; // Сколько дней в истории показывать
// флет азии 
extern int iTimeEndFlatAsiaHour = 5 ; // Конец утреннего флета
extern int iTimeEndFlatAsiaMin = 15 ; // Конец утреннего флета
// Время длины флета измеряется минутами от окончания и назад
// 360 минут эт о6 часов назад от 5:15 получаем 23:15 вчерашнего дня
extern int iTimeEndFlatAsiaSizeMin = 360 ; // + количество минут  флета // 
extern string sTimeBreakFlatAsia = "20:00:00" ; // Время до которого разумно ждать пробой и выставление ордеров
extern int pУровниHighLowDAY = 1 ; // выводить уровни HIGH LOW
extern color ЦветПятницыHIGH = DeepSkyBlue ;
extern color ЦветПятницыLOW = DeepSkyBlue ;
extern color ЦветHIGHDAY = DarkViolet ;
extern color ЦветLOWDAY = DarkViolet ;
extern color lColorFAH = OrangeRed ;
extern color lColorFAL = SandyBrown ;
extern color lColorSignalSELL = Red ;
extern color lColorSignalBUY = Red ;

 


2)


 extern string gslM001rus = "Все что касается индикации"        ;
//                                                                  
extern bool    gpInfoParameter         = false                ; // выводить параметры
extern bool    gpInfoLevel             = true                  ; // выводить параметры
extern bool    _gDeleteObjectGrafic     = 0                    ; // 1-Удалять объекты на графике при завершении 0-не удалять
//                                                            
extern double FlatSBuy                 = 0.0010                ; // =0.00050;  // пипов на пробой ТОЛЬКО ДЛЯ ИНДИКАТОРА!!!
extern double FlatSSell               = 0.0010                ; // =0.00050;  // пипов на пробой ТОЛЬКО ДЛЯ ИНДИКАТОРА!!!
extern int     DayHistory               = 50                    ; // Сколько дней в истории показывать

//                                                         
// флет азии                                               
//                                                         
extern int    iTimeEndFlatAsiaHour    = 5                    ; // Конец утреннего флета
extern int    iTimeEndFlatAsiaMin     = 15                  ; // Конец утреннего флета
// 
// Время длины флета измеряется минутами от окончания  и назад
//   360 минут эт о6 часов назад от 5:15 получаем 23:15 вчерашнего дня
//
extern int    iTimeEndFlatAsiaSizeMin = 360                 ; // + количество минут  флета
//                                                            
//                                                              
//                                                            
extern string sTimeBreakFlatAsia       = "20:00:00"            ; // Время до которого разумно ждать пробой и выставление ордеров
//                                                         
extern int     pУровниHighLowDAY       = 1                    ; // выводить уровни HIGH LOW
//
extern color   ЦветПятницыHIGH         = DeepSkyBlue          ;
extern color   ЦветПятницыLOW           = DeepSkyBlue          ;
extern color   ЦветHIGHDAY             = DarkViolet            ;
extern color   ЦветLOWDAY               = DarkViolet            ;
extern color   lColorFAH               = OrangeRed            ;
extern color   lColorFAL               = SandyBrown            ;
extern color   lColorSignalSELL         = Red                  ;
extern color   lColorSignalBUY         = Red                  ;
//
//
 
                                                    
 
Mathemat >> :

if(param1!=1)return;

if(param2!=2)return;

...

if(param5!=5)return;

Print("Наконец-то дошли!");

원칙적으로 중첩된 if 구문과 동일한 계산을 수행하는 일반 코드입니다. 하지만 어디선가 함수에 반환이 하나만 있어야 한다고 들었습니다. 아마도 혼란스러워하지 않기 위해서일 것입니다. 나는 이 규칙을 엄격하게 따르지 않습니다.

그렇지 않으면 내 접근 방식은 몇 가지 세부 사항을 제외하고 C-4에 매우 가깝습니다.

나는 같은 길을 선호한다!

제어하기 쉬운


값을 반환해야 하는 경우


대신에

만약 ( a > c )

반환(3);

만약 ( l < b )

반환(5);

...

...

만약 ( h != b )

반환(100);

---

선호하다


만약 ( a > c )

코드렛 = 3;

만약 ( l < b )

코드렛 = 5;

...

...

만약 ( h != b )

코드렛 = 100;


// 특히 모든 종료에 공통적인 몇 가지 추가 작업이 반환 전에 수행되는 경우

... 예를 들어 여기서 우리는 다른 일을 하고 있습니다

재실행(코드렛);

}

 

댓글 영역에서 조금...

텍스트를 블록으로 분리하기 위해 U0151 코드가 있는 한 줄의 문자를 사용합니다. 모르는 사람들을 위해 - 다음과 같이 입력됩니다.

  1. Alt 누르기
  2. 숫자 키패드에서 문자 코드의 숫자 0, 1, 5, 1을 차례로 누릅니다.
  3. 해제 Alt

"올바른" 글꼴의 경우 빼기 기호가 표시되지만 끝에 "공백"이 없습니다. 그런 다음 필요한 횟수만큼 복사하여 붙여넣으면 좋은 시각적 신호 역할을 하는 실선 이 얻어집니다.

// обычная линия
// -----------------------------------------------------------------------------------

// сплошная линия
// —————————————————————————————————

// —————————————————————————————————
// Вот такие часто делаю ЗАГОЛОВКИ
// —————————————————————————————————

 

주석 텍스트 블록에 대한 또 다른 까다로운 라인 - 완전히 대칭적으로 보이지만 첫 번째 여는 부분과 두 번째 닫는 부분이 있습니다.


/*///—————————————————————————————————————————
это

여러 줄 주석 블록
...........................

/*///—————————————————————————————————————————

 

Yura , 한 번의 반환으로 귀하의 예는 물론 논리적입니다. 그러나 이 경우 모든 if는 항상 실행됩니다. 많은 반환이 있는 경우와 달리 조건이 있는 줄에 도달하는 즉시 함수에서 종료됩니다.

ForexTools , 감사합니다. 귀하의 디자인 아이디어를 채택했습니다.

사유: