[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 01/02 08:12 / Filesize : 246 KB / Number-of Response : 963
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者】Java質問・相談スレッド113【大歓迎】



1 名前:デフォルトの名無しさん [2008/03/01(土) 18:16:51 ]
プログラミング言語Javaに関する質問スレです。
JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作板をご利用ください。pc10.2ch.net/hp/

過去ログ、関連スレッド、よくある質問とその回答など、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
www.wikiroom.com/java/
これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、
wikiからのリンクをおたどりください。

よくある質問
・「コマンドまたはファイル名が違います」
 「'javac' は、内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
 「Exception in thread "main" java.lang.NoClassDefFoundError: 」
 www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals() を使え。
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。
・その他の質問→「APIのjavadoc見ろ」

前スレッド
【初心者】Java質問・相談スレッド112【大歓迎】
pc11.2ch.net/test/read.cgi/tech/1202467704/

/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */
また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝のう存じます。

次スレは>>980あたりで。

175 名前:デフォルトの名無しさん [2008/03/05(水) 19:50:02 ]
質問です。

GI プログラム中から
他のGUI プログラムを呼び出したときに
必ず呼び出したプログラムのウィンドウ(Frame)にフォーカスをあわせる方法
ってありますか?

呼び出すプログラム側でエンターキーで他のプログラムを呼び出すのですが、
エンターキーを連打したときなどに、どっちのプログラムもキーの受付をしてくれなくなります。

マウスでクリックしてやれば、アクティブになってキー操作を受け付けてくれるのですが。

176 名前:デフォルトの名無しさん [2008/03/05(水) 19:51:14 ]
>GI プログラム中から
GUI プログラム中から
のミスです

あと、
> 必ず呼び出したプログラム
呼び出された新しいプログラム という意味です。

177 名前:デフォルトの名無しさん [2008/03/05(水) 21:18:28 ]
詳しい方へ質問です。

『作成したプログラムを保存するフォルダを作る。コマンドプロンプトを起動したらそのフォルダがディレクトリになるように設定する(Cドライブのルートに「My Java」フォルダを作成し、ここをディレクトリにする)』
という作業をしたいのですが、「コマンドプロンプトのプロパティ」→「ショートカット」で「作業フォルダ」に“C:¥My Java”と入力すると、
「“C:¥My Java”フォルダは無効です。フォルダがあるか、またはパスが正しいか確認して下さい。」と出てしまいます。
他にフォルダを作った覚えもないのに、何度やっても同じ結果になってしまうのですが、どうしてなんでしょう?

あ〜もう!自分で書いてて意味分からない‥


178 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 21:32:09 ]
>>175
ttp://java.sun.com/javase/ja/6/docs/ja/api/java/awt/Window.html#toFront()

>>177
"C:\My Java"
と入れてみ。
C:\は全角で入力する必要があるし、
フォルダ名にスペースを含む場合は前後を"で囲む必要がある。

179 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 21:32:44 ]
C:\は全角じゃない半角だった

180 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 21:44:13 ]
>>177
質問の内容がJavaではない気がする・・・。
Javaのプログラム上からファイル出力をする為のディレクトリを生成して
Javaからコマンドプロンプトを起動してカレントディレクトリを設定するって事ですか?

181 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 21:52:13 ]
int a, b;
System.ou.t.println(a + b);
このaとbを外部からの入力で処理したいのですが、
PHPなんかのWebプログラミングでは、フォームから値を渡しますが、
Javaの場合どうやったらいいんでしょう?
GUI画面を作ればいいのかな?とは思うのですが、やったことがなくてイメージわかないし、
Servlet+JSPなんかの場合、PHPと同じようなことができるんでしょうが、
まだ環境構築どころかJavaでのWebプログラミングのやり方もわからないので、
とりあえずコマンドプロンプトから入力してくださいみたいな感じで、
aとbを順に打ち込んで計算するようなものを作ってみたいと思っています。
どのへんのクラスを使えばいいのでしょうか?

