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

 
Vladimir Simakov:
授業数のことです。それぞれ200行の長さです。
アクセスはどれくらい難しくなるのでしょうか?どこからでも見えるグローバルカーネルを持っています。OOPではあきらめるしかないでしょう。では、ウィンドウズでエレメントを扱うにはどうしたらいいのでしょうか?想像しようとすると昏倒してしまいます))
 
Реter Konow:
アクセスはどのくらい難しくなるのでしょうか?私はどこからでも見えるグローバルカーネルを持っています。OOPではあきらめるしかないでしょう。では、ウィンドウズでエレメントを扱うにはどうしたらいいのでしょうか?想像しようとすると昏倒してしまいます))

静的なクラスです。

 

Vladimir Simakov:
А теперь к эффективности. Switch - это что в конечном итоге? Это последовательное сравнение параметра с константами. Внимание Петр, последовательное.

は必要ありません。

これは、ピーターが正しいとか、スイッチをどこにでも置くべきだという意味ではなく、それにもかかわらず、です。

 
Alexey Navoykov:
はい、その通りです。ですから、スピードという点では、明らかにMQLの中で最速のオプションと 言えます。しかし、マネージド環境でのクラスオブジェクトへの アクセスは間接的なものです。
この度は、簡単な概要説明をありがとうございました。スイッチについて言ったことは撤回します。
 
Georgiy Merts:

そうなんです、この機能の詳細です。1つの巨大なスイッチで、十数種類の必要な機能の中から1つを選択するのです。このようなスイッチでは、誤ってどちらかのブランチに関連するコードを間違った場所に書いてしまうというミスが起こりやすいのです。

オーバーロードでは、物事はもっとシンプルになります。10種類の子孫があり、毎回ONEクラスで作業し、ONEオーバーロード可能な関数を持っています。そのために全く別のファイルを開かなければならないので、誤って別のクラスに書き込むことはできないのです。

さらに - この非常に巨大なスイッチにおけるパースそのものは、必要な1つのクラスを開いて、1つの関数だけをパースするよりも、ずっとストレスがかかると私は考えています。

実は、アセンブラコードでは、このスイッチの処理は、いずれにしてもこのポインタに依存して、同じスイッチになるのです。しかし、OOPの場合、これらはすべてプログラマーから隠されており、プログラマーの仕事を邪魔することはない。OOPがなければ-対処する必要があります。

大雑把に言うと、歩くと--結局、筋肉に一定の順序で信号を送って動かしているわけです。しかし、意識のレベルでは、どの動きをすればいいかを覚えているだけなのです。ここで、OOPとはまさにそのような「どのような動きをするかという記憶」のことです。 あなたは「筋肉がたくさんあって、そこに神経が配線されているのに、なぜ動きを記憶する必要があるのか理解できない」のですが、さて......。何度も言いますが、暗記力のある人は、どの筋肉をどの順番で緊張させればいいかを覚えていれば十分なんです。ムーブメントを全部覚えても意味がない。それほど多くのことを記憶できない他の人々にとっては、動作全体を記憶し、筋肉に何が起こっているのか、どの順番でどの程度緊張しているのか--それを頭から隠しておく方がよほど合理的なのです。

オーバーロードされた関数は、コンパイラにとっては単なる別の関数であり、スイッチもない。

 
Реter Konow:
また、アクセスはどのくらい難しくなるのでしょうか?私は、どこからでも見えるグローバルカーネルを持っています。OOPではあきらめるしかないでしょう。では、ウィンドウズでエレメントを扱うにはどうしたらいいのでしょうか?想像しようとすると昏倒してしまいます))

なぜ、そうしなければならないのか?

グローバルカーネルとOOPは相反するものではありません。

ただ、ウィンドウの要素はウィンドウクラスの中にカプセル化されるべきで、「平然と横たわっている」のではありません。ただ、うっかり「入れ違いで」なんてことがないように。ある変数を変更して、巨大なグローバル配列の中の位置を間違えることは非常に簡単です。一方、正しいインターフェースを問い合わせた後、正しいオブジェクトの中の同じ変数を変更して間違えることは非常に困難です。

 
Koldun Zloy:

オーバーロードされた関数は、コンパイラにとっては単なる別の関数であり、スイッチはない。

また、必要なものはどのように選ばれるのでしょうか?仮想関数と レイトバインドの話です。どのオーバーロードされた関数が呼び出されるのでしょうか?これは、呼び出すときに暗黙のうちに渡されるthisポインタによって決定される。また、この選択はどのようになされるのでしょうか?

 
Georgiy Merts:

また、欲しいものはどのように選ばれるのでしょうか?仮想関数と レイトバインドの話です。どのオーバーロードされた関数が呼び出されるのでしょうか?これは、呼び出しの際に暗黙的に渡されるthisポインタによって決定される。また、この選択はどのようになされるのでしょうか?

実は、ピーターが言っていたのは、仮想関数のことではありません。

でも、スイッチもないんですよ。

仮想関数を持つクラスは、仮想関数テーブルを持ちます。

そして、このクラスのすべてのオブジェクトは、暗黙の変数、つまり仮想関数テーブルへのポインタを含んでいます。

1つまたはすべての仮想関数が子孫でオーバーライドされた場合、新しいテーブルが作成され、子孫インスタンスにはそのポインタが含まれます。

 
Koldun Zloy:

実は、ピーターが言っていたのは、仮想関数のことではありません。

でも、スイッチもないんですよ。

仮想関数を持つクラスは、仮想関数テーブルを持ちます。

そして、このクラスのすべてのオブジェクトは、暗黙の変数、つまり仮想関数テーブルへのポインタを含んでいます。

1つまたはすべての仮想関数が子孫でオーバーライドされた場合、新しいテーブルが作成され、子孫のインスタンスはそれへのポインタを含みます。

その通りです。これと同じテーブルをどうやって使うのかってことです。 アセンブラコードでは、同じスイッチになっています。

あと、「仮想関数の 話をしない」というのは、「なぜOOPなのか」というのと同じようなものですが......。つまり、仮想関数に関するものであり、引数の異なる関数の単純な同一名に関するものではありません。

 
Georgiy Merts:

その通りです。そこで質問ですが、まさにこのテーブルはどのように機能するのでしょうか? アセンブラコードでは、同じスイッチになっています。

いいえ、これは関数へのポインタの配列にすぎません。

アセンブリコードは、オブジェクトからテーブルアドレスを取得します。

ある位置の関数のアドレスを取得します。

そして、そのアドレスへのジャンプが行われる。

仮想関数の 話はしていない」というのは、「なぜOOPなのか」ということなのですが...。つまり、仮想関数についてであり、単に同一の関数名で引数が異なるだけではないのです。

質問から察するに、同じ名前の関数のことを言っているのだろう。

本人は仮想機能すら意識していない可能性が高い。