手把手教你設(shè)計(jì)滿足多個(gè)產(chǎn)品的功能庫(kù)

  • 關(guān)鍵字:通用、高效
  • Key Word:Universal发侵、Effective
  • 本文中提到的“高效”,不特指運(yùn)行時(shí)執(zhí)行效率高妆偏,偏向于開發(fā)階段時(shí)調(diào)用方便刃鳄。

一、設(shè)計(jì)目標(biāo)和主要突破點(diǎn)

設(shè)計(jì)目標(biāo)就是造輪子钱骂,但不是在別人造好輪子后的重復(fù)勞動(dòng)叔锐,而是把造好的輪子加工成自己的輪子,使其同時(shí)具備通用和高效的特點(diǎn)见秽。

從另一方面講愉烙,通用和高效常常是互相矛盾的兩個(gè)指標(biāo)。高效的往往是專用的解取,而通用的往往會(huì)犧牲效率步责,就像嬰兒爽身粉比普通爽身粉更適合涂在寶寶的皮膚上,而嬰兒爽身粉也只有涂在寶寶的皮膚上時(shí)才能充分體現(xiàn)它的優(yōu)勢(shì)一樣禀苦。誠(chéng)然蔓肯,想做出一款所有膚質(zhì)上效果都最優(yōu)的爽身粉難度很大,但我們的題目是“多個(gè)產(chǎn)品”振乏,不是“所有產(chǎn)品”∈『耍現(xiàn)在大廠的產(chǎn)品都是成系列的,比如螞蟻金服的產(chǎn)品如口碑外賣可以嵌套在支付寶內(nèi)也可以單獨(dú)成為一個(gè)產(chǎn)品昆码,再比如嵌套在美團(tuán)APP內(nèi)的美團(tuán)外賣也可以單獨(dú)成為一個(gè)產(chǎn)品气忠。能做出一款適合且僅適合指定系列產(chǎn)品的輪子邻储,是現(xiàn)階段的最佳選擇。

二旧噪、功能分析和關(guān)鍵拔高點(diǎn)

從設(shè)計(jì)目標(biāo)的選擇中我們可以發(fā)現(xiàn)吨娜,本文之所以能提高輪子的效率,本質(zhì)是因?yàn)閷?duì)其適用范圍做了調(diào)整淘钟,專注應(yīng)用場(chǎng)景中會(huì)出現(xiàn)的情況宦赠,摒棄實(shí)際開發(fā)中不會(huì)遇到的條件。所以米母,我們可以通過(guò)細(xì)化適用范圍的方式進(jìn)一步提高輪子的使用效率勾扭。

public static void sendBroadcast(Context context, String action, Bundle bundle) {
  Intent intent = new Intent();
  intent.setAction(action);
  intent.putExtras(bundle);
  context.sendBroadcast(intent);
}

以Android中發(fā)送普通廣播為例,影響該功能適用范圍的關(guān)鍵點(diǎn)在三個(gè)參數(shù)(context/action/bundle)上铁瞒。context確定了廣播發(fā)送者所在的進(jìn)程妙色,action確定了廣播接收者的過(guò)濾條件,bundle確定了廣播附帶的參數(shù)慧耍。發(fā)出廣播的context可以是Application也可以是Activity身辨,而整個(gè)項(xiàng)目所在的進(jìn)程是唯一確認(rèn)的,我們可以將項(xiàng)目中發(fā)送廣播的邏輯統(tǒng)一改成由Application作為context發(fā)出芍碧,這樣在發(fā)送廣播的地方就只需要關(guān)注兩個(gè)參數(shù)即可(context/action/bundle)煌珊,顯然需要關(guān)注的參數(shù)越少,項(xiàng)目開發(fā)階段出現(xiàn)問(wèn)題的概率就會(huì)越小泌豆。

public static void sendBroadcast(String action, Bundle bundle) {
  Intent intent = new Intent();
  intent.setAction(action);
  intent.putExtras(bundle);
  MyApplication.getInstance().sendBroadcast(intent);
}
  • 少年定庵,你還記得把context傳進(jìn)網(wǎng)絡(luò)模塊、傳進(jìn)數(shù)據(jù)模塊踪危、傳進(jìn)控制模塊洗贰,最后引發(fā)內(nèi)存泄漏的恐懼么?

當(dāng)然陨倡,我們可以繼續(xù)對(duì)參數(shù)的適用范圍進(jìn)行分級(jí)敛滋,如果廣播的action是根據(jù)頁(yè)面進(jìn)行劃分的,例如支付頁(yè)發(fā)出的廣播統(tǒng)一以ACTION_PAY為action兴革,那么我們?cè)诎l(fā)送支付相關(guān)的廣播時(shí)就可以進(jìn)一步節(jié)省一個(gè)參數(shù)(context/action/bundle)绎晃。不過(guò)從實(shí)際的代碼開發(fā)總結(jié)的經(jīng)驗(yàn)中可以發(fā)現(xiàn),將action作為統(tǒng)一參數(shù)進(jìn)行封裝的收益并不明顯杂曲,如果以實(shí)用價(jià)值高為標(biāo)準(zhǔn)的話庶艾,建議細(xì)分到context層即可。

public static void sendBroadcast(Bundle bundle) {
  Intent intent = new Intent();
  intent.setAction(ACTION_PAY);
  intent.putExtras(bundle);
  MyApplication.getInstance().sendBroadcast(intent);
}

