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


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

★★Java質問・相談スレッド162★★



1 名前:デフォルトの名無しさん mailto:sage [2013/06/09(日) 20:27:10.93 ]
プログラミング言語Javaに関する質問スレです。
JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作管理    pc11.2ch.net/hp/
Webプログラミング pc11.2ch.net/php/
をご利用下さい。

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

前スレッド
★★Java質問・相談スレッド161★★
toro.2ch.net/test/read.cgi/tech/1364006637/

347 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:30:31.07 ]
>>346
Java言語仕様読み直せ

348 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:36:23.41 ]
>>339
コメントに沿った実装という意味では前者だな。
意味的にも前者のほうがいいんじゃなかろうか、そのコード片だけでは判断できんけど。
結果はどっちも変わらん。

349 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:41:16.57 ]
cが引数a,bから決まるのでなくメンバのa,bから決まる値の場合は・・?

350 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:48:00.80 ]
どこで>>346みたいな知識を仕入れたのか気になるんですが...
検証の仕方も思い浮かびません...

351 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:50:51.90 ]
コンストラクタってスレッドセーフじゃないん?

352 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:51:08.41 ]
>>349
その場合はそりゃ後者だろう。

353 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:52:26.29 ]
The Java? Tutorials
docs.oracle.com/javase/tutorial/

JAVA覚えようぜ

354 名前:デフォルトの名無しさん [2013/06/28(金) 11:37:29.87 ]
>>346の謎解きをするスレはここですか?
>初期化中のオブジェクトが外部に公開

コンストラクタで外部にthis参照が逸出するときのことを言ってるんだろう。
ふつう、コンストラクタはthis参照を外部に公開しないように実装するものなんで、
そういう状況になること事態が実装上の不備だと思う。拙者そう思う。

355 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 12:26:37.11 ]
コンストラクターがマルチスレッドって
ただのコーディングミスだろ



356 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 12:43:30.30 ]
>>354
でもそれだとマルチスレッド関係ないよな...

357 名前:354 [2013/06/28(金) 12:50:39.56 ]
>>356
俺はマルチスレッドの話をしたつもりだったんだが、お前はなんで俺の話がマルチスレッドと関係ないと思うの?

358 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 13:15:22.64 ]
double checked locking 問題ではコード読んだ時の直感に反して
コンストラクタ完了前に参照漏洩してたりしたからなぁ。

あの手の問題あるとチェックしきれん。

359 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 14:28:50.08 ]
>>357
シングルスレッドでも逸出させられる

360 名前:デフォルトの名無しさん [2013/06/28(金) 14:38:54.68 ]
B木を実現するjavaプログラム、難しいけどわかる人いますか?

361 名前:桃白白 ◆9Jro6YFwm650 [2013/06/28(金) 14:45:17.44 ]
>>360
桃白白わかるよ。

362 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 15:01:04.41 ]
スレッドAが生成した新オブジェクトを
ロック無しで確実にスレッドBに届ける方法は無く、

スレッドAがロックすれば確実に初期化された新オブジェクトが
全スレッド間で共有されてしまうので

正直 ど う で も い い

363 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 15:04:35.49 ]
自分も前者がいいな。10文字少ないので。

364 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 15:06:40.22 ]
>>361
すみません、教えてください。

365 名前:桃白白 ◆9Jro6YFwm650 [2013/06/28(金) 15:09:21.89 ]
>>364
B木のなにを知りたい?アルゴリズム?インプリメンテーション?
値を追加するところ?値を削除するところ?値を検索するところ?
どのあたり?



366 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 15:15:09.70 ]
>>350-351
TSM01-J. オブジェクトの構築時にthis参照を逸出させない
https://www.jpcert.or.jp/java-rules/tsm01-j.html

367 名前:デフォルトの名無しさん [2013/06/28(金) 15:16:16.75 ]
>>365
値の追加、検索、削除が出来ればOKです
初めに任意で最大の子の数を入力する所から始めたいです

