kodlama stili hakkında - sayfa 3

 

Kodun net bir yapıya sahip olması için fonksiyonları ayrı eylemlere ayırmayı tercih ediyorum .. optimize etmek daha kolay ..

 
Mathemat >> :

Prensipte, iç içe if yapısıyla aynı hesaplamaları yapan normal kod. Ama bir yerde bir fonksiyonda sadece bir dönüş olması gerektiğini duydum. Muhtemelen, içlerinde kafa karıştırmamak için. Bu kurala kesinlikle uymuyorum.

Aksi takdirde, yaklaşımım birkaç ayrıntı dışında sizinkine çok yakın, C-4.


Evet, böyle bir görüş var. Ancak return ifadesi GOTO ile aynı değildir. Pratikte hiç beklenmedik dönüş atışlarıyla karşılaşmadım. Aksine, bu tür operatörleri ve koşulları kullanan bir program daha okunabilir ve yapılandırılmış hale gelir (tüm kontroller sırayla yukarıdan aşağıya doğru gider, adeta bir sütun oluşturur). Ek olarak, if ()'den farklı olarak return ifadesi, işlevden bir çıkışı garanti eder ve çoğu durumda tam olarak ihtiyaç duyulan şey budur, çünkü bir koşul karşılanmazsa verileri daha fazla hesaplamanın bir anlamı yoktur.

 

Son kuralı gerçekten beğendim: "Asla "kopyala ve yapıştır" işlemini kullanmayın." Ama ne yazık ki onu takip etmiyorum. Peki, geliştirme ortamı düzenleyicisini kullanmak ve çok zaman kazandıran "Kopyala ve Yapıştır" kullanmamak nasıl mümkün olabilir?!

Hayır, kurtarmadığı ortaya çıktı: Tam olarak bu nedenle, sık sık yakalanması zor mantıksal hatalar bulduğumu fark ettim.

Not: Forum motoru ilk mesajımdan bu parçayı biçimlendirmenize izin vermiyor

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

tam olarak benim yaptığım gibi: ilk üç satır bana daha farklı, daha yapılandırılmış görünüyor. Tamam, yıkayarak değil, patenle:


İşlevleri nasıl yorumlayabilirim?

 

İşte son zamanlarda aklıma gelen ve evimde uyguladığım birkaç kural daha:


1. Global değişkenler (GP), kodun başında değil, gerektiğinde, onları kullanan ilgili işlevlerden önce bildirilir.

2. Ayrıca, her işlevden önce, gerçekte çağrıldığında hangi GPU'ları kullandığını (girişler) ve değiştirdiğini (çıkışlar) açıklıyoruz. Ve fonksiyondan sonra artık hangi GPU'nun kullanılmayacağını da açıklayabilirsiniz.

3. Tüm bu yorumlar, işlevler arasındaki boş ayırıcı satırlarla ve hatta "fonksiyon uzunluğu 20 satırdan fazla olmayan" kısıtlamasıyla birlikte, kod dosyasının boyutunu 1,5-2 kat artırır. Derlerken daha da zorlaşmıyor ve burada bundan tasarruf edecek kağıt yok.

4. KİT'ler ne işe yarar? Diyelim ki foo( ..., <type>& değişken ) işlevinde bazı karmaşık türde değişkenleri değerlendirerek, onu referansla iletelim. Ardından, bu değişkeni kodun farklı bölümlerinde tekrar tekrar kullanırsak, her seferinde foo( ) işlevini çağırmak zorunda kalacağız. Korkunç bir şey yok gibi görünüyor - bu değişkeni hesaplamak için her zaman harcadığımız ve hatta değişken kullanan her işlevde bile birkaç satır ekliyoruz (değişken bildirimine ve işlev çağrısına). Ne için? Buna kodun yeniden kullanımı denirse , o zaman bir şekilde optimal değildir: foo( ) işlevini çok sık kullanmanın yanı sıra, kullanıcı tanımlı foo( ) işlevini bir işlev "out" haline getirerek işlev çağrılarının yapısını da bozarız. kategoriler" ve çağrıları hiyerarşik değildir. Değişkeni "kategori dışı" bir değişken olarak bildirmek daha kolaydır, yani. küresel.

