ラウンジでPLOについて語る - ページ 5

 
Alexey Volchanskiy:

みんなの様々な興味を読んで...私は今、仮想 グリッドの公開と制御の ためのクラスを再設計しているんだ、必要なんだ。

そして、コピーコンストラクタと代入演算子で2日間格闘しています。データ・メンバがポインタ形式になっている複雑なクラスなのですが......。

 
Dennis Kirichenko:

コピーコンストラクタと代入演算子で2日ほど格闘しています。ポインタ形式のデータ・メンバを持つ複雑なクラスがある...。

私はとても原始的なことを書いているようです...。

 
Dennis Kirichenko:

関数へのポインタを使用 することができます。

仮想関数でそのように動作するのでしょうか?

そして、私は内部的に関数ポインタが嫌いでした。 純粋なC言語で作業していたとき、なぜ関数ポインタが使われていたのか、今となっては覚えていません。しかし、C++に切り替えたとき、私は何らかの理由でそれらを手放さなければなりませんでした。そして、その時以来、使っていないのです。ポインタ - オブジェクトへのポインタでなければならない。

しかし、「絶対に正しい」と言い切るつもりはない。私の中には、古い時代のオールドスクールな経験がたくさん詰まっているというのは、納得です。

 
fxsaber:

私はとても原始的なことを書いているようです...。

遠慮しないでください。

あなたの名人芸ともいえる定義づけには、誰もかなわないでしょう。

 
George Merts:


...私の場合、この機能は次のようになります。

int CFactoryBalanceResultSeries::Compare(const CObject *poNode,const int iMode) const
{
   CFactoryBalanceResultSeries* pfdsAnother = CONVERT_OBJECT_WITH_CHECK(poNode,CFactoryBalanceResultSeries,MOT_FACTORYBALANCERES_SERIES);
   
   switch(iMode)
      {
      case FSM_BY_PART_OF_MAX_DD_A:    return(_CompareByPartOfMaxDDWith(pfdsAnother,true));
      case FSM_BY_PART_OF_MAX_DD_D:    return(_CompareByPartOfMaxDDWith(pfdsAnother,false));

      case FSM_BY_PART_OF_MAX_SLQUEUE_A: return(_CompareByPartOfMaxSLQueueWith(pfdsAnother,true));
      case FSM_BY_PART_OF_MAX_SLQUEUE_D: return(_CompareByPartOfMaxSLQueueWith(pfdsAnother,false));

      case FSM_BY_LAST_PRCDATA_A:      return(_CompareByLastPrcdataWith(pfdsAnother,true));
      case FSM_BY_LAST_PRCDATA_D:      return(_CompareByLastPrcdataWith(pfdsAnother,false));
      case FSM_BY_LAST_MNYDATA_A:      return(_CompareByLastMnydataWith(pfdsAnother,true));
      case FSM_BY_LAST_MNYDATA_D:      return(_CompareByLastMnydataWith(pfdsAnother,false));
      case FSM_BY_LAST_MNYLOTDATA_A:   return(_CompareByLastMnylotdataWith(pfdsAnother,true));
      case FSM_BY_LAST_MNYLOTDATA_D:   return(_CompareByLastMnylotdataWith(pfdsAnother,false));
      
      case FSM_BY_PRCYEARRECOVERY_A:   return(_CompareByYearPrcrecoveryWith(pfdsAnother,true));
      case FSM_BY_PRCYEARRECOVERY_D:   return(_CompareByYearPrcrecoveryWith(pfdsAnother,false));
      case FSM_BY_MNYYEARRECOVERY_A:   return(_CompareByMnyYearRecoveryWith(pfdsAnother,true));
      case FSM_BY_MNYYEARRECOVERY_D:   return(_CompareByMnyYearRecoveryWith(pfdsAnother,false));
      case FSM_BY_MNYLOTYEARRECOVERY_A:return(_CompareByMnylotYearRecoveryWith(pfdsAnother,true));
      case FSM_BY_MNYLOTYEARRECOVERY_D:return(_CompareByMnylotYearRecoveryWith(pfdsAnother,false));
      
      case FSM_BY_PRCVAR_A:            return(_CompareByPrcVarWith(pfdsAnother,true));
      case FSM_BY_PRCVAR_D:            return(_CompareByPrcVarWith(pfdsAnother,false));
      case FSM_BY_MNYVAR_A:            return(_CompareByMnyVarWith(pfdsAnother,true));
      case FSM_BY_MNYVAR_D:            return(_CompareByMnyVarWith(pfdsAnother,false));
      case FSM_BY_MNYLOTVAR_A:         return(_CompareByMnylotVarWith(pfdsAnother,true));
      case FSM_BY_MNYLOTVAR_D:         return(_CompareByMnylotVarWith(pfdsAnother,false));
      
      case FSM_BY_PRC_GRAILRATIO_A:    return(_CompareByPrcGrailratioWith(pfdsAnother,true));
      case FSM_BY_PRC_GRAILRATIO_D:    return(_CompareByPrcGrailratioWith(pfdsAnother,false));

      case FSM_BY_MAGIC_A:             return(_CompareByMagicWith(pfdsAnother,true));
      case FSM_BY_MAIGC_D:             return(_CompareByMagicWith(pfdsAnother,false));
      default:
         break;
      };
         
   return(NULL);
};

