読者です 読者をやめる 読者になる 読者になる

ぺぷしのーげん

大企業からスタートアップに転職したアプリケーションエンジニアのブログ

Staticクラスやシングルトン(Singleton)の正しい使い方と間違った使い方、生じる不具合や問題点について

f:id:hazakurakeita:20160429120932j:plain

データの持ち方や渡し方に悩むことって結構ありますよね。特に今はWPFでNavigationWindowを使ってアプリケーションを作っているので大変です。今回はその件について。

 

画面に上下関係がない

f:id:hazakurakeita:20160811094912p:plain

NavigationWindowを使った場合、ページ遷移したら戻って来ないことも多いです。戻るとしても、GoBackではなく新規ページとして遷移したほうが何かと都合が良かったり。

f:id:hazakurakeita:20160811095205p:plain

一方で従来のWindowsFormアプリはウインドウが寿命を迎えれば処理が元の画面に戻ってくるわけですから、単純にインスタンスをモーダルウインドウに渡してあげるだけです。こうなると、NavigationWindowを使った開発ではStaticクラスやシングルトンを使いたくなってしまいます。しかし、この悪魔の囁きには我慢してなんとか方法を探すことが大切です。

 

Staticクラスがダメな理由

クラスをStaticにしてしまうと、メソッドやメンバーまでStaticにしなければなりません。また、メソッド内でインスタンスを生成することができないので、かなり自由度が下がってしまいます。このため、Staticクラスは単純な処理を行うライブラリを作ったりする以外はあまり使用する意味はありません。ましてや、なんらかのオブジェクトをStaticクラスで表現することはできません。それではC言語で書くのと変わらないですからね。。。オブジェクト指向に反していますね。

 

シングルトンがダメな理由

シングルトンにすればインスタンスを生成するので、かなり自由にオブジェクトを表現することができます。しかし、これもそんな簡単に使ってはいけません。特に誤用が多いのが、「このアプリケーションでは、このインスタンスは1つしか作らないのでシングルトンにしよう」という理由で採用するケースです。それは絶対にダメです。シングルトンを使って良いのは、あくまでモデルが1つしか存在しない場合のみです。

f:id:hazakurakeita:20160811095618p:plain

例えば一輪車のアプリケーションを作るときを考えましょう。このアプリケーションには一輪車のタイヤクラスが存在します。一輪車はタイヤは1つですので、シングルトンにすれば色んなクラスやメソッドから参照できます!あなたはシングルトンでタイヤクラスを作り、無事アプリケーションをリリースすることができました。

数週間後。。。

f:id:hazakurakeita:20160811100017p:plain

あなたの開発した一輪車アプリケーションは客先で大好評でした。そのため、すぐに新規アプリケーションの開発の話が上がってきました。「いやー君のアプリケーションは素晴らしかったよ。是非このアプリケーション改造して自転車と自動車のアプリケーションも作ってくれ。タイヤを増やすだけでいいから、納期は今週中で頼む」あなたは冷や汗タラタラです。シングルトンで作ってしまったため、一輪車アプリケーションを自転車や自動車に改造するには影響範囲が全体に広がってしまいます。新しく作り直したほうが早いかもしれませんが、納期は短く、しかも2つです。。。

こういった具合に、シングルトンはシングルトンになるが故に拡張性や再利用性を失ってしまいます。

 

じゃあどういう時にシングルトンを使うのか

f:id:hazakurakeita:20160811100248p:plain

単純にその世界やモデルで1つであるかで決めます。シングルトンだと便利だとか、今回は1つしか使わないとか理由でシングルトンを採用するのはダメです。

例えば地球というオブジェクトはどうでしょうか。この世界に地球は1つしかありません。こういった本質的に1つしか存在しないオブジェクトはシングルトンにすると効果を発揮します。あとはトランプの山札はどうでしょうか。稀に複数存在する場合もありますが、多くのトランプゲームの山札は1つですので、再利用できるケースも多く、メリットがあります。とにかくシングルトンにしてよいオブジェクトというのは、一般的に1つしか存在しないオブジェクトだけで、プログラミングが楽だとか、便利だという理由で使ってはいけません。

 

Staticクラスやシングルトンは不具合の巣窟

たまにStaticやシングルトンを使っているアプリケーションで、初期化メソッドを持つクラスを見ることがあります。恐らく後から仕様変更があったのでしょう。これはとてもマズイ状態で、初期化のタイミングによる不具合が起きるリスクが非常に大きいです。このとき、後で仕様変更したことに文句を言うエンジニアもいますが、これもダメです(前職ではこれで部署間の衝突なんてのも散見されました)。ここで文句を言うエンジニアは設計スキルに改善の余地があると言えます。

 

もしこういうコードに遭遇した場合は早めにリファクタリングを検討したいですねー。

 

 

おしまい。