OOPの専門家に質問です。 - ページ 6

 
Реter Konow:

このコードはポータブルではない、それがその特殊性です。持ち運びを想定したものではありません。もうひとつの目的があります。さて、変数のグローバルスコープは、複雑な機構を実装するための強力なツールです。使いこなせればいいんです。隠れたエラーやバグについて言われると、混乱してしまいます。グローバル変数の可視化に関連するバグが発生したことはありません。一言で言えば、「全然ダメ」です。

グローバル変数の問題は、プロジェクトが十分に大きく、これらの変数の状態の変化がコードの多くのセクションから来る場合、バグを探すのにかなり時間がかかるということです。

グローバル 変数の値が明らかにあるべき値でないため、バグが発見される。プロジェクトには数十個のファイルと100500行のコードラインがあります。この変数がいくつのコードフラグメントを変化させたか、誰も覚えていない。その結果、キーボードに頭を突っ込んだまま、ジャージャーとコーヒーを飲んで熟睡してしまうのです。

そして今度は同じものを、OOPで。コードは正しく記述されており、すべてのフィールドはプライベートです。従って、直接変更するのはクラスメソッドのみで、外部から変更するのはSetメソッドのみとなります。従って、Setメソッドやクラス内に何個あるメソッドのうち、フィールドが変更されたところにブレークポイントを置くと、どこで変更されたのか、どこで間違って変更されたのかを簡単に追跡することができます。

 
Реter Konow:

グローバル変数の可視化に関連するバグが発生したことはありません。そんなことはありません。

私は、明白なことをどうやって納得させたらいいのかさえわからないのですが、おそらく、そのためにお金をもらっているわけではないので、やめたほうがいいでしょうね。

何をしようとしてるんですか? まあ、褒められたいならどうぞ。

ピーター!よくやった!その調子だ

))))

 
Vladimir Simakov:

グローバル変数の問題は、プロジェクトが十分に大きく、これらの変数の状態の変化がコードの多くのセクションから来る場合、バグを探すのにかなり時間がかかるということです。

グローバル 変数の値が明らかにあるべき値でないため、バグが発見される。プロジェクトには数十個のファイルと100500行のコードラインがあります。この変数がいくつのコードフラグメントを変化させたか、誰も覚えていない。その結果、キーボードに頭を突っ込んだまま、ジャージャーとコーヒーを飲んで熟睡してしまうのです。

そして今は、同じものでもOOPになっています。コードは正しく記述されており、すべてのフィールドはprivateです。したがって、クラスメソッドの中だけで直接変更され、外からはSetメソッドによってのみ変更されます。従って、Setメソッドやクラス内にいくつのメソッドがあるか、フィールドが変更されたところにブレークポイントを置き、どこで変更されたのか、どこで間違って変更されたのかを簡単に追跡できるようにしています。

練習から。私のプロジェクトには、100以上の接続ファイルがあります。中には2000行以上のコードを持つものもあります。グローバル変数はあらゆるところで使われています。 グローバル化に関連したバグは一度もありませんでした。適応してしまっただけかもしれませんが))変数がすべてロシア語で、名前もすべて意味のあるものなので、バグがないのかもしれません。sdfやiukjはありません。したがって、それらに関連するエラーはありません。一般に、グローバル変数は、例えば、ウィンドウを開く、マウスボタンをクリックする、古代のリストを展開する、などのグローバルなイベントフラグに使用されます....また、ピント合わせにも。つまり、マウスでGUIを走査し、すべてのオブジェクトや要素の番号とそのプロパティをグローバル変数に書き込み、OnChartEventから必要なブロックを呼び出し、フォーカスされているオブジェクトや要素に対して即座に動作させるのです。これはとても便利です。
 
Igor Makanu:

私は、明白なことをどうやって納得させたらいいのかさえわからないのですが、おそらく、そのためにお金をもらっているわけではないので、やめたほうがいいでしょうね。

何をしようとしてるんですか? まあ、褒められたいならどうぞ。

ピーター、よくやった

))))

何も達成できていない。まあ、OOPだけでなく、クールなプロジェクトが 書けるということを理解したのかもしれませんね。また、開発者の証はOOPをマスターしていることだけではありません。OOPで多くのタスクを解決できることは論外です。しかし、それ以外のアプローチもあります。
 
皆さん、議論に参加していただき、ありがとうございました。私は、2つのアプローチの能力を本当に比較するために、OOPに手を出すつもりです。私はOOPが提供できる階層に興味があり、その有用性が構文に埋もれていないのであれば、ぜひ採用したいと思っています。
 
Реter Konow:
まあ、OOPだけでなく、クールなプロジェクトが書けるという事実も理解しているのかもしれませんね。また、OOPに精通していることだけが開発者の証ではありません。OOPで多くのタスクを解決できることは論外です。しかし、それ以外のアプローチもあります。

OOPの話ではなく、コードの書き方の原則そのものの話です。この話は2回目で、@Vladimir Simakovが 上に例を書いています。

