2014年8月5日火曜日

Programming in Scala, First Edition: Chapter 25

25. Annotations
  ソースコードに付け加えられた構造を持った情報
  コメントと同じようにプログラム全体、変数、関数、式等の様々要素に付加できる。
  コメントと違うのは構造を持っている事。
    機械処理に向いている。
  この章ではAnnotationの使い方を扱う。
  新しいAnnotationの使い方はこの本の範囲外。
    Chapter 29では追加方法の一つを紹介する。

25.1 Why have annotations?
  コンパイルや実行以外でもプログラムに関係して行えることはある。
    Scaladocの様なドキュメントを自動生成する。
    好みのスタイルに合わせてコードを綺麗に印刷する。
    コードのエラーチェック
      例えばopenの後のclose忘れのチェック。
    試験的なtype checking
      例えば副作用の管理ややpropertiesの所有権の確認。
  meta-programming tool
    他のプログラムを入力として扱うtool
  Annotationによってこれらのtoolを効率的に実行できる。
  Annotationはコンパイルには使われない。コードの実行には影響しない。
  言語自体に各toolのためのAnnotationを組み込むのはtoolが多いので難しい。
    新しいtoolもどんどん出てくる可能性がある。
  scalaでは共通的な最低限必要な物はシステムAnnotationとして定義されている。
  個々のtoolに必要なAnnotationは独自に定義する事が出来る。

25.2 Syntax of annotations
  どの様な定義の宣言部分にも情報を付加できる。
    vals, vars, defs, classes, objects, traits, and types
  methodに情報を付加したいとき
    @deprecated def bigMistake() = //...
  classに情報を付加したいとき
    @deprecated class QuickAndDirty { ...
  expressionに情報を付加したいとき
    (e: @unchecked) match { ...
    typeとしてAnnotationが使われている場合と同様。
  引数を持つより複雑なAnnotationも定義出来る。
    @annot(exp_{1}, exp_{2}, ...)  {val name_{1}=const_{1}, ..., val name_{n}=const_{n}}
    annotは識別子。
    exp_{1} は必須引数。
      普通は定数が使われる。
      スコープ内の他の変数値を参照する事も出来る。
        @cool val normal = "Hello"
        @coolerThan(normal) val fonzy = "Heeyyy"
    name_{1}=const_{1} は順序も任意のオプション引数。
      右辺値は定数のみ。

25.3 Standard annotations
  Deprecation
    今後削除される予定等で使って欲しくないclassやmethodを示す。
    使用するとコンパイラが警告を出す。
  Volatile fields
    feildの不揮発性を示す。
    実装されているplatform(Java等)に依存した扱いをされる。
  Binary serialization
    シリアル化
      オブジェクトをバイトストリームに変換する機能。
      ストレージに保管したり、ネットワーク越しに別の場所に送ったりできる。
    scala自体にはシリアル化の機能は持っていない。
      実装されているplatform(Java等)のシリアル化の機能を使っている。Charter 29
    @serializable
      classがシリアル化可能であることを示す。
      defaultではシリアル化不可。
        普通のクラスは概ねシリアル化出来る。
        socketやGUIをhandleするようなクラスはシリアル化できない。
    @SerialVersionUID(ID)
      シリアル化した際に任意のIDを埋め込める。
      旧バージョンシリアル化されてオブジェクトと互換性が無い場合にチェックできる
    @transient
      fieldがシリアル化不要であることを示す。
      復元されたときはfieldのtypeのdefaultが入れられる。
  Automatic get and set methods
    @scala.reflect.BeanProperty
    fieldに付加するとcompilerがget/set methodをcompile時に自動生成する。
    compile後に有効になるので一緒にcompileされる部分からは使えない。
      一緒にcompileされるのはユーザのコードではなくて同一ライブラリのコード
      ライブライ内なら直接fieldにアクセスすれば良いので実際は問題にはならない。
    scalaではsetter/getterは普通は不要。
      fieldアクセスとmethod呼び出しを同一表記しているので。
    標準のget/set methodを期待しているframeworkのサポートを想定している。
  Unchecked
    (e: @unchecked) match { ... }
    pattern matchingで全パターンを網羅していない時のcompilerの警句抑制。
    Section 15.5

25.4 Conclusion
  platform依存しないAnnotationの使い方について説明した。
  Annotationは新しく定義するよりも使う場合の方が圧倒的に多い。
  scalaの標準Annotationの主だったものを説明。
  Chapter 29ではJava platform特有のAnnotationについて説明する。
    Java platformにしか使えないAnnotation
    Java platformで標準Annotationに追加される意味
    Java由来のAnnotationとの連携、使い方、定義、扱われ方

0 件のコメント:

コメントを投稿