Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

本日見かけた酷いコード13

タグ: C++ 酷いコード
// クラス定義
class Foo
{
public:
    static Foo* GetInstance();
 
    static void Init();
    static void Function();
    // 以下、静的メンバ関数が続く
 
private:
    Foo() {}
    ~Foo() {}

    Foo(const Foo&);
    Foo& operator=(const Foo&);

    static Member1 member1;
    static Member2 member2;
    // 以下、静的データメンバが続く
};
// 呼び出し側はこんなコード
Foo::GetInstance()->Function();

コンストラクタとデストラクタが非公開で、インスタンスを取得できるのは唯一静的メンバ関数からのみ。「シングルトンパターンを知ったので使ってみました」的なコードだが、そんなことよりまずはクラスとインスタンスの違いを認識しろと。
クラスFooには静的メンバ関数(クラスメソッド)しか存在せず、静的ではないメンバ関数(インスタンスメソッド)が1つも存在しない。だからそもそもシングルトンにする(インスタンスの数を1つに制限する)とか以前に、インスタンスを作る意味がない。

// わざわざ Foo::GetInstance() しなくとも……
Foo::Function();

「メンバをことごとくstatic」にした上さらに「シングルトンにする」など、そうそうやることではない。
やるとしたら……「クラスとインスタンスの違い」をさほど重要視しておらず、「コード変更量を最小に抑える」ことをポリシーにしている人だろうか。
そういう人なら、

  1. 静的メンバだけのクラスFooを作る。
  2. 最初に1度だけ Init() が呼ばれるよう、シングルトンぽくする。
  3. 静的メンバのstaticを外さなくても、ちゃんと GetInstance() さえ呼んでくれれば動作に支障は生じないので、無駄にコード変更量を増やさないためにstaticは外さない。

なんてことをやってもおかしくはない。勘弁してほしいが。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/204-20d093e7
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。