368 名前:桃白白 ◆9Jro6YFwm650 [2013/06/28(金) 15:34:04.09 ]
>>367
コード欲しいってことね。
桃白白もいくつかコード眺めてみたけど、奥村さんのコードが一番きれいだと思う。

『Javaによるアルゴリズム事典』サポートページ
oku.edu.mie-u.ac.jp/~okumura/java-algo/

369 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 15:50:38.71 ]
>>368
ここに置いてあるzipファイルの中の「BTree.java」ですよね?
ありがとうございます!これを参考にします。

370 名前:桃白白 ◆9Jro6YFwm650 [2013/06/28(金) 15:55:43.37 ]
>>369
はい、それです。

371 名前:デフォルトの名無しさん [2013/06/28(金) 20:15:07.51 ]
JavaScriptは板違い
ローカルルール読んでこいよ異常者共

372 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 20:39:57.59 ]
自作クラスの感想などを頂きたいのですが、スレ違いでしょうか?

373 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 20:42:02.65 ]
相談のうちには入る…のかなあ

374 名前:桃白白 ◆9Jro6YFwm650 [2013/06/28(金) 20:49:48.68 ]
>>372
いんじゃないの。書いちゃいなよ。

375 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 21:26:55.04 ]
>>374
自分のコードの感想言われたらファビョる奴が良く言うよ



376 名前:372 mailto:sage [2013/06/28(金) 21:27:03.75 ]
ソースファイルが6つあるので、こちらにアップしていて遅くなりました。
ttp://sourceforge.jp/users/soremachi/pf/TokenTable/wiki/FrontPage/attach/tokenTable.zip
コーディングを補助する目的で作った文字列テーブルです。2ヶ月ほど前にJavaの勉強も兼ねて作りました。
(「TableTest.java」にとりあえずの使い方が書いてあります)

377 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 21:32:12.78 ]
おまいらIdeoneぐらい教えたれよ

378 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 21:32:33.32 ]
sourceforgeねぇ

379 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 21:48:31.18 ]
>>376
System.out.println( "Table file : ファイル名を指定してください" );
return false;
のようなものは
throw new IllegalArgumentException( "Table file : ファイル名を指定してください" );
のようにしておけ
false 返しても結局戻り値チェックしないんだし、エラーを無視して実行を続けるより死ぬ方がいい
特別に理由があって死にたくないときは try catch すればいい

380 名前:372 mailto:sage [2013/06/28(金) 22:04:25.51 ]
Ideoneにも上げました。Sourceforgeの方は消したいと思います。
ttp://ideone.com/IKjued
ttp://ideone.com/1IQ5G5
ttp://ideone.com/zOJYVA
ttp://ideone.com/7TUxdz
ttp://ideone.com/1kuWqV
ttp://ideone.com/9MOKz4
ttp://ideone.com/4QEy30

381 名前:デフォルトの名無しさん [2013/06/28(金) 22:08:09.94 ]
ideoneやcodepadは英語サイトだから利用規約や制限事項や禁止事項がわからないし、利用料金や支払い方法もわからん

382 名前:372 mailto:sage [2013/06/28(金) 22:32:42.03 ]
>>379
わかりました。
引数のチェックでは throw new IllegalArgumentException を使うのが一般的なんですか?

383 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 23:49:28.98 ]
メソッドのコメントに
//- こういうの流行ってんの?

384 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 01:37:41.96 ]
一個目のファイルしかみてないけど、Javaな人はあれみて何も思わないの?
俺、すげー気持ち悪いんだけど。
setHead, setPrimary, set, file、全部キモい。
addとかappendとかkeyとかindexとかcolumnとかpush_backとかなんかそんな概念じゃないのか?
まあ、かろうじてinsertはありなのかもしれないが。

385 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 01:42:53.74 ]
あと、列データとかtokenとか、一体どこ経由でこのコードにたどり着いたんだ?



386 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 02:51:57.69 ]
突っ込みどころが多すぎる

