« 固定小数点演算 | トップページ | 2兆円バラマキ »

2008年10月29日 (水)

「変数のスコープは狭いほど良い」

「goto文禁止令」の類の話かと。

中途半端に優秀なプログラマが「正しいプログラミングテクニック」だと妄信しがちな3つポイント

比較的簡単なので1番目の「変数のスコープ」だけ。

その変数はどのくらい「変数」なのか?

「変数」の最大のポイントは、「代入」にあると思います。

public class Test {

  public static void main(String[] args) {
    if (args.length > 0) {
      String x = args[0];
      new Foo().bar(x);
    }
  }

}

上のソースで変数 x (つまり args[0]) って、どのくらい代入操作されますかね?

マルチスレッドなのか?

はてなブックマーク コメント よりお題をいただきました。

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestServlet
  extends javax.servlet.http.HttpServlet
  implements javax.servlet.Servlet {

  static final long serialVersionUID = 1L;
  static HttpServletRequest request_;

  public TestServlet() {
    super();
  }

  protected void doGet(
    HttpServletRequest request,
    HttpServletResponse response)
    throws ServletException, IOException {

    request_ = request;
    try {
      Thread.sleep(5000);
    } catch (InterruptedException e) {
    }
    response.getWriter().println(request_.getParameter("p0"));
  }
}

2つのブラウザから、以下のリクエストを連続して投げること(5秒以内)。

GET /ServletTest/TestServlet?p0=A
GET /ServletTest/TestServlet?p0=B

一時期、この手のバグが話題になっていましたね。

とはいえ、 Servlet のユーザから見ると、 HttpServletRequest が「定数」に見えるのも確かです。 Servlet コンテナから見ると、「変数」なわけですけどね。

これは Servlet の仕様でしょうね。もともと、「軽量さ」が Servlet の売りであったことを思えば、意図的なデザインでしょう。

そのコードはどの程度「再利用」されるか?

使い捨てにするコードなら、別に気にしなくて良いですよね。広汎に使われるとなると、「想定外」の使われ方をする可能性が増えますので、より「防衛的に」プログラミングする必要があるかと。

|

« 固定小数点演算 | トップページ | 2兆円バラマキ »

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/80472/24851786

この記事へのトラックバック一覧です: 「変数のスコープは狭いほど良い」:

« 固定小数点演算 | トップページ | 2兆円バラマキ »