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; 64UserDictionaryToolsList.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メンバ変数は不要だってことだよね。
最初はAndroidやJavaのソースコードの参考にと思って改造から入ったけど、これなら参考にはしつつもゼロから自分で書いた方がいいのかもしれない。
取り敢えずOpenWnnのRomkan.javaをコピーしてベル打ちが出来るようになったので、今やってるものはひとまずこれで終了してゼロから作ってみるかねぇ…。