182 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 21:56:07 ]
>>181
いきなり2ちゃんかよ。
まずは本なり入門サイトに行けよ

183 名前:175 [2008/03/05(水) 22:21:26 ]
>>178
最前面には来るんですけど、キー入力が受付ないんですよね。
クリックしてアクティブにしてやると受け付けるんですが



184 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:24:54 ]
>>181
System.in から1行読めばいいんじゃないかね。


185 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:26:53 ]
// >>181
public static void main(String[] args) throws IOException {
// 標準入力ストリームから行単位で読み込めるようにBufferedReaderクラスのインスタンスを生成
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.print(a: );
// 標準入力から1行読み込みint型に変換
int a = Integer.parseInt(br.readLine());
System.out.print(b: );
int b = Integer.parseInt(br.readLine());
System.out.println(a + b);
}

186 名前:185 mailto:sage [2008/03/05(水) 22:34:02 ]
訂正
System.out.print(a: ); // ×
System.out.print("a: "); // ○
System.out.print(b: ); // ×
System.out.print("b: "); // ○
あと
import java.io.*;
も忘れないように。

187 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:38:28 ]
>>155
たぶん見た目ネイティブにしたいんだろうが、
JavaでOSのシステム標準フォント設定を得る方法など聞いたことがない。

188 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 22:58:51 ]
システムカラーなら取れるんだけどね

189 名前:デフォルトの名無しさん mailto:sage [2008/03/05(水) 23:37:52 ]
>>181
「Java Scanner」でググって見なよ

190 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 06:58:02 ]
c言語に比べてjabaを初心者が先に学ぶメリットって何かありますか?
良かったら説明して下さい!

191 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 08:16:53 ]
まずは英語を勉強する方が良いと思うぞw

192 名前:デフォルトの名無しさん [2008/03/06(木) 08:33:55 ]
JAVAのテキストが一通り終わったのですが、
次は何をすればいいでしょうか?

193 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 08:44:29 ]
ソフト会社にバイトに行って、いかに自分がダメダメかを思い知るw



194 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 09:45:48 ]
Javaを「メモリ管理不要、C++」として見てしまいますが、
すべてのパッケージを勉強する必要がありますか?

195 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 10:05:04 ]
> すべてのパッケージを勉強する必要がありますか?
必要なら。

196 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 10:18:27 ]
com.sun.*とSwingの非公開クラスはいらんだろう。

197 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 10:28:31 ]
>194
不要。
java.lang.*
java.util.*
は大雑把にでもいいから確認して、後は必要に応じて調べれば十分

198 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 10:32:50 ]
>>196
非公開クラス?
java.sun.com/j2se/1.5.0/ja/docs/ja/api/

ここで見てて涙目になりました;;
覚える事が多すぎます・・・

199 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 11:30:56 ]
>>198
それは1つ前のバージョンのだな
最新はこっちだ
java.sun.com/javase/ja/6/docs/ja/api/

必要になったときに必要なものを調べて来られれば、全部覚える必要はない

200 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 11:31:56 ]
>>198
java.ioはI/O系、java.sqlならJDBCまわりってレベルで十分。
あとは、必要に応じて調べるだけ。

201 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 12:52:12 ]
Scannerでの質問なのですが

import java.util.Scanner;
public class TestPorb
{
public static void main(String[] args)
{

Scanner input = new Scanner (System.in);
String gen = input.next();
int pt2 = input.nextInt();
int pt1 = input.nextInt();
//input.nextLine();
String name = input.nextLine();
int numOfGame = input.nextInt();
String pos = input.next();
}
}

name をとるときに inputMissmatchというエラーが出ます
コメントを解除するとちゃんと動くのですが、
理由が分かる人がいれば教えてください。

202 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 13:01:47 ]
>>201
nextLine は InputMismatchException を投げません。
入力次第なので、後は何とも。

203 名前:201 mailto:sage [2008/03/06(木) 13:11:36 ]
>>202

入力は、

aaa
12
23
asd asd

で試したところ、

