質問: 今PHPで、国名とそれを管理するサーバを管理するクラスを作る必要があります。 国名はstringで、Countryクラスの定数として管理してあります。 サーバはServerクラスのインスタンスで管理してあります。 国名のstringからServerインスタンスを取得するクラスはどのように設計するのが一般的でしょうか。 Serverインスタンスを作るには`new Server(string $hostname, int $port);`といった感じでコンストラクタを呼び出す設計を考えていますが、 現時点で思いついているのが、 * Countryクラスに`static function getServer(string $countryCode): Server`といった関数を作る * Serverクラスに`static function getServerByCountryCode(string $countryCode): Server`といった関数を作る * 全く別の`ServerCountryMap`クラスを作り、クラス定数としてServerクラスのコンストラクタで使う`$hostname`と`$port`を保持する の3つです。 Serverクラスのコンストラクタで国を指定するというものも考えましたが、依存循環になってしまうのかと思いました。
回答: こんにちは。 PHPは詳しくないですけど、一般的なオブジェクト指向での話なら、 「国」に「サーバ」が「紐付いてる」、という表現が適切だと言えるのであれば、「国のインスタンスがサーバのインスタンスのリストを持つ」のが良いと思います。一対一ならサーバ一つを直接持てばいいですね。 `getServers()`や`getServer()`なる関数をCountry側に持たせるのでいいと思います。そういう意味ではstaticは余計です。 逆に、サーバの集合に対して一括で操作を行うが、それぞれのサーバがどこの国に属しているかの追加情報が必要、みたいなシステムの場合なら、各サーバが国の情報をプロパティとして持つ方が適切になります。 要は、システムの設計次第なのです。