assaulter's diary

主にバイクについて

enumのちから

前回 : http://assaulter.hatenablog.com/entry/2012/11/24/233948

の続きです。

Javaを本格的に業務で使い出して3ヶ月位なのですが、Javaのメソッドは基本的にクラスのメンバ変数を操作するものというふうに理解しております。

で、なんも考えないでクラスを作ると、メンバ変数が増殖する一方です。

前回のブログで書いたオブジェクト指向養成ギプスによると

  • クラスの状態変数は4(理想は1 or 2らしい・・・)

なので、例えば状態変数としてx, yの位置情報を持つ場合はx,yをまとめてPosition等のクラスを作ってコンポジションする方法があります。(件のスライドのテクニック)

今回はそれとは別にJavaenumを使うと良い感じにまとめられることに気づいたのでメモ書きします。

やりたいこと

  • メソッドの実行を、ある条件で切り替えたい

適当に実装するよ

public class Hoge {

        private HogeInterface hogeInterface;
	
	public Hoge(HogeInterface hoge) {
		this.hogeInterface = hoge;
	}
	
	public enum State {
		PATTERN_A,
		PATTERN_B,
	}
	
	public void execute(State state) {
		switch (state) {
		case PATTERN_A:
			hoge.executeA();
			break;
		case PATTERN_B:
			hoge.executeB();
			break;
		default:
			break;
		}
	}
}

うーん。switch文って微妙・・・

こうも書ける

public class Hoge {

        private static HogeInterface hogeInterface;
	
	public Hoge(HogeInterface hoge) {
		Hoge.hogeInterface = hoge;
	}
	
	public enum State {
		PATTERN_A {
			@Override
			public void execute() {
				hogeInterface.executeA();
			}
		},
		PATTERN_B {
			@Override
			public void execute() {
				hogeInterface.executeB();
			}
		}
		;
		public abstract void execute();
	}
}

なんとなくそれっぽい!

(注:軽くググってこういう使い方してる記事なかったので、正しいかどうかは保証できません。)

参考記事:http://d.hatena.ne.jp/ashigeru/20090116/1232128313

「定数ごとに匿名クラスブロックをかける」

 

 

匿名クラスを適切に書けるようになると、更にJavaを理解できる気がする・・・!

オブジェクト指向の修行中

このスライドをバイブルにAndroidJavaのコードを書いてます。

このスライドが紹介している、オブジェクト指向が身につくプラクティスの元ネタはこの書籍に載ってるらしいです。
ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション

ThoughtWorksアンソロジー ―アジャイルとオブジェクト指向によるソフトウェアイノベーション

 

オブジェクト指向が身につく9つのプラクティス

具体的にはこんな感じ。

  1. 1つのメソッドにつき、インデントは1つまで
  2. else句を使用しない
  3. すべてのプリミティブ型と文字列型をラップする(ex.得点や制限時間をクラス化する)
  4. 1行につき、ドットは1つまで
  5. 名前を省略しない
  6. エンティティを小さくする(50行を超えるクラスを作らない, 10ファイルを超えるパッケージは作らない)
  7. 1つのクラスにつき、インスタンス変数は2つまで
  8. クラスにはコレクションを1つだけ持たせる
  9. getter, setterを使わない

うーん。。。どうですか???厳しくないですか?

というわけでゆとり仕様

上のスライドの後半に載ってますが紹介だけ。

  1. 複雑度10まで
  2. 1メソッド20ステートメント(コメント等を除いた行数)まで
  3. 1クラス80ステートメントまで
  4. ネスト段階まで
  5. setter使用禁止
  6. フィールドつまで

項目5以外はjavaのメトリクス計測プラグインで測定可能なので、しきい値を設定して、オーバーしたらアラート出すようにしています。

プラス俺ルール

ここから個人的に追加した縛り。

  1. クラスの複雑度の平均 < 5
  2. 重複コード0.0%
  3. 凝集度 < 0.5 (どの程度が良いっていう参考資料がなかったので、適当に設定)

1, 2は分割していけばクリアできるのですが、3が難しい。

上のスライドのp81〜に紹介されている「単一責任の原則」「依存関係逆転の法則」がまだできてません。

ここをサクッとやれるようになればレベル上がったと言えるのかなぁ。

なんか風邪ひいたっぽいので、具体的にどうリファクタしていったかについてはまた今度書きますね。では。

 

androidでカバレッジを取る

メモ書きです。

  • 前提:androidプロジェクトおよびandroidテストプロジェクトが存在する
  • antが入っている

手順

対象プロジェクトのディレクトリに移動した後、
android update project --path .
  • テストプロジェクトのbuild.xmlを作る
対象テストプロジェクトのディレクトリに移動後、
android update test-project -m テストプロジェクトのフルパス -p .
  • プロジェクトのビルド、インストール
対象プロジェクトのディレクトリに移動後、
ant emma debug install
  • エミュレータを起動しておく(もしくはrootをとった端末・・・らしい)
  • テストプロジェクトのビルド、インストール
テストプロジェクトに移動後、
ant emma debug install test

これでテストプロジェクトのどこかにcoverage.xmlが生成される。

eclipseでUMLを生成してみる(Java)

OpenGLで作る Android SDKゲームプログラミング

OpenGLで作る Android SDKゲームプログラミング

この本を写経しつつ遊んでたら、なんとなくクラス図が欲しくなったのでプラグインを入れてみました。

AmaterasUML

project Amateras - http://amateras.sourceforge.jp/cgi-bin/fswiki/wiki.cgi?page=AmaterasUML

最初見つけたときはソースが古かったのですが、最近も更新してるみたいです。

GEF