Georgeさん、_CompareByPrcVarWith()がクラスメソッドなのか、普通の関数なのか、ここではわからないですよね、例えば。C++では、クラスメソッドへのポインタが存在する。そこには、彼らなりのこだわりがあるのです。正直なところ、私はMQL5でこのようなポインタを使った試しがありません。

でも、コード構造を改善するための予備はまだあると思うんです。

結局のところ、関数とは何なのか?

FUNCTION(lat.functio, "execution, performance; duty") とは、一方の変化が他方の変化を伴うような要素間の関係の ことである。

何かをするための機能です。同じ動作は、1つの関数本体にまとめる。

あなたの例では、明らかに、関数

_CompareByPartOfMaxDDWith() を使用します。

_CompareByPartOfMaxSLQueueWith() を使用します。

_CompareByLastPrcdataWith() を使用します。

_CompareByLastMnydataWith() など。

は、COMPARISEを行い、この比較の結果を出します。名称が異なります。イマイチ、実践できていない。パラメータで差別化する必要がある。

だから全ての機能を1つにまとめるか、仮想メソッド、テンプレートメソッドにするのが良いと思うのですが。当然ながら、クラスは「親子」の階層に従わなければなりません。

一般に、複雑なコードを書くのは非常に簡単 で、単純なコードを書くのは非常に難しいと 言われています。

 
Dennis Kirichenko:

Georgeさん、_CompareByPrcVarWith()がクラスメソッドなのか、普通の関数なのか、ここではわかりませんね。C++では、クラスメソッドへのポインタがあります。そこには、彼らなりのこだわりがあるのです。正直なところ、MQL5でこのようなポインタを使った試しはない。

これ(およびアンダースコアで始まるすべて)は、クラスの保護された関数である。

ARRANGEMENTを行い、この比較の結果を出す。名称が異なります。イマイチ、実践できていない。パラメータが違う方がいいんです。

だから全ての機能を1つにまとめるか、仮想メソッド、もしくはテンプレートメソッドにするのが良いと思います。当然ながら、クラスは「親子」の階層に従わなければなりません。

まあ、全部が一つに統合されているんですけどね~。

Compare()という関数が1つだけありますが、これは渡されたキーと比較を行う必要があります。それに対応して、特定のプロテクター機能を一つ選びます。そのため、ユーザーがアクセスできないように保護(プロテクト)されています。Compare()からしか呼び出されないので、下線で表示されているのです。

アンダースコアで始まる関数は、ユーザーから呼び出されることを想定しておらず、クラス内の特定のタスクにのみ使用されます。アクセスは制限されています。

 
Dennis Kirichenko:

