トップ «前の日記(2007-08-31) 最新 次の日記(2007-09-02)» 編集

日々の破片

Subscribe with livedoor Reader
著作一覧

2007-09-01

_ 自分のフィールド呼ぶときどれで呼ぶ?

関数的メソッドの呼び出し時にはカッコを省略しないようにしよう

あまり同意できない(「あまり」がつくのは、100%じゃないから。というか、僕はなんにしても100%ってのは好きではない)。

関数呼び出しの()もそうだが、特に

しまいにゃ attr_accessor とかが設定されてるインスタンス変数まで、関数的メソッドのように呼んでたりするからブチ切れそうになる。アットマーク一つすら書くの面倒かよ。

の箇所。

面倒かどうかではなく、常にフックを入れることを念頭におけばそういうコードになるはずだ。

特に、メンテナンスフェーズ以降(つまり話が逆なのだ)。

以下、Javaで示す。こういった方法については、言語は選ばないと思うので、JavaはそうかもしれないけどRubyは違うということはないと僕は考えている。

public class Foo {
  State state;  
  public Foo() {
      state = State.Start;
  }
  public State getState() {
      return state;
  }
}
アクセサを呼ぶというのは、上記のクラスのメソッドの中で、
void bar() {
    if (state.doSomething()) {
        state = state.nextSate();
    } else {
        state = StateFactory.create(state.getErrorCode());
    }
}
と書かずに、
void bar() {
    if (getState().doSomething()) {
        setState(getState().nextSate());
    } else {
        setState(StateFactory.create(getState().getErrorCode()));
    }
}

と書いているということと読める。Rubyと異なり、Javaはアクセサがゲッタ/セッタメソッドだということが明示されているので良いということかな? と書いているうちに思ったので、C#に変えてみたり。

State state;
public State State {
    get { return state; }
    set { state = Value; }
}
void bar() {
    if (State.doSomething()) {
        State = State.nextSate();
    } else {
        State = StateFactory.create(State.getErrorCode()));
    }
}

なぜ、メソッド呼び出しのオーバーヘッドがあるにも関わらず自インスタンスのフィールドのアクセスにもアクセサを経由すべきなのだろうか?

それはメンテナンスフェーズにおいて、以下の状況が常にあるからだ。(逆になさそうだったり、モジュールの入れ替えとかになんの障壁もなければどうでも良いといえば良い。とはいえ、入れ替えって結構神経質にならざるを得ないから、修正は少なくすませたい)

状況)

時々エラーになって異常終了とか、ログ吐いて死んだりする。しかし、開発環境ではまったく再現せず、資料採取も現場状況から頼み辛い。

結局、こういう場合、実機に仕込むことになる(のが許容される場合については、だけど)。

で、多くの場合、予想もつかないステートに陥っていたり、予想もつかない入力があったりすることが原因で、それをどこぞのルーチンが掴んで問題となるのだ。したがって、入出力の監視が重要。

そのため、迂遠ではあるけれど、まずは

public State State {
    get { 
          // スタックトレース(呼び出したメソッドの特定のため)
          // と現在の値をログ
          return state; }
    set { 
          // スタックトレース(呼び出したメソッドの特定のため)
          // と現在の値と次の値をログ
          state = Value; }
}

Rubyなら

  #attr_accessor :state  # 1行で済むならコメントアウトでもよいかも
  def state=(val) 
    # ログ
    @state = val
  end
  def state
    # ログ
    @state
  end

と修正したモジュールを実機に送り込む。ログを吐く分、若干効率は落ちるが、ロジックそのものには影響がないことが、diffによって明白(差分がアクセサだけであることがだれの目にも明らか)な、特別版である。

これが、直接フィールドをいじくっているとさあ大変だ。

もちろん、すべてがすべてアクセサを利用するわけではない。だが、まさにいつか誰かのソースで問題が起きたり、忘れた頃の自分のソースに問題が起きたときのために、ここぞというフィールドについてはアクセサを利用する。

と、僕はアクセサを使うなぁ。(と同時にアクセサ原理主義は大嫌いなので、基本はパッケージプライベートで、privateは基本的に利用しないのでもある。スコープの広さとか、クラスのサイズとかに依存してそのへんはいろいろ)

