国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

為什么你的android代碼寫(xiě)得這么亂

瀏覽:90日期:2022-09-27 14:13:57

Android上絕大多數(shù)的代碼,都是由事件觸發(fā)的,或者說(shuō),幾乎所有代碼都是寫(xiě)在某個(gè)回調(diào)上的,比如onCreate, onPause, onClick,onBind等等,而這些回調(diào)函數(shù),全都是一個(gè)個(gè)的函數(shù),也就是說(shuō),是一個(gè)一個(gè)小的過(guò)程。

單個(gè)事件內(nèi)完成的功能

對(duì)于一些簡(jiǎn)單的情況,在某一個(gè)回調(diào)內(nèi)部就能完成的事件,大致上都是在回調(diào)中創(chuàng)建一個(gè)A類的對(duì)象,然后調(diào)用A類的某個(gè)方法,這個(gè)方法里面又用到了B類和C類的對(duì)象,經(jīng)過(guò)了一系列翻云覆雨的計(jì)算,我們最終得到了一些數(shù)據(jù),用TextView顯示了出來(lái),比如點(diǎn)擊一個(gè)按鈕彈出一個(gè)Toast顯示當(dāng)前軟件的版本號(hào)這樣的功能,只需要一個(gè)onClick就可以完成。所以我們可以粗暴的理解為,所有面向?qū)ο螅际腔谶^(guò)程的。因?yàn)橹挥幸幌盗袑?duì)象,按照某種特定的順序組織起來(lái),調(diào)用里面特定的方法,才能得出一個(gè)有意義的功能。這也解釋了為什么很多SDK,就給你個(gè)方法,告訴你,你什么都不用管,在Application的onCreate里面調(diào)一下這個(gè)方法就好了。

為什么你的android代碼寫(xiě)得這么亂理論上任何一個(gè)功能都可以用一個(gè)方法來(lái)完成多個(gè)事件配合完成的功能

再比如一些稍微復(fù)雜一點(diǎn)的功能,需要多個(gè)事件配合,比如計(jì)算器,當(dāng)用戶按下第一個(gè)數(shù)字的時(shí)候,觸發(fā)了onClick事件,你要把這個(gè)數(shù)字保存為activity的某個(gè)字段,接著,用戶按下了加號(hào)和第二個(gè)數(shù)字,你都要這樣保存起來(lái),以便于在最終用戶按下等號(hào)的時(shí)候,你能把以前的一系列輸入獲取到,以計(jì)算出一個(gè)結(jié)果。也就是說(shuō),當(dāng)一個(gè)功能需要多個(gè)事件配合完成的時(shí)候,我們做的事情就是把各個(gè)事件的最終結(jié)果從局部作用域提升為類的字段,即提升可見(jiàn)性。當(dāng)可見(jiàn)性不那么好提升的時(shí)候,垃圾代碼就出現(xiàn)了。比如這樣的代碼:

為什么你的android代碼寫(xiě)得這么亂五行缺Context

Context是非常常用的一個(gè)對(duì)象,無(wú)論是發(fā)廣播,還是啟動(dòng)activity,啟動(dòng)Service,獲取SharedPreferences,獲取資源等等,許多地方都需要用到context,加上Application對(duì)象一直存在,于是就想出了這么個(gè)辦法。

我并不反對(duì)通過(guò)提升可見(jiàn)性來(lái)實(shí)現(xiàn)多個(gè)事件之間的配合,比如計(jì)算器的例子,提升可見(jiàn)性就是一個(gè)簡(jiǎn)潔優(yōu)雅的解決方案。但是很多時(shí)候?yàn)榱颂嵘承┳侄蔚目梢?jiàn)性,將字段設(shè)置為靜態(tài)字段是沒(méi)有必要的,而且有可能造成內(nèi)存泄漏。

什么樣的代碼簡(jiǎn)潔清晰

我們之所以代碼寫(xiě)得那么難受,很多時(shí)候是因?yàn)榻o的接口不夠“多”,試想一下,如果SD卡的文件被改動(dòng)有回調(diào),手機(jī)位置發(fā)生變化有回調(diào),網(wǎng)絡(luò)狀態(tài)一變化就有回調(diào),這會(huì)讓很多功能實(shí)現(xiàn)起來(lái)變得非常簡(jiǎn)單。

為什么你的android代碼寫(xiě)得這么亂封裝必要的回調(diào)函數(shù)

什么事件需要寫(xiě)回調(diào)?通常是那些破壞代碼簡(jiǎn)潔的邏輯,比如耗時(shí)的操作,像網(wǎng)絡(luò)請(qǐng)求,大量計(jì)算,獲取地理位置等,或者一直在被監(jiān)聽(tīng)的事件,比如推送到本地的消息,文件被篡改、網(wǎng)絡(luò)狀態(tài)等。讓那些簡(jiǎn)單不耗時(shí)的操作,比如讀取文件,彈出Toast或者設(shè)置TextView分門(mén)別類的放在這些回調(diào)里面,讓人一目了然。

