質問: ### はじめに 設計初心者です。 ### 分かっていないこと 下記「参考」内の例における「シングルトン」をはじめとする、デザインパターンの適用範囲がわかりません。 「参考」のページには図書館の貸出名簿の話が掲載されています。この話自体はなんとなく理解できたのかなと思います。 では、ここをシングルトンで設計したらほかもシングルトンで統一する必要があるのか、それともデザインパターンはオブジェクトごと(もしくは他のなにかごと)に適用するものであって、アプリ内で統一する必要はないものなのか。これが分かりません。 ### 不明ながらも現状で想像していること 現状の想像では、貸出名簿はシングルトン、ほかは○○といったようにオブジェクトごとにデザインパターンを適用でき、アプリ内にそれぞれ適材適所の形でデザインパターンが混在できるのでは?という想定をしています。(貸出名簿が1つしか生成できないからといって、貸出名簿のルールに縛られて他のオブジェクトが1つしか生成できなくなるなんてことはかなり不都合なので。例えばユーザーインスタンスの生成など...)だからアプリ全体として○○で作られているという言い方はあまりされず、この部分は○○パターンを利用、この部分は...という言い方になる。 ### 教えていただきたいこと まとめると、教えていただきたいことは以下になります。 1. シングルトンを含むデザインパターンの適用範囲(区切り)はどこか。 2. (1.を元に)アプリケーション内にデザインパターンが混在することは悪い設計にはならないのか。 3. 主要なオブジェクト指向言語(JavaScriptやJava、C#等、GitHubのリポジトリ内の使用率10〜20位に入る程度を想定しています。)は上記 1. 2.におおよそ共通していると言えそうか ### 参考 デザインパターン 5章 Singleton パターン 以上です。 よろしくお願い致します。
回答: オブジェクト指向プログラミングを行う場合、オブジェクトは自身の内部にオブジェクトを持つことになり、つまりオブジェクトは再帰的な構造を持ちます。 デザインパターンは、あるやりたいことがあったときに、それをオブジェクト構造においてどのような形で実装するとうまくいくかの経験則的なパターンを集めたものです。 最初に述べた通り、オブジェクトは再帰的な構造を持つので、現実的なプログラムは例えば、あるトップのクラスは主にイテレーターパターンで処理を行なっていて、イテレーターパターンによって取得されるオブジェクトは内部的にストラテジーパターンを採用していて、、、などといったようなことになると思います。 ディレクトリとファイルで例えると、例えば社内共有フォルダがあって、それはトップでは部署ごとフォルダによって整理されている。各部署ごとフォルダはチームフォルダによって整理されている。特定のチームのフォルダは、四半期ごとのフォルダによって整理されている。。。。といったような形であったときに、デザインパターンのアナロジーでいうならば、トップディレクトリは「組織構造による分割パターン」を採用している。各部署ディレクトリも同様である。その特定のチームディレクトリは「時系列分割パターン」を採用している。などといった表現になるかと思います。 > > 1. シングルトンを含むデザインパターンの適用範囲は区切りはどこか。 > > > フォルダの整理術10パターンがあったときに、その適用範囲は何かといわれれば、「適切に整理できるような範囲が適用範囲である」という答えになると思います。もう少し言うと、各デザインパターンは何かの問題を解決しようとしているので、その問題を正しく解決する形で最終的にプログラムを組めるならば、それは適用範囲だった、といえそうです。 > > 2. (1.を元に)アプリケーション内にデザインパターンが混在することは悪い設計にはならないのか。 > > > デザインパターンはそれぞれが何かの問題を解決していて、その問題解決を組み合わせることが、デザインパターンに従ったプログラム記述である、と言えます。混在、というより、「適切に組み合わせる」ことこそがプログラムの設計・実装である、と認証するのが正しいと思います。 > > 3. 主要なオブジェクト指向言語(JavaScriptやJava、C#等、GitHubのリポジトリ内の使用率10〜20位に入る程度を想定しています。)は上記 1. 2.におおよそ共通していると言えそうか > > > 1 や 2 の話は、オブジェクト指向がどうであるか、という話であって、言語の話とはレイヤーが違う認識です。 オブジェクト指向のデザインパターンとは、究極的には、抽象的なオブジェクトというものたちのみがあるような世界において、(そしてそれしかなかった場合)どのようにオブジェクトを組み合わせていくと現実の問題に対応できるようになるのかのパターン集です。 またもし聞きたいのが、各プログラミング言語において、どの程度までのオブジェクト指向して実装をするのが効果的か、特にいろいろ controversial なシングルトンパターンはどうなのか、という旨の質問であるとしたら、それは各言語の言語設計に依存していて、一概に答えは出せない(すごく出しにくい)のではないか、と個人的には思います。