[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 13293] Scala スケーラブルプログラミング第 4 回議事録
- From: IWAMURO Motonori <vmi@xxxxxxxxx>
- Date: Sun, 7 Mar 2010 01:27:16 +0900
岩室です。
済みません、遅くなりましたが、議事録をお送りします。
--------
Scalaスケーラブルプログラミング第4回議事録
2010年2月27日
参加者: 遠藤、岩室、石黒、高橋(徹)、松永、村山、久保田、高橋(智)、中島、
        高原、小棚木、門脇
書記: 岩室
p.212-
■12.5 積み重ね可能な変更をそれぞれのトレイトで表現する
・「フィルタリング」について、p212の説明では「取り除く」となっているが、
  実装では、条件に合わないものを追加せず無視している。
・p215のnewをカッコでくくる意味は?
  → 複数行にまたがっているので、継続の意味ではないか?
・JavaのStream系のAPIに似ている。
・Javaのinterfaceだと、宣言されたメソッドを全部実装する必要があるが、
  こちらは特定のメソッドだけを実装できる。
・必要なところだけフィルタを書けるのは便利。
・でもwith, with, ...と続くのはつらい?
・Javaよりは楽だけど、やっぱり実装が大変?
・aspectチックに書けるのがうれしい。
・Javaのaspectは準備が大変。
  → 最近のaspectではjavaagentが使える(動的に設定できる)
・aspectとしての機能が言語として組み込まれているのは良い。Javaのaspect
  は後付け。
・特定のインスタンスにだけ付けるのは良い。(検証とか)
・Javaの無名クラスと似ているが、traitは事前に定義されている点がちがう。
・部品をいろいろ用意して、いろいろ組み合わせることができる。
  →Javaの無名クラスとは異なる。
・「without」のようなものは無いのか?(笑)
■12.6 Scalaが多重継承ではなくミックスイン合成を選んだ理由
・p217 L3 → 誤訳?
  「インクリメントし、かつ倍にする、という処理がおこなわれない」ではないか?
・同じtraitを複数withで指定できるか?→宿題
・p218の図がよくわからない。
・traitの継承はやらない方がよい?
・トレイトの継承は、熟練しないと使ってはいけないのでは。
■12.7 トレイトすべきか、せざるべきか
・・「Javaコード【を】継承できるようにしたい場合」
  ○「Javaコード【で】継承できるようにしたい場合」
  ではないか?
・Javaのinterfaceのメソッド呼び出しは遅い。
  → が、それが本当にボトルネックになるか?
     ロジックを変えた方が速くなることは多い。
■12.8 まとめ
・深い。
・間違った継承ツリーを後から変えるのは大変だが、traitの方はやりやすい。
・ゴミみたいなtraitが量産されないか?
・細かいものを組み上げていくのがlisp的に感じる。
・一人プロジェクトなら良いが、複数人だと使えるか?
・traitのoverrideしてないメソッドは呼べるか? → 呼べる。
・多重継承の解決
  ⇒実装の継承?
    trait/mix-in
    C++テンプレート
・「遺伝継承」?
・トレイト? 特性?
13章 パッケージとインポート
■13.1 パッケージ
・リスト13.5: 何故Booster2がこの構文になる?
  → Booster2はnavigationの中にない。
・「_root_」が微妙。
・"."から始めればいいのではないか? (C++だと、::から始める)
  → "."はいろいろなところで使われるから無理ではないか?
■13.2 インポート
・catch-all節って何?
■13.3 暗黙のインポート
■13.4 アクセス修飾子
・private[this]って何?
  → 同一クラス内でも、オブジェクトが違えばアクセスできない
・13.4.4「Xまでは非公開あるいは限定公開だという意味になる」
  →意味が取りづらい。
・[]内は階層構造以外に指定できるか?
・[]内に複数指定できるか?→できなさそう?
・Javaから見たらどう見える?
■13.5 まとめ
14章 表明と単体テスト
■14.1 表明(assertions:アサーション)
・ensuring はどう振る舞う?
・Javaのassertの挙動を変えられないのは不便。組み込みだと「assertでfail
  したときにデバッガを起動する」といったことをしたいのだが、できない。
■14.2 Scalaにおける単体テスト
・リスト14.4はどう動く? 基本コンストラクタ内のtestメソッドでテストを
  登録し、executeでテストが実行される?
・p239 L1最後の一文は?
  →14.4 内で、テストメソッドを実装する場合は、14.3と同じになる、ということ?
    (1意見) test("xxx xxx xxx")と書くと、暗黙でxxxXxxXxxメソッドが定義
    されるのかと思った。
■14.3 情報が豊富なエラーレポート
・expectをJavaで書いたらどうなる?
  → 例えば:
     expect(2, new ExpectFunction<Integer>() {
       @Override
       Integer execute() {
         return ele.getWidth();
       }
     });
     長い……。
■14.4 JUnitとTestNGの使い方
・p241 下のリスト
  2つ目の@Testの直後の{...}は、アノテーション@Testの引数相当。
  Javaで書くと、@Test(exceptedExceptions={...}) と同じ。
・p242 リスト14.6
  - テストの数は減っているのでは?
  - interceptを別メソッドにすればいい。p241よりは短かいコードになる
■14.5 仕様としてのテスト
・it should 〜 と英語で読める。
・IAE = IllegalArgumentException。
・specs → やりすぎではないか?
・自然言語 = 英語
  日本語でも定義できるのでは?
・自然言語に近付けば近付くほど、あいまいにならないか?
■14.6 プロパティベースのテスト
・「数百のwの値」は適切な値が生成されているか?
  wとして適切な値が選ばれているか? ⇒ 宿題
・境界値は判断してくれるのか?
・文字列の場合はどうなるのか?
■14.7 テストの構成と実行
■14.8 まとめ
15章 ケースクラスとパターンマッチ
■15.1 単純なサンプル
・simplifyTop自体は再帰するか? → しない。
・erlangのパターンマッチのOO的な表現?
■15.2 パターンの種類
・Javaではこうなる? (15.2.1の直後のリスト)
  if (expr instanceof BinOp) {
    op = expr.op;
    left = expr.left;
    right = expr.right;
    ...
  }
・変数パターンの特殊ケースがワイルドパターン?
・15.2.3 perlっぽい印象がある。
●次回は15.5から
--------
-- 
IWAMURO Motonori <http://vmi.jp/>