追記:簡潔さと柔軟さ。sumimさんのコメント。上のコードからも垣間見えるけど、言語によって簡潔さが十分にサポートされるようになってきたため(フィールドの直接アクセスと見た目が変わらないC#(3.0だとフィールドの記述そのものが不要化される)、直接アクセスよりさらに手数が少ないRuby)、柔軟さの勝利かと思いきや、新たな論点が生まれてきたようで興味深いという話。そうやって論点が必ずでてきて、その摩擦熱で少しばかり前進するってのが人間のおもしろいところ。(根っこは同じじゃないと思うな。マクロはユーザー定義なので記述した人固有の知識。それに対して言語の機能は共通の知識)

_ デスノート見た

なんとびっくり、眼の下にクマがあって、姿勢が悪いやつが正義側だったのか。ずーと、あっちが悪役だと思ってたよ(画しか見たことなかったし)。

でも、おれ、あいつ好きだな。

_ 規約重要

で、結局、バランスといっても人それぞれ、読みやすい/にくいも人それぞれ(だって、出身言語で(x,y,z)と書いてあるとタプルだと思っちゃう人だと、メソッド呼び出しに()が付いていると読みにくいかも知れないよ)なので、結局、あるソフトウェアシステムを構成しているソースについては統一を取っておいて、それに慣れようぜ、とやるしかないのかも。

で、その規約に対する意識がドイツ風(車線厳守、速度自由)か、アメリカ風(車線自由、速度厳守)(と、さっそく援用したり)、万能魔人村章風(風の吹くまま気の向くまま)とかいろいろあるのでさあ大変だったりするのだが。

#突如思い出したnobsun語録。「だってRubyのメソッドの引数はタプルだから」……ってことは()を付ける派か。

_ 2つのアクセス方法

簡潔さの例

柔軟さの例

いいなぁ。

というわけで、「午年」(と実際に手書きの漢字でタイトルが出てくる)。ジム ジャームッシュとのコラボレーションというより、バビロン出身のストレンジャーな映画監督に孤高のロックンロール野郎が漢を叩き込むストーリーとも言える。途中にはさまるニールヤングの息子が書いた絵が映画になるシーケンスとか(絵で描いた汽車が動き出すんだけど、汽車と映画の歴史にまた1ページと言っても良い美しさ)。またインタビューが強烈で、田舎のオヤジが集団で、都会出身のオシャレな若造(じゃないんだけど、年齢差があるのでそう見える)に、おめぇのようなチャラい業界の小僧にはわかんねぇだろうが、いっちょ教えてやるからよく聞けよ、みたいな感じで、それをあのくそ生意気そうなジャームッシュが神妙に拝聴しているのがいい感じ。

イヤー・オブ・ザ・ホース [DVD]

(突然わかったというか、別のほうのにちゃんと書いてあるのに気付かなかった。)

_ IronRubyがRubyForgeに

IronRuby

ということのようです。via: John Lam on Software

本日のツッコミ(全11件) [ツッコミを入れる]
_ shiro (2007-09-01 14:41)

うーん、言語の機能がマクロで実装されてることもあるわけで、言語レベルの知識と個々のユーザレベルの知識の間の境界はもっと曖昧かと (現実にはその間に処理系レベルとか組織レベルとかいろいろ入る)。<br><br>CLOSではメソッド内で直接スロットアクセスしていてもMOPでフックをかけ放題なわけですが、その柔軟性が同時に「メソッドの字面を見ただけではコストがわからない」という欠点にもなっているわけで、やっぱりトレードオフの落としどころをどこにするかが文化圏によって違うっていうような話なんじゃないかと思いました。

_ arton (2007-09-01 15:17)

もちろん、組織レベルは前提としています(規約の話が出てくるのはそういう意味です)。したがって開発に利用する言語の機能をどう扱うかは開発にあたっての前提としなければならないので逆に曖昧にすべきではないということだと思います。<br>>トレードオフの落としどころをどこにするかが文化圏によって違う<br>そこで、違う文化圏間の衝突から新たな知見が生まれるといいね、ということだと理解したのですが、そういうことではなくて?<br>それとは別に、MOPから『ソッドの字面を見ただけではコストがわからない」という欠点』というのが見えたというのは、AOP(アクセサやプロクシクラスを利用したフックでも同じですね)を推す場合に、きちんと抑えておくべきことだ、と理解しました。文化圏が違うとそういった知見が現場レベルでは見えないのが問題ですね。というか、それを噛み砕くのも僕のジョブか。

_ arton (2007-09-01 15:22)

何気なく書いたら、まさにAOPの先取りなのか(http://ja.wikipedia.org/wiki/Common_Lisp_Object_System)。

_ mumurik (2007-09-01 16:10)

cygwinでbuild通そうとしたら1時間もかかった…<br>ASRを使えという神の思し召しでしょうか?

_ arton (2007-09-01 16:22)

ようこそ、ネイティブワールドへ!<br>というか、今、地球光を見てるところ。人手不足のおりそんなこともやっておれんのだ、というところを見てる。

_ きむら(K) (2007-09-01 17:02)

地球光…ああ、ターンエーですか。<br>cygwinはファイルの読み書きが遅いのでそのせいでは >ビルドに一時間

_ arton (2007-09-01 18:13)

がーん、ディアナとキエルの交換まで話たところでシーンが変わって、趣味か! はカットされてんのか。

_ habuakihiro (2007-09-01 18:34)

というわけで是非テレビ版を(^^)

_ arton (2007-09-01 18:57)

確かに見ると魅力があったし(ファーストガンダム見てからガンダムはナノシールドしてたのだが、ちょっと発掘されたらしい)、やばい誘惑ですねぇ。なんにしても、どうもありがとうございました。<br>それにしても劇場版だけに、ストーリーは追えるけど、名前を覚える前に次のシーンに飛んでいくので、初見では辛い点がありました(第3者をネタに会話していると、その対象が誰かわからなかったり)。<br>#個人的に映像作品を見始めると完全に他のことができなくなるのが辛いところ。

_ きむら(K) (2007-09-02 03:05)

トミノ作品のダイジェスト映画は、絶対的に尺が足りないので<br>どうしても一見さんお断り的な感じになってしまうのは<br>どうしようもないかも(^^;<br>#この点で一番極端なのがTHE IDEON<br>とはいうものの、30分×50本はしんどいですよね。「趣味か!?」は何話だったか?

_ arton (2007-09-02 03:44)

あと、登場人物が多彩で背景がしっかりしているから、ダイジェストだと辛いのかも知れませんね。<br>趣味か、は22話です(羽生さんに教わったURL:http://www.geocities.co.jp/AnimeComic-Pastel/3829/words22_TurnA.html)


2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|

ジェズイットを見習え