InputMismatchException:
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at TestPorb.main(TestPorb.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)

を投げてきて、次の入力に進めません
長くてすみません。



204 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 13:41:01 ]
>>203
で、それは何処で止まってるのでしょうか、と。
// 一行ごとに直前の変数を出力して、
// 入力と解析後の対応部分を確かめつつ。

205 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 13:46:14 ]
nextIntが23の後の改行も食ってるとか?

206 名前:201 mailto:sage [2008/03/06(木) 13:55:08 ]
>>204

入力は一行づつで、
最後の asd asd を入力した時点でのエラーです。
その前に入力したデータは全て正常に入っています。
どうも入力した "asd asd" を nextLine() で Stringに入れることができていないようなんです。

String name = input.nextLine(); の実行前に一度 input.nextLine(); を実行することでエラーを回避できるので、
Bufferに何か残っているのかな、と予想しているのですが実際のところよく分かりません。

207 名前:201 mailto:sage [2008/03/06(木) 13:57:50 ]
>>205

だとすれば、
無駄にinput.nextLine()を走らせて回避するしか方法はないのでしょうか・・

208 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 14:57:03 ]
>>205
まあ、nextLine が、"23" の直後から改行までを、改行抜きで食ってるだけ。
よって、"23<改行>" なら、戻り値の列長はゼロ。

>>207
そうそう。無駄に nextLine を走らせてください。そういう仕様です。
細かく調整したいなら sikip というものもあります。

209 名前:201 mailto:sage [2008/03/06(木) 22:17:42 ]
>>208

そうですか、分かりました
skipの方も試してみます

ありがとうございました


210 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 22:21:33 ]
今、自分のPCに
Java SE 6 Update 3 がインストールされており、
ブラウザでアプレットなどが起動できるのですが、

Update 4 や Update 5 をインストールすると
Update 3 で起動できていたアプレットが起動しなくなり、
ブラウザを閉じようとすると、固まってしまう状態になります。

ランタイムをアンインストールして Update 3 に戻すと正常に動作するようになるのですが、
Update 4 以上のバージョンで何か問題があるのでしょうか?

コントロールパネルのJavaの設定で、
インターネット一時ファイルなどを削除してみても、
アプレットは動作しませんでした

211 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 22:40:16 ]
リグレッションバグ踏んだとか

212 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:14:08 ]
アプレットが元々バグってて、古いバージョンではたまたま動作してただけとか

213 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 08:29:09 ]
お世話になります。

SwingでGUIのプログラム作ってみているのですが、
イベント動作(?)を設定できずに悩んでいます。
お力添えください。

(awtの?)ActionListener,ActionEvent,ActionPerformed()で、
イベント動作を記述したいです。

JPanel A
├JPane B
|├JButton 1 (implements ActionListener)
|└JButton 2 (implements ActionListener)
└JTabbedPane
 ├JTextArea 1
 └JTextArea 2
例えば、JFrame以下に、上記の構造のコンテナの階層があって、
各コンテナは、直上のコンテナでインスタンス化される。
以上としたときに、
ボタンのActionPerformed()にて、
テキストエリアの内容を保存したり、とにかくテキストエリアにアクセスしたいのですが、
その手段がわかりません。
( 続く)



214 名前:213 mailto:sage [2008/03/07(金) 08:29:32 ]
(続き)

すべての変数をJPanel A 直上でインスタンス化して、
上記の構造をつくり、
JButtonは、内部クラスにすれば、動作の設定はできるのですが、
コンテナの数が多くなってきたときに、内容を読むのが辛い気がします。

また広域な変数を作ることでも可能なのでしょうが、あまり使いたくないです。

どのようにすればよいでしょうか。

最終的には、JMenuBar以下のメニューからのアクセスをしたい、
且つ、JMenuBar以下の構造は、クラスとして、
外部クラスか内部クラスとして宣言したいです。
また、JTabbedPaneは、メニューなどから、増加させたり、削除させたりしたいのですが、
「各コンテナは、直上のコンテナでインスタンス化される。」
のルールにのっとった記述ができなく、簡単化のため、上記の例を出しました。

