コーディングスタイルについて - ページ 3

 

私は、機能を個別のアクションに分離する方が好きです。そうすれば、コードが明確な構造を持つようになり、最適化が容易になりますから...。

 
Mathemat >> :

基本的には、ネストされたif構文と同じ計算を行う通常のコードです。しかし、どこかで関数のreturnは1つであるべきだと聞いたことがあります。おそらく、それらに巻き込まれないようにするために行うのでしょう。私はこのルールを厳格に守っているわけではありません。

細かい点を除けば、私の考え方はC-4さんと非常に近いものがあります。


はい、そのような意見もあります。しかし、return演算子はGOTOと同じものではありません。実際には、予期せぬリターンスローに遭遇したことはない。逆に、このような演算子や条件を使うと、プログラムが読みやすくなり、質感が高まります(すべてのチェックが上から下へ一列に並ぶような形になっています)。また、if()演算子とは異なり、returnは関数の終了を保証するものであり、これはほとんどの場合において必要とされるものです。

 

最後の「『コピー&ペースト』操作は絶対にしない」というルールがとても気に入りました。しかし、残念ながら、私はそれに従わない。IDEエディタを使っていて、時間を短縮できる「Copy&Paste」を使わないのはどうしてですか?

そのため、論理的なミスを発見することが多く、なかなか捕捉できないことに気づかされます。

追伸:フォーラムエンジンは、私の最初の投稿からこの断片をフォーマットすることを許可していません。

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

最初の3行が違っていて、より構造化されているように見えますね。OK、有無を言わさず。


コメント機能

 

最近思いついた、自分のところですでに実践しているルールを紹介します。


1.グローバル変数(GV)は、コードの先頭ですべて宣言するのではなく、必要に応じて、それらを使用する対応する関数の前に宣言します。

2.また、各関数の前に、実際に呼び出されたときに、どのGPを利用し(入力)、どのGPを修正するか(出力)を記述しています。そして、機能の後に、どのGPが使われなくなるのかも説明することができます。

3.これらのコメントと、関数間の空の区切り線、「関数の長さは20行以内」という制限により、コードファイルのサイズは1.5〜2倍になります。 コンパイルが難しくなるわけでもなく、そのために紙面を割いているわけではありません。

4.GPは何のためにあるのか?関数foo( ..., <type>& variable )で、ある複雑な型の変数を参照渡しで計算したとする。そして、この変数をさまざまなコード断片で繰り返し使用すると、その都度foo( )関数を呼び出さなければならなくなります。この変数の評価には毎回時間がかかりますが、変数を使用する各関数には(変数宣言と関数呼び出しの)2行が追加されているので、問題ないようです。なぜ?foo()関数の使用頻度が高くなりすぎるだけでなく、関数呼び出しの構造も壊れ、ユーザーfoo()関数が「カテゴリ外」になり、その呼び出しも非階層的になってしまうからです。変数を "out of category "変数、つまりグローバル変数として宣言するのは簡単です。

個人的には、このような疑問のあるコードの再利用よりも、厳密な階層化された機能の方が好ましいと思います。階層性についてはすでに述べたとおり、n次の各関数は、(n-1)次の関数と「自分自身の」関数のみから呼び出されます。上の緑色の背景の写真で、機能の階層を説明した例をご覧ください。

5.しかし、もちろん、階層的な意味で最適なコードになるとは限らず、時には「異質な」関数を呼び出さなければならないこともある。この場合、関数階層におけるその場所を、「alien」関数名の前に /* */ という括弧で記述することができる。


このようなことは愚かで過剰なことかもしれませんが、おそらく何度も編集しなければならないコードを書いていることは重々承知しています。ここでは、コメントや構成で自分を安心させる方がいいと思います。

 
Vinin >> :
機能の大きさについて。一画面に収まるような機能を心がけています。全体を見渡せるように

ソースコードをブロック単位で修正できるように、また、追加や変更に便利なようにコードを書くようにしています。

コメントはコードサイズの30%以上でなければならない

(80xでUNIX系OSのソースコードを見て覚えた、RT11)

半年後には忘れているようなコードも、修正する必要があれば、コメントですぐに理解できます

(5年ぶりに自分のコードを読み返したときに、本番環境で実際に体験しました)

一日で全部覚えて、夕方までに変更しました。)

私は、読みやすさを重視して、スペースやインデントを省略しないようにコードを配置するようにしています。

2つの例を比べてみてください!どちらのコードがより読みやすいですか?


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構文と同じ計算を行う通常のコードです。しかし、どこかで関数のreturnは1つであるべきだと聞いたことがあります。おそらく、それらに巻き込まれないようにするためにやっているのでしょう。私はこのルールを厳格に守っているわけではありません。

あとは、細かいところを除けば、私のやり方はあなたと非常に近いです。

私も同じように一人で出かける方が好きです

制御しやすい


もし、値を返したい場合は


代わりに

if ( a > c )

を返します( 3 )。

if ( l < b )

を返す(5)。

...

...

if ( h != b )

を返す(100)。

---

好む


if ( a > c )

codret = 3;

if ( l < b )

codret = 5;

...

...

if ( h != b )

codret = 100;


// 特に,return の前にすべての出力に共通する追加操作を行う場合.

... 例えば、ここでは別のことをします。

retrun( codret);

}


 

ちょこっと解説...

テキストをブロックに分割するために、私はコードU0151の文字列を使用しています。ご存じない方のために、このように入力されています。

  1. Altを押しながら
  2. 数字キーボードで、シンボルコード0→1→5→1の順に押します。
  3. リリース Alt

正しい」フォントの場合、マイナス記号が付きますが、両端には「スペース」がありません。それを必要なだけコピーして、視覚的に良い境界線として機能する実線に します...。

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

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

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

 

また、コメント欄のテキスト ブロックも巧妙に分割されています。完全に左右対称に見えますが、最初に開く行と2番目に閉じる行があるのです。


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



複数行コメントブロック
...................................................................................................

 

由良 1回で返すという例は、もちろん論理的です。しかし、この場合、returnが多い場合とは異なり、条件を満たす文字列に到達した直後に関数から抜けるため、すべてのifが常に実行されることに注意してください。

ForexTools さん、ありがとうございます。デザインのアイデアを取り入れました。