关于编码风格 - 页 3

 

我更喜欢把功能分成独立的动作,这样代码就有一个清晰的结构......这样更容易优化......。

 
Mathemat >> :

基本上,它是正常的代码,执行与嵌套if结构相同的计算。但我在某个地方听说,函数中的返回应该是一个。也许,这样做是为了不与他们混在一起。我没有严格遵守这一规则。

在其他方面,我的方法与你的非常接近,C-4,除了几个细节。


是的,有这样一种意见。但返回操作符与GOTO不是一回事。在实践中,我从未遇到过任何意外的返回抛物。相反,当使用这样的运算符和条件时,程序变得更有可读性和质感(所有的检查从顶部向下逐一进行,形成一种列)。此外,与if()操作符不同,return保证了函数的退出,而这正是大多数情况下所需要的,因为如果某些条件没有得到满足,进一步评估数据就没有意义。

 

我非常喜欢最后一条规则:"永远不要使用'复制和粘贴'操作"。但是,可惜的是,我没有遵循它。怎么可能使用IDE编辑器而不使用节省大量时间的 "Copy&Paste "呢?

事实证明,不是这样的:我注意到,正是因为这样,我经常发现逻辑错误,而这些错误很难被发现。

P.S. 论坛引擎不允许我将我的第一篇帖子中的这个片段格式化

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

正是和我做的方式:前三行看起来不同,更有结构性。好吧,不择手段。


我如何评论的功能

 

这里还有一些最近想到的规则,我已经在自己的地方实施了。


1.全局变量(GV)不是在代码的开头全部声明,而是根据需要,在使用它们的相应函数之前声明。

2.在每个函数之前,我们还描述了它在实际调用时使用哪些GP(输入)和修改哪些GP(输出)。而在功能之后,你也可以解释哪些GP将不再被使用。

3.所有这些注释,加上函数之间的空分隔线和 "函数长度不超过20行 "的限制,使代码文件的大小增加了1.5-2倍。 这并没有增加编译的难度,而且我们也没有多余的纸张来处理。

4.全科医生的作用是什么?假设我们在函数foo( ..., <type>& variable )中计算某个复杂类型的变量,通过引用传递。那么,如果我们在不同的代码片段中重复使用这个变量,我们将不得不每次都调用foo( ) 函数。这似乎没有问题--除了每次花时间对这个变量进行评估外,我们还在每个使用变量的函数中增加了几行(用于变量声明和函数调用)。为什么?如果这就是所谓的代码重用,它在某种程度上是次优的:除了使foo( )函数的使用过于频繁之外,我们还打破了函数调用的结构,使用户foo( )函数 "脱离了类别",其调用没有层次。将变量声明为 "类别外 "变量,即全局变量,是比较容易的。

就个人而言,我更喜欢严格的分层功能,而不是这种有问题的代码重复使用。我已经说过层次结构:每个第n阶的函数只能被第(n-1)阶的函数调用,而且只能是 "它自己的 "函数。请看我在上面绿色背景的图片中解释功能层次的例子。

5.但当然,代码在层次感上并不总是最佳的,有时你不得不调用 "外来 "的函数。在这种情况下,你可以在 "外来 "函数的名称前用括号/***/写出它在函数层次结构中的位置。


也许这一切都很愚蠢和过分,但我很清楚,我正在写的代码可能要编辑不止一次。在这里,我认为最好在评论和结构上让自己放心。

 
Vinin >> :
关于函数的大小。我试图使功能适合于一个屏幕。这样,你就可以看到整个事情。

我试着写代码,以便可以分块修正源代码,并且方便添加和修改。

注释应不低于代码大小的30%。

( 在80年代学会了这样做,看UNIX操作系统的源代码,RT11)

半年后,代码就被遗忘了 - 如果你需要纠正它,评论会让你迅速了解这个问题 !

(我在一个生产现场有一个真实的经历,当我在5年后阅读自己的代码时,我有一个真实的经历)

感谢评论,我在一天之内记住了所有的东西,并在晚上进行了修改)

我试图将代码调整到可读性,而不是在空格和缩进上吝啬。

比较这两个例子!哪个代码读起来更好?


1)

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结构相同的计算。但我在某个地方听说,函数中的返回应该是一个。也许,这样做是为了不与他们混在一起。我没有严格遵守这一规则。

至于其他方面,我的方法与你非常接近,除了几个细节。

我更喜欢用同样的方式独自出门!

更容易控制


如果你想返回一个值,那么


而不是

如果 ( a > c )

返回(3)。

如果 ( l < b )

返回(5)。

...

...

如果 ( h != b )

返回(100)。

---

偏向于


如果 ( a > c )

codret=3。

如果 ( l < b )

codret=5。

...

...

如果 ( h != b )

codret = 100。


// 特别是在返回之前进行了一些所有输出所共有的额外操作的情况下

... 例如,在这里我们做一些其他的事情

retrun( codret)。

}


 

一点点评论...

为了将文本划分成块,我使用代码为U0151的一行字符。对于那些不知道的人,它是这样打的。

  1. 按住Alt键
  2. 在数字键盘上依次按下符号代码的数字0、1、5、1。
  3. 释放Alt

对于 "正确的 "字体,我们得到一个减号,但在两端没有 "空格"。 然后根据需要多次复制它,作为一个良好的视觉边界的实线...

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

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

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

 

也是评论文本 块的一个巧妙的分块线--它看起来完全对称,但有一个第一开端和一个第二结束的线。


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

多行注释块
...................

/*///-----------------------------------------

 

尤拉,你的例子有一个回报,当然,这是符合逻辑的。但要注意的是,在这种情况下,所有的if都会被运行,而不像有许多返回的情况下,当函数的退出是在达到条件的字符串后立即得到的。

ForexTools,谢谢你,我已经接受了你的设计理念。