1: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:12:25.506 ID:hiXRyAIv0
遺伝的に完全なデータ渡しをしたいんだけど方法ある? 例えば public class A { int id; public B b; publin static void DeleteB(A a){ a.b = null; } } っていうクラスがあったとして A a = new A(); a.b = new B(); A.DeleteB(a); っていう処理をするとデータ渡しなのにAのメンバbが参照型のせいでnewしたaのメンバbがnullになってしまうよね こうならないように渡したデータのクラスが持つ参照型のメンバに関しても参照先は異なるけど参照先のデータは同じ、みたいなことが遺伝的に成り立つようにしたい つまり元のオブジェクトとは干渉しない完全なクローンデータを渡したいんだが可能?
2: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:18:36.569 ID:i28ptRekH
可能
3: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:19:52.434 ID:hiXRyAIv0
>>2 お?
4: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:21:52.119 ID:bnodbkNS0
JavaやめてKotlin使う
5: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:25:53.669 ID:hiXRyAIv0
>>4 KotlinはJavaのデータ渡しとは違うのか?
7: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:30:09.009 ID:bnodbkNS0
>>5 関数型言語っぽく書けるけどJVMで動くステキな奴。
10: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:40:07.553 ID:hiXRyAIv0
>>7 なるほど Javaの上位互換とは訊くが触ったことないんだよな… そろそろAndroidStudio勉強しようかなと思ってるがKotlinの方がいいのかな Javaは最近触れてないけど一時期よく使ってた
16: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:57:48.489 ID:bnodbkNS0
>>10 てっきりガッコの課題かと思って茶化したがプロジェクトやってんのね。ごめん。 言語何?データ渡しってのはいわゆる値渡しのことだよね?
18: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:01:07.585 ID:hiXRyAIv0
>>16 言語はC# そうそう値渡しのことです
6: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:29:12.499 ID:1yZqwlpOr
んー頭のいいことしてるね コンストラクタじゃ駄目なん
9: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:38:01.980 ID:hiXRyAIv0
>>6 今自分が取り組んでるプロジェクトにMVPのデザインパターンを取り入れてるんだがPresenterからViewのメソッドを呼ぶときに Modelのデータを渡したいんだが>>1 にあるような理由でModelのインスタンスのメンバを書き換えられるようになってしまうから保守性を高める意味でちょっと訊いてみたかった コンストラクタでやるのも頑張れば可能かもしれないが参照型のメンバがさらに参照型のメンバを持ってたりすると大変
43: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:03:32.692 ID:bnodbkNS0
>>41 >>9 >>1 の書いてるのはC#
8: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:36:06.232 ID:1yZqwlpOr
ああ言ってる意味よく分かってなかったんだけど A a = new A(); a.b = new B();
A.DeleteB(a); ↑こいつが問題ってことね Aだから悪いのであってa.DeleteB(a)だったらいいんじゃないの?
A.DeleteB(a)のままで使うとしたらどうしたら良いんだろね… クラスAでBを初期化しとかざるを得ない気がすんだけど…
11: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:41:59.056 ID:hiXRyAIv0
>>8 A.DeleteB(a)でもa.DeleteB(a)でも変わらなくね? そっちじゃなくてデータ渡しの仕組みの問題
12: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:43:01.818 ID:1yZqwlpOr
>>11 あっメソッドの中身A.bに空目してたよ
13: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:48:44.218 ID:1yZqwlpOr
んーぼくjava初学者だからよく分かんないんだけど要はDeleteBのアクセス制御が出来りゃいいの…? a.b=nullでデータが書き換えられる事がリスクってことでええのんよね…? 参照先は異なるけどーからの一文がよくわかんない…
15: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:53:53.513 ID:hiXRyAIv0
>>13 アクセス制御の話ではなく渡されたデータの参照型のメンバ変数に格納されたアドレスを元のインスタンスのそれとは異なるようにしたい でも参照先のデータは同じになるようにしたい メモリ管理の話なので初学者だとちょっと高度かもしれない
17: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 21:58:47.889 ID:1yZqwlpOr
それつまりcloneメソッドみたいなの作ればいいんじゃないの…? 多分あるよ… object型にはcloneメソッドがあるからそれ実装すりゃいいんじゃないかな…
19: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:02:44.592 ID:hiXRyAIv0
>>17 cloneって参照型もちゃんと複製してくれるんだっけ
21: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:09:03.540 ID:1yZqwlpOr
>>19 参照型のメンバが参照型だったら参照のコピーになっちゃうかも… でももしそうだとしたらゴミメソッドすぎるよね apiマニュアル読むのめんどくさいから読んできて… やったことないんだけどたとえばAクラスがメンバとして何を持ってるかって調べる方法あんのかな…?
25: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:16:25.668 ID:hiXRyAIv0
>>21 確かjavascriptはすべてのメンバを走査できたような記憶があるがコンパイル言語は無さそう…いや、分からんけど まあ浅いコピーだと中途半端だよねやっぱり
20: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:05:07.718 ID:bnodbkNS0
22: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:11:56.132 ID:hiXRyAIv0
>>20 うーむ…DeepCopyは自作するしかないのか
24: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:14:30.353 ID:HcLCgw1JM
インターフェースで定義と初期化して 後で継承すれば
27: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:18:52.094 ID:hiXRyAIv0
>>24 それでいけるかね… 多分関連する全てのクラスに対してそれやらないといけなくなるだろうから面倒というかもっと上手いやり方は無いものかね
34: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:32:27.287 ID:HcLCgw1JM
>>27 そもそもそんなコード必要ないようにかけば C言語だと悩まないわけで
26: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:16:36.353 ID:iOwtAuty0
>>1 なんでstaticにすんの?
28: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:20:21.785 ID:hiXRyAIv0
>>26 A型の値渡しの一例を挙げたかっただけ staticであることは全く本質ではない
29: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:20:39.950 ID:mBz7HEb20
Serializableてのがあるらしいが
31: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:23:25.706 ID:hiXRyAIv0
>>29 それはI/Oとかじゃないの 普通にメソッドに渡すだけなのにシリアライズとかするか?
40: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:57:37.009 ID:mBz7HEb20
>>31 しないね DeepCopyが面倒なら試してみればという程度の意味です
30: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:20:56.354 ID:iOwtAuty0
まずBにcloneっていうメソッドの定義が必要だし こういう件だと全てに置いてstaticは必要ない
32: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:27:04.494 ID:eNLoag8H0
×遺伝的 〇推移的
36: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:38:48.239 ID:wuXjw/tx0
cloneメソッドを作れ、で終わる話では?
37: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:45:13.849 ID:sxCXS0rj0
> こうならないように渡したデータのクラスが持つ参照型のメンバに関しても参照先は異なるけど参照先のデータは同じ、みたいなことが遺伝的に成り立つようにしたい
これがさっぱり意味がわからないんだけどw ぐちゃぐちゃの日本語にしか見えない 「こうしたい」って一言で言えない?
38: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 22:52:04.315 ID:iOwtAuty0
そもそも A a = new A(); a.b = new B(); じゃなく A a = new A(); B b = new B(); a.b = b; って書けば済む話じゃない?
41: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:00:59.734 ID:DErLLtx10
これjavaなら出来るんだけど C++だと出来ないのよね というかそもそもクラス設計に問題がある ゲーム作ってた時に初めてぶち当たった壁だわ 自動車のタイヤとかエンジンみたいな感覚だとゲーム作れない 設計が間違ってる ゲームだと一番外側に座標という空間クラスを作るって所までは理解したけど 何を作りたいのかわからないから何とも言えない
42: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:01:19.139 ID:HcLCgw1JM
1さんの件はよくわからないがJavaとかC++は複雑な機能使いすぎて返って悩むってことよくある Pythonでは悩んだことあんまないのでオブジェクト指向というよりは単に言語仕様の罠な気がする
44: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:03:37.931 ID:HcLCgw1JM
C++はみんな糞っていうよね 理由はいろいろあるけども 最近は案件も減った Goのほうがいいみたい
46: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:03:47.742 ID:DErLLtx10
いやこれ誰しも悩むとこよたぶん 何か作ろうとし始めたら必ずこの壁にぶつかるはず
47: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:03:49.295 ID:enYrHJs4d
C++ならコピーコンストラクタ作れよ
48: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:05:58.653 ID:iOwtAuty0
> publin static void DeleteB(A a){ > a.b = null; > } >データ渡しなのにAのメンバbが参照型のせいでnewしたaのメンバbがnullになってしまう
どうなって欲しいのかイマイチ分からんね
51: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:08:13.503 ID:iATIg5rja
>>48 aのメンバbをnullにする処理をしてるんだからnullにならない方が意味分からん
49: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:06:21.967 ID:mBz7HEb20
循環参照があるオブジェクトのDeepCopyとかよく考えないで作ると面白いことになりそう
50: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:07:07.331 ID:DErLLtx10
C++だと上に書いたクラスに下のクラスを入れるのは出来るけど その逆が出来ないんだよ そのようなクラスはありません的なエラーになる おそらくC#も同じじゃないかな Javaの場合これが出来るんだな でもおそらくこれが出てきてしまう設計にまず問題がある クラスを理解していない可能性が高い
52: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:10:34.136 ID:iOwtAuty0
>>50 classのメンバ関数以外の定義ってヘッダーに書くもんじゃなかったっけ? あとメンバ関数のプロトタイプもヘッダーに書くから基本的に定義不明で参照できない事にはならないはずだけど
53: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:13:27.969 ID:DErLLtx10
>>52 それが問題があって C++の場合上に書いているクラスは下のクラスを呼び出したり色々入れたりも出来るけど 下に書いたクラスを上のクラスに同じようにできないんだわ おそらくC#も同じ仕様かと Javaはこれが出来るんだ コンパイルする時なのか知らんけど Javaの場合一度すべてのクラスを使える状態にしてからやる感じになるらしい >>1 の悩みはとてもいい悩みだよ 真面目にアプリ作り始めると誰しも1回はぶち当たる壁だと思う 俺もこれで悩んで10日くらいゲーム作りとまった
56: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:16:18.538 ID:iOwtAuty0
>>53 それC#は違うよ プロトタイプが必要ないから同じファイル内で下が見れないとかにはならない ファイル分けしたら循環参照とかになるかもしれないけどそういう場合はinterfaceで切り分けたりとか手段はある
58: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:17:18.062 ID:DErLLtx10
>>56 でもたぶんそのクラス設計は間違ってる
64: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:25:46.431 ID:iOwtAuty0
>>58 まぁ大体相互参照が必要な場合ってそのクラス自体をメンバに持たせるんじゃなく親クラスかI/Fを持たせるもんじゃない?
66: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:36:22.000 ID:DErLLtx10
>>64 うーん・・・ 俺素人プログラマだから何とも言えないけど まず一つ一番デカイクラスを作る 俺の中だと空間クラスとよんでる それともう一つデータクラスが必要になって その空間クラスとデータクラスが色んなクラスを行ったり来たりするイメージ
59: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:17:27.208 ID:bnodbkNS0
>>53 低レイヤー詳しくないけどJVMに訳す時に首尾よくリンクするってことなのかね。 だとするとC#も.Netに訳す時にうまくやってくれる期待ができるかな?
60: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:20:36.980 ID:DErLLtx10
>>59 たぶんJavaとCはコンパイルというかそもそもが違う気がする Cってのは上から順番に展開していく感じなんだけど Javaってのは全部展開してから動く感じ で、高速なのはCなんだけど Javaの場合>>1 のやろうとしてることは簡単に出来る
54: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:14:45.017 ID:DErLLtx10
で、結論がクラス設計が間違ってる まず大きなクラスを一つ作り その中でクラスを生み出していくのが正解だから A→BはあるけどB→Aはあり得ないんだわ
55: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:15:58.469 ID:DErLLtx10
つまりAの中でBやCを作る またAの中でBの子供のDやCを量産して使ったりするわけよ 不可逆なんよ BからAにはしない おそらくこれがオブジェクト指向なんだと思う 違ってたら突っ込みはいくらでもして素人プログラマーに毛が生えた程度だから
57: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:16:59.070 ID:HhxThP1a0
こういう才能ない奴に何も吹き込むな 早めに死んでくれないと周りに何人も死人作りだす
65: 以下、5ちゃんねるからVIPがお送りします 2019/05/10(金) 23:35:29.220 ID:HhxThP1a0
>>63 この数行で絶望的な頭の悪さを感じさせるだろ これで下手に動くコード作り出したら、ケツ拭きさせられた奴が死ぬ
こんなパターンあるんだろうか
この記事へのコメントはありません。