2016-11-04 8 views
4

理由を次のコードになりますSmalltalkのファロ文字列の連結の代わりに、ストリーム

| list types | 
list := Heap new. 
types := #('a' 'b' 'c'). 
types do:[ :t | 
    1 to:9 do:[ :i | 
     list add:(t, i asString). 
     ]. 
    ]. 
^ list 

問題はファロでの方法でString concatenation instead of streams警告? []ボタンショー:

文字列の連結の代わりにいくつかの反復メッセージの内部文字列連結を使用してコードのストリーム
チェック。

ストリームで簡単にできることは何ですか?私は何を達成したいことはC9A9にすべての値A1リストB1にB9とC1を作成することです。

+1

ルールは「画家をschlemielアルゴについてですrithm "https://en.wikipedia.org/wiki/Joel_Spolskyしかし、それは明らかにここで偽陽性だ –

+0

私は参照してください。ジョエル・スポルスキー(Joel Spolsky)が述べたように、私は以前にこの問題に遭遇していなかったし、リソースのこのような無駄な使用を避けるよう教えられたこともなかった。私はこれが偽陽性であることを理解していますが、問題が発生したときはいつでもそれが役立ちます。 –

答えて

8

回収ループ内にある一部t, i asStringの(あなたがRBStringConcatenationRule

それが遅くなり、より多くのメモリ強烈だから

通常の文字列の連結が推奨され (クラス内のルールの実際の実装を見ることができますので、それは文句を言いメモリについてIIRC)

あなたには、いくつかの重い連結(単一の文字列に部品の多くを結ぶ)を行っているのであれば、ストリームが好適である:あなたがそれを見るために、システム内で最もprintOn:方法を見ることができますアクション。

しかし、単純なケースでは,との連結は問題ありません。警告ルールはあまりにも広すぎます。警告はちょうどそのようなものです...何かが間違っているかもしれないという警告、または何かが良いと書かれています。

do:過度に一般的な、例えば以上の専門的な収集方法(select:collect:、...)を使用することが好ましいのSmalltalkで、より良いライティングといえば

| list types | 
types := #('a' 'b' 'c'). 
list := types flatCollect: [ :t | (1 to: 9) collect: [ :i | t , i asString ]. 
^ Heap withAll: list 

(とあなたがちょうどlist tempvarを持って、直接ではなく第三行を返すことができます

+0

確かに、私は特殊な機能については考えていませんでした。これはコードをもっときれいにする! –

1

を作成したオブジェクトの数をmininizeするにHeapを必要としない場合、あなたはこのように行うことができます:。

| list types digits | 

list := Heap new. 
types := #($a $b $c). 
digits := (1 to: 9) collect: #asCharacterDigit. 

types do: [ :t | 
    digits do: [ :d | 
     list 
      add: ((String new: 2) 
       at: 1 put: t; 
       at: 2 put: d; 
       yourself) 
      ] ]. 
^ list 

ですから、文字列に整数から暫定文字列との間隔を作成する。NOR変換されていません。

関連する問題