説明を読み進めると、GEFなるものが必要なので、eclipseのHelp - install new softwareで検索する。出てくるのでそれを入れます。

あとはDLしてきたAmaterasUML/*.jarをeclipseのpluginsフォルダに置きます。

使ってみる

eclipseで、new project - AmaterasUML - クラス図 と選択。親フォルダ選べって言われるので、クラス図作成したいフォルダを指定しましょう。

すると、中身空の.cldファイルが出来るのでそれを開きます。

あとは開いたウィンドウに.javaファイルを突っ込むとこんな感じになります。

f:id:assaulter:20121104221639p:plain

うーん微妙かも。

RockSmith楽しいっす

ロックスミス(リアルトーンケーブル同梱)
ロックスミス(リアルトーンケーブル同梱)
ユービーアイ ソフト (2012-10-11)
売り上げランキング: 18

ギター買って半年くらいなのですが、人に連れられて外でやる位しか触らなかったので、ほとんど上達してませんでした。

でも、最近毎日2時間はコレやってます。

違いは何か?

最初はルート音に毛を生やした程度の音数ですが、それをクリア出来ると徐々に本物に近づけていく。初心者が脱落するのところを上手く救ってるとおもいます。

趣味ってなんだろう?

”何もしなくていい時に気がついたらやってるもの”

かなぁと。某ブログからの引用です。

 

しかし同じギターを引く行為でも、こういう変化一つで、”あ、弾こうかな”ってなるハードルが全然違う。もしかしたら今まで嫌厭してたものも、やり方を少し変えるだけで好きになれるかもしれない。

 

コレやるのしんどいなぁと思ったら、やり方をちょっとだけ変えてみる。これ何にでも適用できそうな気がしますね。

というわけで

そういう体験を提供できる何かが作れればいいのかなぁとぼんやり思いました。

たまにはこういうどうでも良い話を書くようにしようかな。

JavaScript The Good Partsを読む(その3)

だいぶ間が空きましてすいません。Java+Design Patternやっててそっちも面白かったもので。Java+DPに関しても書いていきたいですね。

では、第4章に関して。この章では関数ということで、関数の呼び出し方やクロージャ、カリー化等が出てきます。

ですが、今日はスコープとクロージャについて書きます。

スコープ

JavaScriptはブロックスコープを持っていません。

代わりに、関数スコープは持っています。

var foo = function () {
    value: 0
};

// アクセスできない!
//document.write(foo.value);

この声質を利用して、プライベートなフィールドを持ちたい場合にクロージャを使う(のだと僕は理解しました。)

クロージャ

書き方はおそらく色々あるんだと思いますが、その一例として。

// 前段階
function outer () {
    var x = 1;
    alert('outer x = ' + x);
    return function () {
        alert('closure x = ' + x);
        x = x + 1;
    };
}

//実行するには?
var f = outer(); // alert('outer x = ' + x);が実行される
f(); // alert('closure x = ' + x);

これではなんだか手間なので、即時関数と呼ばれるものを利用します。即時関数についてはこのテキストには書いてなかったので、こちら等 - http://d.hatena.ne.jp/sandai/20110824/p1 を参考にしてみるといいかもしれません。

// 即時関数使用バージョン
var f = (function () {
    var x = 1;
    alert('outer x = ' + x);
    return function () {
        alert('closure x = ' + x);
        x = x + 1;
    };
}());

// 実行するには?
f(); // alert('closure x = ' + x);が実行される

即時関数を利用すると、var f = hogehogeの段階で関数が実行されるので、alert('outer x = ' + x);が発動します。

// テキストの例。valueにはincrementを使わないと影響を与えることができない。getValueを使わないと値を取得できない。var myObject = (function () { // 即時関数を変数に代入
    var value = 0;
    return {
        increment: function (inc) {
            value += typeof inc == 'number' ? inc : 1;
        },
        getValue: function () {
            return value;
        }
    };
}());

次回予告

次回は多分DPかandroidの話をやります。JS一旦休憩かなー?w

MacOS X に node.jsとnpmをインストールする(TypeScriptを使ってみよう)

お久しぶりです。

最近生活のリズムが崩れていて、記事を書く時間がすっぽり抜け落ちておりました。

書くことは沢山あるので、少しずつ記事を書いていこうと思います。

node.jsとnpmをインストール

なぜ急にnode.jsなんてものを言い出したかというと、

TypeScript - http://www.typescriptlang.org/

これの環境を作りたいと思ったからです。(軽く試すだけなら、正直webでコードかけるのでそれで十分なのですが・・・)

naveおよびnodeをインストールする

    
    $ git clone https://github.com/isaacs/nave.git ~/.nave
    $ ln -s ~/.nave/nave.sh ~/bin/nave
    $ nave use latest

マカー御用達のhomebrewでもインストールできますが、nave用いると、nave use hogeでバージョン切り替えが簡単に出来ます。

npmをインストールする

パッケージ管理ツールのnpmをインストールします。

    $ curl https://npmjs.org/install.sh | sh

httpsなので、ご注意を。

TypeScriptをインストールする

npmを使ってインストールできます(上のTypeScriptのページを参照)

    $ npm install -g typescript

TypeScriptファイルをJSファイルに変換する

    $ tsc hoge.ts

これでjsファイルが作成されます。TypeScriptがどんなJSファイルを吐くのかは、公式ページにlearnという項目があるので、そこで色々見てみましょう。

2chのTypeScriptスレに面白いフレーズがあったのでコピペ

"長所はJavaScriptがそのまま通ること。短所はJavaScriptがそのまま通ること。"

ちゃんと使おうと思ったら、JavaScriptに対する理解は必須っぽいです。