這些是無(wú)法用MVP,MVVM等架構(gòu)解決的,原因很簡(jiǎn)單,因?yàn)闊o(wú)論怎么分層,這些回調(diào)都是需要的,分層只是把這些回調(diào)放在不同的文件里面而已。軟件分層一方面是為了容易移植,另一方面是為了分離純Java的代碼,方便做單元測(cè)試。

回調(diào)是讓代碼簡(jiǎn)潔的方式之一,在我們實(shí)際編碼的過(guò)程當(dāng)中,在此前的基礎(chǔ)上,還可能會(huì)遇到下面這個(gè)非常常見(jiàn)的問(wèn)題。

臃腫的回調(diào)

無(wú)論我們?cè)覆辉敢猓覀兌际窃谝蕴畛涓鞣N事件的回調(diào)來(lái)編寫(xiě)android代碼的,這就導(dǎo)致一個(gè)問(wèn)題,當(dāng)業(yè)務(wù)邏輯越來(lái)越復(fù)雜的時(shí)候,我們就很有可能會(huì)在同一個(gè)回調(diào)中,編寫(xiě)多個(gè)毫不相關(guān)的任務(wù)的業(yè)務(wù)邏輯。

當(dāng)一個(gè)事件的回調(diào)中承載的事情越來(lái)越多,面向過(guò)程的思想就體現(xiàn)的越來(lái)越明顯。在實(shí)際編程的過(guò)程當(dāng)中,我偏向于同時(shí)具備面向?qū)ο蠛兔嫦蜻^(guò)程兩種思維方式,而不是簡(jiǎn)單粗暴的認(rèn)為:面向?qū)ο蟾哐牛嫦蜻^(guò)程低俗。它們的本質(zhì)是相同的,褪去多態(tài)的光環(huán),面向?qū)ο笾皇且环N將函數(shù)分門(mén)別類存放的一種建議。

如何解決回調(diào)過(guò)于臃腫的問(wèn)題?

優(yōu)先考慮將這個(gè)回調(diào)的事件細(xì)分。典型的就是AbsListView類的onTouchEvent,onTouchEvent里面的邏輯非常復(fù)雜,為了避免堆積在一起過(guò)于凌亂,onTouchEvent被分解成了onTouchDown,onTouchMove,onTouchUp以及onTouchCancel。這樣一大塊代碼就會(huì)被打散,交給更細(xì)致的回調(diào)來(lái)分擔(dān)。

為什么你的android代碼寫(xiě)得這么亂將onTouchEvent細(xì)分

如果某個(gè)事件的回調(diào)中執(zhí)行的業(yè)務(wù)邏輯,并不是一類(比如發(fā)送網(wǎng)絡(luò)請(qǐng)求刷新了一下ListView和讀取了一下配置文件),不像onTouchEvent這樣可以細(xì)分,那么問(wèn)題就會(huì)變得比較麻煩,因?yàn)槲覀冇檬录幕卣{(diào)來(lái)解決問(wèn)題的時(shí)候,我們真正想要的是回調(diào)函數(shù)執(zhí)行的時(shí)機(jī),比如onResume就在那個(gè)特定的時(shí)機(jī)會(huì)被調(diào)用,如果你需要的就是這個(gè)時(shí)機(jī),你就只能老老實(shí)實(shí)的在這里寫(xiě)代碼,別無(wú)他法。為了代碼簡(jiǎn)潔,我們能做的就是盡可能的將這個(gè)承擔(dān)了多個(gè)職責(zé)的回調(diào)寫(xiě)的足夠簡(jiǎn)單,最好是沒(méi)有循環(huán),沒(méi)有分支,就是幾個(gè)赤裸裸的函數(shù)放在哪里,讓人一目了然。

為什么你的android代碼寫(xiě)得這么亂回調(diào)只提供了一個(gè)處理問(wèn)題的時(shí)機(jī),很難保證單一職責(zé)

認(rèn)識(shí)到android軟件開(kāi)發(fā)是在各種各樣的回調(diào)上搭建一切功能,是編寫(xiě)代碼的第一步,是未來(lái)學(xué)習(xí)設(shè)計(jì)模式的基礎(chǔ)。

文/吳晨(簡(jiǎn)書(shū)作者)原文鏈接:http://www.jianshu.com/p/8182921fea87
標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 南华县| 阳西县| 安吉县| 探索| 台北县| 东兴市| 达尔| 新昌县| 临沂市| 长泰县| 高阳县| 舞阳县| 丽水市| 滦平县| 城步| 嵩明县| 丘北县| 林芝县| 华蓥市| 德州市| 河源市| 松原市| 得荣县| 大庆市| 武鸣县| 桐梓县| 屏东县| 普洱| 故城县| 通渭县| 车致| 敦煌市| 黄平县| 南康市| 重庆市| 松潘县| 太仆寺旗| 凉城县| 安西县| 安康市| 梨树县|