列を追加してるのにsetHeadというメソッド addだろ
標準出力するだけのクラス tableを受け取るメソッドかtoStringに書けばいい
トリッキーなgetterとsetter 座標指定で十分
同一パッケージから直接変更し放題のフィールド 大事な値をうっかり壊しちゃうかもよ
何でもpublicメソッド エラーメッセージとか外から呼び出すの?
別のクラスに投げるだけなら直接呼び出せ
ファイルが閉じられない可能性がある
Exceptionでキャッチすんな
...

387 名前:372 mailto:sage [2013/06/29(土) 03:00:41.42 ]
>>384-385
insertは、なぜありなんでしょうか?Javaというか、オブジェクト指向に触れて3ヶ月ほどなので、
その概念というのがちょっとわからないです・・・。メソッドの持つ役割とかですか?
列データやtokenなどは、いい加減に書いてしまいました。
ArrayListを入れ子にしているので、行列のフィールドに対するコメント文です。

388 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 05:13:45.52 ]
>>387
慣用的に使われる用語とその組み合わせというのがあって、大抵それは求めれば他のソフトウェア
技術や数学用語にちゃんと由来が見つかる。

例えばデータ構造として表(table)という名前を使うのであれば列(column)や属性(attribute)、
行(row)やタプル(tuple)という言葉と組で使うのが慣用的。これらの用語は関係データベースの
世界に由来の一端(全てではない)があって、この世界ではrelation・attribute・ tupleかtable・
column・rowの組で使う(厳密にはこの二つの組は異なる概念なので混ぜるのも良くない)。

あとPrimary、これも元々関係データベースから来た用語だけど、数ある候補キーの中から一つ
を選んで主キー(primary key)とするのであって、PrimaryKeyならともかくPrimaryだけでは
意味をなしていない。無難なのはKeyColumnかな。

操作に関してもtableにinsertとはおぉDB的だなぁと思ったらsetと出てきてずっこける。
DB的にupdateとするとややずっこけ感は少ない気がする。

setHeadは三重の意味で良くない。一つは上記の通りheadという名前。二つ目は列の「追加」
なのにsetという用語を使っていること。最後にsetHeadというメソッド名はJava Beansの
規約でtableのheadプロパティの値をセットするメソッドに使う必要があること。

389 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 05:45:43.21 ]
要約:クラス設計がレビューされていないような品質

390 名前:384 mailto:sage [2013/06/29(土) 07:41:48.98 ]
>>388
あまりにアレ過ぎて言語化できなかったんだけど、すっきりしたよ。ありがとう。
俺、Javaは初心者なんだけど、Javaな世界ではあんな感じが普通なのかと思ったよ。
誰も何も言わないから。

391 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 08:25:23.88 ]
名付け規約に準ずるのは当然だが、
あまりにしつこい社会主義のようだと、せっかくの創造性がつぶれる
もともと日本人には発想性がある人が少ないのに、さらに減ってしまう

ジャワみたいにばかみたいに長い名前をつけるのもどうかと思うがな
コンパイル後も短いシンボルになってないので、実行時の翻訳にムダな時間がかかる処理系もあるだろう

392 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 08:58:37.24 ]
今のところコード品質に関する指摘は>>386だけだな
他は識別子の名前についてガヤガヤ言ってるだけで特に耳を傾ける必要はない
コーディング規約読めばそれで理解できる話だし

393 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 12:47:46.80 ]
包含関係がしっかりしていれば長い名前空間も苦にはならないが、そうなっていない
StringとStringBufferの区別は本当に必要なのか、とか

394 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 12:52:19.11 ]
なるほど、不変オブジェクトだけで十分、と。

395 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 12:56:03.85 ]
可変オブジェクトだけで十分、っていう意味かもしれないじゃない



396 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 14:25:16.00 ]
>>392
名前超大事

397 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 15:39:30.97 ]
>>396
チーム開発なのか個人開発なのか
ライブラリとして提供するのか

色々シーンあるだろ。個人開発なのに名付け規則に神経すり減らすのはエネルギーの無駄

398 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 15:48:00.90 ]
名前に神経すり減らすんじゃなくて
>>397みたいな奴が妥当な名前を付けられないってだけ

