編輯:Android編程入門
說起代碼整潔之道,想必大家想到更多的是那本經典重構書籍。沒錯,記得當時自己讀那本書的時候,一邊結合項目實戰,一邊結合書中的講解,確實學到了很多東西,對我自己的編碼風格影響極深。隨著時間的流逝,書中很多具體的內容自己都記得不太清楚,但是會不自覺的應用到實際工作中,相當於成為自己的一種編碼習慣了。所以在這篇博客裡面,我將結合自己最近在android項目裡面重構的經歷,分享一些自己的代碼重構體會吧,希望能夠總結自己,同時幫到大家。
我記得以前遇到一個team leader他給我很深刻的影響就是人很自負,但是不得不承認技術很牛。他給我印象最深的一句話就是:你在寫代碼的時候,對自己的要求就是一個方法裡面,最多不能夠超過20-30行代碼,不然我就認為你這個代碼寫的很爛,需要考慮重構了。從此我就深深得被他那句話給震撼到了,這句話以後一直就作為我編碼時候的座右銘。好了,讓我們回到正題上來吧,請看如下代碼:
private void setDownGoodsListView() { downGoodsListAdapter = new RsvAdapter(recyclerViewBelow.getContext(), downGoodsList, R.layout.goodsitem2); recyclerViewBelow.setAdapter(downGoodsListAdapter); downGoodsListAdapter.setItemClickListener(new RsvAdapter.ItemClickListener() { @Override public void onItemClick(View view, int position) { TrackPart currentTrack = SvmFactory.getSvm().getTrackPart(); if (currentTrack.canSell(goodsId, isHotDrank)) { Bundle data = new Bundle(); data.putString("GoodsId", goodsId); data.putBoolean("GoodsIsHot", isHotDrank); Context context = view.getContext(); Intent intent = new Intent(context, SaleActivity.class); intent.putExtras(data); if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } context.startActivity(intent); } } @Override public void onItemLongClick(View view, int position) { } }); }
private void setUpGoodsListView() { upGoodsListAdapter = new RsvAdapter(recyclerViewTop.getContext(), upGoodsList,R.layout.goodsitem); recyclerViewTop.setAdapter(upGoodsListAdapter); upGoodsListAdapter.setItemClickListener(new RsvAdapter.ItemClickListener() { @Override public void onItemClick(View view, int position) { TrackPart currentTrack = SvmFactory.getSvm().getTrackPart(); if (currentTrack.canSell(goodsId, isHotDrank)) { Bundle data = new Bundle(); data.putString("GoodsId", goodsId); data.putBoolean("GoodsIsHot", isHotDrank); Context context = view.getContext(); Intent intent = new Intent(context, SaleActivity.class); intent.putExtras(data); if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } context.startActivity(intent); } } @Override public void onItemLongClick(View view, int position) { } }); }
上面這段代碼是我從最近的android項目裡面截取出來兩個方法,具體含義你可以理解為:有兩個列表,同時綁定數據和綁定每一個item的點擊事件。如果你拿到這段代碼,你會怎樣去重構呢?
也許聰明的你,很快就能夠發現這段代碼最大的問題就是冗余代碼太多,有沒有發現itemClick裡面的代碼,除了goodsId/isHot兩個參數差別之外,基本全部都是一樣的代碼。基於上面的分析,我們可以將代碼進行如下重構:
private void setUpGoodsListView() { upGoodsListAdapter = new RsvAdapter(recyclerViewTop.getContext(), upGoodsList,R.layout.goodsitem); recyclerViewTop.setAdapter(upGoodsListAdapter); upGoodsListAdapter.setItemClickListener(new RsvAdapter.ItemClickListener() { @Override public void onItemClick(View view, int position) { clickGoodsItemAction(view,upGoodsList.get(position).getId(),upGoodsList.get(position).isHot()); } @Override public void onItemLongClick(View view, int position) { } }); }
private void setDownGoodsListView() { downGoodsListAdapter = new RsvAdapter(recyclerViewBelow.getContext(), downGoodsList, R.layout.goodsitem2); recyclerViewBelow.setAdapter(downGoodsListAdapter); downGoodsListAdapter.setItemClickListener(new RsvAdapter.ItemClickListener() { @Override public void onItemClick(View view, int position) { clickGoodsItemAction(view,downGoodsList.get(position).getId(),downGoodsList.get(position).isHot()); } @Override public void onItemLongClick(View view, int position) { } }); }
private void clickGoodsItemAction(View view,String goodsId,boolean isHotDrank){ TrackPart currentTrack = SvmFactory.getSvm().getTrackPart(); if (currentTrack.canSell(goodsId, isHotDrank)) { Bundle data = new Bundle(); data.putString("GoodsId", goodsId); data.putBoolean("GoodsIsHot", isHotDrank); Context context = view.getContext(); Intent intent = new Intent(context, SaleActivity.class); intent.putExtras(data); if (!(context instanceof Activity)) { intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } context.startActivity(intent); } }
可以看到,我們進行了冗余重構之後,整個代碼就簡潔、直觀了很多。但是如果只重構到這一步的話,那麼還不是很完美的代碼。你也許會問,還有什麼地方可重構的嗎?這個時候我們可能還需要用到另外一個重構原則就是:一個方法裡面盡量只做一件事情。這下你就應該能夠明白接下來應該做的事情了吧?首先讓我們來看看,兩個set開頭的方法裡面到底都干了幾件事情?第一件事情就是:綁定列表數據;第二件事情就是設置每一個item的點擊事件;好吧,分析到這裡接下來的重構就是順理成章的事情了,set方法重構之後的代碼如下:
private void setUpGoodsListView() { setOneAdapter(); setOneItemClick(); }
private void setDownGoodsListView() { setTwoAdapter(); setTwoItemClick(); }
private void setOneAdapter(){ upGoodsListAdapter = new RsvAdapter(recyclerViewTop.getContext(), upGoodsList,R.layout.goodsitem); recyclerViewTop.setAdapter(upGoodsListAdapter); }
private void setOneItemClick(){ upGoodsListAdapter.setItemClickListener(new RsvAdapter.ItemClickListener() { @Override public void onItemClick(View view, int position) { clickGoodsItemAction(view,upGoodsList.get(position).getId(),upGoodsList.get(position).isHot()); } @Override public void onItemLongClick(View view, int position) { } }); }
同理連個two方法也是這樣去拆分,這裡就不一一貼出來了。重構到這裡,你會發現整個代碼結構就一目了然,但是我故意犯了個很二的錯誤,那就是命名規范的問題。這個也許大家都很清楚:每個變量的命名,每個方法的命名都盡量要讓人家一看到這個名字就知道該方法是干什麼的?所以這裡可能又牽涉到一個很有意思的矛盾問題(雞生蛋,還是蛋生雞呢?)。也就是在我們代碼裡面到底是應該加注釋呢?還是盡量少加注釋呢?你會看到只要我們遵循命名釋意的規則,我們就不需要去添加注視了,因為項目結構隨時在變,很可能今天添加的注釋,明天就不准了,這樣的注釋有比沒有更害人。所以我的原則是能不加就不加。
好了,今天就到這裡吧!其實還有更好的重構原則,大家可以參考一些書籍,下班了see you!
PS:還有幾天就開學了.先來一發. 學習內容:1.序列化的目的2.Android中序列化的兩種方式3.Parcelable與Serializable的性能比較4
例子是從《Android系統源代碼情景分析》第二章抄過來的,在學習的過程中還是遇到了不少的問題。個人體會:在學習第二章之前應該把《Linux設備驅動程序》這本書至少前四章
上節,介紹Material Design 對陰影效果的實現,這節,我們來介紹Android 5.x的著色與裁剪的特性。 Android 5.X 在對圖像的操作上增加更多
自從Google在2013年發布了Android Studio後,Android Studio憑借著自己良好的內存優化,酷炫的UI主題,強大的自動補全提示以及Gradle