グローバル変数の可視化を使用したい場合 - 問題ありません、誰もそれを禁止していません。)))

しかし、プログラムを書くための恒久的なスタイルとしては悪であり、コードが多ければ多いほど、この悪も多くなる! - そう説明されましたか?)

SZY:もう1つテストショットです。MQLのヘルプを見ると、すべての機能が独立した完全なユニットとして作られていることがわかりますか?- パラメータを渡す=結果が出るMetakvotのプログラマーがまた間違ったことをしているとでも? 関数の書き方は自由であるべきだ。ここではグローバルスコープで、ここではユーザーが関数を呼び出して結果を得るのだ!」。))))- 手続き型(各サブルーチンが完全な論理ブロックである)正しいコードである、コードを正しく書く! 右ではない...まあ、「早く必要なときに」勝手にやってくるんですけどね(笑)。

 
Реter Konow:
練習から。私のプロジェクトには、100以上の接続ファイルがあります。中には2000行以上のコードを持つものもあります。グローバル変数はあらゆるところで使われています。グローバル化に関連したバグは一度もありませんでした。私が適応しただけかもしれませんが...))

あなたは記憶力がいいだけで、誰もがそんな幸運に恵まれているわけではありません。もう、今日入力した変数がどれだったか、かすかに覚えています。1週間前のものはどれだか覚えていない。しかし、それは問題ではありません。それらはすべてローカルで、どのオブジェクトのフィールドへのアクセスも、適切な関数を通じてのみ可能です。理想を言えば、コードのどの場所でも、必要なものだけにアクセスでき、それ以上の変数にはアクセスできないようにすることです。そして、本当に必要なときには、変数に アクセスできない理由を考えなければなりません。それは単なる見落としであったり、もっと頻繁に、変更するために追加作業が必要な変数であったりします。すぐに使えるとなると、忘れてしまい、なぜプログラムが動かないのか、思い通りに動かないのか、その原因を探るのに長い時間がかかってしまうのです。

 
Реter Konow:
何かを成し遂げようとするわけではありません。まあ、OOPだけでなく、クールなプロジェクトが書けるということを理解したのかもしれませんね。また、開発者の証はOOPをマスターしていることだけではありません。OOPで多くのタスクを解決できることは論外です。しかし、それ以外のアプローチもあります。

もう一つ、OOPの良いところは、クラスライブラリ、特に本当に普遍的なライブラリを徐々に獲得していくことで、それが一生残り、この生活を円滑にすることです。

実際のプロジェクトからは、本当に効果がある。ここでは面倒な作業はなく、注文可能なオーダー/ポジションの数と状況を監視するだけです。この関数は、ポジション/オーダーがクローズ/キャンセルされていないことを制御し、クローズ後にリストから削除することのみを行います。

void OrdersControl(){
   for (CTrade* it=gPos.Begine();
        it!=NULL;
        it=it.Control()?gPos.Next():gPos.Delete());}

gPosがCList<CTrade> gPosである場合。

CListとCTradeは標準ライブラリの ものではありません。

CTradeは私自身のライブラリCPositionから継承しています。

実際には、以下のように、プロジェクトのコードを読みやすくするために必要なすべてのCTradeがあります。

#include "..\Header.mqh"

#ifndef _C_TRADE_
#define _C_TRADE_

#include "..\..\..\Shared Projects\mqlLib\Objects\Trade\CPosition.mqh"

class CTrade:public CPosition
  {
public:
                     CTrade(double mVolume,int mDirect,double mSL,double mTP);
   bool              Control() {return !( CPosition::Control()&TRADE_FINISH);}
  };
//-------------------------------------------------------------------------------------
void CTrade::CTrade(double mVolume,int mDirect,double mSL,double mTP):
   CPosition(NULL,
             mDirect>0?OP_BUY:OP_SELL,
             mVolume,
             0.0,
             mSL,
             mTP)
{}

#endif
オーダー/ポジション処理の実装全体は、クロスプラットフォームのCPositionライブラリファイルの中に隠されています。
 
Реter Konow:
皆さん、議論に参加していただき、ありがとうございました。この2つのアプローチの能力を本当に比較するために、私はOOPを掘り下げてみるつもりです。私はOOPが提供できる階層に興味があり、その有用性が構文に埋もれていないのであれば、必ず採用するつもりです。

YouTubeで自分を助ける。たくさん載っていますね。特に英語は得意でしょう。


45分を惜しんではいけないよ、ピーター。最初に、この人が何を言っているのかを理解することが非常に重要です。多くの人が反論するだろうが、一般的には彼の言うとおりである。


 
Nikolai Semko:

YouTubeで自分を助ける。たくさん載っていますね。特に英語は得意でしょう。


45分を惜しんではいけないよ、ピーター。最初に、この人が何を言っているのかを理解することが非常に重要です。多くの人が反論するだろうが、一般的には彼の言うとおりである。


ニコライさん、ありがとうございます。これからも注目です。