トップ «前の日記(2007-06-04) 最新 次の日記(2007-06-06)» 編集

日々の破片

著作一覧

2007-06-05

_ TableAdapter

TableAdapterって、ADO.NETじゃないのか……(System.Dataネームスペースじゃないし)

でも下層には、SqlDataAdapterがいるから、ADO.NETっていっても間違いじゃないよね? と、誰とも無く同意を求めてみたり。

_ なんで?

匿名メソッドはやめれ

もしかして、「アノニマスメソッド」と呼べ、という意味だったりするわけはないだろうから、文字通り、使うな方面の意味なんだろうけど(追記:ではなく、無名メソッドじゃなきゃおかしいだろう、ということでした。うむ、それはそうですね。でも待てよ、と書いた先からシステム付与のとんでもない本名を匿名化したもの、と解釈してみるとか。と考えてみると、delegateというキーワードを匿名に利用している、つまり「〜というメソッドを提供するdelegateさん(仮名)」という感じなのではないかな、と。実際問題として関数名としてdelegateと書いているわけだし)。

#もちろん、まずい使い方はいくらでも考え付くけど、悪用は善用に転化できるけど、使われなければそれまでだ。

例)カプセル化

class Foo {
    int counterValue;
    public int Counter {
        get { return counterValue; }
    }
    public void bar() {
        Baz baz = new Baz();
        baz.doSomethingWithFoo(this);
    }
}
class Baz {
    public void doSomethingWithFoo(Foo foo) {
        ...
        if (foo.Counter == 0) {
            ...
        }
        ...
    }
}

に対して

と、ここまで書いて、この例だと何も匿名メソッドを使うまでも無く、次の書き方で良いことに気づいたので、この例はやめた。

class Foo {
    int counterValue;
    public bool IsFirstVisit {
        get { return counterValue == 0; }
    }
    public void bar() {
        Baz baz = new Baz();
        baz.doSomethingWithFoo(this);
    }
}
class Baz {
    public void doSomethingWithFoo(Foo foo) {
        ...
        if (foo.IsFirstVist) {
            ...
        }
        ...
    }
}

で、別の例を考え付くまで、一回休み(というか、普通にイベントハンドラを書けば良いのだが)。

#おれはTell Don't Ask原理主義者だから、Tellのネタを与える方向は常にOK

とりあえず最初の一歩としては、外部へは常に振る舞いのみを与えて、属性は(プロパティのような仮想化されたものですら、属性そのものとしては)見せないってこと。

でも、さらに考えると、Fooのインスタンスに対しての最初の呼び出しであれば、何をするか、というのはFooの所有ではないかとか、と思ったけど上の例は、Fooに連動して動作するBazなので、クリーンなFooを与えられたときのBaz自身の動作がifのブロックの中に入るのでこれで良い。次のように書くのはさすがにやり過ぎだろう。

class Foo {
    int counterValue;
    public bool InitializeBaz(Baz baz) {
        if (counterValue == 0) {
            baz.Initialize();
        }
    }
    public void bar() {
        Baz baz = new Baz();
        baz.doSomethingWithFoo(this);
    }
}
class Baz {
    public void doSomethingWithFoo(Foo foo) {
        ...
        foo.InitializeBaz(this);
        ...
    }
    public void Initialize() {
        ...
    }
}

でも待てよ。こっちのほうがチャーミングだな。こっちのほうが良さそうだ。(条件判断がメソッド全体を覆うものに変形できているというのが、チャーミングな理由)

追記:っていうか、アトミシティ原則(っていう名前じゃなかったかも。ステートの問い合わせを処理と分離するな)からもこっちが良いというか、場合によってはこっちでなければならない。

_ fact

「保守不能なコードを書く大原則とは 可能な限り多くの場所において可能な限り多くの方法で 事実を明確にすることである」

DRYの反対。そこら中で繰り返せ(しかも複数の方法/アスペクトで)、ってことでは。

本日のツッコミ(全4件) [ツッコミを入れる]
_ きむら(K) (2007-06-05 03:11)

以前web日記に書いたことがあると思うのですが、「匿名」ってのは本当は名前があるけどそれを隠しているという意味だと思ってます。<br>件の関数はハナから名前を持たずに生まれてきているので、<br>「無名」関数とでもすべきだと考えます。<br>anonymousという英単語自体に対応する訳語としては<br>匿名、無名どちらでもOKですけど、意味的に匿名はないだろうと思います。<br>anonymous ftp の anonymous なら匿名で納得なんですけど。

_ odz (2007-06-05 03:12)

匿名じゃなくて無名という意ではないでしょうか。<br>http://www.kt.rim.or.jp/~kbk/zakkicho/zakkicho18.html#D20061222-2

_ arton (2007-06-05 03:30)

おお、示し合わせたような見事な被りかた(RSSの反映が原因?)。<br>で、意味はわかりました。確かに無名のほうが合ってますね。でも、これは難しい(僕も記事を書くなら「匿名メソッド」って書く)。っていうのは、MSDNの訳語が「匿名メソッド」だから別の訳を当てるとヘルプから参照できなくなるし、(読者にとって)新規性がある概念に複数の呼び名があると混乱の元になりそうだからです。<br>#というときのコミュニティなんちゃらか……ちょっと考えてみます。

_ NyaRuRu (2007-06-05 16:00)

anonymous delegate はコンパイル時生成の静的な匿名クラスというイメージが強いので,個人的には「匿名」でも違和感はありません.実際名前はコンパイラが勝手に生成しています.<br>まあ自分でも特定の実装を意識しすぎだとは思いますが.<br>その点,Expression Tree や DLR の AST は確かに無名というイメージですね.<br><br>http://www.atmarkit.co.jp/fdotnet/special/cs20review02/cs20review02_01.html<br>>このように匿名メソッドは、実は(暗黙的な)クラスを作り出すための機能なのだ。


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|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

ジェズイットを見習え