- DRY
- Don't repeat yourself
情報の重複は変更の困難さを増大し透明性を減少させ、不一致を生じる可能性につながるため、
重複するべきでない(ウィキペディアより)という原則だ。
この原則を適用するためには、共通する処理は次々とメソッドとして定義することになる。
では、あるメソッド内だけで複数回用いる処理のためにメソッドを定義する必要があるか?
というとそうでもない。
以下はCSVを二重配列として返す方法。
(ただしダブルクォーテーションには対応していないぶっきらぼうなやり方)
| csv aBlock rows |
aBlock :=
[:aStream :char | | aList |
aList := OrderedCollection new.
[aStream atEnd] whileFalse: [aList add: (aStream upTo: char)].
aList yourself].
"二重リスト作成"
csv := 'c:\xxxxx.CSV' asFilename readStream.
rows := ((aBlock value: csv value: Character cr) reject: [:each | each isEmpty])
collect: [:each | aBlock value: each readStream value: $,].
csv close.
このようにブロックを使って局所関数的なことを行うことができる。
ブロックの中では外で定義した変数を理解してくれるので、
メソッドにする場合よりも引数またはインスタンス変数を減らせる場合がある。
ちなみに、tokensBasedOn:メソッドが同じようなことをやっているので
これは車輪の再開発といえなくもない。
tokensBasedOn:を利用した二重配列の作り方は以下(1行でできてしまうんだな)。
| row csv |
[row := (((csv := 'xxxxx.CSV' asFilename readStream) contents tokensBasedOn: Character cr) reject: [:each | each isEmpty])
collect: [:each | each tokensBasedOn: $,]] ensure: [csv close]
Smalltalkで学ぶオブジェクト指向プログラミングの本質にはブロックを再帰しながら
クラスの階層を表示するソースが掲載されているのでそちらも参考に。
最終更新:2011年12月29日 12:11