よろしく御願いします。

215 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 10:36:36 ]
>>213
ボタンとテキストエリアで行うことを仕様とし、その実装をクラスにする。
そのインスタンスをパネルAで生成し、パネルBとタブの生成時に渡す。

216 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 12:10:01 ]
数値a, b(long、doubleも含む)のどちらが大きいか比較し、
a<bなら負、a>bなら正、a==bなら0を返すような標準APIってありますか?

自分で作れというのが最もなのですが、割と頻繁に使う状況に遭遇するので、
標準でそのようなAPIは無いのか疑問になって質問しました。
Mathにはなかったようなのですが。

217 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 12:18:40 ]
>>216
new BigDecimal(a).compareTo(new BigDecimal(b)) とか?
無限大やらNaNやらの場合は知らん。

218 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 12:27:43 ]
>216
数値といっても型が違えば単純には比較でないだろ、常考
比較する為の一般に通用する仕様がないわけだから安直に標準APIじゃ提供しようがない

219 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 12:33:59 ]
それくらい自分で作れ。

220 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:07:15 ]
>>217
ありがとうございます。
取りあえずこれでいけそうですね。

>>218
説明不足でした。型はプリミティブ型でよいです。
System.out.print()のように引数タイプに全てのプリミティブ型を
用意しているクラスメソッドがあったので、数値比較についてもあるのかなと思ってました。

221 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:21:14 ]
同じ型どうしなら a-b でいいのだけど、それじゃダメってことだよね。


222 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:39:09 ]
>>216
×最も
○尤も

(a==b)? 0: (a<b)? -1: 1;

223 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:39:31 ]
>220
だからdouble と int をどうやって比較するのかと(ry



224 名前:デフォルトの名無しさん [2008/03/07(金) 13:40:42 ]
パネルにコンポーネントをadd()してからそのコンポーネントをadd()の反対にすることはできますか?

225 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:45:31 ]
ん?remove(Component)のこと?

226 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:59:21 ]
>>223
値範囲で 217 に負けるけど、Double.compare(double, double) でも良いと思うのですが
変換で何か重要な問題があったっけ……

227 名前:216 mailto:sage [2008/03/07(金) 14:03:57 ]
本当に説明不足でした。
ぐだぐだですみません。
返す型は int。
型はプリミティブ型。
>>221
(int)(long型 - long型)すると、差がInteger.MAX_VALUEより大きい場合に
問題が起きそうなのでその方法はとりませんでした。

>>222さんのように三項演算子で書く方法が一番スマートそうですね。
どうもでした。

228 名前:216 mailto:sage [2008/03/07(金) 14:08:05 ]
>>226
読む前に投稿していました。
まさにこんな感じのを求めてました。
ありがとうございます。

229 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:10:20 ]
>>226
int i = 0;
double d = 0.0;

230 名前:226 mailto:sage [2008/03/07(金) 14:13:42 ]
>>229
日本語での解説をお願いします。

231 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:14:32 ]
(゜д゜) はぁ?

232 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:22:24 ]
javadocよく嫁

233 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:23:29 ]
言い忘れた
byte型の昇格じゃなきゃ特に演算時に気を付けることはない。



234 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:27:46 ]
嘘八百を並べた悪徳スレ

235 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:43:59 ]
>>216
>>226でもいいけど、long が 64ビットなのに対して double の仮数部は 53ビットしかない。
だから例えば
System.out.println(Double.compare(0x20000000000000L, 0x20000000000001L)); //=> 0
System.out.println(0x20000000000000L == (double)0x20000000000001L); //=> true

逆に言うと、あらかじめ精度が必要ない事が判っていれば
Double#compare(double, double) で構わない。

236 名前:226 mailto:sage [2008/03/07(金) 14:55:25 ]
>>235
なるほど。これはお勧め出来なかったですね、申し訳ない。

