[agile][scrum][開発] バーンダウンチャート

http://www.infoq.com/jp/news/2010/02/deciphering-burndown-charts

縦軸に残作業量(これの測定方法が不明)、横軸に時間をとったときのグラフの進み方。

  • 斜め45度に下がっていれば理想的。
  • 終盤に突然下がったようなら、機能や要求を削ってスコープを狭くした可能性あり。

などが分析できる

[scala][java][tutorial] Scala本を読む 9

制御の抽象化

  • 9.1 重複するコードの削減

例:?末尾が特定の文字列で終わるファイル、?先頭が特定の文字列で始まるファイル、?正規表現にマッチしたファイル名 を探す関数を作るとする。
フォルダ内のファイルを列挙し、一つずつファイル名がマッチするかチェックするような動作になるだろう。

Javaだと、Stringを引数にとり、booleanを返すinterfaceを定義し、そこに?〜?の動作をするように実装した無名クラスを利用する。
Scalaでは関数値(function values)を引数にとることでコードを少なくできる。

object FileMatcher {
  private def filesHere = (new java.io.File(".")).listFiles
  def filesEnding(query: String)) = 
    for (file <- filesHere; if file.getName.endsWith(query))
      yield file
}

マッチする部分をさらに縮めて
  def filesEnding(query: String) =
    filesMatching(query, _.endsWith(_))

とできる。
javaのinterface方式では「コードの重複を取り除けるが、同時に同じくらいかそれ以上の量の新しいコードを増やしてしまう」らしい。
だからめんどくさい気がするのか。なるほど。

  • 9.2 クライアントコードの単純化

コレクションに「特定の条件を満たすものがあればtrue」を返すExsits関数など。
判断部分だけを渡せばOKなのでコードが少なくて済む。

  • 9.3 カリー化

前に出てきた気がするけど、なんとなくの説明。
f(x,y)⇒F(x)(y) とする。
引数xをとって、引数yをとる関数を返す。←の関数は引数yを入れるとf(x,y)と同じ結果を返す。

  • 9.4 新しい制御構造
def withPrintWriter(file: File, op: PrintWriter => Unit){
  val writer = new PrintWriter(file)
  try {
    op(writer)
  } finally {
     writer.close();
  }
}
を、カリー化して、さらに「引数を一つだけ渡すメソッドは{}を使ってよいルール」を使うと
def withPrintWriter(file: File)(op: PrintWriter => Unit) {
  val writer = new PrintWriter(file)
  ・・・
}
とかけて、

val file = new file("sample.txt");
withPrintWriter(file){
  writer => writer.println(new java.util.Date);
}

確かに、while(){}みたいにかける。「新しい制御構造」。

  • 9.5 名前渡しパラメータ
def byNameAssert(predicate: => Boolean) =
  if(assertionEnabled && !predicate)
    throw new AssertionError
本当は
def byNameAssert(predicate: () => Boolean)〜

これでbyNameAssert(() => z>10)でなくbyNameAssert(z > 10)とできる。
byNameAssert(Boolean)との違いは、中身が遅延評価されるということ。

[scala][java][tutorial] Scala本を読む 8

「関数とクロージャー」

  • 8.1 導入
  • 8.2 ローカル関数

関数を関数内にスコープ内だけに有効な関数として定義できる
外側のスコープの関数のパラメータにアクセスできる。

  • 8.3 一人前の存在としての関数

"scalaにはfitst class functionsが用意されている"
⇒関数にファーストクラスオブジェクトと同じ性質を持たせられるということらしい。
ファーストクラスオブジェクト

    1. オブジェクトに名前がつけられる
    2. 引数として関数や手続きに渡すことができる
    3. 返り値にすることができる
    4. データ構造に含めることができる

"関数リテラルは実行時にインスタンス化すると値としての関数(function values)になる。"
クラスとオブジェクトの関係ににている。

パラメータの型の省略

numbers.filter((x: Int) => x > 0)
↓
numbers.filter((x) => x > 0)

"=>"は、左辺で受け取った引数を右辺で処理する関数を返す記法

numbers.filter(_ => > 0)
一回しか使わない場合は場所がわかる
  • 8.6 部分化された関数

これちょっと不思議

def sum(a: Int, b: Int, c:Int) = a+b+c
val a = sum _
a(1,2,3)
⇒ 6

アンスコを使うと、引数が部分的に適用(引数を渡して関数を実行すること)された関数が生成される

val b = sum(1, _: Int, 3)
b(2)
⇒ 6

内部でclass x{ def apply(_: Int){ sum(1, _, 3) }
みたいなクラスができているらしい

関数内で関数外のパラメータ(自由変数)を利用できる。
実行時にパラメータの実体を取得する必要がある⇒取得したものを束縛変数という(のか?)。

  • 8.8 連続パラメータ

Java5で追加されたやつみたい。

def echo(args: String*) 〜

処理の最後に自身を呼び出す関数。
コンパイラが最適化を行い、パラメータのみ更新して関数の戦闘にジャンプするようにしてくれる
⇒手続きの繰り返しとほとんど同じ実行速度となる
ただし再帰呼び出しにifなどが入ったりすると最適化されない。

[scala][java][tutorial] Scala本を読む 7

今回は制御構造なんだってさ
制御構造に「帰り値がある」んだってさ

  • 7.1 if

3項演算子っぽい

val filename = 
  if (!args.isEmpty) args(0)
  else "default.txt"
  • 7.2 while

whileも返り値がある。"()"(Unit値)、javaのvoidっぽいもの。
値を返さない(=内部でvarの更新処理がたいていはいる)ので、whileはあまり使わないほうがいい。

あと、以下の処理は利用できない。
代入の結果はscalaではUnit値になり、Unit値と""の比較は常にtrueになってしまうため。

while( (line = readLine()) != "")
〜
  • 7.3 for
    • 7.3.1

繰り返しに、toとuntilを使える

(iはval変数)
for(i <- 1 to 4) ⇒ 1,2,3,4
とか
for(i <- 1 until 4) ⇒ 1,2,3
    • 7.3.2 フィルター

for文の実行をコレクションのサブセットに適用したいとき

for(i <- 1 to 10 if i%2==1) println(i) ⇒ 1,3,5,7,9

forの入れ子は()の中に<-を追加するだけ。

    • 7.3.4

val,varを使わず、いきなり代入するとfor内だけで使える変数ができる。

    • 7.3.5 yield

for(〜) yield tmp {}
tmpにforの処理後のコレクションが格納される(場所注意)

  • 7.4 try

javaとあまり変わらない。ただし
finally節の処理結果は返り値に反映されない。(fileのcloseなどにのみ利用すべき。)

  • 7.5 match

case文があらゆる型やその他のものに利用できる。
breakを書かなくていい。

  • 7.6 break,continue

関数形と合わないのであまり使わない。

  • 7.7 変数のスコープ

より内側のスコープで、外側で使われている変数を再度定義できる。

{
  var a = 10;
  {
    var a = 5
  //a=5
  }
  //a=10
}