クラスが分からない
人気の高いライブラリのコードを読んだりすると、ナルホドそうやってクラスやモジュール、処理を切り分けるのかなんて思うけど、自分で書くとなると、なんだかむちゃくちゃ。読めるけど書けない、聞けるけど話せないというのは外国語の学習では普通のことなので、まだまだ練習が足りないってことかなと思う。
学習記録ということで書き留めると、
class FooDoc def initialize(doc) @doc = doc @html = "" set_title make_hoge end def to_html pre_process make_html @html end private def set_title @title = @doc.match(/regexp/)[0] def pre_process @title.bold! @doc.gsub!(/hoge/,"foo") : :
みたいな感じで書いてある場合に、例えば、@titleというインスタンス変数を、set_titleみたいなプライベートメソッドの中で初期化していいのか、とかいう疑問。
あるいは、pre_processは、実は@titleの存在を前提としているうえに、@docに作用している。非常に依存関係や影響関係が分かりづらい。プライベートやクラスによってクライアントコードから隠蔽されているとはいえ、これってグローバル変数と副作用ありまくりのコードと何が違うんだという疑問が出てくる。set_titleを呼ぶときには、set_title(@doc)と明示的に渡したほうがいいんじゃないか、とも思える。だとすると、インスタンス変数をあちこちのメソッドでいじるのは良くなくて、ローカル変数をその都度作って参照を受けた渡すほうが、精神衛生上もリーダビリティという点でも上じゃないのか?
@title.bold!みたいに破壊的にやり方も、どうなんだろうか。
ちょっとしたスクリプトを書くという意味では、以前よりスラスラ書けるようになったけど、どうもいろいろと悩みが大きい。もっと良いコードを読めってことだろうと思う。良いイディオムや構文も知らずに英会話学校に通っても効果が薄いように、悩みながら書くのは、あまり効率の良い学習法ではないような気がする。