Long.MAX_VALUE と (double) Long.MAX_VALUE
==> 9223372036854775807
==> 9.223372036854776E18

// int と double についての方も、こういうことなのでしょうか?

237 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:58:14 ]
>>236
int と float だと、float の方が精度低いので問題起きる可能性がある。

238 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:36:10 ]
(・д・)

239 名前:デフォルトの名無しさん [2008/03/07(金) 16:54:44 ]
MVCモデルについて質問です。
現在、MVCを使ってマインスイーパを作ろうというプロジェクトを行っています。
Mでは、m*nのテーブルを裏返したり、フラグを変更させる動作を持たせる事にします。
ここで問題なのですが、
この配列をVに描写してもらう時に、渡すのは数字の入った2次元配列です。
これを例えば1なら1と表示させるというようにすればいいように思えますが、
Vを作る人は、Mがどういう仕様かを知ってはいけないと思います。
つまり、Mで、1という数字を100という風に書こうが31という謎の値で書こうが関係ない設計にしなければならないと思います。
この場合、私の考える中で唯一これを満たす方法は、
Mに描画のメソッドを実装して、Vで委譲させる方法ですが、
MVCの原則として、Mは描画や出入力を行ってはいけない事になっています。
そもそも、View側でもm*nで待っていてくれている保証はないわけですが、
MとVの独立性を保つためにはどのように設計すればよいのでしょか?

240 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:07:46 ]
>>239
>Vを作る人は、Mがどういう仕様かを知ってはいけないと思います。 

いやいやいや。
ビューはモデルの仕様を知っている。
でなければ、何を描くのかすらわからんではないか。
ツリーモデルをマインスイーパービューに渡してどうしろというんだ。
ツリービューはツリーモデルを描く。
マインスイーパービューはマインスイーパーモデルを描く。
interface MinesweeperModel {
 int getWidth();
 int getHeight();
 boolean isFlagSet(int x, int y);
 boolean isOpen(int x, int y);
 boolean hasMine(int x, int y);
 void addChangeListener(ChangeListener l);
 void removeChangeListener(ChangeListener l);
}
こんなのでいいかと。
これをどう実装するか(二次元配列?)は、モデルの実装の詳細であって、ビューはそれを知る必要はない。
これをどう表示するか(JTable?)は、ビューの実装の詳細であって、モデルはそれを知る必要はない。
ただし両者とも、そのインタフェイス (MinesweeperModel) の仕様は知っている。

241 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:13:31 ]
MVCってjava関係ないじゃん。
ゲーム作ってるならこっちの方が適切。

ttp://pc11.2ch.net/test/read.cgi/gamedev/1155209226/l50
ゲームにおけるデータ構造・クラス設計・パターン

242 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:15:00 ]
クリックされたら配列に入力され、その後配列と対応する場所に四角を書きたいんですが
うまくいきませんorz
どこがだめなんでしょうか?
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

/*
<applet code="proto" width=200 height=200></applet>
*/
public class proto extends Applet implements MouseListener{
Point p;
boolean bl[][] = new boolean[20][20];
public void mouseClicked(MouseEvent me) {
p = me.getPoint();
bl[p.x/10][p.y/10] = true;
repaint();
}
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void paint(Graphics g){
for(int x=0;x<20;x++){
for(int y=0;y<20;y++){
if(bl[x][y] == true){
g.fillRect(x*10,y*10,10,10);
}}}}}

243 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:18:48 ]
>>242
addMouseListener



244 名前:239 [2008/03/07(金) 17:22:15 ]
>>240
プログラムが出来たら、うpするので
その時に評価してもらおうと思います。
いろいろ考えると難しくて。実装じゃなくて、設計が。
設計やさんは優秀じゃなきゃ出来ませんね。
設計が腐ってるとすべてが終わる。
設計がしっかりしてれば
実装なんか中卒だろうが高卒だろうが
理系だろうが文系だろうが
関係なしに出来るのではないかと思えてきましたが、
実際のプログラミング現場ではやはり設計というのは一番優秀な人がするものなのでしょうか?