399 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 16:56:30.39 ]
会社の歯車がプログラムの歯車をつくるような環境って事か
それは自由がないわな かわいそうだな...

400 名前:372 mailto:sage [2013/06/29(土) 17:19:07.84 ]
>>386
別のクラスに投げるだけなら、といのは、ファイル入出力や画面への出力は、
同じクラスにメソッドとして持たせるという意味合いで合ってますか?
それとも、ひとつのJavaファイル内に複数のクラスを書くということでしょうか?
何でもpublicメソッドなのは、正直、アクセス修飾子の使い方をわかっていませんでした。

401 名前:372 mailto:sage [2013/06/29(土) 17:58:10.67 ]
>>388
知りませんでした。メソッド名は
(setHead -> add)、(setPrimary -> setKeyColumn)、(set -> update)、(get -> select)
こういう風にすればいいですか?

402 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 17:59:31.16 ]
> 正直、アクセス修飾子の使い方をわかっていませんでした

( ゚д゚ )

403 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 18:52:47.47 ]
そもそも、コンセプトとして、いわゆるDBのテーブルを想定しているのか、Excelのシート、つまり
二次元のデータの入れ物を想定しているのかがわからない。
そういう意図を表明するという意味で、名前重要。

404 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 18:59:40.27 ]
命名規則に話が集中しているのはそこがあまりにタコだと実装のレビューをしようにも読む方が
無駄な努力を強いられて嫌になるから。Tableクラスだけでもなかなかの忍耐が必要。

一人で書き捨てするコードならともかく、人に読んで貰うなら命名規則や慣用は要尊重。
無知を言い訳したオリジナリティーの発揮は単に有害。初心者こそ模倣から始めるべき。

・適切なクラス名やメソッド名が解らないのであれば既存のライブラリのAPIから似たような
 ことをしているクラスやメソッドの名前を探して真似をする。
・適切なコメントの付け方が解らないのであれば既存のライブラリのソースコードを調べて
 (クラス名に.javaとつけてググればいくらでもヒットする)真似をする。JavaにはJavaDoc
 形式というコメントの付け方が定義されていて、これ以外の独自コメント形式は単に迷惑。
・適切な変数名が解らなければ既存のライブラリのソースコードを調べて(以下略)

解らなければまず調べよう。
初学者ほど何故か調べない、真似をしない、コンパイル時のエラーメッセージも読まない不思議。

405 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 19:03:01.06 ]
クラス定義時の一般論として

・フィールドは基本private。さらにfinalに出来ないか検討する。Tableのtableなんかは
 finalに出来る。finalではないpublicは御法度。protectedも慎重に。
・フィールドの型は特別な事情が無い限りHashMapといった実装クラス名よりもMapと
 いうインターフェイスを用いた方が一般的に設計の抽象度が上がって実装に柔軟性が出る。
・データの重複はバグの温床なので避ける。例えばrow_no、row_sizeなんてフィールドが
 用意されているけれども、table.size()等で代用できないか検討する。パフォーマンス?
 それは素直で安全な実装で大敗してから考えるべき。
・特別な事情がない限りファイルIOは直接手作りしない。例えばTableクラスの場合は
 write(DataOutput out)、readFields(DataInput in)というDataInput、Outputを使って
 読み書きするメソッドを用意するのがお薦め。これだけでTableクラスをファイルに保存
 することも、ネット経由で投げることも、Hadoopでビックデータ解析(笑)にも使える。
 あるいはJAXBやJacksonを使ってXMLやJSONへマッピングする方法を検討する。

続く。



406 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 19:05:40.12 ]
Tableクラスに関するとりあえずのコメントとして