コピーコンストラクタと代入演算子で2日ほど格闘しています。ポインタ形式のデータ・メンバを持つ複雑なクラスがある...


デニスは、「人それぞれ、いろいろなアプローチがある」ということを言いたかったのです。実は、昨日このスレッドを開いたとき、「a-a-a OOPは非常に複雑だ、SBは恐ろしいブラックボックスだ」というような昨日の愚痴が登場するのかどうか、興味があったのです。来なかったのだから、当然である。

しかし、人が出てきて、それぞれ違ったアプローチをしています。これは、レナトが盛んに語る共通プロジェクトという 観点からも興味深いことです。

ZS:プロジェクトでの共有はまだうまくいきません、最近試してみました。

 
George Merts:

これ(およびアンダースコアで始まるものすべて)は、クラスのプロテクション機能です。

まあ、ひとつに統合されたわけですからねー。

Compare()という関数が一つだけありますが、これは渡されたキーに対して比較を実行しなければなりません。それに応じて、特定の抗議された関数のうちの1つが選択される。そのため、ユーザーがアクセスできないように保護(プロテクト)されています。下線で示したCompare()からしか呼び出されないのです。

アンダースコアで始まる関数は、ユーザーから呼び出されることを想定しておらず、クラス内の特定のタスクにのみ使用されます。アクセスは制限されています。


たくさんの _CompareXXX() メソッドがある場合、どのようにマージされるのですか?そして、私の理解では、1があるはずです。

質問 例えば、_CompareByPartOfMaxDDWith() メソッドは、CFactoryBalanceResultSeries::Compare()以外の場所で呼び出されて いますか?

 
Dennis Kirichenko:

多くの _CompareXXX() メソッドがある場合、どのようにマージするのですか?そして、私の理解では、1があるはずです。

質問 例えば、_CompareByPartOfMaxDDWith() メソッドは、CFactoryBalanceResultSeries::Compare()以外の場所で呼び出されて いますか?

CompareXXX()メソッドだけであれば、本来のCompare()仮想関数と何ら変わりはありません。

ポイントは、_CompareBy...()メソッドはメインのCompare()からしか呼ばれないという点です。そして、冒頭のアンダーラインはそのことを警告しているのです。

Compare()一般メソッドは、2つのオブジェクトへのポインタと、比較を指定するキーを受け付けます。この一般的な方法では、鍵が分析され、その後、1つの鍵だけを比較するように設計された特定の方法が呼び出されます。また、これらのメソッドは、渡された2つのオブジェクトのキーの値を計算し、キーがint、double、bool、stringのいずれであるかによって、具象型の比較のメソッド(これもprotected)が呼び出されるようになっています。

すべてのメソッド _CompareBy...() - 1つの関数で記述することができました。しかし、そうするとコードの可読性が悪くなると私は考えています。

 
George Merts:

もし、_CompareXXX()メソッドが1つしかなければ、本来のCompare()仮想関数と変わりません。

ポイントは、_CompareBy...()メソッドはメインのCompare()からしか呼ばれないという点です。そして、冒頭のアンダーラインはそのことを警告しているのです。

Compare()一般メソッドは、2つのオブジェクトへのポインタと、比較を指定するキーを受け付けます。この一般的な方法では、鍵が分析され、その後、1つの鍵だけを比較するように設計された特定の方法が呼び出されます。そして、これらのメソッドはそれぞれ、渡された2つのオブジェクトのキーの値を計算し、キーがint、double、bool、stringのいずれであるかに応じて、具象型の比較のメソッド(これもprotected)と呼ばれるものである。

すべての _CompareBy...() メソッドを1つの関数で記述することができます。でも、そうするとコードの可読性が悪くなると私は思っています。


おっしゃることはよくわかります。好みの問題でしょうね。でも、私なら全部1つの手法でやりますね。特に、protected および private メソッドがCompare() 以外に呼び出されない場合。