2016-06-01 13 views
1

私のクラスには3つの状態があります。各状態では、何らかの仕事をして、他の州に行くか、または同じ州に留まります(95%以上のケースでは、同じ州にとどまります)。私は状態パターンを実装することができます(私はあなたがそれを知っていると仮定します)。「状態パターン」と「状態ごとに1つのメンバ関数」を比較しますか?

私は、状態毎のメンバ関数と、現在の状態関数を指すメンバ関数へのポインタも持っています。私が別の状態に行きたい状態になったら、その関数ポインタを別の状態関数にポイントするだけです。 (これは状態パターンと完全には同じではないかもしれませんが、私の場合はうまくいきます)。

これらの2つの方法はほぼ同じですと思います。

だから、私の質問は以下のとおりです。

  1. ソリューションが優れている(ものに依存しますか)?
  2. 州ごとにクラスを宣言することは価値がありますか(関数は1つだけです)?私は人工的だと思う。
  3. パフォーマンスについてはどうですか?状態クラスの新しいオブジェクトを作成していません(状態パターンの場合)。あなたがオブジェクトかどうかのプライベートメンバにアクセスする必要がある場合、それが依存
+0

あなたのコードが動作している場合は、コードレビューは、おそらくそれのための適切な場所である。 –

+0

私の質問があります私のコードには接続されていません。 – user1289

+0

閲覧/投稿を検討するプログラマーボード –

答えて

1

あなたは本当にあなたのプログラムを実行するの下に制約を言及していないので、それは特に、他の上の1つの実装のオーバーヘッドについてのハードのコメントですので、私は、コードの保守性についてのコメントを作ります。

個人的に私はあなたの状態マシンが非常にシンプルでシンプルなものでなければ、状態ごとのクラスを宣言する方がはるかに保守性が高く、拡張可能であると考えています。&経験則では、クラス内のコードを見ることができず、頭の中に絵全体を保持できない場合は、クラスが多すぎるかもしれません。州ごとにクラスを宣言する際に支払う小さなオーバーヘッドは、モジュラーコード(またはそれを維持する他の誰か)を書くことによって得られる生産性の利益に相当する可能性があります。私は、おそらくシンプルなステートマシンとして始まった本質的に1つの大きな(非常にハードすぎる)ステートマシンである、あまりにも多くの「uber」クラスに出くわしました。

「S」とSOLID頭字語の「O」部分(https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)が常に心に留めておくのは良いものです。

+0

これは私が考えていたものです、それをシンプルに保つために、私は(いくつかのオーバーヘッドを持っているでしょうプライベートなメンバーにアクセスするためには、メインクラスへの参照を持っていなければなりません。)、おそらくもっと理にかなっています。ありがとう。 – user1289

0
  1. (確かに状態クラスはメンバーを持っていないはずですが、とにかくそれが何かを要する必要があります)。そうでなければ、クラス外の実装はコードをより小さな断片に分割し、これにより望ましいかもしれません(しかし、これは目的ではありません:2つのソリューションに長所と短所があります)。

  2. これは必須ではありませんが、抽象レイヤーを追加してカップリングを緩めます。インターフェイスを使用すると、他のクラスに影響を与えることなく各実装を変更できます(クラスフィールドの追加など)。

  3. 新しい空のクラスを割り当てたり、関数を呼び出すのに同じオーバーヘッドが割り当てられます。

+1

は、の割り当てを行います空のクラスはmallocの呼び出しを含んでいますか?私はそれがアドレスを持っている必要があるので、はいと思います(サイズは1ではなく0です)。したがって、mallocを呼び出すと、パフォーマンスに影響するはずです。 – user1289

+0

おそらくそうです。さて、ここでは少し挑発的でしたが、私はC言語から少し離れて行き、Cプログラマが自分のコードの実行を心配してはいけない場所で心配していました。あなたはスイッチング状態が頻繁ではなかったと言っていました。2. molbdniloのような静的なインスタンスを使用することはできますので、パフォーマンスの心配に基づいてコード設計の決定を下してはいけません。 –

+0

はい、私の場合には、それはあまり影響しない、とそうmolbdniloのソリューションは良かったが、一般的に、私たちは常にパフォーマンスを考慮する必要があります:) – user1289

関連する問題