2016-05-14 16 views
1

大きな「モノリシック」クラスを小さなクラスに分割する最善の方法は何ですか?大きな「モノリシック」クラスを小さなクラスに分割する

UserオブジェクトとChannelオブジェクトを持つシンプルなチャットシステムを設計しました。ここでは、ユーザーは複数のチャンネルに参加して会話することができます。

UML chat design diagram

私はこの設計で持っている主な問題は、それがあまりにも多くのことを行い、すなわち、ChatManagerクラスはビットのモノリシックであるということである。ここでは

は、私のデザインの図です。以前のインカネーションでは、チャンネルメンバーシップも処理しましたが、現在は ChannelMembershipManagerに分類されています。

私のChatManagerクラスを「簡素化」する最良の方法は何ですか?私が見ていない私のデザインに他の問題はありますか?

+0

と思われます。トップレベルのマネージャークラスは少し醜い傾向があります。 –

+0

ええ、私はredditで頼んで、悲しそうに同じ応答を得ました。私はちょうどそれを整えることができる何かがあることを望んでいた。 –

+2

この図で明らかに間違っていることはありません。それをコード化して、リファクタリングのチャンスを探してください。 –

答えて

2

モノリシックマネージャを分割する最も良い方法は、OOの考え方に従って、クラスに責任を割り当てることです。すぐに思い浮かぶいくつかの提案があります。完璧を期待しないでください、これはちょうど私の頭の上にあります。

私はChannelクラスのすべてのインスタンスとUserクラスのすべてのインスタンスを追跡する必要性を参照してください行うが、私は、「マネージャー」クラスのための必要性を全く見ません。 たぶんこれは、各クラス内のクラススタティックで行うことができます。 (これらのインデックスは一種のハッシュマップのように動作修飾子を使用して、UMLでモデル化することができます。ChannelsUsersが本当に偶数は必要ありません!これらの数字は単にこれをコーディングする多くの方法の一つです。

Userクラスのインスタンスは、コマンドチャネルを使用して人と通信することができます。人がUserクラスのインスタンスにチャネルに参加するように要求すると、チャネルに対応するチャネルごとのソケットを管理するPrivate Channelのインスタンスを作成できます1人の場合は、要求されたChannelのインスタンスにそれを受け入れる許可を求めます。Private Channelは、poll()read()およびへのメソッドを持つことができます。。

Userが参加または離席したときに、Channelクラスのインスタンスがアナウンスする責任があります。 Channelクラスの各インスタンスは、接続されたPrivate Channelインスタンスのポーリング、メッセージ/コマンドの読み取り、および他のすべてのメッセージへのメッセージの繰り返しなどのアクションを実行する必要があります。

これは私の頭の上にあります。考えてみると時間がかかりましたが、いくつかの潜在的な問題や最適化が見られるかもしれませんが、OOの教義に従って、マネージャーのモノリスを分割する方法についていくつかのアイデアがあります。

関連する問題