[置顶] 关于Coding的一些思考
2017-11-06 11:03
363 查看
前言
前段时间有个朋友跟我说,你好像很久没写博客了。我说是,最近工作比较饱和,业余时间整理的东西,暂时存到了笔记里,没有梳理好,不想拿出来“误人子弟”。
他说,那是你懒。
扎心了,老铁。
仔细想想,他说的对。做人做事,当始终如一。不忘初心,方得始终。
那今天就跟大家分享一下我最近的一些思考,起于代码,而不止于代码。
分而治之
分而治之,即通过各种灵活巧妙的方式方法,将较大的构成拆分成相互关联的较小的子系统。说到这里我们来思考一下组件化的策略,它将复杂系统分解为更好管理的组件,使得系统更容易维护和扩展。其实这就是一种类似分而治之的思想。
举一反三,如果我们某个页面的逻辑变得越来越复杂怎么办?我们是不是也可以把页面的逻辑也拆分成一个一个的小组件呢?如果可以,我们应该怎么拆分呢?其他臃肿的结构我们是不是也可以这样处理呢?
其实拆分的方案有很多种,因地制宜。这里我先列出几种,大家如果有好的方案可以一起讨论:
多个自定义控件。
多个Fragment。
或者自己实现一个比Fragment更轻量的类,把逻辑拆分之后,委托给多个这样的类去处理,目前我们项目中有些地方是这样处理的。
public abstract class BaseViewHolder { private final Unbinder mUnbinder; protected BaseViewHolder(View rootView) { mUnbinder = ButterKnife.bind(this, rootView); } public void unbind() { mUnbinder.unbind(); } }
逻辑比较简单,这里就不赘述了。如果需要特殊操作,比如绑定到Fragment的生命周期之类的,另行处理就好。
写代码和写作
好的代码就像好的小说一样,是不断改出来的。如果你觉得当前项目中哪里写的很不舒服,那么改造它吧。
举个例子,社交App的聊天列表可能会有好多不同类型的消息,我们一般用 RecyclerView 来实现。
最初的实现可能是这样的:
public class MultipleItemAdapter extends RecyclerView.Adapter { //定义类型 @Override public int getItemViewType(int position) { //根据数据的type,返回对应的类型 return super.getItemViewType(position); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //根据类型初始化对应的ViewHolder return null; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //根据类型绑定数据 } @Override public int getItemCount() { return 0; } }
迭代了一个版本之后,产品经理说,我们需要再加两种类型。这个时候我们该怎么办呢,是继续在这个类里添加类型还是重构一下呢?
如果你的项目里也有类似的代码,我的建议是重构。理由如下:
项目更容易维护和扩展
提升自己设计代码和编写代码的能力
那我们要重构成什么样子呢?我在前边也说了,好的代码是不断改出来的,我们可以先给自己定个小目标:每个类型的逻辑放到自己的类里去维护,做到单一职责。像这样:
public class Animal implements TypeInterface { @Override public int getLayoutRes() { return R.layout.item_test; } @Override public RecyclerView.ViewHolder onCreateViewHolder(View view) { return new AnimalVH(view); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, ViewModelInterface data) { AnimalInfo animalInfo = (AnimalInfo) data; AnimalVH animalVH = (AnimalVH) holder; animalVH.mTextView.setText("animal:" + animalInfo.toString()); } static class AnimalVH extends RecyclerView.ViewHolder { public TextView mTextView; public AnimalVH(View itemView) { super(itemView); mTextView = (TextView) itemView.findViewById(R.id.test); } } }
那我们怎么实现呢,其实就是把逻辑委托出去。我简单写了下,可能比较粗暴,但已经实现了我们的需求。
public interface TypeInterface { int getLayoutRes(); RecyclerView.ViewHolder onCreateViewHolder(View view); void onBindViewHolder(RecyclerView.ViewHolder holder, ViewModelInterface data); } public interface ViewModelInterface { int getType(); } public abstract class BaseAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { public Map<Integer, TypeInterface> mTypes; public List<ViewModelInterface> mDatas; protected BaseAdapter() { mTypes = new HashMap<>(); mDatas = new ArrayList<>(); } @Override public int getItemViewType(int position) { // TODO: 2017/11/3 将数据映射到对应的实现类型 return mDatas.get(position).getType(); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // TODO: 2017/11/3 由对应的实现类型创建holder View v = LayoutInflater.from(parent.getContext()) .inflate(mTypes.get(viewType).getLayoutRes(), parent, false); return mTypes.get(viewType).onCreateViewHolder(v); } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { // TODO: 2017/11/3 根据holder或者数据对应回实现类型,由实现类型对象绑定数据 mTypes.get(mDatas.get(position).getType()).onBindViewHolder(holder, mDatas.get(position)); } @Override public int getItemCount() { return mDatas == null ? 0 : mDatas.size(); } }
代码比较简单,我也就不过多叙述了,其实重要的是这种重构代码的意识,如果觉得哪里写的不舒服,那就改造它吧。
方向很重要
古语有云,凡事预则立,不预则废。当我们拿到一个需求的时候,我们首先要做的就是把需求分析清楚,不明白的地方及时沟通,否则做的越多,错的也就越多。也就是思考要高于实现。
其实方案出来之后不妨和周围同事讨论一下,可能会发现一些更好的思路也说不定。总之有了对的思路,才能做出来对的事情。
勤于梳理
所谓梳理,在我看来就是对一段时间内做过的事情做一个简单的分析。梳理的过程也是沉淀的过程。拿记笔记来说,可能一个月的笔记就有十几篇。就像入冬的时候我们想找去年冬天的衣服可能要翻箱倒柜一样,可能一段时间之后,我们都不知道自己之前的笔记记了什么。那我们不妨抽一些时间出来梳理这些笔记,梳理的过程中可以对这些笔记做一个整合或者删减,方便管理。
做项目也是一样,我们对每个版本变化的点也要时常梳理,可能1.0版本的时候加入的功能到1.3版本完全不需要了,我们则需要精确的对这部分差异代码做一些处理。
面向文档编程
忘了从哪里看过一句话是这样说的,好的程序员文档和代码的量大概是1:1。1:1可能有些夸张,但一个项目如果能有一个详细的文档是非常不错的。从技术调研到方案的确定,再到版本变更,这些东西是很有必要记录的。既方便自己梳理,避免遗漏一些东西,也方便新人熟悉项目,好处多多。
所以,养成写文档的好习惯吧。
后记
暂时就这些吧,希望今天的分享能给大家带来一些小启发。相关文章推荐
- [置顶] 关于产品的一些思考——腾讯之UIDesigner
- 关于Coding的一些思考
- [置顶] 关于产品的一些思考——小米之日历
- 白书 - 拓扑排序 及 关于递归、coding的一些思考
- [置顶] 关于产品的一些思考——腾讯之手机安全管家
- [置顶] 关于产品的一些思考——腾讯之微信
- 关于新闻源的一些思考和尝试
- 关于寻路算法的一些思考(3):A*算法的实现
- 关于柯西许瓦兹不等式的一些思考
- 【Android】导入第三方库时,关于so文件的一些思考
- 关于处理某一个事件需要关联多个事件或表的情况下,一些思考
- 关于区块链的一些思考
- [体感游戏]关于体感游戏的一些思考(三) --- 射击
- 关于Web3D的一些思考
- 关于c++中一些指针问题的思考
- 关于设计的一些思考
- 项目q总结:关于Linux性能问题的一些思考
- 关于产品的一些思考——阿里巴巴之来往
- 关于写代码的一些思考
- [置顶] 关于CSDN2013博客之星的一些看法