Androud 如何有效減少重復代碼

前言


? ? ? ?重復的代碼一直都是可維護性的大敵,重構的重要任務之一也就是要去除掉重復的代碼,有效的減少重復代碼,可以大大提高軟件的擴展性。

? ? ? ?在Android開發中,很容易產生重復的代碼。因為Android是組件,模板式開發,每個頁面都是獨立用Activity或Fragment實現,布局文件都是用XML方式去寫,所以很容易造成代碼的重復,雖然二個頁長的差不多,但畢竟是二個Activity,于是就拷一份出來,改吧改吧就成了。

? ? ? ?那么我們如何做才能去掉重復的代碼呢?

一、使用include標簽引用重復布局

二、使用style定義樣式

三、使用ViewStub減少整體布局的重復

四、多使用應用資源

五、代碼的抽象與繼承

六、總結


一、使用include標簽引用重復布局


? ? ? ?標簽是減少布局重復的利器,它的作用是把另外一個布局文件全部無修改式的嵌入到標簽所在的位置。這與C/C++語言的預處理指令#include是一樣的。在WEB框架式開發中,也非常常用HTML模板,其中也有類似的include。目的也是減少代碼的重復。

? ? ? ?要想把include用的恰到好處,首先要做的就是把整體布局模塊化,從整體的布局出發,找出可復用的局部布局或布局組合,把它們放入單獨一個布局文件中,然后在其他的地方就可以include了。

例如:

test.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"   android:orientation="vertical">  <Button   android:layout_width="match_parent"  android:layout_height="wrap_content"  android:textSize="16dp"  android:gravity="center"  android:layout_marginTop="5dp"  android:layout_marginBottom="5dp"  android:text="1"  />  <View   android:layout_width="match_parent"  android:layout_height="0.5dp"  android:background="#BFBFBF"/>  <Button   android:layout_width="match_parent"  android:layout_height="wrap_content"  android:textSize="16dp"  android:gravity="center"  android:layout_marginTop="5dp"  android:layout_marginBottom="5dp"  android:text="2"  />  <View   android:layout_width="match_parent"  android:layout_height="0.5dp"  android:background="#BFBFBF"/>  <Button   android:layout_width="match_parent"  android:layout_height="wrap_content"  android:textSize="16dp"  android:gravity="center"  android:layout_marginTop="5dp"  android:layout_marginBottom="5dp"  android:text="3"   />  </LinearLayout>

? ? ? ?這段布局是我們正常情況下的寫法,從布局中我們可以看出View標簽代碼是一樣的,那么我們就可以把View單獨寫在一個xml文件里,然后用include標簽引用它即可。

簡化后的布局代碼如下:

test_1.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="16dp"android:gravity="center"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:text="1"  /><include layout="@layout/divider_view"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="16dp"android:gravity="center"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:text="2"  /><include layout="@layout/divider_view"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:textSize="16dp"android:gravity="center"android:layout_marginTop="5dp"android:layout_marginBottom="5dp"android:text="3"  />
</LinearLayout>

 
divider_view.xml 

<?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="0.5dp"android:background="#BFBFBF"></View> 

? ? ? ?怎么樣,是不是比原來的布局代碼簡潔直觀多了,而且實現出來的效果也一樣。當然這是單個View重復,那么多個View組重復也是一樣的。

? ? ? ?使用include標簽還有一個好處,就比如你要修改View的樣式,在未使用include之前,你需要把test.xml中的所有View都要修改一遍,但是使用include之后,你只需要修改divider_view.xml中的View即可。


二、使用style定義樣式


? ? ? ?在我們開發應用的過程中,會有很多控件的樣式是一樣的,我們一般會用復制-粘貼來使用,這樣就會有大量重復代碼出現,而且如果我們某一天要修改該控件的樣式了,那我們需要找到所有這些控件,一個一個的修改樣式,但是我們如果使用style來定義樣式的話,不僅會減少大量重復代碼,而且修改樣式也變的非常靈活。