・カラムの型や名前をバラバラのMapで管理しているのはあまり良くない。素直にカラムの
 定義を扱うTableの内部クラスを用意して、
 public static class Column{public final int index; public final String name; public final String type;}

 これのリストをスキーマとして定義する。必要であればルックアップテーブルも。
 private final List<Column> schema = new ArrayList<Column>();
 private final Map<String, Column> nameToColumn = new HashMap ...

 スキーマ情報を提供する公開メソッドも用意すると親切だよね。
 public List<Column> getSchema() {return Collections.unmodifiableList(schema);}
 public List<Column> getColumn(int index) {return schema.get(index);}
 public List<Column> getColumn(String name) {return nameToColumn,get(name);}

・検索結果に一個結果を追加する度にサイズを+1した配列を生成して内容を全件コピーする
 凄いコードを見たような気がするのは気のせいだよね・・・素直に可変長であるList
 を使うべき。返値もListで良い。

・for(int i...)ではなく拡張for構文を使ってくれた方が読みやすい

・・・この調子で書いていくとどうなるのだろう・・・

407 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 19:15:00.14 ]
お前のレスを読むにもかなりの忍耐が必要

408 名前:372 mailto:sage [2013/06/29(土) 19:31:53.15 ]
>>406
スキーマって何ですか?

409 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 19:56:44.17 ]
自分で調べてから質問しろ

410 名前:デフォルトの名無しさん [2013/06/29(土) 19:58:21.58 ]
>>408
構造の定義のことでしょ。
>>406のコードでは列情報のことっすね。いまTableにはこの列がありまっせーていう情報。

411 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 19:58:31.40 ]
>>408
スキーマとは構造のこと。テーブルのスキーマはテーブルの構造のこと。
テーブルのスキーマは一般的には列の定義の集合で、個々の列は名前や型を持つ。

テーブルの構造をスキーマと呼ぶ一方で、具体的なデータが入ったテーブルその
ものはインスタンスと呼ぶ。スキーマとインスタンスもDBの世界で使われる言葉。

なのでDBの素養のある人であればtable.getSchema()がカラム定義のリストを返す
のは簡単に想像出来る。これが命名規約や慣用の強み。
ただschemaに関しては素直にcolumnList、getColumnListでも良いかもね。

というかこれ以上現状のコードをレビューをするのもしんどいので、一度自分で
色々調べ直して書き直したコードと共に出直してくれないかな。

412 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 20:05:52.52 ]
どんな勉強したらこんなに酷くなるの?
参考にしたものがどうしようもないゴミか、372が変な方向に理解しちゃったの?

ちょっとjavax.swing.table.DefaultTableModelを見てみなよ

413 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 22:07:32.53 ]
どんなレスを期待してコードを見てくれと言ってるのかわからないが、メソッド名を言われた通りに変えればOK
的なレベルに達してないから。

414 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 22:20:15.32 ]
詳細設計書なんていらんだろ派がこの板には多いと思うが、こういうコードを見れば
必要な場合もあるということがわかるはず。

415 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 22:34:56.88 ]
>>414
こういうコードを見ても設計何ソレ
なのがJAVAドカタの真髄



416 名前:デフォルトの名無しさん [2013/06/30(日) 00:49:17.69 ]
Windowsで無料でJavaを勉強出来る開発環境を教えて下さい

417 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 01:12:40.42 ]
JDK + テキストエディタ

418 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 01:23:16.55 ]
いるんだよなこういうジジイ発想の奴が
Eclipseと答えるのがまっとうな人間

419 名前:372 mailto:sage [2013/06/30(日) 02:14:52.38 ]
みなさまのアドバイスを参考に書き直してみました
ご指導よろしくお願いします

mainクラス ideone.com/paGek6
Tableクラス ideone.com/vLUKre
Columnクラス ideone.com/IdrclV

420 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 02:20:15.16 ]
>table.getAttribute(j)
これはKUSOコード

421 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 02:37:58.18 ]
クソと言うなら理由も書け

422 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 02:49:23.64 ]
ちゃんと差分を見てあげようよw 初めのに比べたら随分スッキリした。
その分随分機能も削られているけど。

・Columnがattributeを持つのは変。意味的にここはnameだと思う。
・せっかくColumnをimmutable(変更不可能)なオブジェクトとして定義しているのに
 tableにgetTypeやgetAttributeを用意しているのは勿体ない。getColumnで直接
 Columnオブジェクトを渡して無問題。table.getColumn(index).getType()みたい
 に使える。
