Help us understand the problem. What is going on with this article?

社内発表2

More than 3 years have passed since last update.

答えは、Statementのクローズで例外が発生するケースがあることです。
Statementのクローズで例外が発生すると、このままでは
Connectionのクローズが実行されません。

対策としては、javaで言うと、java6までのレガシーシステムの古い流儀では
finally句等を使用して、トランザクションの最後に必ずclose処理が走る様にすることです。

package com.example.cf.flightsearch;

public class FlightSearch implements SessionBean {
  private MonitoredDataSource connectionPool;
  private List lookupByCity() throws SQLException RemoteException {
    Connection conn = null;
    Statement stmt = null;
    try {
      conn = connectionPool.getConnection();
      stmt = conn.createStatement();
      // 検索のロジックを実行して、
      // 結果のリストを返す
    } finally {
      if (stmt != null) {
        try {
          stmt.close();
        } catch (Exception e){
            //NO OPARATION(復帰の可能性は無い)
        }
      }
      if (conn != null) {
        conn.close();
      }
    }
  }
}

或いは、DbUtilsを使用して

package com.example.cf.flightsearch;

public class FlightSearch implements SessionBean {
  private MonitoredDataSource connectionPool;
  private List lookupByCity() throws SQLException RemoteException {
    Connection conn = null;
    Statement stmt = null;
    try {
      conn = connectionPool.getConnection();
      stmt = conn.createStatement();
      // 検索のロジックを実行して、
      // 結果のリストを返す
    } finally {
      DbUtils.closeQuietly(stmt);
      DbUtils.closeQuietly(con);
    }
  }
}

java7以降や、もうちょっと新しい書き方は
いわゆるローンパターンと呼ばれるものがあります。
専用構文やAPIがなくても、高階関数が使用できる言語ならば
簡単に自作できます。
高階関数を簡単に説明すると、関数を引数 or 返値として
取る関数のことを言います。
(高階関数は、後で時間が有れば話すかもしれません
関数型プログラミング関連の話です。)

なぜか、scalaと言う言語には、これが標準ライブラリには
用意されていません。

javaでは、try-with-resources Statement
c#だとusingステートメントを使用します。

Scala using(ローンパターン)
http://www.ne.jp/asahi/hishidama/home/tech/scala/sample/using.html
もう少しカッコよく実装すると、こんな感じだけど
scalaの暗黙の変換があるので、気にしないでください。
http://qiita.com/piyo7/items/c9be1f39bcfea43a778a


その二
try-catch構文で、関数や処理で例外を、細かくキャッチしている。
これは、try-catch構文の趣旨とは違う書き方です。

try-catchでcatchするのは、アプリケーションの一番外側のみに
するのが、基本であり、catchするのは、catchで復帰処理が可能性で
処理が続行できる場合や、特別な事情がある場合のみとするのが
一般的だと思われます。

当たり前ですが、特別な事情が、頻繁にあらわれるはずがないので
頻発する場合は、設計をミスっています。

また、上で一般的と言いましたが、その様な常識は
以下の本等で仕入れてください。

リーダブルコード
https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655

すすめてなんですが、自分は読んでいません
言い訳をすると、下記の様に
パラパラめくってみると何処かで読んだようなことばかりで
初心者向けに見えるので、読む優先順位が低いです。
ですが、評判が良いことや、知っている人が呼んでいて
特に、文句を言っていないところを見ると、良い本なのだと思います。

定量的な評価がない
「経験豊富なプログラマーにとって、リーダブルコードに
目新しい物はなにもない」
http://snowlong.hatenablog.com/entry/2015/08/31/141137


蛇足
ですが、代わりに自分は、以下を読みました。
(自分は、数年前から、もっと尖がった関数型プログラミング等に
興味があり普通の書き方も、ある程度知っています。)

CODE COMPLETE
(1版)
おすすめです。英語3版が出ています。
https://www.amazon.co.jp/%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B3%E3%83%B3%E3%83%97%E3%83%AA%E3%83%BC%E3%83%88%E2%80%95%E5%AE%8C%E5%85%A8%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%97%E3%81%A6-Microsoft-PRESS-%E3%82%B9%E3%83%86%E3%82%A3%E3%83%BC%E3%83%96-%E3%83%9E%E3%82%B3%E3%83%8D%E3%83%AB/dp/4756102107

達人プログラマー―システム開発の職人から名匠への道
https://www.amazon.co.jp/%E9%81%94%E4%BA%BA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E2%80%95%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E9%96%8B%E7%99%BA%E3%81%AE%E8%81%B7%E4%BA%BA%E3%81%8B%E3%82%89%E5%90%8D%E5%8C%A0%E3%81%B8%E3%81%AE%E9%81%93-%E3%82%A2%E3%83%B3%E3%83%89%E3%83%AA%E3%83%A5%E3%83%BC-%E3%83%8F%E3%83%B3%E3%83%88/dp/4894712741

プログラミング作法
https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E4%BD%9C%E6%B3%95-%E3%83%96%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3-%E3%82%AB%E3%83%BC%E3%83%8B%E3%83%8F%E3%83%B3/dp/4756136494

その他、リファクタリング本などなど


続き
リーダブルコードより、もっと定量的なものが欲しく
1000ページ越えの本を読むのを厭わないのであれば
次の本がおすすめです。
色々なプロジェクトのデータの統計値を見せながらの説明があるので
ある程度説得力があります。

CODE COMPLETE
(2版)
https://www.amazon.co.jp/CODE-COMPLETE-%E7%AC%AC2%E7%89%88-%E4%B8%8A-%E5%AE%8C%E5%85%A8%E3%81%AA%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%97%E3%81%A6/dp/489100455X

Effective Java
(2版だけど)
https://www.amazon.co.jp/EFFECTIVE-JAVA-Java-Joshua-Bloch/dp/4621066056

まとめ

以上、挙げたほかにも、色々な常識・知識があります。

常識は、現場だけでは、仕入れられません。
現場には、staticおじさん等のような、ワカランチンが
仕切っていることも、珍しくないからです。

有名なstaticおじさん
http://el.jibun.atmarkit.co.jp/minagawa/2010/04/post-ebc4.html

(そういう人は、俺の○十年の経験では・・・と言ったりしますが
一人の人間が経験出来ることなんて、高々100年分しかありません。
人類60億人の中の世界ランカーレベルの人が、代々知識を受け継いで
継ぎ足した知見に比べると、たかが○十年の経験では
ヒヨッコすぎます。井の中の蛙です。
そう言う人には、ハイハイ言って
心の中で無視してください。
あるいは、その現場限りとしてください。
ただ、馬鹿にするのは人として良くないです)

本や、web等の情報にアンテナを張り
先ずは普通の書き方を習得してください。
それが出来てから、もっと尖がった書き方や
エレガントな書き方を追求しても良いでしょう。

以上、初心者に対する個人的な意見でした。

LT第2弾
http://qiita.com/zeal1483/items/a203c3660e3ae264b3fc

zeal1483
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away