2015-01-04 9 views
5

Scalaのようなプログラミング言語の不変性( "var"を避ける)に重点を置いて、オブジェクトの "状態変更メソッド"はインスタンスのコピーを返さなければならないことを意味します。新しい状態)?不変性を持つ設計(Scala)

タートルを考えてみましょう。私はこのように私のカメを移動したいと思います:

val turtle = new Turtle(0, 0, "north") 
val turtle2 = turtle.turnLeft().forward(5).turnRight().backward(2) 

ここで(彼らは二つの別々のインスタンスです)タートルの同じインスタンスを指していますturtle2。実際には、その一連の動きで、4つの暫定オブジェクトが作成されました。これは、たとえばturnLeftメソッドを実装する方法です。

def turnLeft { 
    self.copy(orientation = self.orientation match { 
    case "north" => "west" 
    case "east" => "north" 
    case "south" => "east" 
    case "west" => "south" 
    }) 
} 

これは正しい設計アプローチですか?

「はい」の場合、(すべてのメソッド呼び出しで新しいオブジェクトを作成すると)効率的/非効率的です。 いいえ、正しいものは何ですか?不変性の側面(あるいは多分関数型プログラミング)に対する私の理解に間違っている/欠けているのは何ですか?事前に

おかげで、短命オブジェクトのとてもたくさんの ラカ

+0

あなたのコードは(不変のPOVから)正しいように思えます。効率の面では、私はそれが確かに単一の変更可能な事前割り当てオブジェクトほど高速ではないと思う。全体の影響は、いかに速く頻繁にカメを移動したいかによって異なります。 –

+0

ありがとう、それに注意してください。 –

答えて

9

作成はスカラの特徴的な機能です。適切なサイズのヒープを持つJVM上で実行し、すべてのチャーンを処理するのに十分な量の若い世代のメモリを持っていれば、一般的にそれほど高価ではありません。

言われているように、不変性は宗教ではありません。常識は勝つべきであり、 "パラダイム"に固執することがあまりにも過度に課税されるような設計決定を導くべきです。

+0

お返事ありがとうございます。私は(短命のオブジェクトを作成する)このようなことについては気にしない。 ...それはちょうど...私の "状態を変更する"メソッドで "self.copy(...)"を手作業で行うことは煩雑に見えます。スカラーでこれを行うには良い方法がありますか(おそらくメソッドのための特別なアノテーション)? –

+0

まあ、 'copy(foo = bar)'は 'foo = bar 'よりも" cumersome "にすぎないようです。それを返す?または私は何かを逃していますか? – Dima

1

私は、Turtleをエンティティとして処理するかどうかを検討することが重要だと思います。

私は車を持っていて、車を右に回すと、車は右に進みます(最適な場合:P)、車を左に回して左に進みますが、それでも同じ車です。同じことがカメにも当てはまります。不変性は通常、プログラムをより理解しやすくしますが、直感的ではない場合があります。

右の見出しと左の見出しのカメが異なるかどうかを考えてください。もちろん、平等チェックはオーバーライドすることができるので、旧名と新型のカメ(同じ名前/ IDを持つ)が同じかどうか、または参照のみで同じであるかどうかは、理論的な違いです。

関連する問題