2014年4月23日水曜日

Programming in Scala, First Edition Chapter 13

13. Packages and Imports
  他の部分への影響を最小にすることが重要。
  モジュラースタイルがその一つの解決策。
    小さい部品に分割する。
   内部(implementation)と外部(interface)がある。
      内部の変更は同じモジュールを開発している人にのみ影響する。
      外部の変更は他のモジュールを開発している人にも影響すr。
   packageの配置、importによる名前の可視化、access modifierのる可視性の制御。
   Javaと同様の部分も多いが、より一貫性を強化した部分もある。

13.1 Packages
  パッケージはJavaと同様に階層構造になっている。
    これまでの例はパッケージ名未指定のunnamed package内として扱われていた。
  Javaと同様の定義方法。
    package bobsrockets.navigation
    class Navigator
    ファイル全体が同一のパッケージになる。
  C#風の定義方法。
    package bobsrockets.navigation {
      class Navigator
      package tests {
        class NavigatorSuite
    ...
    一つのファイルに複数のパッケージを定義。
    ネスト構造が取れる。
  パッケージの名前はjavaと同じreverse-domain-nameに従ったほうが良い。
    そうすると、com.bobsrockets.navigationになるかもしれない。
      本書では簡単にするためにcom.は省略する。
  パッケージも他の名前と同様に同じ名前があると内側が優先して参照される。
    外側を参照したいときは親のパッケージ名も指定すれば良い。
    最も外側を指定したいときは__root__.を親として指定する。

13.2 Imports
  import節を使えばprefixを省略して名前にアクセス出来る。
    import bobsdelights.Fruit
      Fruitをprefix無しに使える。javaのsingle type import
    import bobsdelights._
      bobsdelights内の全ての名前にアクセス出来る。javaのon-demand import
        javaだと*を使うがscalaでは*は記述子に使える普通の文字だから使えない。
    import bobsdelights.Fruits._
      Fruitのメンバへのアクセス。javaのimport of static class fields
  先頭だけではなくてどこにでも宣言できる。
    ブロックの内側でも宣言出来る。
  パッケージやsingleton以外の任意の値の名前についてimport出来る。
    関数の引数のメンバをimportすることも出来る。
    オブジェクトをモジュールとして使うときに便利。Chapter 27
  パッケージ自体の中でも自分をimport出来る。
  選択的にimport出来る。selector clause
    import Fruits.{Apple, Orange}
      Apple, Orangeだけをimport
    import Fruits.{Apple => McIntosh, Orange}
      AppleをMcIntoshと言う名前に変えてimport、Orangeをimport
    import Fruits.{Apple => McIntosh, _}
      AppleをMcIntoshと言う名前に変えてimport、それ以外全てをimport
    import Fruits.{Apple => _, _}
      Appleを名無しにして隠して、それ以外全てをimport
    selector clauseは左優先で解釈される。
      _は残り全てを吸い込むので一番右に書く必要がある。
  import Fruits.Apple は import Fruits.{Apple} の省略形。

13.3 Implicit imports
  暗黙的に下記の3つが全ての.scalaにimportされている。
    import java.lang._ // everything in the java.lang package
    import scala._     // everything in the scala package
    import Predef._    // everything in the Predef object
  ?? scalaとPredefを分けたのは何故??
  shadowに注意。scalaとjava.langで同名の場合はscalaにアクセスする事になる。
  ?? scalaのJVMベースの代わりに、.NETベースの実装もある??

13.4 Access modifiers
  Private members
    クラスやオブジェクト定義の内側からしかアクセスできない。javaと同じ。
    インナークラスのprivate memberは外側のクラスからアクセス出来ない。
      更に内側のクラスからならアクセス可能。
      javaと異なる。javaはインナークラスのprivate menberへのアクセス可能。
  Protected members
    定義しているクラスのサブクラスからしかアクセス出来ない。javaより厳密。
      同じパッケージ内でもサブクラス以外からはアクセス出来ない。javaはできる。
  Public members
    何もつけなければpublic。どこ彼でもアクセスできる。
  Scope of protection
    scalaのAccess modifiersはqualifiersと一緒に使うことが出来る。
    private[X]
      アクセス可能な範囲をXにする。
      パッケージ全体も可能。
      一番外側のクラスにすればjavaのインナークラスのprivatreと同じ。
      private[X]だと同じインスタンスからしかアクセス出来ない。object-private
      ?? documentationに便利??
      ?? general variance annotations, Section 19.7で使う??
    protected[X]
      サブクラスからのアクセス+private[X]のアクセスと同等。
      パッケージ全体にするとjavaのprotectedと同じ。
  Visibility and companion objects
    companion objectsとclass間ではお互いのprivateメンバにもアクセスできる。
    ?? ここだけ例外的??
    companion objectsのprotectedメンバは意味がない。
      対のクラスのサブクラスからアクセス出来ないから。
        javaのprotected staticメンバであればアクセスできる。
        ?? 同じ事をしたくても不可能??

13.5 Conclusion
  Chapter 27でより単なる分割を超える柔軟なモジュールシステムを説明。
  モジュールのパラメータ化や継承についても学ぶ。

0 件のコメント:

コメントを投稿