Closed izumin5210 closed 9 years ago
05f049d まででPIOまわり(Read除く)の置き換え完了.
手順はだいたい以下のとおり:
KonashiManager
内の実装をPromise化Storeを単純なgetter/setterだけの薄い実装にして,Dispatcherで変更を通知してあげる.DispatcherにはDoneCallback
を実装することでthen
に放り込むだけであとはいい感じになんとかなる.
Actionに関してはKonashiWriteCharacteristicAction
という抽象クラスを作ってあるので,それを継承してあげる.hasValidParams()
で値のバリデーション,setValue()
で値を変換してCharacteristicに渡してあげるところまでやる(INVALID_PARAMETER
なげるのとかはActionをexecuteするときにhasValidParams()
の結果見て勝手にやってくれる).
このペースで全部の処理をPromise化してたら100commits超えてもおかしくないので,ここから適当にブランチ切っていったほうがいいかもしれない.
よくよく考えると,ユーザからしたら`BluetoothGattCharacteristic
とか返されても困る
DoneFilter
噛ませてIntegerに変換とかしたほうが良さそう
テストぶっ壊れてるからなおす
Utilityまわりのリファクタしたかったけど,テスト書くのがあまりにも面倒だから保留. Androidに依存しない部分なので,Groovy・Spockを導入してみてもいいかもしれない.
79
WHY
設定系APIが不安定
Android由来かkonashi由来かは不明であるが,複数のタスクを間髪を入れずに実行しようとすると最初のタスク以外はすべて無視される. この影響で,現行SDK(α〜v0.5.0)のコールバックベースのAPIとkonashiの設定変更系の処理(
pinMode
,pwmPeriod
,etc.)が非常に相性が悪い(=> #8 #76 など).実装すべきコールバックメソッドが多い
konashiにある大量のAPIのほとんどにコールバックメソッドが用意されているため,それを実装するためのインタフェースも肥大化してしまっている(0.5.1時点で7つのインタフェースに分割されている).
クラス肥大化によりメンテナンスが困難
大量のAPIからのコールバックを捌くために超肥満体型Managerクラスが誕生しており,メンテナンスやテストを困難なものにしている(#36).
エラーがわかりにくい
あらゆるエラーのコールバックは全て同じメソッドに返るため,どの処理由来のエラーなのかがわからない(#69).
WHAT
Bletiaを導入することで, https://github.com/YUKAI/konashi-android-sdk/issues/76#issuecomment-132843538 で提案があったPromiseベースのAPIに変更する.
メリットとしては以下のようなものが挙げられる:
then
内で次の処理を呼ぶようにすればThread.sleep()
いれなくても良くなるfail
に返るのでハンドリングが楽Action
という概念があるAction
を継承させたクラスをBletia#excecute()
に渡してあげればあとはよしなにやってくれるreadCharacteristic
writeCharacteristic
readDescriptor
writeDescriptor
enableNotification
readRemoteRssi
Action
の実装に移譲できるKonashiManager
が痩せるHandlerThread
によるキューイングや接続・切断などありがちな処理はすべてBletia内に実装されているKonashiHandlerThread
,EventやCharacteristicのハンドリング用Enumなどのクラスは削除できるTODO
Konashi{,Base}Manager
Message
classes,KonashiMessageHandler
, Event classes ,KonashiCharacteristic
,KonashiNotifier
, etc.)[ ] Utility classes