1

私は最近、次のように2つのサブクラス(EmptySetとNonEmptySet)を持つintセット「IntSet」を表す抽象クラスを作成する「Scala by Example」という本を読んでいます。

abstract class Stack[A] { 
  def push(x: A): Stack[A] = new NonEmptyStack[A](x, this)
  def isEmpty: Boolean
  def top: A
  def pop: Stack[A]
}

class EmptyStack[A] extends Stack[A] {
  def isEmpty = true 
  def top = error("EmptyStack.top")
  def pop = error("EmptyStack.pop")
}

class NonEmptyStack[A](elem: A, rest: Stack[A]) extends Stack[A] {
  def isEmpty = false
  def top = elem
  def pop = rest
}

私の質問は次のとおりです。空のコンテナーと空でないケースの両方を処理する 1 つの具体的なクラスを作成する代わりに、空のコンテナーを独自のクラスとして表すというこのパラダイムはどの程度役立ちますか?

4

1 に答える 1

1

実装でis-empty-check を実行する必要がないため、各実装はより単純で読みやすくなっています。これにより、コード メトリック値 (循環的複雑度など) も向上します。

さらに、実行時に空と非空を区別する必要がないため、一般的に実装がわずかに高速になります。私の知る限り、ScalaSetはこの手法を適用し、パフォーマンスを最適化するためにさまざまなタイプのセット (サイズに応じて使用) を実装しています。

明らかに、これは不変のデータ構造に対してのみ機能します。

于 2013-01-07T14:29:45.670 に答える