2014年7月11日金曜日

AndroidでのListenerとCallbackの違い

AndroidでのListenerとCallbackの違い

Androidの勉強を始めてしばらくするとListenerやCallbackが出てきますが、Androidでの両者の違いをどう定義しているのか少し引っかかったので調べてみました。

大意としてはコールバックの方が根幹になる名詞で、リスナはコールバックに含まれてしまう、つまりどっちも同じでしょ、と言われればそうとも言えますが、個人的には「リスナ」と言われるとUIイベントをイメージし、「コールバック」と言われると内部処理をイメージしながら聞いています。

一般的な定義

  • Callback
    呼び出し先の処理が終了した時点で(呼び出し元から指定された)関数が実行される事。
    その為、呼び出し元から呼び出し先関数を実行する再に関数ポインタを渡しておく。
    呼び出し先で何らかのイベントが発生した時にそれを検知し通知する為の仕組み。
  • Listener
    概要はコールバックと同じ。言語やフレームワークにより定義はマチマチ。
    ちなみにJavaには関数ポインタが存在しないので、コールバックの実現にオブジェクトを使用している為か「リスナ」と表現される事が多い。
個人的にはUIイベント系がリスナ(イベントリスナ) 、UIイベント以外がコールバック、という感じで使い分けるものかなぁと漠然と考えていました。

Androidで気になったところ

しっくり版

