2012-05-03 5 views
1

私はJavaでプログラミングしていたとき、私は以前はオブジェクトとマネージャーを持っていました。あなたが知っているクラス(通常はシングルトン)は、あるクラスのオブジェクトのコレクションを保持し、それらを便利に管理できるようにします。 Scalaでは、コンパニオンオブジェクトにすべての機能を組み込み、別個のマネージャオブジェクトを作成することを避けたいという状況がますます増えています。Scala - コンパニオンオブジェクトに "manager"パターンを実装していますか?

すべては、インスタンスにIDを与えてから始まります。なぜ、コンパニオンオブジェクトにコレクションがないのですか?コレクションがある場合は、そのコレクションをすべてのメソッドでコレクションに取り込まないのはなぜですか?そしてマネージャーはもう必要ありません。しかし、1つの特殊性は、コンパニオンオブジェクトが通常Carのような単一の名前を持つことである(複数の場合はCarsまたはCarManagerではない)ので、複数のメソッドを操作するメソッドは、オブジェクト名と結合した言葉で奇妙に見えます。

私はこの状況についてのあなたの意見を知りたいと思います。このアプローチが、見た目の不必要な肥大化したマネージャパターンよりも好ましいかどうかを知りたいと思います。それに関する記事への言及も感謝します。

+1

あなたはこれをチェックすることができます/2.0.1/ScalaTodoList –

+0

うーむ...とにかくこれがどうして質問に関係するかわからないけど、とにかくありがとう、私はそれを読んで行くよ! (ScalaTodoListチュートリアルを除いて、私は長い間それを渡してきました)。 – noncom

+2

コンパニオンオブジェクトを使用して、すべてのモデル操作を保持します。私があなたを正しく理解していれば、同じことをしようとします。 –

答えて

3

可能な限り単純です。オブジェクト内のコレクションは実際には単純です。ただし、オブジェクトを静的オブジェクトに依存させないようにする必要があります。それは厳格な構造を作り出し、テストをより困難にするでしょう。

私はケーキパターン(How do you do dependency injection with the Cake pattern without hardcoding?参照)を見ていきます。このようにして、CarManagerをオブジェクトに作成し、それをCarRepositoryComponentを通じて依存関係に混在させることができます。

非コンパイル例: https://github.com/novus/salat/wiki/SalatWithPlay http://www.playframework.org/documentation:

val someService = new SomeService 
    with MyRepairServiceComponent with CarCollectionRepositoryComponent 
someService.repairCar(8) 

trait SomeService extends RepairServiceComponent with CarRepositoryComponent { 
    def repairCar(id: Int): Status = repairService.repair(carRepository.get(id)); 
} 

trait CarRepository { 
    abstract def get(id: Int): Car 
} 
trait CarRepositoryComponent { 
    abstract def carRepository: CarRepository 
} 

object CarManager extends CarRepository { 
    private var cars = Map[Int, Car]() 
    def get(id: Int): Car = cars(id) 
} 
trait CarCollectionRepositoryComponent { 
    def carRepository = CarManager 
} 
3

これは、コンパニオンオブジェクトを効果的にシングルトンに変えています。シングルトンは、良いデザインのパターンよりもアンチパターンです。単体テストがこの問題の主な理由です(これはこれまで多くの人が私よりスマートにカバーしてきました)。

オブジェクト理想的にはは、これらの理由でどのような種類の可変状態を維持すべきではありません(これはメンテナンスの悪夢を私に信頼させます)。

+0

まあ、私は単体テストを使用していないし、とにかくすぐに行くつもりはない...と私はリソースの要求と時間が重要なアプリケーションをプログラムするので、私は多くの可変状態を使用する必要があります..あなたが言っていることを理解しているあなたが私のことと直面している経験から話しているように.D ..そして、私は関数型プログラミングに完全に従っていないので、私はどこかに可変状態の一重項を置く必要があります。違いはそれが別のオブジェクトであるかどうかです。それが悪いデザインで、同じ生産性を達成する方法がある場合は、どのように聞くのがうれしいでしょう。 – noncom

+0

私は悪いツールの制限のためのコードを非難することは特に良いことではないと思います。 Scalamockはオブジェクトをモックできます。 –

+0

あなたのインスタンスを管理するためのクラスがアンチパターンではない、シングルトンパターンはです。 –

関連する問題