Şahsen, bu tür şüpheli kod yeniden kullanımına katı bir işlevler hiyerarşisini tercih ederim. Hiyerarşi hakkında zaten konuştum: çağrının n'inci sırasının her işlevi, yalnızca (n-1)-inci sıranın işlevi ve yalnızca "kendisi" tarafından çağrılır. Yukarıdaki yeşil arka plan resminde işlev hiyerarşisini açıklayan örneğime bakın.

5. Ancak, elbette, kod hiyerarşi açısından her zaman optimal değildir ve bazen "yabancı" işlevleri çağırmanız gerekir. Bu durumda, "yabancı" işlevin adından önce, işlevler hiyerarşisindeki yerini parantez /* */ içinde girebilirsiniz.


Belki tüm bunlar saçmalık ve aşırılıktır, ancak açıkça biliyorum ki, yüksek olasılıkla birden fazla kez düzenlenmesi gerekecek bir kod yazıyorum. Burada, bence, yorum ve yapı açısından güvenli oynamak daha iyidir.

 
Vinin >> :
İşlev boyutu. Fonksiyonu bir ekrana sığdırmaya çalışıyorum. Hepsini görebilmek için.

Kaynak kodu bloklar halinde düzenlenebilecek ve ekleme ve değiştirme kolaylığı sağlayacak şekilde yazmaya çalışıyorum.

yorumlar kod hacminin en az %30'u kadar olmalıdır

(Bunu 80x'te UNIX işletim sistemlerinin kaynak kodlarına bakarak öğrendim, RT11)

yarım yıl içinde kod unutulacak - düzeltmeniz gerekiyorsa - yorumlar konuya hızlı bir giriş sağlar

(üretimde gerçek bir deneyim olduğu için - 5 yıl sonra kendi kodumu okuduğumda

Yorum sayesinde bir günde her şeyi hatırladım ve akşam değişiklik yaptım)

Kodu okunabilirlik için hizalamaya çalışıyorum, boşluklardan ve girintilerden tasarruf etmiyorum

iki örneği karşılaştırın! hangi kod en iyi okur?


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("Наконец-то дошли!");

Prensipte, iç içe if yapısıyla aynı hesaplamaları yapan normal kod. Ama bir yerde bir fonksiyonda sadece bir dönüş olması gerektiğini duydum. Muhtemelen, içlerinde kafa karıştırmamak için. Bu kurala kesinlikle uymuyorum.

Aksi takdirde, yaklaşımım birkaç ayrıntı dışında sizinkine çok yakın, C-4.

Ben de aynı yolu tercih ederim!

kontrolü daha kolay


Bir değer döndürmek istiyorsanız, o zaman


yerine

eğer ( a > c )

dönüş(3);

eğer (l <b)

dönüş(5);

...

...

eğer ( h != b )

dönüş(100);

---

tercih


eğer ( a > c )

kodet = 3;

eğer (l <b)

kodet = 5;

...

...

eğer ( h != b )

kodet = 100;


// özellikle tüm çıkışlar için ortak olan bazı ek işlemler dönüşten önce yapılırsa

... örneğin, burada başka bir şey yapıyoruz

geri çalıştırma(koderet);

}

 

yorum alanından biraz...

metinleri bloklara ayırmak için U0151 kodlu bir karakter satırı kullanıyorum. Bilmeyenler için - şöyle yazılır:

  1. Alt tuşuna basın
  2. sayısal tuş takımında, sırasıyla 0, ardından 1, ardından 5 ve 1 karakter kodunun sayılarına basın.
  3. Alt'ı serbest bırak

"doğru" yazı tipleri için bir eksi işareti elde edilir, ancak uçlarda "boşluk" yoktur. daha sonra gerekli sayıda kopyalayıp yapıştırın, iyi bir görsel işaret görevi gören düz bir çizgi elde edilir ...

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

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

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

 

yorum metni bloğu için başka bir zor satır - kesinlikle simetrik görünüyor, ancak ilk açılış ve ikinci kapanış var:


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

çok satırlı yorum bloğu
...................

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

 

Yura , tek dönüşlü örneğiniz elbette mantıklı. Ancak, bu durumda tüm if'lerin her zaman geçtiğine dikkat edin - birçok dönüşün aksine, fonksiyondan çıkış, koşullu satıra ulaşıldığında hemen elde edildiğinde.

ForexTools , teşekkürler, tasarım fikirlerinizi benimsedim.

Neden: