- PR -

特集「私がJavaからC#に乗り換えた10の理由」について

投稿者投稿内容
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2003-07-18 02:31
>>英-Ranさん
やっとすれ違いがわかりました(と思います)。
私は、個人的には委譲(実装責任を他者に渡すこと?ですか?)という概念(もちろん既にあるものです)にからめた理論展開ができていなかったようです。
それで、確かに指摘されていたとおり、

引用:

「C# delegate」、「メソッドオブジェクト」、「無名InnerClass」のそれぞれにおいて「委譲」の主体は何か




を考えてみると、本来委譲すべきものとしては「メソッド」が主役ですから無名InnerClassや、

コード:

c1.SampleEvent += c2.Sample_Handler;



のほうが、メソッドオブジェクト自体(と考える事ができるもの)を渡しているわけですから、自然ってことですね。型を持つだのを中心として展開した私が議論していたのは「委譲」の意味からすればずれている、と。
確かに「C# delegateオブジェクト」はメソッドを渡すという概念から見るとなんか余計な感じです。でも、じゃあ「何でこうなっているのか」を考えたくなってくるわけで、ちょっと理由を考えてみます。privateメソッドを委譲につかえるとか委譲に使うメソッドはあくまでクラスのメソッドでもあるとかあたりが怪しい感じ(この辺誰も突っ込んでくれない)。
英-Ran
ベテラン
会議室デビュー日: 2002/06/12
投稿数: 55
投稿日時: 2003-07-18 08:56
引用:

yaさんの書き込み (2003-07-18 02:31) より:
>>英-Ranさん
やっとすれ違いがわかりました(と思います)。



わかっていただけて、うれしいです。実はすでに何度もこのことは書いたつもりだったのですが、なぜかみんな無視するんですよね。

# 実は結構さびしかったり

引用:

のほうが、メソッドオブジェクト自体(と考える事ができるもの)を渡しているわけですから、自然ってことですね。型を持つだのを中心として展開した私が議論していたのは「委譲」の意味からすればずれている、と。



逆の発想をしてみてください。なぜ、メソッドオブジェクトや無名InnerClassでは型の発想をとやかく言う必要がないのに、「C# delegate」では型がうんたらとか言語仕様として書かなければならないのか、というふうに。

引用:

確かに「C# delegateオブジェクト」はメソッドを渡すという概念から見るとなんか余計な感じです。でも、じゃあ「何でこうなっているのか」を考えたくなってくるわけで、ちょっと理由を考えてみます。privateメソッドを委譲につかえるとか委譲に使うメソッドはあくまでクラスのメソッドでもあるとかあたりが怪しい感じ(この辺誰も突っ込んでくれない)。



二番目の「「C# delegate」、「メソッドオブジェクト」、「無名InnerClass」のそれぞれにおいて「委譲」の主体は何か 」に対する答えを表にすると一目瞭然になるはずです。

[ メッセージ編集済み 編集者: 英-Ran 編集日時 2003-07-18 08:57 ]
未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2003-07-18 09:58
>を考えてみると、本来委譲すべきものとしては「メソッド」が主役ですから
>無名InnerClassや、
「処理の責任」じゃないんですか?

メソッドとかクラス(或いは手続きとかデータ構造)という
視点から見ていると,オブジェクト指向やデザインパターンの
本質を見失うのでは.
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2003-07-18 10:45
今後、匿名メソッド、匿名デリゲートなんてものが…
ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 2003-07-18 11:18
ども。ほむらです。
だんだんと議論っぽくなってきて
どこまで延びるのか別の意味でも
楽しみになりつつあります(笑
ちなみに、前の書き込みのCソースで一部間違いが
ありますが、文法エラー的は些細なので無視しますm(__)m
------------------

K-NAK 氏へ
僕の個人的な思いつきに
わざわざ実験していただけたことに感謝します。
(実行環境持ってないので実験できなかったんです><)
引用:
デリゲートインスタンスは、メソッドへのポインタに加えて、インスタンスへの参照も
保持しているようですね。
(私はむしろstaticメソッドへのデリゲートがどうなってるのかが不思議です^^;)


メンバ変数の独立性は保障されているとして考えてもいいのかな?
ということは、C++では使いにくかった関数のポインタが
delegateを使用するとクラスとしてのカプセルを保持しつつ異なるクラス間で
干渉しあえると言うことですね^^
(モデリングとか設計はさらに重要なものとなりそうですが)

C++で座標を移動するクラス(等速運動とか加速度運動など)を作ったときに
C++では関数のポインタは静的な関数(またはグローバル関数)にしか
使用できなかったので
メンバにアクセスできず苦闘した記憶があります。
(=friendでグローバルな関数を呼んでいるのと同じ

delegateを使用すれば座標や運動状態を保持するクラスと
実際には運動を実行するマネージャのクラスを
別々に考えて上げれるというわけですね。(う〜ん便利だ(笑


ya 氏へ
えっと。。。僕の場合なのですが
たとえばDirectXを使用したときに
DirectX本体のラッパークラスと
画像を保持するクラス(レイヤー)があった時に
レイヤークラスをクリーンナップするための
グローバル関数を作成しておいて
DirectXのクラスに関数のポインタを
覚えさせておきました。(必要があった場合に自動的に処理させるため)

つまり、こういう認識でよいのでしょうか?
なんか、僕最後の部分でまだ誤解しているような感じが^^;;;;;;;;;;;

提示していただけた例を使用するのならば
ラッパークラス(ex.CMyDirectDraw)はこんな感じの宣言???
まぁ、色々と不都合はでそうですが(笑
コード:
class CMyDirectDraw:
{
    protected :
        Delegate *LayerCleanupDelegate;
}




お犬様 氏へ
>今のところ Java にはプリミティブ型と参照型しかないですが???
僕がJavaを勉強したときにJavaはクラス型?(クラスを基本とした型)で
あるべきというのがあってintなどのようにただバイト情報だけの原始的な型は
なくそうという考えがあったと聞いてました。
なので本来であれば、intやlongなどもStringのように
クラスであるべきはずなのに
原始的(プリミティブ)な型として残ってしまっている。
(↑以上の思想より存在しない予定のもの

すべてをクラスとして表現するのは無理なのか?
なんてことを言っていた人がいました。
それが記憶に残っていて発言の元になっています。

Javaのbreakなどは便利でいいですよね。
Cにもぜひとも取り入れてほしいと願いもしました。
最近の言語には
大抵取り入れられているようですし。。。(perlしか知りませんが(笑)

メモリ管理についてはそのガベージコレクション(以下GC)が大きいです。
またも聞いた話になってしまうのですが
GCは昔のベーシック同様メモリの再配置も行ってくれるようです。
C++(WIN SDK)であればCreateHeap()などを使用して一括確保一括解放とかしないと
フラグメント化が起こってしまって実メモリはたくさんあるはずなのに
残りの領域が少ないとか。。。なぜかスワップが発生したり。。
確保と開放がはげしいものになると結構でてしまいます。
僕の言いたいメモリ管理というのはこういったローレベルな話です。

基本さえまればメモリリークなんてそう簡単には出ないと思ってますし。
ヒープ領域はまとめて開放してしまいますから
残っていても一緒に削除されてしまいます
(↑注.アクセス違反の原因(笑

未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2003-07-18 11:39
携帯Javaアプリとか作っていると、GCの存在を意識させられます。
突然速度が低下したり、メモリー食って「ソフトが継続できない障害が発生しました」
と怒られてしまいます。
nak2k
ベテラン
会議室デビュー日: 2003/07/17
投稿数: 86
投稿日時: 2003-07-18 11:51
今の議論に参加するのに無名インナークラスを理解してないのはまずい、と思い
少し調べてみました。

http://www.fk.urban.ne.jp/home/kishida/kouza/forte06/forte06abstract.html
上記ページより「無名インナークラス」の項から少々引用
コード:
ActionListener al = new ActionListener(){
  public void actionPerformed(ActionEvent ae){
    taMessage.append("押された\n");
  }
};



上記の文で生成されるインスタンスは「無名クラス」のインスタンスであり、
かつ、「無名クラス」は「ActionListenerインタフェイスをimplements」するわけですよね?
ゆえに生成されるインスタンスは、「ActionListener型のオブジェクト」ともいえます。
(実際、ActionListener型の変数に代入してますし)

ここで考えたのが、『C#のdelegate』は「無名インナークラスがimplementsする
インターフェイスが、一つのメソッドしか宣言してない場合専用の仕組み」と
みることも可能ではないか?ということです。
(C#のdelegateの型は、無名インナークラスのインタフェイスの型と一致するわけです)

こう考えると比較すべきは、「C#のdelegate」と「Listnerインターフェイス」ではないか?と考えます。
そしてその違いは、
1.単一イベントのみ扱う(delegate)か、複数イベントを扱える(Listner)か
2.継承による分類を行える(Listner)か、行えない(delegate)か
ではないか、と。(なんか間違ってるかも…)

私はJavaの経験が少ないので間違いがあったらご指摘願いたいのですが、
Javaのプログラミングにおいて「単一メソッドのListenerが多い」あるいは、
「Listenerの空実装を備えたAdapterを使うことが多い」というようなことはないでしょうか?
もしそうだとしたら、「Listenerの特殊形」に対して、Listnerよりプリミティブな
「delegate」という新しい概念をあえて導入したC#は、それが十分に有益だとの判断
の元に導入したと感じます。

(しかし、C#のdelegateの真のねらいは、eventキーワード抜きには語れない気がします…
 これについてはいずれ投稿させていただきます^^;)
object
ぬし
会議室デビュー日: 2002/03/20
投稿数: 338
お住まい・勤務地: 香川県高松市
投稿日時: 2003-07-18 12:08
objectです。

>とめさん
「コプリエン」の「ファンクタ」ですよね?
「コプリエン」が何をベースに「ファンクタ」を考えたか、確証は無いですが、読んでいる限りでは、数学の圏論(カテゴリー論)があるみたいですね。
「ファンクタ」自体も、圏論の「関手」と関連があるようですし。

「ファンクタ」は、私も「delegate」に近いと思います。
でも、「delegate」は「メソッドシグニチャ」を「型」として取り込もうとしていますから、少し違うと言えば違うんですかね?
宜しければ、また教えて下さい。

「ファンクタ」も「delegate」も、私には、
「クラス指向」に於ける、「メソッド」の復権
の様に映ります。

コプリエンは、「ファンクタ」を「クラス」で実装して、尚且つその中で継承まで考えている様です。
でも、「delegate」で考えた場合、これが良いのか悪いのかも含めて、この辺は私には余り良く分かりません。
宜しければ、これに関しても教えて欲しいです。
でも、余り話しを発散させると、ここのテーマから大きく外れてしまいますかね?

スキルアップ/キャリアアップ(JOB@IT)