? ? ? ?就比如test_1.xml布局文件中有三個Button控件,只有text內容不同,那么我們如何把Button的共同點提取到style中呢?很簡單,在styles.xml下 新增一對<style>標簽,為該style命名,如命名為DemoBtn,然后在<style>標簽內 使用<item>標簽來存放控件的屬性,例如 android:layout_width="match_parent" ? ? ,用<item>來表示就是 <item name="android:layout_width">match_parent</item>,name是控件的屬性名,標簽之間則是屬性值

按照這樣的方法,把所有共同屬性都添加到DemoBtn這一style中即可。

<style name="DemoBtn">  <item name="android:layout_width">match_parent</item>  <item name="android:layout_height">wrap_content</item>  <item name="android:textSize">16dp</item>  <item name="android:gravity">center</item>  <item name="android:layout_marginTop">5dp</item>  <item name="android:layout_marginBottom">5dp</item>  
</style>

? ? ? ?最后回到布局中,把三個Button的共同屬性全都刪除掉,換為 style ="@style/DemoBtn" ? ,就能達到原來的效果,1行代碼代替6行代碼,代碼現在更加美觀了。

test_2.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"   android:orientation="vertical">  <Button   style="@style/DemoBtn"  android:text="1"    />  <include layout="@layout/divider_view"/>  <Button   style="@style/DemoBtn"  android:text="2"   />  <include layout="@layout/divider_view"/>  <Button   style="@style/DemoBtn"  android:text="3"   />  </LinearLayout>

? ? ? ?經過include標簽引用和style樣式提取,在看我們的布局文件,是不是感覺很清爽了。而且需要修改樣式的話,只需要在style中修改就可以了。


三、使用ViewStub減少整體布局的重復


? ? ? ?前面是找出布局中的可復用布局組合,include以減少重復。但有些時候是反過來的,也就是說有幾個頁面,它們整體的一樣的,但是某個局部是不同的,這個時候include就不行了。這個時候就可以使用一樣的整體布局+ViewStub來做布局。

? ? ? ?ViewStub是一個輕量級別的,不可見的View,當ViewStub被設為visible時,或者顯示調用layout()時,才會去把它所指向的布局渲染出來,所以它非常適合處理整體相同,局部不同的情況。關于ViewStub的使用可以參考Android實戰技巧:ViewStub的應用。 具體的策略是:

  • 規劃整體布局,抽象出共同的布局,把可變的布局識別出來
  • 寫整體布局,對于可變的局部布局用ViewStub替代
  • 用一個基Fragment來操作整體布局。
  • 創建基Fragment的子類,每個子類,用真正的布局來替換ViewStub。


四、多使用應用資源


? ? ? ?這點是非常重要的,Android的強大之處在于,所有的資源的指定都可以用引用,而非直接寫死,直接寫死就會出現重復代碼,比如顏色,背影,字串,布局,ID,度量(dimen),風格等等。那么,我們在使用的時候,也盡可能的使用引用,這樣非常易于復用,修改和定制,從而也就更方便復用。


五、代碼的抽象與繼承


? ? ? ?從代碼上去除重復的代碼就是用通用的重構技巧,比如提煉方法,抽象基類,提煉常量等。


六、總結


? ? ? ?其實代碼的去重復的關鍵都在于要分析出可變與不可變,共性和特性,這是抽象與封裝的基礎。這個沒有直接可操作性的建議,只能靠自己平時多多積累,以及遇到問題時多多思考。

? ? ? ?另外,就是對于重復的定義是達到三次及三次以上。如果僅出現二次,并且,無可能出現別一次,這個時候其時,要不要去重復有在商榷,寫第二次時,花時間重構,與拷貝或重新實現,其實代碼差不多。當發現第三次實現某個東西時,就要考慮好好的重構一下,減少重復。

