eclipse を使った java 開発 111126 杉浦
TRANSCRIPT
1
Eclipse を使ったJava 開発
杉浦 彰Twitter: @urasandesu
Blog: http://urasandesu.blogspot.com/
2
はじめに
既に、 VB や C++ などの、他のプログラミング言語を使った開発を行ったことがある人向けの資料です。
Eclipse を使った基本的な Java 開発を行うための導入資料となります。
ソフトウェア構成管理の一部である、テスト自動化についても触れています。
3
Java http://java.com/en/オブジェクト指向プラットフォーム非依存(互換性重視)
ネットワーク機能を標準でセキュリティ開発のしやすさ(枯れた構文、 GC、マルチスレッド向け言語仕様)
4
Eclipse http://www.eclipse.org/統合開発環境( IDE) 元は IBM が開発→ OSS 化豊富なプラグインデバッグ・ステップ実行コード編集支援(自動補完、自動追加、自動生成)
5
インストール
なにはともあれ、開発環境
6
Eclipse 3.7 Indigo(EE) 32bit 版
– eclipse-jee-indigo-SR1-win32.zip 64bit 版
– eclipse-jee-indigo-SR1-win32-x86_64.zip
適当なフォルダへ解凍 これだけ?
– これだけ。– コンパイラは同梱されてる。– ベンダにより微妙に挙動が違うのはよくある話。
最終的には標準的な環境で試すのが吉。
7
Hello, world!!
さっそく動かして見る
8
1. Eclipse を起動し、ワークスペースを指定。
9
2. Welcome 画面。とりあえず閉じる。
10
3. Package Explorer ビューで右クリック、[New]→[Project] を選択。
11
4. New Project ダイアログが開いたら、 [Java Project] を選択し、 [Next] ボタンをクリック。
12
5. New Java Project ダイアログが開いたら、[Project name] に “HelloWorld” を入力し、[Finish] ボタンをクリック
13
6. Package Explorer ビューにできたHelloWorld プロジェクトの中にある src フォルダを右クリック、 [New]→[Class] を選択。
14
7. New Java Class ダイアログが開いたら、[Name] に “Main” を入力し、 [Finish] をクリック。
15
8. Main.java をダブルクリックして開き、以下のようなコードを入力。
public class Main {
public static void main(String[] args) {
System.out.println("Hello, world!!");
}
}
16
9. 一通り入力が終わったら保存。 Problems ビューにビルドエラーが検出されていないことを確認。
17
10. Package Explorer ビューの Main.java を右クリック、 [Debug As]→[Java Application]。
18
11. 実行結果が Console ビューに表示される。
19
せっかくなら・・・
環境のカスタマイズ自分やメンバのお好みで
20
フォントの種類やサイズを変える [Window] – [Preferences]
[General] – [Appearance] – [Colors and Fonts]
21
行番号を表示 /列ガイドを表示 [Window] – [Preferences]
[General] – [Editors] – [Text Editors] – [Show line numbers]
[General] – [Editors] – [Text Editors] – [Show print margin] [Print margin column] に桁数を入力
22
シンタックスハイライトをカスタマイズ [Window] – [Preferences]
[Java ] – [Editor] – [Syntax Coloring]
23
タブ派 v.s. スペース派 [Window] – [Preferences]
[Java ] – [Code Style] – [Formatter] – [Edit] ボタンクリック
[Profile name] にわかりやすい名前を入力 [Indentation] タブの [Tab policy] を変更
24
1 行に入る文字数 [Window] – [Preferences]
[Java ] – [Code Style] – [Formatter] – [Edit] ボタンクリック
[Profile name] にわかりやすい名前を入力 [Line Wrapping] タブの [Maximum line width] を変更
25
設定のインポート /エクスポート
インポート– [File] – [Import]
[General] – [Preferences] – [Next] ボタンクリック [From preference file] に他のマシンからエクスポートした設定ファイルを指定し、 [Finish]
エクスポート– [File] – [Export]
[General] – [Preferences] – [Next] ボタンクリック [Export all] チェックボックスをチェック [To preference file] にエクスポートする設定ファイルパスを指定し、 [Finish]
26
他にも色々?
Eclipse の真骨頂
27
例えば、静的解析ツール
バグの元になりやすそうなパターンを指摘– 無効な引数– 変数の初期化し忘れ– コメントの有無
Eclipse で使える静的テストツール - @IT– http://www.atmarkit.co.jp/fjava/rensai3/eclipsetst02/eclipsetst02_1.html
28
Checkstyle
代表的な静的解析ツールを使ってみるプラグインの導入方法も
29
Checkstyle
http://checkstyle.sourceforge.net/ Java のための静的解析ツール 主にコーディング規約が遵守されてるかどうか– 空白スペースの記述位置– クラス名、メソッド名、定数、変数などの命名規則
– Sun のコーディング規約があらかじめ提供される
30
あと、プラグイン Eclipse に新しい機能を付けられる 柔軟性は非常に高い
– Java 以外の言語でも Eclipse を利用可能に!– C+
+、 PHP、 Perl、 C#、 D、 TeX、 Python、Ruby、 JavaScript、 COBOL…
簡単な導入機能– ただし、 Eclipse 3.4 以降
Checkstyle もこれに対応したプラグインを配布– http://eclipse-cs.sourceforge.net/
31
1. [Help] メニューの [Install New Software]
32
2. Install ダイアログが開いたら、[Add] ボタンをクリック
33
3. Add Repository ダイアログが開いたら、[Name] にわかりやすい名前入力し、 [Archive] ボタンをクリック
34
4. ダウンロードした zip ファイルを指定し、[OK] ボタンをクリック
35
5. [Select All] ボタンをクリックし、 続けて [Next] ボタンをクリック
36
6. [Next] ボタンをクリック
37
7.License Agreement を確認し、 [Finish] ボタンをクリック
38
8.Warning ダイアログが出てもそのまま進める
39
9.Eclipse の再起動を促されるので、再起動
40
10.試しに最初のプログラムをチェックしてみる。 – 右クリック [Checkstyle] – [Check Code
with Checkstyle]
41
11.指摘たくさん!
42
12. プロジェクトや個人で使いたいものに絞り込む。 [Window] – [Preferences]
[Checkstyle] デフォルトの Check Configuration をコピーするなどして、使うチェックだけにカスタマイズ
43
ソフトウェア構成管理はじめの一歩
急に JUnit に入ってもアレかと・・・すみません・・・前置き長いかもです
44
例えばこんな問題
しっかり直したはずの不具合が、いつの間にか復活してる!
このバージョンのマスタがあったはずなのだけど、どこに行った?
追加したはずの機能が、他の人の手違いで上書き /削除されてしまった!
特定の PC にしか最新版のソースがない、特定の人しかビルド /リリースできない・・・。
ある機能の実装を担当していた人が突然いなくなってしまった!
45
例えば、「しっかり直したはずの不具合が~」
何が起こった?(他に影響はない?) いつから? どのリリースから?(仕向け地毎 /機器毎にカスタマイズしてる場合とか)
誰が?(我々?それとも別会社?) なぜそれが入り込んだ?
再発防止策、作ってよ?
不具合が出ちゃったものはしょうがないけど、
ちゃんと説明してよね!
46
これらの問題を解決するために
ソフトウェア構成管理Software Configuration Management: SCM
構成管理=構成管理=品質管理+変更履歴管理品質管理+変更履歴管理
47
品質管理と変更履歴管理
品質管理–要求 /障害の管理–リリース計画
変更履歴管理–作業記録–複数メンバによる共同作業時の決め事
48
ただ・・・ 例えば、不具合を不具合管理用の帳票で
↓ 過去に似たようなもの直したはずだから、参考にしたい・・・でも、どこにあるの?
そもそも帳票の最新版はどれ?
不具合管理帳票の変更管理表過去に修正した不具合の一覧表それらの文書をまとめる管理表
・・・あれ?
49
自動化、しましょうか・・・
脱・属人性方法論があるのであれば、なるべく
50
品質管理ツール
要求 /障害の管理– Mantis/Trac/Redmine
リリース計画–継続的インテグレーション
Continuous Integration: CIビルド自動化( xmake/xant)テスト自動化( xUnit)
51
変更履歴管理ツール
第 1 世代– SCCS/RCS
第 2 世代– CVS/SVN/VSS
第 3 世代– Bazaar/Git/Mercurial
52
寄り道
品質管理とか変更履歴管理とか、他の部分のための社内勉強会もあるといいですね。
オープン系は結構情報出てくるんですけど、基幹系はこの辺りどうなってるんでしょう?xUnit の類に COBOLUnit ってツールもあるみたい?
– COBOL→Java 載せ換えみたいなプロジェクトでこの辺りの話はあるのか~とか。
– せっかく載せかえるのだから、バッチ処理の負荷分散とか並列処理とか~とか。
53
JUnit
今回は、テスト自動化ということで
54
JUnit
http://www.junit.org/ Java 向けのユニットテスト(単体テスト)自動化フレームワーク
Smalltalk の SUnit を元にケント・ベックらが中心となって開発
Eclipse EE には標準で同梱
55
1. Package Explorer を右クリック→ [New]→[JUnit Test Case]
56
2. New JUnit Test Case ダイアログが開いたら、Name にわかりやすい名前を入れ、 [Finish] ボタンをクリック
57
3. 実行。 [Debug As]→[JUnit Test]
58
4. JUnit ビューが自動的に表示される。まだ失敗。
59
5. テストを追加。 標準出力に Hello, world!! が出力されるんだっけ
。public class MainTest { @Test public void test() { // 設定 ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); System.setOut(ps); // 実行 Main.main(new String[] {}); // 検証 Assert.assertEquals("Hello, world!!\r\n", baos.toString()); }}
60
6. もう一度実行→成功した!
61
機能を追加してみる
引数に与えた文字列を計算させる。イメージ
$> java Main + 1 1
Result: 2
62
7. テストの修正。public class MainTest { @Test public void test_main01Add() { // 設定 ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream ps = new PrintStream(baos); System.setOut(ps); // 実行 Main.main(new String[] {"+", "1", "1"}); // 検証 Assert.assertEquals("Result: 2\r\n", baos.toString()); }}
63
8. 実行。もちろん失敗する。
64
9.機能の変更。これでいいかな?
public class Main {
public static void main(String[] args) {
if (args[0].equals("+")) {
int x = Integer.parseInt(args[1]);
int y = Integer.parseInt(args[2]);
System.out.println(
String.format(
"Result: %d", x + y));
}
}
}
65
10.再度実行。O.K.!!
66
でも、ほんとにこれで大丈夫?
引数に何も与えられない場合は?引数が空の場合は?引数の数が足らない場合は?多すぎる場合は?
引数が数字じゃない場合は?
67
不安をテストに
怪しいのは非対称なパターン、異常系テストが書けないのは、仕様や設計が不明確なことも多々– “+”以外はなんかないの?
聞いて見ると、“ -”, “*”, “/” も必要だった!–整数の演算しかないの?
聞いて見ると、小数点付きの数や 16 進数の計算も必要だった!
実は、文字列の結合もしたいという要望もあった!
68
自動化しておくことで
仕様の変更や機能の追加に対しては・・・– 前にあった機能と実は競合してた、みたいなことが早めにわかる
– 処理の流れを整理したい、というときに安心してできる(リファクタリング)
– 新しく入った人に、勉強も兼ねて安全に触ってもらえる
一通り完成した後の保守でも・・・– 不具合対応が、もし他の場所に影響していた場合に検出しやすくなる(デグレの検出)
69
演習!
習うより慣れろ、です※演習資料は、 TDDBC for C++ で使われたものを利用させていただき
ましたhttp://www.slideshare.net/imagire/tdd-boot-camp-for-c
70
ハマりやすいところをいくつか
プリミティブ型(値型)と参照型– ラッパー型と Auto Boxing/Unboxing の動き
Integer i = null; // コンパイル可!int ii = i; // 実行時に NullPointerException!
演算子のオーバーロードはありません– String の同値比較は、 equals メソッドで
「リソースの確保は初期化時に( Resource Acquisition Is Initialization: RAII)」できません( Java 6 まで)– 例外安全にするには、 finally 文や Rent パターン
– Java 7 からは拡張 try 文が使える
71
Java を使ったプロジェクトならではの問題も?
変な規約– 設計書に書かれたクラスしか作ってはいけない!
初期のころの不具合やパフォーマンスの問題が未だに信じられている?
古いバージョンしか使えない– Java 4、 Java 5 は現役!
社内フレームワークがバージョンアップに付いて行けていない?
15 年前に出た言語なので、他にもありそう– ただ、未だに一番人気がある言語という地位を守っている事実!
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html