-2

このコードを見てください:

#include <framework_i_hate.h>
int main() {
  XFile file("./my_file.xxxx", "create");
  XObject object("my_object");
  // modify the object
  object.Write();
}

保存される場所を推測してみてくださいobject... はい、あなたはそれを推測しました。これは魔法すぎると思います。 のようなものを書きたいobject.Save(file)のですが、必須ではありません。明らかに、コンストラクターframework_i_hate.h中に変更されるグローバル変数が内部にあります。fileコンストラクター内のこの副作用についてどう思いますか?

この動作をどのように隠すことができますか?

フレームワークを推測する人へのボーナス。

4

3 に答える 3

3

投稿を理解するのが非常に混乱しており、最後の質問は非常に修辞的です。グローバル変数は悪です。他に何を追加しますか?

于 2010-09-07T20:19:05.617 に答える
2

これについて言えることは、まだ十分に明らかではありません: これはかなり厄介な副作用です。

  • 結果として生じる動作は予期せぬものであり、そのフレームワークを十分に理解していない限り、まったく予測できません。

  • グローバルなプログラム状態は、通常、オブジェクト指向プログラミングではお勧めできません。(実際、グローバル状態はおそらく決して良い考えではないので、できれば避けるのが最善です。)

  • このフレームワークもスレッドセーフではない可能性が高いです。XFile(2 つの並行スレッドが両方ともオブジェクトを作成し、これらのスレッドの 1 つが ... を書き込むとどうなるか考えてみてください。それはXObjectどこに保存されるのでしょうか?)

このスレッドは .NET に関するものではなく、C++ に関するタグが付けられていますが、私はこの「アンチパターン」を以前に見たことがあります。これは、それほど深刻ではなく、より健全な形式、つまり DB トランザクション スコープを使用したものです。

于 2010-09-07T20:19:38.820 に答える
1

私は、XFile と XObject の関係が明示されていることを望んでいますが、この「魔法」が隠されすぎていることに同意します。また、名前が重要な API の他の部分がない限り、なぜオブジェクトに名前が付けられているのか疑問に思います。

グローバル変数は多くの理由で軽視されていますが、これはほんの一例です。

于 2010-09-07T20:24:31.653 に答える