android开发系列之代码整洁之道
谈起编码干净整洁之道,想来大伙儿想起大量的是那本經典重新构建书本。没有错,还记得那时候自身读那本书的情况下,一边融合新项目实战演练,一边融合书里的解读,的确学得了很多东西,对自己的编号设计风格危害极深。伴随着时间的流逝,书里许多实际的內容自身都还记得不太清晰,可是会不自觉的运用到具体工作上,等同于变成自身的一种编号习惯。因此 在这篇blog里边,我将融合自身近期在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新项目里边提取出去2个方式,实际含意你能了解为:有两个目录,另外关联数据信息和关联每一个item的点击事件。假如你取得这一段编码,你能怎样去重新构建呢?
或许聪慧的你,迅速就可以发觉这一段编码较大 的难题便是沉余编码过多,是否有发觉itemClick里边的编码,除开goodsId/isHot2个主要参数区别以外,基础全是一样的编码。根据上边的剖析,我们可以将编码开展以下重新构建:
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); } }
能够见到,大家开展了沉余重新构建以后,全部编码就简约、形象化了许多。可是假如只重新构建到这一步得话,那麼还并不是很极致的编码。你或许会问,有没有什么地区可重新构建的吗?这个时候大家很有可能还必须采用此外一个重新构建标准便是:一个方式里边尽可能只做一件事情。这下你也就应当可以搞清楚下面应当做的事儿了吧?最先使我们讨论一下,2个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!