245 名前:242 mailto:sage [2008/03/07(金) 17:26:33 ]
うわ・・恥
>>423どうもありがとうございました

246 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:32:36 ]
実装をなめんなよ

247 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:38:34 ]
>実際のプログラミング現場ではやはり設計というのは一番優秀な人がするものなのでしょうか?

そういう話題はマ板向き

248 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:51:19 ]
設計する人が優秀とは限らないが、優秀でない人が設計すると火事になる

249 名前:239 [2008/03/07(金) 18:02:27 ]
今、ぼくは
「クラスが独立であるとは、クラスが単独でテスト可能である事と同値である」
という持論に基づいてプログラムしています。
これが正しいかどうかは置いといて、
テストが不可能、例えば乱数に寄ってしまっている設計はいけない設計ですか?
例えばマインスイーパなら、爆弾を仕掛けると思いますが、
爆弾を仕掛けるのを乱数に頼って、イニシャライザに組み込んでしまうと、
動作ごとにどこに爆弾が仕掛けられたか分からず、
「ここを押せばこういう状態に遷移する」
といったテストが行えません。
今作ってるプログラムはまさにこうなのですが、
これは失敗した設計ですか?

250 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:06:26 ]
>>240の書いているようなモデルインターフェースを作っていれば、そんなものいくらでも実装で変更できると思うんだけど。

251 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:13:59 ]
>>249
乱数を元にしないNonRandomMinesweeperModelを使ってテストすればいいだけだ

252 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:17:45 ]
乱数に限定した話なら乱数シードを外から渡すようにすれば良いだけの話。
再現性が保てない設計は失敗と言っていい。

253 名前:239 [2008/03/07(金) 18:20:36 ]
>>252
再現性が保てない設計は失敗なんですか。
確かにぼくもこれではテストが出来ないではないかと
すごく不安になってました。
乱数シードを外から渡してみます。

もしぼくが設計者だったら大火事でしたね。



254 名前:239 [2008/03/07(金) 18:22:40 ]
コーディングの段階からjavadocに基準した
コメントを書いておくべきですか?
みなさんはどうなされていますか?

255 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:22:41 ]
>>249
イニシャライザが何か初期化してても、とりあえずそれを無視して、
テスト用の盤面に書き換えてからテストすればいいんじゃないか

256 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:35:59 ]
>>254
場合による。

ライブラリとかみたいにドキュメントはきっちりしてた方がいい場合もあるし
アプリケーションで要求変更がばしばしくる案件なんかではドキュメント書いても
次の日には書き換えなきゃいけなくなったりで割に合わない場合もある。

257 名前:239 [2008/03/07(金) 18:36:36 ]
>>255
それが可能な設計ではないという事です。
でも、これは具体的な話ですが、
initBoard(int i, int j, int[][] bombBoard)
とかいう風にします。
今は
initBoard(int i, int j, int bombNum)
としています。これは爆弾の数から内部で爆弾が配置されたボードを弾いて、それを使って
Boardをinitializeしようという設計だからです。
でもこれは爆弾ボードの生成で乱数を使ってしまうので、再現性がありません。
しかし、上記のメソッド定義だと、ユーザが好き勝手なテーブルを引数にしてしまいます。
これはユーザに使い勝手がいいとは言えない気がします。
例えばもし縦横の配列数が違った場合は、Exceptionを出して処理を終了させればいいのでしょうか?

258 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:43:02 ]
>>257
>initBoard(int i, int j, int[][] bombBoard) 
>とかいう風にします。 
>今は 
>initBoard(int i, int j, int bombNum) 
>としています。

それ両方あればいいじゃん
ユーザは使い勝手の良い方を選んで使えばいい

259 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:44:47 ]
initBoard(int width, int height, int bombNum, long seed) で良いじゃん。

260 名前:239 [2008/03/07(金) 18:45:50 ]
>>258
なるほど、オーバーロードがありましたか。
その発想は気づきませんでした。
確かにJavaAPIにある多くのライブラリには複数イニシャライザが設定されてるものがありますね。
でも書き直しですね。このままだとDRYに反する。

