减少代码中该死的 if else 嵌套,让代码更简洁
if (true) {if (true) {if (true) {if (true) {if (true) {if (true) {}}}}}}

正文
private static final int TYPE_LINK = 0;private static final int TYPE_IMAGE = 1;private static final int TYPE_TEXT = 2;private static final int TYPE_IMAGE_TEXT = 3;public class ShareItem {int type;String title;String content;String imagePath;String link;}public interface ShareListener {int STATE_SUCC = 0;int STATE_FAIL = 1;void onCallback(int state, String msg);}
public void share (ShareItem item, ShareListener listener) {if (item != null) {if (item.type == TYPE_LINK) {// 分享链接if (!TextUtils.isEmpty(item.link) && !TextUtils.isEmpty(item.title)) {doShareLink(item.link, item.title, item.content, listener);} else {if (listener != null) {listener.onCallback(ShareListener.STATE_FAIL, "分享信息不完整");}}} else if (item.type == TYPE_IMAGE) {// 分享图片if (!TextUtils.isEmpty(item.imagePath)) {doShareImage(item.imagePath, listener);} else {if (listener != null) {listener.onCallback(ShareListener.STATE_FAIL, "分享信息不完整");}}} else if (item.type == TYPE_TEXT) {// 分享文本if (!TextUtils.isEmpty(item.content)) {doShareText(item.content, listener);} else {if (listener != null) {listener.onCallback(ShareListener.STATE_FAIL, "分享信息不完整");}}} else if (item.type == TYPE_IMAGE_TEXT) {// 分享图文if (!TextUtils.isEmpty(item.imagePath) && !TextUtils.isEmpty(item.content)) {doShareImageAndText(item.imagePath, item.content, listener);} else {if (listener != null) {listener.onCallback(ShareListener.STATE_FAIL, "分享信息不完整");}}} else {if (listener != null) {listener.onCallback(ShareListener.STATE_FAIL, "不支持的分享类型");}}} else {if (listener != null) {listener.onCallback(ShareListener.STATE_FAIL, "ShareItem 不能为 null");}}}
2. 业务判断
3. 状态判断
减少 if else 方法一:接口分层
来,看代码更加直观:
public void share(ShareItem item, ShareListener listener) {if (item == null) {if (listener != null) {listener.onCallback(ShareListener.STATE_FAIL, "ShareItem 不能为 null");}return;}if (listener == null) {listener = new ShareListener() {@Overridepublic void onCallback(int state, String msg) {Log.i("DEBUG", "ShareListener is null");}};}shareImpl(item, listener);}private void shareImpl (ShareItem item, ShareListener listener) {if (item.type == TYPE_LINK) {// 分享链接if (!TextUtils.isEmpty(item.link) && !TextUtils.isEmpty(item.title)) {doShareLink(item.link, item.title, item.content, listener);} else {listener.onCallback(ShareListener.STATE_FAIL, "分享信息不完整");}} else if (item.type == TYPE_IMAGE) {// 分享图片if (!TextUtils.isEmpty(item.imagePath)) {doShareImage(item.imagePath, listener);} else {listener.onCallback(ShareListener.STATE_FAIL, "分享信息不完整");}} else if (item.type == TYPE_TEXT) {// 分享文本if (!TextUtils.isEmpty(item.content)) {doShareText(item.content, listener);} else {listener.onCallback(ShareListener.STATE_FAIL, "分享信息不完整");}} else if (item.type == TYPE_IMAGE_TEXT) {// 分享图文if (!TextUtils.isEmpty(item.imagePath) && !TextUtils.isEmpty(item.content)) {doShareImageAndText(item.imagePath, item.content, listener);} else {listener.onCallback(ShareListener.STATE_FAIL, "分享信息不完整");}} else {listener.onCallback(ShareListener.STATE_FAIL, "不支持的分享类型");}}
减少 if else 方法二:多态
public abstract class ShareItem {int type;public ShareItem(int type) {this.type = type;}public abstract void doShare(ShareListener listener);}public class Link extends ShareItem {String title;String content;String link;public Link(String link, String title, String content) {super(TYPE_LINK);this.link = !TextUtils.isEmpty(link) ? link : "default";this.title = !TextUtils.isEmpty(title) ? title : "default";this.content = !TextUtils.isEmpty(content) ? content : "default";}@Overridepublic void doShare(ShareListener listener) {// do share}}public class Image extends ShareItem {String imagePath;public Image(String imagePath) {super(TYPE_IMAGE);this.imagePath = !TextUtils.isEmpty(imagePath) ? imagePath : "default";}@Overridepublic void doShare(ShareListener listener) {// do share}}public class Text extends ShareItem {String content;public Text(String content) {super(TYPE_TEXT);this.content = !TextUtils.isEmpty(content) ? content : "default";}@Overridepublic void doShare(ShareListener listener) {// do share}}public class ImageText extends ShareItem {String content;String imagePath;public ImageText(String imagePath, String content) {super(TYPE_IMAGE_TEXT);this.imagePath = !TextUtils.isEmpty(imagePath) ? imagePath : "default";this.content = !TextUtils.isEmpty(content) ? content : "default";}@Overridepublic void doShare(ShareListener listener) {// do share}}
public void share(ShareItem item, ShareListener listener) {if (item == null) {if (listener != null) {listener.onCallback(ShareListener.STATE_FAIL, "ShareItem 不能为 null");}return;}if (listener == null) {listener = new ShareListener() {@Overridepublic void onCallback(int state, String msg) {Log.i("DEBUG", "ShareListener is null");}};}shareImpl(item, listener);}private void shareImpl (ShareItem item, ShareListener listener) {item.doShare(listener);}
public ShareItem createLinkShareItem(String link, String title, String content) {return new Link(link, title, content);}public ShareItem createImageShareItem(String ImagePath) {return new Image(ImagePath);}public ShareItem createTextShareItem(String content) {return new Text(content);}public ShareItem createImageTextShareItem(String ImagePath, String content) {return new ImageText(ImagePath, content);}
减少 if else 方法三:使用Map替代分支语句
private Map<Integer, Class<? extends ShareItem>> map = new HashMap<>();private void init() {map.put(TYPE_LINK, Link.class);map.put(TYPE_IMAGE, Image.class);map.put(TYPE_TEXT, Text.class);map.put(TYPE_IMAGE_TEXT, ImageText.class);}public ShareItem createShareItem(int type) {try {Class<? extends ShareItem> shareItemClass = map.get(type);return shareItemClass.newInstance();} catch (Exception e) {return new DefaultShareItem(); // 返回默认实现,不要返回null}}
写在最后
把接口分为外部和内部接口,所有空值判断放在外部接口完成;而内部接口传入的变量由外部接口保证不为空,从而减少空值判断。
利用多态,把业务判断消除,各子类分别关注自己的实现,并实现子类的创建方法,避免用户了解过多的类。
把分支状态信息预先缓存在Map里,直接get获取具体值,消除分支。
评论