? ? ? ?還有,就是,在項目開始不要考慮的太多,不要過度設計。孤認為,不過度設計,更不要過早優化,就根據需求和進度和發展狀況綜合來看。當出現了重復,需要重構時就立馬去做,這樣就不會出問題。但如果沒能及時去做重構,欠了債,那么由于涉及代碼,功能和模塊都比較多時,再去重構,難度大,風險也大。就好比房屋的維護保養,當出現灰塵時就去打掃,很容易,個把小時就搞定了,但如果一直拖著,一年才打掃一次,可能要十天半個月才能完事。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446972.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446972.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決在sample文件夾里面寫代碼,在測試的時候因為virtual原因,make編譯報錯

代碼的結構 錯誤顯示 解決辦法 添加一句話&#xff0c;具體的cpp依據情況而定set_source_files_properties(${PROJECT_SOURCE_DIR}/src/sample_storage_test.cpp COMPILE_FLAGS "-Wno-unused-parameter")

Android SharedPreferences總結及優化

一、SharedPreferences簡介 Android 中的 SharedPreferences&#xff08;后續簡稱SP&#xff09;是輕量級的數據存儲方式&#xff0c;能夠保存簡單的數據類型&#xff0c;比如 String、int、boolean 值等。應用場合主要是數據比較少的配置信息。其內部是以 XML 結構保存在 /dat…

Java基礎——深入理解ReentrantLock

一、簡介在Java中通常實現鎖有兩種方式&#xff0c;一種是synchronized關鍵字&#xff0c;另一種是Lock。二者其實并沒有什么必然聯系&#xff0c;但是各有各的特點&#xff0c;在使用中可以進行取舍的使用。二、ReentrantLock與synchronized的比較相同點&#xff1a; &#xf…

使用開源的openssl的md5頭文件,實現對于文件的md5代碼

需要安裝openssl的庫 sudo apt-get install opensslsudo apt-get install libssl-dev參考鏈接 代碼 #include "openssl/md5.h" #include <iostream> #include <fstream> #include <iomanip>//#define MAX_DATA_BUFF 1024; //#define MD5_LENGTH…

Android 多進程開發

前言正常情況下&#xff0c;一個apk啟動后只會運行在一個進程中&#xff0c;其進程名為AndroidManifest.xml文件中指定的應用包名&#xff0c;所有的基本組件都會在這個進程中運行。但是如果需要將某些組件&#xff08;如Service、Activity等&#xff09;運行在單獨的進程中&am…

clion中鏈接openssl庫

錯誤顯示 前提條件 apt-get install opensslapt-get install openssl-dev 解決辦法 在CMakeLists.txt文件中加入如下命令link_libraries(crypto) 參考鏈接 無法將openssl庫鏈接到CLion C 程序c - 無法將openssl庫鏈接到CLion C程序

Java中String、StringBuffer、StringBuilder三者的區別

一、簡介String、StringBuffer、StringBuilder三個類之間的區別主要是在兩個方面&#xff1a;運行速度和線程安全。二、區別1、運行速度&#xff0c;或者說是執行速度在這方面運行速度快慢為&#xff1a;StringBuilder > StringBuffer > String StringString為字符串常量…

Ubuntu環境下,使用clion編譯器,使用開源opensll的對稱AES算法對于文件進行加密,C++代碼

前提準備條件 需要安裝openssl需要安裝openssl-dev需要配置CMakeLists.txt文件集體內容可以參考我提供的相關參考鏈接 AES_file.h #include <openssl/aes.h> #include <iostream> #include <fstream> #include <cstring>#define RELEASE_ARRAY(P) if…

Java提高篇 —— Java關鍵字之static的四種用法

一、前言 在java的關鍵字中&#xff0c;static和final是兩個我們必須掌握的關鍵字。不同于其他關鍵字&#xff0c;他們都有多種用法&#xff0c;而且在一定環境下使用&#xff0c;可以提高程序的運行性能&#xff0c;優化程序的結構。下面我們先來了解一下static關鍵字及其用法…

C++ 使用move來刪除用戶指定的文件

