ログ日記

作業ログと日記とメモ

OpenWnnを改造している

非常に読みにくい。
Javaをやり始めたところなので、自分のJavaの力がないのかソースの書き方がおかしいのかの判断がつかない。
しかし、ざっと眺めつつ読んでるんだけど、継承の使い方があまりよろしくないような。


例えば

  50 /**
  51  * The abstract class for user dictionary tool.
  52  *
  53  * @author Copyright (C) 2009, OMRON SOFTWARE CO., LTD.  All Rights Reserved.
  54  */
  55 public abstract class UserDictionaryToolsList extends Activity
  56     implements View.OnClickListener, OnTouchListener, OnFocusChangeListener {
  57 
  58     /** The class name of the user dictionary tool */
  59     protected String  mListViewName;
  60     /** The class name of the user dictionary editor */
  61     protected String  mEditViewName;
  62     /** The package name of the user dictionary editor */
  63     protected String  mPackageName;
  64 
UserDictionaryToolsList.javaのソース

ここのmListViewNameは一度も使われていない。また、下のmEditViewNameやmPackageNameはどこで代入されているんだろうという感じ。
まぁクラスがabstractなのでサブクラスで代入されているんだろうなと思ってソースを見る。

  24 /**
  25  * The user dictionary tool class for Japanese IME.
  26  *
  27  * @author Copyright (C) 2009 OMRON SOFTWARE CO., LTD.  All Rights Reserved.
  28  */
  29 public class UserDictionaryToolsListJAJP extends UserDictionaryToolsList {
  30     /**
  31      * Constructor
  32      */
  33     public UserDictionaryToolsListJAJP() {
  34         mListViewName = "jp.co.omronsoft.openwnn.JAJP.UserDictionaryToolsListJAJP";
  35         mEditViewName = "jp.co.omronsoft.openwnn.JAJP.UserDictionaryToolsEditJAJP";
  36         mPackageName  = "jp.co.omronsoft.openwnn";
  37     }
UserDictionaryToolsListJAJP.javaのソース

これらのメンバ変数は、サブクラスでは使われていない。
スーパークラスのprotectedな変数を直接代入している。こういう書き方するんだっけ?そもそもprotectedを使ったことがほとんどないのでピンとこない。



で、結局mEditViewNameなどはどこで使われているの?とソースを追う。

 500     /**
 501      * Add the word
 502      */
 503     public void wordAdd() {
 504         /** change to the edit window */
 505         screenTransition(Intent.ACTION_INSERT, mEditViewName);
 506     }

...

 574     /**
 575      * Processing the transition of screen
 576      *
 577      * @param  action       The string of action
 578      * @param  classname    The class name
 579      */
 580     private void screenTransition(String action, String classname) {
 581 
 582         if (action.equals("")) {
 583             mIntent = new Intent();
 584         } else {
 585             mIntent = new Intent(action);
 586         }
 587         mIntent.setClassName(mPackageName, classname);
 588         startActivity(mIntent);
 589         finish();
 590     }
UserDictionaryToolsList.javaのソース

この構造は… wordAdd で mEditViewName を実引数にしてメソッドを呼び出しているが、そもそもメンバ変数なんだから引数にする必要がないのでは?こう書いてあると、コードを追うときに実はmEditViewName以外の実引数で呼び出している箇所が他にあるんじゃないかと探さないといけない。で、実際にはmEditViewName = classname だった。


分かりやすくするにはどうすればいいんだろう。
このままの構造を使うなら、abstract String getEditViewClassName(); などを定義してサブクラスで文字列を返す処理を書けばいいのかな。で、screenTransitionの引数を減らしてscreenTransitionの中からgetEditViewClassNameを呼び出す。


あとaction.equals("")のチェックも気になる。
呼び出し側はIntent.ACTION_INSERTとかやるわけだから、nullや空文字じゃないことは保証されているんじゃないの?


で、今度は別のよく似た処理があるコード

 402     /**
 403      * Transit the new state
 404      */
 405     private void screenTransition() {
 406         finish();
 407 
 408         /* change to the word listing window */
 409         Intent intent = new Intent();
 410         intent.setClassName(mPackageName, mListViewName);
 411         startActivity(intent);
 412         
 413     }
UserDictionaryToolsEdit.javaのソース

さっきとまったく同じ処理が別の書き方で書いてある。
上の方のコードではintentがメンバ変数になっていたけれど、ここではローカル変数になっている。ということはmIntentメンバ変数は不要だってことだよね。




最初はAndroidJavaソースコードの参考にと思って改造から入ったけど、これなら参考にはしつつもゼロから自分で書いた方がいいのかもしれない。




取り敢えずOpenWnnのRomkan.javaをコピーしてベル打ちが出来るようになったので、今やってるものはひとまずこれで終了してゼロから作ってみるかねぇ…。