トップページ⇒tech
571コメント167KB

CとJAVAを比較した場合Cの良いとこと悪いとこ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
ってある?
0446デフォルトの名無しさんNGNG
>>441
うーむ、言い方が悪かった。
条件によって生成するサブクラスが違う場合(ただし同じインターフェースを
実装しているか、同じ抽象クラスを継承していることが前提)に、getConstructor()
とかやるじゃない。
0447デフォルトの名無しさんNGNG
>>444
アサーションだよ。アサーション用のメソッドが無い場合は
そうやってクラス内の値を取り出すしかない。
0448親切な人NGNG

ネットサーフィン中に、凄い人気掲示板、発見!!!

「はにちゃんねる」↓
http://www.isn.ne.jp/~honey/hc/

ネット内では、現在、この掲示板の話題で、持ちきりです。
0449デフォルトの名無しさんNGNG
>>446
あーわかりました。そういう時は、なるべくFactoryMethodとかで
やったほうがいいよ。(かのヒロミチュ先生もご推薦(藁))
0450デフォルトの名無しさんNGNG
>>445
Javaの場合、その変数(C++だと派生クラスポインタ)に対して
メソッド呼び出しをした時必ず動的バインドが行われる。
過去レスを読んでみると良い。
0451デフォルトの名無しさんNGNG
>>449
そう、だからFactoryMethodとかAbstractFactoryとかその辺のことを言ってるんだよ。
0452デフォルトの名無しさんNGNG
>やったほうがいいよ。(かのヒロミチュ先生もご推薦(藁))
誰?
0453デフォルトの名無しさんNGNG
451の発言を見て
>そういう時は、なるべくFactoryMethodとかでやったほうがいいよ。
という意味がいまだにわかっていないじゃん(w
と書いてみるテスト
0454デフォルトの名無しさんNGNG
>>451
本当に、そのあたりを記述するのにリフレクション使う必要が
あるのかな???C++/Java両刀の人間には不思議なんだけど。
使ってもできるけど、避けたほうがいいんじゃない?という話
ですが、どないでしょ?
0455デフォルトの名無しさんNGNG
そういえば、高木先生スレッドなくなったね。
高木先生はすげーって。
0456デフォルトの名無しさんNGNG
>>454
もうほっといてあげなって。
これだけ説明してもわかってないし、
ヒープとスタックの区別もついて無さそうだよ。
0457デフォルトの名無しさんNGNG
そういうわけで、ポリモーフィズムもわかってない。
きっとOOもわかってない。
あー、哀れ・・・
0458445>450NGNG
>>429のことですか?過去レスって。
0459デフォルトの名無しさんNGNG
という具合になげくお前らももっとわかってなさそう・・
0460スレと全然関係無いけどNGNG
攻撃に弱い人は、たいてい冬厨ですな。
第三者装って揚げ足取るのが得意技。
0461デフォルトの名無しさんNGNG
>>454
Classクラスのfactoryメソッド使うだろ?
まさにそれがリフレクションの機能使ってるやんけ。
0462デフォルトの名無しさんNGNG
なんかずいぶんいろんな意味の「動的バインド」が出てきてる気がする…
0463デフォルトの名無しさんNGNG
>>454
>使ってもできるけど、避けたほうがいいんじゃない?という話
>ですが、どないでしょ?
というのは何故??
0464デフォルトの名無しさんNGNG
FactoryMethod適用時に、switch文を使ってもクラスの動的生成を見かけ上はできる
けど、美しくないよね。
0465この人大丈夫か?NGNG
>>461
なんででしょ?普通にnewで対象クラスのコンストラクタ起動するだけでいいじゃない。
仮にそれでないとFactoryMethodが実現できないなら、C++の時どうするの?
0466デフォルトの名無しさんNGNG
>>443
君らの書くプログラムはファイルreadすると
勝手にフォーマットがわかるですか?
ずいぶん便利ですね。
0467デフォルトの名無しさんNGNG
>>466
「解析」をそんなに責めなくても…
0468デフォルトの名無しさんNGNG
>>465
getConstructorメソッドちゅうのを使うことはリフレクションの機能を使っているということです。
ちなみにこの場合は対象クラスをnew演算子でインスタンス化しません。
0469デフォルトの名無しさんNGNG
>>465
あ、そうそう、Constructorクラスていうのがあるからね。
Java2のAPIガイドみてみ。
0470この人大丈夫か?NGNG
あーそういうことか。
switch分岐よりClass.forName().newInstance();
とかで一行で済ますほうが「ソースが美しい」って話ね。

ここから先は宗教戦争ですので、結論はでませんな。

インスタンス生成メソッドでさえswitchを嫌うことで失う実行時
コストととの相談というあたりを落としどころにしませう。でない
と終わらんよ。
0471デフォルトの名無しさんNGNG
>>465は、lava.lang.refrect をまず読んでからだろうな。
0472デフォルトの名無しさんNGNG
>なんででしょ?普通にnewで対象クラスのコンストラクタ起動するだけでいいじゃない。
newする対象のクラスが動的に変わる場合はハードコーディングしないでしょ?
クラス名をひっぱってきて、Constructorオブジェクトを取得してからインスタンスを
取得する。まあ一度やってみてください。やらんとわからんと思う。
0473デフォルトの名無しさんNGNG
java.lang.refrectだ・・・
0474この人大丈夫か?NGNG
しかし、コレクションあたりと同じ感覚でリフレクション使う人って、
以外と多いんだね。知らんかった。気をつけよう。
0475デフォルトの名無しさんNGNG
>>470
アンタも大丈夫??
0476デフォルトの名無しさんNGNG
>>474
そうそう、そのへんから宗教戦争になるんだよ、たぶん…
0477デフォルトの名無しさんNGNG
>>474
コレクションとリフレクションを同じ感覚で捕らえられる感覚が
おれにはさっぱりわからん。まったく別物じゃん。説明してくれ。
0478デフォルトの名無しさんNGNG
異なるクラスが20個あったら20個の分岐を作るんか?
そりゃアンタ、アフォですよ。
0479この人大丈夫か?NGNG
>>472
あーそうか。サブクラスを実行時まで解決できないパターンでの
ファクトリの話ね。了解です。

はうー、どんなシステムでそんなもんが必要になるのでせうか。
後学の為に教えてチョ。
0480デフォルトの名無しさんNGNG
>>478
3個ぐらいだったら分岐しちゃうような…
0481デフォルトの名無しさんNGNG
実行時に20のうちから1つ選んでインスタンスを作るような場面が、コレクションを使う場面と同じ位あったら、やっぱ考え直すな、おれなら。
0482デフォルトの名無しさんNGNG
>>479
結構いろんなところで遭遇するよ。
例えばA/B/Cというシステムにメッセージを送りたくて、出口が一つしかない場合とか。
メッセージのあて先決定メソッドなんかはabstructにしておくんだよ。
0483デフォルトの名無しさんNGNG
>>480
3個程度しか増えないことがわかっているならそれでも良いんじゃない?
んで、将来も変わらないことがわかっているんならわざわざリフレクション
使うまでもないかもね。
0484デフォルトの名無しさんNGNG
というか、リフレクションって呼ぶとかなり誤解招くな・・・
そんなリフレクションAPIの末端使ってて、リフレクションとか言ってるんだもんな。
解析と判別も笑えたけど。
おめーのバグだろ・・・スレに登録済みですか?(笑)

>Class.forName().newInstance();とかで一行で
一行じゃかけないよ。
横に長くて(笑)
それは冗談にしろ、2つのメソッドは両方引数がくっついてくるわけで
そこら辺もとか考えると、
switchの方が、メンテするとき明らかに楽だと思うけど。

で、リフレクションおじさんは結局のところ
変なデザパタの本をそのまんま丸暗記してたって事なのかな?
さすがにスタックとヒープの違いはわかってると思うけど・・・
そう願いたいよ。
0485デフォルトの名無しさんNGNG
484も、えらそうなこと言ってるけどおそらく実務は皆無だと思われる・・
0486デフォルトの名無しさんNGNG
まぁ、ここでわかってないやつが1000人いても、仕事の現場のわかってないやつ1人にくらべれば、俺の生活への影響は微々たるものだ。
0487デフォルトの名無しさんNGNG
ファクトリーメソッドは便利だから、よく使うよね。
20個分岐するswitchって言うけどさ
20個クラスつくったり、ファクトリーメソッド呼び出す側とか
いろいろ考えてみると別にどうってことないと思うけど。
0488デフォルトの名無しさんNGNG
>>484
>というか、リフレクションって呼ぶとかなり誤解招くな・・・
>そんなリフレクションAPIの末端使ってて、リフレクションとか言ってるんだもんな。
えらそーなことをのたまうオメーが説明してみー。
0489デフォルトの名無しさんNGNG
>switchの方が、メンテするとき明らかに楽だと思うけど。
バカかお前は?
クラスが増えるたびにいちいちソース直してコンパイルかけんのかよ??
そーゆーのはプロパティファイルに外だしするんだよヴォケが。
0490デフォルトの名無しさんNGNG
>>488
というかリフレクションクラス全部挙げたりしたんですが・・・
今日は70メッセージくらい書いたと思うけど。
今日も厨房が一人減って満足だ。
では、おやすみ。
0491デフォルトの名無しさんNGNG
489はmakeツールを知らないらしい・・・
0492デフォルトの名無しさんNGNG
>というかリフレクションクラス全部挙げたりしたんですが・・・
それは説明したことにはならんと思うぞ。
0493デフォルトの名無しさんNGNG
20個分岐のswitchが1箇所ですむなら、べつにいいと思うんだが、このテの話は、
20個の分岐が、あっちこっちに散らばるようなら、ポリモルフィズムつかえっていう時に出てくるなぁ。
でも、20個のcaseのswitchが1つあって、そこで作るオブジェクトを切りかえるような使い方なら、
おれはまよわずそれを使うな。
リフレクション(?)なんぞ使わずに。
0494デフォルトの名無しさんNGNG
491はIDEを使ったことがないらしい・・
ついでにJavaで仕事をしたこともないらしい・・
0495デフォルトの名無しさんNGNG
窓の中の蛙ハケーン
0496493NGNG
あ、もちろん、実行時まで知り得ないクラスのインスタンス作るような場合は、リフレクションでしょうね。
0497デフォルトの名無しさんNGNG
>>493
というかですね、あるシステムの汎用フレームワーク的な部分を構築する
場合は、スーパークラスやインターフェースのかたまりを作って
それをベースにいろんなシステムを開発していくわけです。

そのフレームワークからユーザーパッケージのクラスを、ソースに
ベタ書きで呼び出すわけにはいかんだろ、というワケです。
0498デフォルトの名無しさんNGNG
ファクトリーメソッドにプロパティー使うバカもいるのか。
名スレだな。
0499デフォルトの名無しさんNGNG
普通はどうやるの?? > 498
0500デフォルトの名無しさんNGNG
MS の JVIEW上でも File.setLastModified() だっけ?
出来るメソッド書くとき java.lang.reflect にお世話に
なりました。
0501デフォルトの名無しさんNGNG
>>497
ストリングクラスのオブジェクト渡すのと、
派生クラスのオブジェクト渡すのと何が違うの?
それってファクトリーメソッドの話とは違うよね?
0502デフォルトの名無しさんNGNG
>>500
C#はうざいので消えてください。
0503デフォルトの名無しさんNGNG
>>501
なんか話がズレてるぞ。
汎用なんだから、ある特定のユーザーパッケージもしくはクラスを
importしたりベタ書きしたら、ぜんぜん汎用じゃなくなるじゃんか。
0504デフォルトの名無しさんNGNG
Cの良いとこと悪いとこスレだったはずなのに (ほのぼの〜)
0505503NGNG
汎用パッケージ内のクラス内に、ユーザーパッケージのクラスを
ハードコードすると、汎用パッケージとして意味をなさなくなってしまう
という意味です。
0506503NGNG
それを解決するのに有用なのが上の方にあったリフレクションだ。
0507デフォルトの名無しさんNGNG
>>503
だから、外部から派生クラスを受け取ればいいでしょ?
0508デフォルトの名無しさんNGNG
リフレクション使うにしろ、文字列を受け取るわけでしょ?
ファクトリーメソッドの話はもう終わったのかな。
0509デフォルトの名無しさんNGNG
>>507
スマソ。意味がわからん。
「外部から派生クラスを受け取る」ってどういう意味?
0510ジーンズもケイタイも503が好きNGNG
>>503
汎用パッケージとユーザーパッケージが同時に存在してるなら、どういうことになるんだろうね。
0511510NGNG
どういう→そういう
0512デフォルトの名無しさんNGNG
>>508
ずっと続いてます。
0513デフォルトの名無しさんNGNG
>>509
つまり Class.forName() で得られるような
クラスオブジェクトを渡すって事では?
0514デフォルトの名無しさんNGNG
外部って言うのは、フレームワーク上のアプリケーション
つまりは、ユーザーパッケージの事。
0515513NGNG
やば、ヘンな造語使ってしまった
0516デフォルトの名無しさんNGNG
>>510
汎用パッケージは、いろんなところに横展開が可能だ。
A社で使ったり、B社で使ったり・・。業界が同じなら流用しやすいだろ。
だけど中身の業務は違うから、そういう部分はユーザーパッケージのクラス
で実装するんだよ。汎用パッケージが提供するのは主にインターフェース
もしくは抽象クラスの部分。
0517デフォルトの名無しさんNGNG
>>514
だから、ユーザーパッケージのクラス名は外だしにするってことだ。
switch文を使ったら、クラス名をハードコーディングせんといかんだろが。
0518デフォルトの名無しさんNGNG
>>517
ちょっと待て、switchはファクトリーメソッドの話。

ユーザーパッケージの中でnewされたオブジェクト(抽象クラスを継承した物
またはインターフェースをインプリメントしたもの)を受け取る関数を
汎用パッケージに持たせるのが普通では?
つまり、何らかの入力に対して何らかの出力をしたければ、
(例えばの話として)汎用パッケージでは、
constructor(InputStream is,OutputStream os)
というのを用意して、
ユーザーパッケージでは、相応のInputStreamとOutputStreamの派生クラスを
newして
コンストラクタに渡してあげればよい。
0519デフォルトの名無しさんNGNG
>>518
俺の構想とはアンタとちょっとずれているとは思うのだが・・

汎用パッケージからAというインターフェースを実装したクラスを
使いたい場合、ユーザーパッケージにはAを実装したクラスを作るよね。
だけど汎用パッケージ側はユーザークラスを知らないわけだ。
だけどインターフェース名で呼び出せば良いから、条件によって
クラス名だけフレームワーク側にあたえてやって、ユーザークラスの
インスタンスを取得すればよい。

こんな風に。

A a = Factory.getA(クラス名);

どうでしょうかね?
0520519NGNG
取得したいユーザークラスが引数を持つコンストラクタをもっている
場合も、インスタンスの取得の仕方が違うだけで考え方は同じだよ。
0521デフォルトの名無しさんNGNG
結局のところ、Javaのリフレクションって俗に言うプラグインを組み込むための仕掛け
と理解してるんだけど良いのかな。JavaBeanってプラグインだと決め付けてるけど。
0522デフォルトの名無しさんNGNG
ttp://www.tetras.co.jp/yada/j_java_ref_r.htm

リフレクションの応用範囲は広い。いろんな場面で活用されるということだ。
0523デフォルトの名無しさんNGNG
>>521
それはリフレクションの一部の機能ね。

>>519
言いたい事はわかるけど、それだと
ユーザーが作ったAの派生クラスを外部で利用するには、
キャストをしなきゃならない事は理解できるかな?
Aがインターフェースである場合はそんする部分も大きいよ。
0524デフォルトの名無しさんNGNG
そのURLのページから、リフレクションは情報隠蔽を破壊しやすいので
使わないこと。
まあ、ファクトリーメソッドとしては問題ないけどね。
0525デフォルトの名無しさんNGNG
>>523
そのユーザーが作ったAの派生クラスは、汎用パッケージがあることが
前提なんだから、他では使い道が無いよね?
万が一、外部で(外部とはどういう意味かよくわからんが)使いたい場合は
そのクラスをそのまま使えばいいんじゃないの?

例えばそのユーザークラスに独自のメソッドが実装されていた場合
(つまりスーパークラスにはないメソッドが定義されている)に
そのメソッドを使いたい場合は、Aというインターフェースで受けては
いけないよね。もしくはダウンキャストしなけりゃならない。

Java2における、Vectorクラスなんかそうだよな。Listで受けるときは
Listに定義されてるメソッドしか使えないけど、汎用的に使えるよね。
0526デフォルトの名無しさんNGNG
>Aがインターフェースである場合はそんする部分も大きいよ。
どういう場合か簡潔に説明してください。
0527デフォルトの名無しさんNGNG
>>523
後付けの部品を組み込む時以外の既知のクラス情報を参照するのに意味あるの?
クラス設計の不手際をコーディング時に辻褄あわせて再設計の工数とトレードオフ
するためには使えるけど、それって裏技の類だよね。

・・・設計に自信があっても障害検知時に利用するというのには大いに意味があるか。
0528デフォルトの名無しさんNGNG
なんで誰も>>494のバカっぷりに突っ込んでやらないの?
0529デフォルトの名無しさんNGNG
528=491
0530デフォルトの名無しさんNGNG
C 使いってもういないのだろうか。
嘆かわしい世の中だ。
0531デフォルトの名無しさんNGNG
>そのユーザーが作ったAの派生クラスは、汎用パッケージがあることが
逆です。
フレームワークをユーザーが使うの。

>もしくはダウンキャストしなけりゃならない。
既に書いたけど、
汎用フレームワークの外側でnewされてれば、ダウンキャストは起こらない。
リフレクション使うと、コンパイル時の型チェックもできないしさ。

>どういう場合か簡潔に説明してください。
ファクトリーメソッドで必ずオブジェクトを作るって事は、
複数のインターフェースをインプリメントできない。
つまりはインターフェースの意味が無い。
constructor(A a,B b)
というのがあったとき、
A,BをインプリメントしたクラスCがあると、
constructor(c,c)でOK。
これでいい?
0532デフォルトの名無しさんNGNG
とりあえず BeansScriptingFramework は便利だ。
0533デフォルトの名無しさんNGNG
>>530
きょうび Cだけしかできないなんてヴァカがいたらみてみたいものだ(w
0534デフォルトの名無しさんNGNG
>>533
Javaをわけもわからず無理やり使って、勝手に惨めな思いしている
Cプログラマなら、掃いて捨てるほどいるなあ。
0535デフォルトの名無しさんNGNG
>>534

年末に使われてないJava使いを集めて捨てました。
すっきりきれいになりました。GCって便利ですね。
0536デフォルトの名無しさんNGNG
JAVAで全てできると思っている奴は見ていてマヌケだ。
0537デフォルトの名無しさんNGNG
JAVAと表記するやつは間違いなくマヌケさん(稿
0538デフォルトの名無しさんNGNG
>>536
>>JAVAで全てできると思っている奴は見ていてマヌケだ。
そんな人いないと思いますけど…
ひょっとして、過去の536ご自身ですか?
0539デフォルトの名無しさんNGNG
>>537
>JAVAと表記するやつは間違いなくマヌケさん(稿

おまえは些細なことにこだわって自滅するタイプ
0540デフォルトの名無しさんNGNG
Javaってなんでヲタを集めるんだろうか?
0541デフォルトの名無しさんNGNG
ヲタというほど知ってるやつ、少なさそうだけど…
0542デフォルトの名無しさんNGNG
ヲタとは知識をひけらかして人を見下す人の事を言ったのが語源ですだ。
0543あたまの容量が少ないひとっているんだねNGNG
>>539
きみってヴァカそう、僕のまわりには決していないタイプ(w
0544デフォルトの名無しさんNGNG
>>542
>>ヲタとは知識をひけらかして人を見下す人の事を言ったのが語源ですだ。
それって 542ご自身がヲタだという告白とみなしますが、
よろしいですか?
0545デフォルトの名無しさんNGNG
>>543
>>>539
> きみってヴァカそう、僕のまわりには決していないタイプ(w

おまえ、いつも一人ぼっち。周りにだれもいないタイプ(ヒ
■ このスレッドは過去ログ倉庫に格納されています