1. taka66

    Posted

    taka66
Changes in title
+Effective Java読書会8日目(編集中だけど) - プログラミング一般
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,193 @@
+前回の記事はこちら↓
+[EffectiveJava読書会7日目 - 第7章 メソッド](http://qiita.com/taichiw0424/items/308888f0957f19e1a363)
+
+項目45 ローカル変数のスコープを最小限にする
+項目46 従来のforループよりfor-eachループを選ぶ
+項目47 ライブラリーを知り、ライブラリーを使う
+項目48 正確な答えが必要ならば、floatとdoubleを避ける
+項目49 ボクシングされた基本データより基本データ型を選ぶ
+項目50 他の型が適切な場所では、文字列を避ける
+項目51 文字列結合のパフォーマンスに用心する
+項目52 インタフェースでオブジェクトを参照する
+項目53 リフレクションよりインタフェースを選ぶ
+
+## 項目45 ローカル変数のスコープを最小限にする
+* ローカル変数のスコープを最小限にする最も協力な技法は、
+ローカル変数が初めて使用された時に宣言すること
+* ほとんど全てのローカル変数宣言は、初期化子を含むべき。
+初期化子を与えられない時点で、宣言をする必要は無い。
+(try-catchは例外の場合がある※1)
+
+
+```java:ローカル変数のスコープ
+// hogeのスコープはfor文の中だけ
+for () {
+ int hoge = 1;
+}
+
+// hogeのスコープはfor文の中だけではない
+int hoge;
+for () {
+
+}
+```
+
+※1 try-catchにおいて、変数をtry-catchの外でも使用する場合は、
+変数の宣言はtry-catch句の中で行わなければ成らない為、
+その条件に当てはまらない場合があるということだと思います。
+
+### whileよりforがいいと思うところ
+* ループの変数の内容がループを抜けた後に特に必要が無い場合、
+whileよりもforを使おう。
+
+1. for文は初期化時点でループ変数を宣言できる。
+このループ変数がローカル変数のスコープを必要最小限なものに限定ししてくれる。
+その為に、ループ内の変数の内容がループを抜けた後に特に必要が無い場合は、
+whileよりもforを使おうという話でした。
+
+2. コピペのミスにコンパイルエラー時に検知できる
+
+```java:コピペミス(while)
+ int i = 0;
+ while (i <= 5) {
+ System.out.println("the number of i is the" + i + ",");
+ i++;
+ }
+
+ int i2 = 0;
+ while (i <= 5) { //間違えてるけどコンパイルは通る
+ System.out.println("the number of i2 is the" + i2 + ",");
+ i2++;
+ }
+```
+このケースで、コンパイルが通らないという事は無い。
+なぜなら、変数iは、 **while内に限定されたローカル変数ではない** から。
+
+```java:コピペミス(for)
+for(int i = 0; i <= 5 ; i++) {
+ System.out.println("the number of i is the" + i + ".")
+}
+
+for(int i2 = 0; i2 <= 5 ; i++) { //←ここでコンパイルエラー
+ System.out.println("the number of i2 is the" + i2 + ".")
+}
+```
+
+ただ、これを超えて、Java8では、さらにfor文を書かずに、Stream APIを使って書くのかどうかという議論になってくると思っています。
+
+最近ちょくちょく議題にあがってきますね。
+http://d.hatena.ne.jp/torutk/20140518/p1
+
+## 項目46 従来のforループよりfor-eachループを選ぶ
+
+きっとJava8からはforeach使ったりStream使ったりでしょう
+
+## 項目47 ライブラリーを知り、ライブラリーを使う
+
+Library使おうよ。特に標準ライブラリ。という話。
+
+1. 標準ライブラリにある機能を、自前で実装する無駄。
+処理を限りなく早くしたり、軽量にしたい場合(組み込み系や昔のゲームソフトとか)
+を除いては無駄だと思う。
+
+2.Web Applicationでがっつり数式計算するようなメソッドを気をつける。
+例では、乱数を利用した特定の条件に置けるランダムな
+整数を計算するメソッドを紹介していました。
+
+(僕はほぼ数学科の出身なので、たまになんかこう、行列計算とか引っ張りだしたくなる時もある(忘れて下さい))けどこれって結局実装する人も、
+レビューする人も正しい数学の知識が無いと、
+非常に分かりにくいバグをうむ可能性があります。
+
+考えた上で必要なシーンもあると思いますが、不用意にガンガン自前の数式を実装するのは危険だと言えそう。
+
+### 3.java.lang,java.util,java.ioは押さえとけ
+特に標準ライブラリの中でも上記のパッケージの中身はプログラマのベースの知識として、押さえておくべき。
+→ということでどっかにまとめよう
+
+
+
+## 項目48 正確な答えが必要ならば、floatとdoubleを避ける
+
+数値がずれるのはみなさんご存知の通り。
+9桁まで int
+18桁まで long
+全般 BigDecimal
++ BigDecimalは丸めを制御できるという利点あり。
+基本データ型を使用していない、若干のコストを気にしないのであればBigDecimalを使うべき。
+
+## 項目49 ボクシングされた基本データより基本データ型を選ぶ
+
+基本データ int,double,boolean
+ボクシングされた基本データ Integer,Double,Boolean
+
+できる限り、前者を可能な限り使おう。という話です。
+
+## 項目50 他の型が適切な場所では、文字列を避ける
+
+Stringが、本当に適した型なのかどうか考えるべき。
+たまに見かけてしまうことがあるのが、こういうやつ。
+
+```java:example
+String hoge = "0"; //intとか使えよ
+String hoge2 = "true" //booleanですね
+```
+
+あと、こういうやつ
+
+```java:example2
+String key = hoge + "#" + huga.next();
+```
+
+- hogeもしくはhuga.next()に"#"が入っていたらどうする
+- hogeとhuga.next()のフィールドを見ないと中身が分からない
+- 単純なequals,toString,compareToを使えない
+
+⇒この場合は、これらの集合を現すprivate staticなメンバークラスを書くのが良い。
+
+
+## 項目51 文字列結合のパフォーマンスに用心する
+ここに関して、こちらの本では文字列結合演算子(+)による結合は遅いという話をしています。
+これに関しては、日本語のブログでも非常に数多くの議論がなされている問題です。
+
+http://d.hatena.ne.jp/j5ik2o/20110222/1298380551
+
+大量の文字列をループ処理で連結する場合:StringBuilder
+少ない場合は、concatか文字列結合演算子
+
+位の印象でいます。
+
+
+## 項目52 インタフェースでオブジェクトを参照する
+例として挙げられている
+## 項目53 リフレクションよりインタフェースを選ぶ
+## 項目54 ネイティブメソッドを注意して使用する
+CやC++等のネイティブ言語で書かれたネイティブメソッドを使うことに関してですが・・・
+
+### 使うな
+
+で良く無いですか・・・??
+現在でも有効な効果的な使用法があれば教えて頂きたいです。
+これに関しては、当時アプリがCやC++などで作られてて、
+それからJavaでアプリを作るようになった。
+という過程の中から生まれた部分が大きいと思います。
+あるとすれば元々ある機能を致し方なく、
+使う以外でここをケアする必要すらあまり無いのかなと思っています。
+
+
+## 項目55 注意して最適化する
+
+早いプログラムを書くのではなく、良いプログラムを書く。
+
+## 項目56 一般的に受入れられている命名規則を守る
+
+JLS6.8
+http://docs.oracle.com/javase/specs/jls/se5.0/html/names.html#6.8
+
+を読めば分かるように、そんなにずれたことをやってる所はなさそう。
+下記の記事が面白いと思いました。
+
+正しいコーディングが身につくエンジニア英語の手引き 〜文法とクラス/メソッド、命名規則〜
+http://www.find-job.net/startup/english-for-engineers-naming-conventions
+
+Codic
+http://codic.jp/