Androidで最初の方に出会うのはイベントリスナだと思います。
Button button = (Button)findViewById(R.id.button); 
button.setOnClickListener = (new View.OnClickListener(){
    ...
OnClickListenerインタフェースです。

クリックイベントを取得する = UIイベント

なのでListenerという名前で実装されているのがしっくりきます。

あれれ版

同じく最初の方に出会うこれ。
public boolean onKeyDown(int keyCode, KeyEvent event){
    ...
KeyEvent.Callback インタフェースで宣言されている onKeyDown() メソッドです。KeyEvent.Callback インタフェースはActivityやViewが実装してくれているのでそれらの内部で上記のようにいきなりオーバーライドして使用する事ができます。
でもイベントリスナ(= UIイベント)なのにインタフェース名が Callback …解せない…

そう言えば

SurfaceHolder.Callback というのもありました。
Surfaceの位置やサイズが変更された時に surfaceChanged(), Surfaceが作成/破棄された時に surfaceCreated(), surfaceDestroyed() が呼び出されます。
これは…
UIイベントはUIイベントなんだけど、通常ユーザ発じゃないUIイベント、という考えでリスナではなくコールバックとして実装されている、と考えれば納得…。

リファレンスを確認

上に記載したインタフェースに関してリファレンスを読んでみましたが、、、定義がない。
で、APIガイドで見つけました。
Event Listeners
An event listener is an interface in the View class that contains a single callback method. These methods will be called by the Android framework when the View to which the listener has been registered is triggered by user interaction with the item in the UI.
イベントリスナはViewクラスのインタフェースで、1つのコールバックメソッドを含みます。これらのコールバックはリスナが登録されているViewの時UI中アイテムへのユーザ操作がトリガになりAndroidフレームワークから呼ばれます。
イベントリスナの定義として、Androidフレームワークから呼ばれるのはリスナ&コールバック共に存在するので置いておくとして、以下の2点は使えそうです。
  • Viewクラスのインタフェース
  • 1つのコールバックメソッドを含む
他リスナで色々調べると、上記2点の定義に当てはまらない(Viewクラスのインタフェースではない or 複数のコールバックメソッドが含まれる)のに xxx.Listener として定義されているインタフェースが出てくる事やイベントリスナの命名規則に当てはまらない(リスナインタフェースがOnXxxListenerでなくListenerで定義されてたり)ことから、ユーザ操作から生まれるAndroidフレームワークからの通知でも、リスナとイベントリスナを分けて定義しているようです。
  • イベントリスナ
    • Viewクラスのインタフェースとして定義されている
  • リスナ
    • Viewクラス以外のインタフェースとして定義されている
まだAndroidはやり始めなので、今後意識して見ていればこの辺りの定義はもう少し詰められるかも知れないです。

まとめ

  • イベントリスナ
    • ユーザ操作により発生する通知
    • Viewクラスのインタフェース
    • 1インタフェースに1つのコールバックメソッド
    • 命名規則がある(ぽい)
    • インタフェース OnXxxListener
    • コールバックメソッド onXxx()
    • リスナ設定メソッド setOnXxxListener
  • リスナ
    • ユーザ操作により発生する通知
    • Viewクラスのインタフェースではない
    • 1インタフェースに1〜複数のコールバックメソッド
  • コールバック
    • 基本的には内部処理結果の通知

という感じでしょうか。

自分で作るとしたら、
  • UI系コントロールを拡張する時、根本部分ならイベントリスナ
  • UI系コントロールを拡張する時、下位コントロール限定ならリスナ
  • 内部処理ならコールバック  

として実装すると何となくAndroidに合う気がします。。

最後に

KeyEvent.Callbackに関してはなぜリスナでなくコールバックとして実装されているのかまだピンと来ていません。View系クラス以外でも使えるようにと考えたとしても、Listenerという名前で定義してくれた方がスッキリするんだけどな、と思うのは

・コールバックを内部処理で使う
・リスナをUIイベント系で使う

と習慣づいてしまっているからかも知れません。
コールバックの仕組みをデザインパターンに落としたものにObserverパターンというものがありますが、リスナ系にしてもコールバックにしても仕組み自体は同じものなので今回省いてます。

2014年7月4日金曜日

その9 - 「Javaプログラマ Silver SE7」

photo credit: Bobbi Newman via photopin cc



概要

以前紹介した「Java言語プログラミングレッスン 上/下」の二冊はJavaの大枠がかなり丁寧に記載されていると思いますが、今回紹介する書籍「Javaプログラマ Silver SE7」はその比ではありません。


やはり資格試験の参考書&問題集という位置づけなだけありかなり詳細な箇所まで記載されています。
この問題集をやる前にもっとふんわりしたJavaの本しか勉強してなかったら恐ろしい事になっていたかも…と思ってホッとした覚えがあります。
しかも、試しに問題をいくつかやってみると「あれ問題が分かりにくい…」とか「継承のポリモフィズムの問題だと思ったのにシグニチャの問題!?」というようなもひっかけ問題が多々あります。
しかしそれはしょうがないのです。
実際の試験もそうだからです。
この書籍は実際の試験問題の類似問題がかなりの数記載されています。繰り返しこの書籍で勉強する事で実際の試験問題の問題文や問題コード、解答文に慣れる事ができると思います。

この書籍で出せた正答率程度は実試験でも取得する事ができると思います。私の場合もこの書籍での正答率96〜98%で実試験95%、同僚も概ね同じような感じでした。
書籍での正答率 ≒ 実試験正答率
ぜひ繰り返し問題をこなしてみてください。

ポイント

最初に

まずは書籍の正誤表サイトの確認です。
せっかく勉強するのに間違いを覚えてしまってもしょうがないですから、勉強する前に上記サイトで内容を確認しましょう。

期間

私の場合は忘れっぽい&急ぎで資格を取得する必要があった、という2点からこの書籍を購入して10日で受験しました。
体力的にかなり辛かったです。

もちろん、すでにJavaを業務で使用するなりして精通されている場合は「試験問題に慣れる」事をメインにすれば短期間での受験が可能だと思います。
そうでない方で急ぐ理由が対外的なところにない方は、繰り返しこなした方がいいと思います。
あと試験に関してですが、オンラインでいつでも予約可能です。
登録が少し面倒なのと、試験予約ではかなり席が埋まっているので3日以上前には試験予約を済ませておいた方がいいと思います。
 

検証コードを書く

各ポイントでの検証コードなのでとても小さなものになると思いますが、その詳細部分が試験では問われます。
少しでも疑問に思ったらプチコードを書いてみてください。

意識するところ

実試験でもこの書籍をこなす上で同様のポイントに気を付けなければいけません。
  • 変数の宣言、初期化、初期値代入
  • オブジェクト指向関連
  • 例外(文法だけでなく例外クラスも)
  • 問題コードを素早く読んで理解する
「Java言語プログラミングレッスン」で学んだ基本をふまえ、それよりも深い部分まで問われたりします。
問題をこなすうちに問題文の癖のような部分には慣れるとおもいますので、基本部分を深めるためにもやはり検証コードを書くことは外せないと思います。
 

最後に

私はケアレスミスをしてしまうタイプなので元々100%は厳しいですが、この試験で100%とか本当に凄いと思います。
ですがJavaの勉強を始めた時からそこを意識して、基本をしっかり押さえ深く掘り下げ、コードを読み慣れれば達成できない事はないとも思います。
ぜひJavaの知識を深め100%目指してみてください。

2014年7月1日火曜日

その8 - 「Javaプログラミングレッスン 下」のまとめ




下巻まとめ

下巻も終わりJavaをひと通りこなしたところでまとめておきます。

期間

下巻は3週間くらいで書籍の通し、プラス数個のプログラム作成までこなしてしまいましょう。
もちろんプログラム自体が初めての方はもっと時間をかけるのもOKです。

理解

文法の暗記が少ないだけに、「こう書くとこう動く」という部分が増えてくると思います。
そこは上巻から引き続きコードを書いて動作をしっかり把握しておいてください。 

使いこなす

下巻は基本部分よりもそれを使用した部分(スレッド、ファイル) や広げた部分(コレクションなど)が多いので、上巻より最初に暗記する部分が少ないです。その分バリバリとプログラムを作成して「慣れる」から「使いこなす」にステップアップしたのが感じられると思います。
どんどん色々な種類のプログラムを作成してJavaでのプログラム作成に慣れていきましょう。

予告

次回はJavaの資格取得の参考書、JavaプログラマSilver SE7を紹介したいと思います。

2014年6月30日月曜日

その7 - 「Javaプログラミングレッスン 下」の進め方

photo credit: Marwa Morgan via photopin cc



進め方

この書籍の進め方は今までと同じ流れでかまいません。
まずは新たに出てくる概念であるクラスや継承、インタフェース、ポリモフィズムなどのオブジェクト指向部分や例外の基本をしっかり押さえてください。
スレッドやファイルはJavaの資格試験では範囲外になっていると思いますが、そこも含めてひと通り終えてしまいましょう。

プログラムを作る

スレッドやファイルなど資格試験範囲外の部分もひと通り終えると記載しましたが、その理由がまさに「プログラムを作る」為になります。
書籍に記載されているスレッドやファイル操作を参考にできますし、その際にデータを保存する変数にコレクションを使用してみたりそこからファイルに保存してみたり。
書籍には記載されてないですが、HTTP通信を作成して任意のサイトから画像をダウンロードして保存(通信とファイル操作)、そしてそれを複数スレッドで行う(マルチスレッド)など思いつくままに作ってみるのです。

作る際に注意したい事

1から作る

ポイントは1から自分で作る、という事です。
書籍を丸写ししていると結局自分はどこが弱いのか、が分からないままになってしまいますので、ぜひ1から書いてみてください。
分からなくなった時やシグニチャを忘れた時などはもちろん書籍を参照したり、リファレンスを参照したりしてください。
そういう進め方で作成していればどんどん何も見ずにプログラムを書けるようになるはずです。 

パーツ単位で作る

最初はパーツ単位でいいと思います。
まずは通信するプログラムを作る。
次にデータ(通信で取得したデータ形式)を保存するプログラムを作る。
最後にそれを合体させる。
それぞれにmain()メソッドが存在する独立したプログラムとして作成したものを後から合体させる事で、キャパを超えた設計で悩む時間を減らす事ができ、単体ごとに繰り返しトライアンドエラーを繰り返す事でエラー発生箇所の見極めを容易にし、品質向上にも繋がり易くなります。 

タイミング

書籍に記載されているコードを実際に入力して動かすことは都度行ったほうがいいですが、プログラムを作成してみるタイミングはどこでも構いません。
継承を終えた段階で継承を使用したプログラムの作成もいいですし、スレッドが終わった段階で継承とスレッドを使用したプログラムの作成でもかまいません。
ぜひ複数の要素を取り入れたプログラムの作成をしてみてください。
そうやってプログラムを作成していくにつれ、あやふやな記憶が繰り返し思い出され使用されることで確固たる記憶に変化し、記憶していた知識への本当の理解が進むことになると思います。

予告

次回は下巻のまとめにしたいと思います。

2014年6月29日日曜日

オブジェクト指向のこころ

中古で高値で買ってしまったんですけど…

人気書籍で中古市場で値が高騰していた「オブジェクト指向のこころ」が3月より再販されています。

歯がギリギリ言うくらい悔しいですが確かにいい書籍だったので紹介したいと思います。

概要

本書はまずなぜオブジェクト指向プログラミングが必要なのかを説明してくれます。
システムには変更が発生する → だから凝集度を高く、結合度を低くしておく
凝集度、結合度はクラス設計を行う際に必要な概念で、これを理解しているかしていないかでクラス設計時に「このフィールドをどこに追加するべきか…」「このメソッドを…」という判断がつけやすくなります。
このようにオブジェクト指向の必要性をまずはざっと再確認します。
次にクラス図の記載に使用するUMLの再確認。
そして問題のあるシステムの紹介。
オブジェクト指向を適用してその問題を解決する方法など。
そして本題のデザインパターンです。
紹介されているパターンは12程度ですが、Facade, Adapter, Strategy などの重要パターンを厳選して紹介しており、そのパターン採用に関する考察や適したシステムの紹介なども記載されています。
デザインパターンの合間にはオブジェクト指向に対して視野を広げる考え方や、エキスパートがどう設計するかの解説、などなどとても興味深い内容になっています。

感想

Javaでオブジェクト指向に初めて手を出した状態でデザインパターンどころかUMLすらふんわり程度しか知らない状態だったので、導入部分(1,2章)から正にジャストフィットな内容でした。
まずこの書籍の特筆すべき点は、「デザインパターンを事実に則した流れで解説している」というところです。
  1. 最初にとあるシステムの問題を定義します
  2. その解決策を考察します
  3. こういう形に作れば(直せば)解決すると判断します
  4. そして答えがでます
「その形ならあるじゃないかこのパターンが!
という一般的なデザインパターンの解説書の逆をいく流れです。
デザインパターンの書籍で多いのは、
「このパターンはこういう形だからこういう時に使う」
というまずはパターンありきの解説ですよね。
実際の仕事ではまずシステムの大枠や流れを考えるので当然この書籍のようなアプローチになりますから、 流れを逆にして考えなくていい、というのはとても大きい事だと思います。
自分が考える際の思考回路と同じ流れで読み進められますから。

とはいえ、デザインパターンの紹介部分ではこういう時に使う、という説明もちゃんとなされています。
上記のように仕事の流れに添って解説している部分は実際のシステムの問題を解決していくくだりで採用されている手法です。

そしてそれだけではなく、著者がシステムをいくつも作成する上で得た、
  • こういう時はこう考える
というようなノウハウも記載されています。
つまりまるで経験豊富な先輩から(事実著者はそうだと思いますが)実例を交えてオブジェクト指向や設計、デザインパターンに関しての考察やノウハウ、重要性や注意事項を順を追って教えて貰っているような気持ちになります
全編に渡ってコード例が記載されている類の書籍ではなく、あくまで「なぜこうなのか」「なぜこうするのか」「なぜこれが必要なのか」という概念を理解するという立ち位置の書籍です。
とはいえ、必要箇所ではコード例もありますし、クラス図も記載されていますのであまりに情報が不十分で何が書かれているか分からない…という事にはなりませんでした。
ただ実際業務でのシステム例が出てきたりしますので、開発者経験のある方じゃないと少し難しいかも知れないですね。
個人的にはオブジェクト指向を説明する時に車クラスだなんだと変な喩えをされる方が分かりにくいので、実際の例に基づいたこの書籍はかなり理解が進んだと思います。

その6 - 「Javaプログラミングレッスン 下」のポイント

photo credit: martinak15 via photopin cc



「Javaプログラミングレッスン 下」のポイント

下巻で特にしっかり押さえるポイントについて書きたいと思います。

目次


上巻からの続きなので11章からのスタートです。
第11章 : クラスとインスタンス
  • オブジェクト指向の中心的な概念であるクラスとインスタンスについて学びましょう
第12章 : スーパークラスとサブクラス
  • クラスを拡張する方法や、「継承」について学びます
第13章 : 例外
  • Java言語のエラー処理である「例外」について学びます
第14章 : インタフェース
  • Java言語に疑似的な「多重継承」を行わせるインタフェースと、クラス間の関係について学びます
第15章 : ガーベッジコレクション
  • メモリの管理の詳細について、また使われなくなったメモリの回収・冷静処理であるガーベッジコレクションについて学びます
第16章 : スレッド
  • 複数のスレッドを動かす「マルチスレッドプログラミング」の基礎を学びます
第17章 : パッケージ
  • クラスを分類し、名前空間を分ける「パッケージ」の使い方と作り方を学びます
第18章 : ファイル操作と入出力、クラスの調べ方
  • クラスライブラリの使い方の例として、ファイルを読み書きしたり、削除したりするプログラミングを練習します
第19章 : コレクション
  • 多くのインスタンスを管理するコレクションについて学びます
オブジェクト指向、例外の部分が上巻になかった言語として新たに出てきた箇所です。
その他はスレッドやファイル操作とJavaAPIを使用してのプログラミングに関してになります。
ちなみにスレッドやファイル操作はプログラマとして必須だと思いますが、Javaの試験(Oracle Certified Java Programmer Silver SE 7)では範囲外となっていて、Goldの方で出てきます。

下巻のポイント

上巻と同じくひと通り理解して身に付けないといけないですが、特に気をつけるポイントを。
  • オブジェクト指向
  • 例外
  • Java SE 7 で追加された機能
以降それぞれを解説します。


オブジェクト指向

11, 12, 14章の部分です。
継承、インタフェース、is a と has a の違い、ポリモフィズムなどなど、オブジェクト指向部分の基礎をしっかりと押さえる事が大事です。
ここを乗り切るとJavaコードを読むのがかなり楽になるのではないでしょうか。
コードを書いてみたり、他人のコードやJavaAPIのコードを読んだりしてオブジェクト指向のコードに慣れ親しんでください。

例外

Javaのエラー処理の部分です。
例外処理の文法やその動き以外の部分も押さえておきます。
メソッドが例外を投げる時そのメソッドをオーバーライドしたメソッドではどう記載するか(throws宣言する例外は元と同じかそのサブクラス、RuntimeExceptionやそのサブクラスは元がthrows宣言してようがしていまいがthrows宣言できる、元がthrows宣言をしていてもオーバーライドした方はthrows宣言しなくてもいい、など)や、
チェックされる例外とチェックされない例外の意味とその実際のクラス(FileNotFoundException, ArrayIndexOutOfBoundsException, などの例外やエラー系のクラス)を例外のクラス階層を踏まえた上で確認したりになります。

Java SE 7 で追加された機能

本書P.371から「Project Coin」としてまとめられていますのでひと通り把握しておく必要があります。

予告

次回は本書を使用しての勉強の進め方を記載したいと思います。

2014年6月27日金曜日

その5 - 「Javaプログラミングレッスン 上」のまとめ


上巻まとめ

下巻に移る前に上巻でのポイントをまとめておきます。

期間

上巻は2週間くらいでざっとこなしてしまいましょう。
プログラム自体が初めての方はもっと時間をかけてもいいと思います。

ただ、プログラミングの基本部分が多いだけに暗記箇所が多く、暗記の危険なところは飽きて嫌になってしまうところです。そうならないようになるべく短期間で仕上げるのがコツです。

そして飽きを防止する為にも書籍をなぞってコードを書くだけでなく、各所で何か作ってみてください。
しっかりコードを書きながら進めたのなら一巡するだけでいいと思います。
何か忘れてしまった時は都度参照してあやふやなまま放置しなければ大丈夫です。

理解

先にも書きましたが、上巻はプログラミングの基本部分が大半です。つまり他のプログラム言語でも応用の効く基本知識が多いので、万が一Javaが合わなくても他言語で使い回しが効きやすい知識になると思います。

ですので丸暗記するだけでなく「なぜこれが必要なのか」「なぜこういう手順なのか」などしっかり理解しておくといいと思います。

使いこなす

理解するだけでなく使いこなすのが重要です。
そして慣れ親しむことです。
上巻の知識だけでも色々な種類のプログラムが作れると思います。
小さくて構わないので、そらでプログラムが書けるようになるくらいJavaに慣れて使いこなしましょう。

予告

次回は「Javaプログラミングレッスン 下」に進みたいと思います。