iT邦幫忙

2021 iThome 鐵人賽

DAY 14
0
Mobile Development

我的怨念齊天高 之「為什麼我的專案死掉了!」系列 第 14

每個專案的程式碼都該這樣開始

(今天這篇文章好雞肋阿!)

比起決定要不要使用最新觀念、最新套件,以下幾件事情務必要注意:

1.實作每個常用介面跟物件。
例如要實作一個OnClickListener——假設稱它為ProjectClick,然後每個要使用OnClickListener的地方就不要直接實作OnClickListener,改實作ProjectClick。

abstract class ProjectClick implements OnClickListener{
   void onClick(View v){
     click(v);
   }
   
   abstract click(View v);
}

這樣做的目的是...用個假設情境說明...「專案中途忽然希望:別鎖著畫面,但又不希望使用者連續點擊、連續啟動特定功能。這時候就可以修改ProjectClick,也只需要修改這一次,就可以讓所有Click都有『避開連續點擊』的效果。」

abstract class ProjectClick implements OnClickListener{
   long lastClick = System.currentTime();//是這個函數嗎?
   void onClick(View v){
     long thisClick = System.currentTime();
     if(thisClick - lastClick > 1000)
        click(v);
     lastClick = thisClick;
   }
   
   abstract click(View v);
}

同樣的原則也可以適用在各種Adapter、Activity、跟Fragment。

2.實作一套更新畫面的機制。
例如現在Activity提供了「runOnMainUI」這個方法,那就不要每次都實作一個Runnable,而是改用一個制式的Runnable實作,假設稱為UiRunner。


interface UiJob{
   void job();
}

static ArrayList<UiJob> JobList = ....

class UiRunner implements Runnable{
   void run(){
      for(UiJob job : JobList){
          job.job();
      }
      
      JobList.clear();
   }
}

然後將所有更新介面的動作都做成任務,放在佇列中讓這個Runner執行。(下面只用「更新TextView的動作」當範例。)

class TextJob implement UiJob{
   TextView text;
   String value;
   
   TextJob(TextView t, String v){
      text = t;
      value = v;
      JobList.add(this);
   }
   
   void job(){
      text.setText(value);
   }
}

未來,需要更新TextView時,只要執行TextJob的宣告即可。

  new TextJob(text, string);

(以此類推,也可以用來更新ImageView或ListView。)

為什麼要這樣做?
可以避免程式碼中出現一堆「Runnable」的匿名物件,更可以將程式碼的重用度提高。

(其實每個人都應該自己靠經驗去建立自己的原則。把自己的原則拿出來分享好像怪怪的。)


上一篇
各種無用的Guide與設計模式
下一篇
You can't always get what you want
系列文
我的怨念齊天高 之「為什麼我的專案死掉了!」20

尚未有邦友留言

立即登入留言