三擎勘、代碼實(shí)現(xiàn)和最終得分點(diǎn)

上文以Android中發(fā)送普通廣播功能為例子提出了通過(guò)細(xì)化參數(shù)適用范圍來(lái)提高功能庫(kù)使用效率的技巧咱揍,但技巧始終只是技巧,沒(méi)有足夠扎實(shí)的功底終究是做不出完美的功能庫(kù)的棚饵∶喝梗基本功就靠大家積年累月的工作經(jīng)驗(yàn)吧掩完,以下是本文示例中涉及到的部分代碼。

public class MyApplication extends Application {

  private static Application instance = new Application();

  /**
   * 允許從Application中統(tǒng)一獲取context硼砰。
   */
  public static Application getInstance() {
    return instance;
  }
}

public class Tools {

  /**
   * 普通方式發(fā)送廣播且蓬,需要傳入三個(gè)參數(shù),當(dāng)需要從網(wǎng)絡(luò)模塊/數(shù)據(jù)模塊/控制模塊等context
   * 概念較弱的模塊中發(fā)出廣播時(shí)题翰,需要將context一路傳進(jìn)去恶阴,此時(shí)發(fā)生內(nèi)存泄漏的風(fēng)險(xiǎn)很大。
   */
  public static void sendBroadcast(Context context, String action, Bundle bundle) {
    Intent intent = new Intent();
    intent.setAction(action);
    intent.putExtras(bundle);
    context.sendBroadcast(intent);
  }
  
  /**
   * context統(tǒng)一從Application中獲取豹障,用完即釋放冯事,不用考慮內(nèi)存泄漏的問(wèn)題。
   */
  public static void sendBroadcast(String action, Bundle bundle) {
    Intent intent = new Intent();
    intent.setAction(action);
    intent.putExtras(bundle);
    MyApplication.getInstance().sendBroadcast(intent);
  }
}

public class PayActivity extends AppCompatActivity {

  private static String ACTION_PAY = "ACTION_PAY";
  
  /**
   * context和action都用統(tǒng)一的方式獲取血公,但應(yīng)用面太窄昵仅,按個(gè)人喜好可以嘗試,不推薦坞笙。
   */
  public static void sendBroadcast(Bundle bundle) {
    Intent intent = new Intent();
    intent.setAction(ACTION_PAY);
    intent.putExtras(bundle);
    MyApplication.getInstance().sendBroadcast(intent);
  }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岩饼,一起剝皮案震驚了整個(gè)濱河市荚虚,隨后出現(xiàn)的幾起案子薛夜,更是在濱河造成了極大的恐慌,老刑警劉巖版述,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梯澜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡渴析,警方通過(guò)查閱死者的電腦和手機(jī)晚伙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)俭茧,“玉大人咆疗,你說(shuō)我怎么就攤上這事∧刚” “怎么了午磁?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)毡们。 經(jīng)常有香客問(wèn)我迅皇,道長(zhǎng),這世上最難降的妖魔是什么衙熔? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任登颓,我火速辦了婚禮,結(jié)果婚禮上红氯,老公的妹妹穿的比我還像新娘框咙。我一直安慰自己咕痛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布扁耐。 她就那樣靜靜地躺著暇检,像睡著了一般。 火紅的嫁衣襯著肌膚如雪婉称。 梳的紋絲不亂的頭發(fā)上块仆,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音王暗,去河邊找鬼悔据。 笑死,一個(gè)胖子當(dāng)著我的面吹牛俗壹,可吹牛的內(nèi)容都是我干的科汗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绷雏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼头滔!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起涎显,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤坤检,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后期吓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體早歇,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年讨勤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了箭跳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡潭千,死狀恐怖谱姓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情刨晴,我是刑警寧澤屉来,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站割捅,受9級(jí)特大地震影響奶躯,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜亿驾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一嘹黔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦儡蔓、人聲如沸郭蕉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)召锈。三九已至,卻和暖如春获询,著一層夾襖步出監(jiān)牢的瞬間涨岁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工吉嚣, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梢薪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓尝哆,卻偏偏與公主長(zhǎng)得像秉撇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子秋泄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,144評(píng)論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理琐馆,服務(wù)發(fā)現(xiàn),斷路器恒序,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 按照慣例瘦麸,每年的這個(gè)時(shí)候,都要寫些什么吧奸焙,不然這么重要的日子瞎暑,怎能沒(méi)有儀式感彤敛?而我們之間一直以來(lái)最具儀式感的...
    檬檬細(xì)語(yǔ)閱讀 1,158評(píng)論 2 9
  • 親愛(ài)的: 當(dāng)我給你寫這封信的時(shí)候与帆,信陽(yáng)正下著小雨,連續(xù)幾天墨榄,特別涼快玄糟,而此時(shí),紹竣同學(xué)恐怕已經(jīng)在省實(shí)驗(yàn)中學(xué)開始軍訓(xùn)...
    美好羊中荷葉lucy閱讀 1,079評(píng)論 4 5
  • 如果你第一次聽說(shuō)引流腳本袄秩,那你一定要關(guān)注我并看到最后阵翎。 簡(jiǎn)單的說(shuō)一個(gè)功能 暴力吸粉 當(dāng)初我也是花錢去買了一些腳本去...
    億萬(wàn)少年的頂級(jí)機(jī)密閱讀 335評(píng)論 0 0