・コンストラクタにColumnの配列を渡すようにしたのは好判断だと思う。
 後からColumnを追加出来ないようにするだけで他の部分のロジックが単純になる。
・ただ内部的にはColumnsは配列ではなくListで持っていた方が色々と具合が良い。
 Javaの配列はimmutableに出来ない。なので例えば現状のgetAllColumnsはこれを
 使って個々のColumnを差し替えることが出来るので安全ではない。
 さらにコンストラクタ引数に渡したColumnsの配列は防御的コピーをすべき。
 private final List<Column> columnsとして、コンストラクタで
 this.columns = Collections.unmodifiableList(new ArrayList<Column>(Arrays.asList(columns)));
 とでもしておくと良い。getAllColumnsでcolumnsをそのままreturnしても無問題。
・細かいことだけどコンストラクタはTable(Column... columns)の方が使い勝手が良い。
 new Table(new Column(...), new Column(...))も、現状通りColumn[] columns = ...
 としてnew Table(columns)とする使い方も両方使える。
・insertで入力値の型チェックも実装すると素敵だと思う。

この調子で行くとよいんじゃないのかな。

423 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 02:57:42.08 ]
最初のコードに比べたらだいぶマシになったな
入門以前レベルから初心者レベルまで話が進んだ

424 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 03:03:45.80 ]
> getAllRecords

Listの中身を全件配列にコピーする、そんな定番処理は手作りするまえにAPIと
して用意されていないか調べるべきだろうね。もちろん存在する。
ListのtoArrayメソッドの使い方を調べてみると良いと思う。

425 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 03:09:50.58 ]
> public final void insert(final Object... record) {
finalに出来ないか検討するっていうレスがあったけどここまでする必要ない
classにfinalついてるからメソッドのfinalは全部無意味
サブクラス作れないからオーバーライドできないもん
仮引数のfinalはあってもいいけど

> for (int i = 0; i < table.getAllRecords().length; i++){
繰り返しの度に時間がかかるメソッドが呼ばれるけどいいの?



426 名前:372 mailto:sage [2013/06/30(日) 03:31:24.30 ]
>>403
DBへの問い合わせ文をメソッドに、データ構造をListにしてみよう、と思って最初は書いていました。
>>404-406,410,411
JavaDoc形式のコメント、クラス定義時の一般論や、DataOutput, DataInputのインタフェースやスキーマの利用方法、知りませんでした。
レビューを参考にして、色々調べ直してから出直します。コードをレビューして頂いて自分の無知がよくわかりました。ありがとうございます。
>>412
なにも参考にしないで、自分の欲しい機能を追加していきました。

あと、スレの流れ的に言いにくいのですが、>>408,>>419は、私ではありません。
このレスを書いていて発言する機会を失ってしまいました・・・。

427 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 03:31:57.59 ]
> getAllRecords

仕様をはっきりさせるべきだろうね。今のコードでは確かに新しいレコードの
追加は出来ないけれども、個々のレコードの中の値の書き換えは出来る。
シャローコピーだから。それが嫌ならディープコピーを実装するしかない。

ディープコピーまでは不要、書き換え可能は承知で単にレコードの集合を参照
可能にしたいだけなのであればやはり返値は配列ではなくListにして、
return Collections.unmodifiableList(records);とでもするのが実装も簡単
だし全件コピーに比べてオーバーヘッドも少ない。

mainの中のループもfor(Object[] record: table.getAllRecords()){ ...と
でもした方が読みやすい。

428 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 03:36:18.89 ]
なんだと〜

429 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 06:11:06.80 ]
>>427
ここまでくると異常者だな

430 名前:420 mailto:sage [2013/06/30(日) 07:39:46.72 ]
>>421
getAttributeはテーブルクラスのメソッド名として不適切
100歩譲ってgetColumnAttributeなら可。
それにgetXxxx(index)はgetterと紛らわしい

