2011-07-13 9 views
2

クラスオブジェクトが1つの場所でしか使用されていない場合は、プログラミングとアーキテクチャが悪いことがわかります。しかし、私はまた、すべて強力で、あまりにも多くのことができるオブジェクトを作成することについて警告されています。だから私はこれをどのように打ち破るのですか?ここに私が意味するものの例があります - これは一例に過ぎないので、これらのことをリテラルに入れてはいけません。神の目的を防ぐために何をすべきですか?

とにかく私は、私が働いているオブジェクトがかなり複雑です。このオブジェクトには多くの情報が格納されており、データに対して多くの操作を実行できます。だから、このオブジェクトを地球と呼ぶことにしましょう。

Public Class Planet 
Private _population As UInteger = 0 
Public ReadOnly Property Population() As UInteger 
    Get 
     Return _population 
    End Get 
End Property 

Public Overridable Sub CreatePerson(Optional ByVal numberOfPeople As Integer = 1) 
    _population += numberOfPeople 
End Sub 
End Class 

これまでのところ単純です。しかし、私は、多くのことが、オブジェクトが可能な限り実行できるように、何度も繰り返すことができます。だから、物事を複雑にしないようにするために、昼と夜の間に起こる "活動"を壊しました。昼と夜の2つのオブジェクトを作成しています。ですから、私は更新されたPlanetクラスを持っています。今

Public Class Planet 

Private _population As UInteger = 0 

Private _day As New Day 
Private _night As New Night 

Public ReadOnly Property Day() As Day 
    Get 
     Return _day 
    End Get 
End Property 

Public ReadOnly Property Night() As Night 
    Get 
     Return _night 
    End Get 
End Property 

Public ReadOnly Property Population() As UInteger 
    Get 
     Return _population 
    End Get 
End Property 

Public Overridable Sub CreatePerson(Optional ByVal numberOfPeople As Integer = 1) 
    _population += numberOfPeople 
End Sub 

End Class 

、この2つのクラス - 昼と夜は - 決しては惑星クラスの外で使用されます。これは、この「親」クラスのPlanetのメソッドと属性を整理するための良い方法ですか?それ以外はどうやって同様に整理できますか?

私はリファクタリングについて読んだことがありますが、これが私のケースに役立つとは思いません。私はこのようなPlanetオブジェクトを呼び出すことができるという考えが好きです:Earth.Night.BlowUpMoon

+0

良いタイトル:-)。 –

+0

私は、クラスがあまりにも強力になったり、あまりにも多くのことをする方法を知っている場合、それが実際の用語であると信じています。 –

答えて

2

発見可能性の点で考えてください。他の誰かがあなたのオブジェクトを使用する場合、月を爆破するために特定の時間帯に行く必要があることを知っていますか?BirthdayCard.September25th.Send()と同じですか? 「誰か他の人」のものであれば、私は6ヶ月以内にあなたも含めます。組織化のために編成しているのですか、それと似た方法と特性を合理的にまとめるのですか?

+0

私は間違いなく方法とプロパティを追加していますが、これは良いデザインであることを確認したかったのです。私は一度だけ言われたので、何かが欠けているように感じる。ただ一つの場所で使用されるだけのオブジェクトを作成しないでください。私はそれが理にかなっていないと思っていますが、私はまた、オブジェクトを使用して整理することが悪い設計手法かもしれないことを見ています。 –

+0

.Netではすべてがオブジェクトなので、常にワンタイムオブジェクトを作成します。しかし、私はクラスを意味すると思いますよね? Reflectorをダウンロードして.Netフレームワーク自体を調べると、関連するプロパティを保存するために使用される親クラス内の多くのプライベートクラスが表示されます。 'System.Uri'には、2つのクラス、1つの構造体、6つの列挙型がクラスに対してプライベートです。上記のサンプルを使用して、私は個人的に 'Night'オブジェクトが' BlowUpMoon() 'にできるとは思わないでしょう、私はその関係を見ていません。 –

1

あなたのクラスをリファクタリングし、それをいくつかの小さなクラスに分割します。それぞれのクラスはsingle responsibilityです。それぞれが一度だけ使用されることは重要ではありません。コードはまだまだ改善され、理解しやすく、さらにはテスト可能です。

2

例が考案されていますが、この状況はドメイン駆動型設計では実用的です。あなたのPlanetクラスはaggregate - 自身の内部エンティティを管理するルートオブジェクトです。集約境界の外側では、すべての相互作用はルート集約オブジェクトを介して行われます。

関連する問題