代碼 #include <iostream>bool remove_file(std::string path){if (remove(path.c_str())0){std::cout << "success!" << std::endl;}else{std::cout << "False!" << std::endl;} } int main() {std::string path "/…

Java提高篇 —— Java關鍵字之final的幾種用法

一、前言 在java的關鍵字中&#xff0c;static和final是兩個我們必須掌握的關鍵字。不同于其他關鍵字&#xff0c;他們都有多種用法&#xff0c;而且在一定環境下使用&#xff0c;可以提高程序的運行性能&#xff0c;優化程序的結構。下面我們來了解一下final關鍵字及其用法。 …

使用C++的方式實現AES算法

aes_file.h #include <iostream> #include <fstream> #include <bitset> #include <string> using namespace std; typedef bitset<8> byte; typedef bitset<32> word;const int Nr 10; // AES-128需要 10 輪加密 const int Nk 4; /…

Java提高篇 —— Java三大特性之封裝

一、封裝 封裝從字面上來理解就是包裝的意思&#xff0c;專業點就是信息隱藏&#xff0c;是指利用抽象數據類型將數據和基于數據的操作封裝在一起&#xff0c;使其構成一個不可分割的獨立實體&#xff0c;數據被保護在抽象數據類型的內部&#xff0c;盡可能地隱藏內部的細節&am…

sqlite3的backup和restore函數的使用

參考代碼 第一段這個親測可以使用 #include <sqlite3.h> #include <iostream> /* ** Perform an online backup of database pDb to the database file named ** by zFilename. This function copies 5 database pages from pDb to ** zFilename, then unlocks pD…

Java提高篇 —— Java三大特性之繼承

一、前言 在《Think in java》中有這樣一句話&#xff1a;復用代碼是Java眾多引人注目的功能之一。但要想成為極具革命性的語言&#xff0c;僅僅能夠復制代碼并對加以改變是不夠的&#xff0c;它還必須能夠做更多的事情。在這句話中最引人注目的是“復用代碼”,盡可能的復用代碼…

Java提高篇 —— Java三大特性之多態

一、前言 面向對象編程有三大特性&#xff1a;封裝、繼承、多態。 封裝&#xff1a;隱藏了類的內部實現機制&#xff0c;可以在不影響使用的情況下改變類的內部結構&#xff0c;同時也保護了數據。對外界而已它的內部細節是隱藏的&#xff0c;暴露給外界的只是它的訪問方法。 繼…

光盤刻錄制作Ubuntu等操作系統的啟動盤

前提條件 軟媒刻錄 空白光盤&#xff08;至少4.7G&#xff09;電腦&#xff08;最好使用外置的光驅&#xff09;系統鏡像&#xff08;ISO格式&#xff09; 具體操作 打開軟媒魔方選擇光盤刻錄按照標紅的進行選擇選擇鏡像->選擇或者拖拽都可以選擇刻錄機->如果使用外部刻…

Java提高篇 —— 抽象類與接口

一、前言 接口和內部類為我們提供了一種將接口與實現分離的更加結構化的方法。 抽象類與接口是java語言中對抽象概念進行定義的兩種機制&#xff0c;正是由于他們的存在才賦予java強大的面向對象的能力。他們兩者之間對抽象概念的支持有很大的相似&#xff0c;甚至可以互換&…

C++ const相關內容學習

const 作用 修飾變量&#xff0c;說明變量不可以被修改修飾指針&#xff0c;分為指向常量的指針&#xff08;pointer to const&#xff09;和自身是常量的指針&#xff08;常量指針&#xff0c;const pointer&#xff09;修飾引用&#xff0c;指向常量的引用&#xff08;refe…

Java提高篇 —— Java淺拷貝和深拷貝

一、前言 我們知道在Java中存在這個接口Cloneable&#xff0c;實現該接口的類都會具備被拷貝的能力&#xff0c;同時拷貝是在內存中進行&#xff0c;在性能方面比我們直接通過new生成對象來的快&#xff0c;特別是在大對象的生成上&#xff0c;使得性能的提升非常明顯。然而我們…