431 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 08:49:45.89 ]
getColumnAttribute
冗長な名前使っていてイライラせん?
getColAttr じゃいけん?

432 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 09:12:00.03 ]
>>431
そういう省略は好まれない。人によって省略したりしかかったり、またどう省略するかがまちまちだと困る。
スペルアウトするのが原則。

433 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 09:31:36.34 ]
>>432
誰が好まん?

434 名前:デフォルトの名無しさん [2013/06/30(日) 09:45:57.18 ]
>>433
コード読む人だろ。ColがColorなのかどうなのか定かじゃないだろ。
そんなとこでケチケチするちんけなやつのコードなんて見たくないってことだ。

435 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 09:47:19.17 ]
コンストラクタでIO使うのが常識なのか?
init(入力ストリーム)ってメソッド作ったら初期化はコンストラクタでやれ
コンストラクタで読み込むようににしろって先生に怒られた



436 名前:デフォルトの名無しさん [2013/06/30(日) 09:48:47.57 ]
>>435
むしろ非常識でござろうな。IOExceptionをどう処理するつもりなんだ。

437 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 09:51:53.93 ]
>>434
>>そんなとこでケチケチするちんけなやつのコードなんて見たくないってことだ。
さすがジャバラー(笑) 冗長な名前はムダなんだけどなぁ
バイトコードを解析した事ある?(笑)

438 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 10:05:05.10 ]
>>432
>そういう省略は好まれない
ところでprintlnとconcatはどう思いますか?

439 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 10:13:11.98 ]
>>435
>init(入力ストリーム)ってメソッド作ったら
コンストラクターが終わるとオブジェクトは構築されたと見なされる。
initを呼び出す前の状態が、クラス名の概念を表すオブジェクトとして適切かどうかによる。

>>436
コンストラクターでIOExceptionが出ると困るとか
どれだけジャバドカタは低脳なんだ。

440 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 10:35:01.08 ]
>>439
>>initを呼び出す前の状態が、クラス名の概念を表すオブジェクトとして適切かどうかによる
どういう意味?

441 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 10:46:01.05 ]
例外処理を当たり前に使うような手合いにはIO例外は外で受ければいいので気にならないんだろう
C言語の感覚が強い人はエラーは戻り値で判断するようにしたくなる
例外は文脈が吹っ飛ぶのであまり論理的でないしな
コンストラクタ内例外はnewの失敗としては検出できないのでそりゃ躊躇したくもなるだろう

442 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 10:55:32.68 ]
>>438
組み込みメソッド名の中には、そういう歴史的な理由経緯の省略がある場合があるが、それはそういうものだと
理解するしかない。
そういうメソッド名を自分が作るクラスに使うのはOKだと思うが、複合名詞を自分のセンスで省略するのは
好まれない。特に、Javaの世界では、スペルアウトするのが好まれる。なぜそうなのかは知らないが、
Javaのネーミングの規範として、スペルアウトしろと言われるのを良く見かける。

443 名前:440 mailto:sage [2013/06/30(日) 10:59:52.32 ]
>>441
例えば編集可能な文字列クラス(OreString)を自作したとする。
new直後は中身のデータも文字列の長さも未定義で、
initして初めて長さ0の文字列になるとする。
initする前は「文字列」の概念として不完全な存在だから
OreStringというオブジェクトは成り立っておらず、
この設計はおかしい。
この場合、OreStringContextとかOreStringDataとか
いうクラス名にするか、
コンストラクターでOreStringを適切な初期状態にする。

444 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 11:00:32.03 ]
Javaは常にTAB一段分のハンデがあるから長い名前は厳しいな

445 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 11:02:43.78 ]
>例外は文脈が吹っ飛ぶのであまり論理的でない
ジャバドカタは本当に頭が悪いな。



446 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 11:06:29.48 ]
ここで>>445に論理的な例外を説明する義務が発生しました
・逃げる
・説明する
・SAVE

447 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 11:08:53.55 ]
・ギムアップする






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

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

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