261 名前:239 [2008/03/07(金) 18:54:11 ]
>>259
seedを引数にするという発想は正常ですか?
自由な配列を入れさせてもし大きさが違っていたら
Exceptionを発行して弾くというのは
少し感覚的におかしい気がします。
「型が違う」「クラスが違う」という弾き方は正常かと思いますが、
配列の大きさが違う、という事で弾かれるのは、
外から見てる人が、引数に対してすでに設定したBoardの大きさを意識して
入れなくてはいけない事になります。
これは使い勝手がいいとは言えないし、
おそらく正しい設計に基づいているであろう
GUIのライブラリがそういうものがあったかどうか考えても
なかったように思えます。
(もしあったら教えてください)

262 名前:239 [2008/03/07(金) 18:55:17 ]
あ、でもそれじゃseedがどういう時にどんな配列が出来るか
は予想がつかないのでテストケースが書けないですね・・・

263 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:58:04 ]
>260
DRYだろオーバーロードは基本的に。
void a(int i) と void a(int i, int j)
があったとすれば、前者の実装は
a(i, 0)
のように記述するだろ?



264 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:01:00 ]
>>261
乱数のシードを渡すくらいなら Random オブジェクトを渡した方がいいと思う
そうすれば SecureRandom を使うこともできるし (セキュアな盤面が必要な状況なんかないだろうけど)、
テスト目的に Random を継承してランダムでない値を返すようにしたオブジェクトを渡すこともできるし

265 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:10:59 ]
>>235
言語仕様的には strictfp が付いてなければ IEEE754 に従っている保証はない
ちなみに、IEEEの倍精度は精度は53桁だけど仮数部は52ビットだった気が

266 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:14:07 ]
優秀でない人が実装すると設計が無駄になる

267 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:19:17 ]
>>264
Random を継承してランダムでない値を返すくらいなら、
単に、数値を返すメソッドを持ったインタフェースを渡した方がいいと思う


268 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:22:29 ]
>>254
コメントはテストケースにしっかり書いた方が良いよ

269 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:27:09 ]
>>262
どういうシードを渡した時にどういう配列が出来るかは、どういう乱数が発生するかと等価だから
乱数生成ルーチンのテストにしかならん。除外可能。でなければ乱数生成を自前でやる必要が
出て本末転倒な事になる。異なるシードを与えたときに異なる配列になることが確認できれば十分
(もちろんその整合性も)。

というかホワイトボックステストがしたいのかブラックボックステストがしたいのかはっきりせれ。

270 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:29:13 ]
つうか、そこまでするんだったら、
interface InitBoard {
int width();
int height();
boolean bomb(int x, int y)
}
などというインタフェースを渡せばいいやん

271 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:41:35 ]
>>265
>>235の例だけでいえば定数式だから strictfp ついてなくても
0 だったり true だったりは言語仕様で保証されてる。

272 名前:239 mailto:sage [2008/03/07(金) 19:41:41 ]
>>270
インターフェイスを使うメリットが分かりません。
インターフェイスは、そこに書いてあるメソッドに実装を強要するだけであり
なぜこの場面で使わないといけないのかが分かりません。

273 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:42:49 ]
「エンジニアリング設計の基準を実際に満足することのできる唯一のソフトウェアドキュメントはソースコードだけだ」
と Jack Reeves 様が言っております。
ソフトウェアで巷で言われている「設計」などというものは
他の工学では単に設計の骨組みに過ぎないのです、たぷん



274 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:44:13 ]
上にもいろいろ書いてあるだろ?
インターフェイス使えば同じ機能でも別の実装が可能になるんだって。
もう少し自分でいろいろ試行錯誤するべきだと思うよ。

275 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:46:44 ]
マインスイーパーのマス程度にポリモーフィズムはいらんだろw
必要になったとすればもうそれは別のゲームになってるから設計からやり直したほうがいい。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<246KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef