`
lujl1988
  • 浏览: 13238 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android函数重构(MVC)

阅读更多
原來的程式片段是這樣的
1  @Override 2  public void onCreate(Bundle savedInstanceState) { 3      super.onCreate(savedInstanceState); 4      setContentView(R.layout.main); 5            6      //Listen for button clicks 7      Button button = (Button) findViewById(R.id.submit); 8      button.setOnClickListener(calcBMI); 9  }上面的程式片段中,包含了所有 Android 程式共用的標準內容, 整個程式的大致架構在前面章節中已經講解過,現在我們從中取出我們感興趣的部分來討論:
Button button = (Button) findViewById(R.id.submit); button.setOnClickListener(calcBMI);在第7行我們看到一段程式碼來宣告按鈕物件,與針對該按鈕物件作動作的程式碼。 button.setOnClickListener 程式碼的意義是指定一個函式,來負責處理"按下"這個"按鈕"後的動作。
我們可以想像,在同一個畫面中,多加入一些按鈕與欄位後,"onCreate" 這段程式將變得壅腫,我們來試著先對此稍作修改:
首先,我們可以套用 MVC 模式,將宣告介面元件(按鈕、數字欄位)、指定負責函式等動作抽取出來,將 onCreate 函式改寫如下
@Override public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);     setContentView(R.layout.main);     findViews();     setListeners();  }接著我們將宣告介面元件的部份寫成一個獨立的「findViews」函式:
private Button calcbutton; private EditText fieldheight; private EditText fieldweight;  private void findViews() {     calcbutton = (Button) findViewById(R.id.submit);     fieldheight = (EditText) findViewById(R.id.height);     fieldweight = (EditText) findViewById(R.id.weight); }順便將原本很沒個性的按鈕識別參數「button」改名成「calcbutton」,以後在程式中一看到「calcbutton」,就知道是一個按下後將開始處理計算工作的按鈕。
同樣地,我們也將指定特定動作(按按鈕)的負責函式獨立出來:
//Listen for button clicks private void setListeners() {     calcbutton.setOnClickListener(calcBMI); }如此一來,我們就將程式邏輯與介面元件的宣告分離開來,達成我們重構的目的。
完整程式如下:
package com.demo.android.bmi;  import java.text.DecimalFormat;  import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView;  public class Bmi extends Activity {     /** Called when the activity is first created. */     @Override     public void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.main);         findViews();         setListeners();     }      private Button button_calc;     private EditText field_height;     private EditText field_weight;     private TextView view_result;     private TextView view_suggest;      private void findViews()     {         button_calc = (Button) findViewById(R.id.submit);         field_height = (EditText) findViewById(R.id.height);         field_weight = (EditText) findViewById(R.id.weight);         view_result = (TextView) findViewById(R.id.result);         view_suggest = (TextView) findViewById(R.id.suggest);     }      //Listen for button clicks     private void setListeners() {         button_calc.setOnClickListener(calcBMI);     }      private Button.OnClickListener calcBMI = new Button.OnClickListener()     {         public void onClick(View v)         {             DecimalFormat nf = new DecimalFormat("0.0");             double height = Double.parseDouble(field_height.getText().toString())/100;             double weight = Double.parseDouble(field_weight.getText().toString());             double BMI = weight / (height * height);                          //Present result              view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));               //Give health advice              if(BMI>25){                 view_suggest.setText(R.string.advice_heavy);             }else if(BMI<20){                 view_suggest.setText(R.string.advice_light);             }else{                 view_suggest.setText(R.string.advice_average);             }         }     }; }同樣是「calcBMI」 函式,在完整程式中,改將「calcBMI」 函式從原本的「OnClickListener」宣告成 「Button.OnClickListener」。這個改變有什麼差別呢?
閱讀原本的程式碼,在匯入(import)的部分可以看到,「OnClickListener」是來自於「android.view.View.OnClickListener」函式:
    import android.view.View.OnClickListener;改成 「Button.OnClickListener」後,「Button.OnClickListener」就變成來自於「android.widget.Button」中的「OnClickListener」函式,在查閱程式時,整個「Button」與「OnClickListener」之間的關係變得更清晰。
另外,我們偷偷將「OnClickListener」中其他會存取到的介面元件識別參數,也補進 findViews 宣告中:
private void findViews() {     button_calc = (Button) findViewById(R.id.submit);     field_height = (EditText) findViewById(R.id.height);     field_weight = (EditText) findViewById(R.id.weight);     view_result = (TextView) findViewById(R.id.result);     view_suggest = (TextView) findViewById(R.id.suggest); }同時,我們也把識別參數的命名方法做了統一:按鈕的識別參數前加上 「button_」前綴,可輸入欄位的識別參數前加上 「field_」前綴,用作顯示的識別參數前則加上「view_」前綴。將變數名稱的命名方法統一有什麼好處呢? 好處在於以後不管是在命名新變數,或是閱讀程式碼時,都能以更快速度命名或理解變數的意義,讓程式變得更好讀。
我們也把原本在程式中直接寫進的字串
TextView result = (TextView) findViewById(R.id.result); result.setText("Your BMI is "+nf.format(BMI));改寫成
//Present result view_result.setText(getText(R.string.bmi_result) + nf.format(BMI));
分享到:
评论

相关推荐

    MVC++环境2005-2017全部一键安装包x86 x64

    MVC++ 2012伴随着Visual Studio 2012一同到来,带来了更全面的C++11支持,包括初始izers列表、统一的构造函数和更多模板的改进。这一版本还优化了调试体验,特别是对异步编程的支持,使得开发者可以更容易地调试异步...

    Android用户界面

    它使用队列来处理这些外部动作,每个动作作为一个独立的事件加入队列,Android用户界面框架根据“先进先出”原则处理这些事件,并将它们分发给相应的事件处理函数。 ##### 2. 视图(View) - **基本概念**:视图是...

    新版Android开发教程.rar

    � MVC 和 Web APP 架构 Android Android Android Android 开发背景 � 计算技术、无线接入技术的发展,使嵌入式系统逐渐有能力对桌面系统常规业务进行支持。 � 谷歌长期以来奉行的移动发展战略:通过与全球各地的...

    libraryofalexandria:展示如何重构遗留代码的示例 android 项目

    《亚历山大图书馆:Android 重构遗留代码实践指南》 在软件开发过程中,尤其是在维护老项目时,我们经常会遇到“遗留代码”。这些代码可能是由于历史原因、技术债务或者早期设计决策导致的,它们可能难以理解和修改...

    android投票程序Poll代码.rar

    10. **版本控制与重构**:考虑到代码的组织和团队协作,项目可能使用了Git进行版本控制,并遵循一定的编程规范和设计模式,如MVC(Model-View-Controller)或MVVM(Model-View-ViewModel),以实现代码的模块化和...

    安卓手机计算器

    - 良好的软件设计原则,如MVC(Model-View-Controller)或MVVM(Model-View-ViewModel),可能被用于组织代码结构,使代码易于维护和扩展。 7. **版本控制**: - 开源项目通常会使用版本控制系统,如Git,来管理...

    Professional Visual Studio 2017代码

    - **MVC和Web API**:用于构建分离关注点的Web应用,支持RESTful服务。 - **Razor视图**:模板引擎,简化HTML和C#代码的混合编写。 5. **移动和云计算开发** - **Azure集成**:无缝集成微软Azure云服务,如Blob...

    猿圈APP(个人模仿版)

    高质量代码意味着良好的编程规范,如遵循命名规则,使用简洁明了的变量和函数名,以及避免冗余和重复的代码。它还涉及到代码的可读性和可维护性,这通常通过详尽的注释来实现。在这款APP中,开发者显然重视代码的...

    Google_Maps_API_V3.docx

    首先,谷歌地图API V3支持多种浏览器和设备,包括Chrome、iPhone上的Safari以及Android手机。这意味着开发者可以创建跨平台的应用程序,让更多的用户能够享受到一致的体验。不再需要API keys是V3的一个显著改变,这...

    C++ GUI Qt5编程实战-源代码

    1. **模块化**:Qt5对库进行了模块化重构,开发者可以根据需求选择加载必要的模块,减少应用体积。 2. **QML**:Qt Quick 2引入了QML,这是一种声明式的UI设计语言,使得创建动态和复杂的用户界面变得更加直观。 3. ...

    wolf-mansion:我想用Kotlin取代WOLF MANSION

    2. **设计架构**:确定如何使用Kotlin重构现有系统,比如使用MVC(模型-视图-控制器)或MVVM(模型-视图-ViewModel)等架构模式。 3. **前端接口**:如果存在前端HTML,需要考虑如何与后端Kotlin接口通信,可能使用...

    Projemanag

    - 使用IDEA(IntelliJ IDEA)或Android Studio,它们内置了对Kotlin的优秀支持,包括代码提示、格式化和重构工具。 6. **版本控制**: 项目可能使用Git进行版本控制,通过提交历史查看代码变更,利用分支管理不同...

    java面试题及答案-非常全面(包括基础、网络、数据结构、算法及IT大厂面经)

    ### 动态可重构穿戴式计算机系统实现(C++) - **特点**:适应不同的应用场景。 - **实现技术**:面向对象编程、模块化设计等。 ### 无线充电传感器网络点播式充电调度算法设计实现 - **技术背景**:物联网技术的...

Global site tag (gtag.js) - Google Analytics