吐槽一下 ShardSDK 为 cocos2d-x 写的 Sample 代码。 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xpol
V2EX    Android

吐槽一下 ShardSDK 为 cocos2d-x 写的 Sample 代码。

  •  
  •   xpol 2015-11-08 13:11:22 +08:00 12320 次点击
    这是一个创建于 3676 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这两天再基于 ShareSDK Cocos2d-x 的 Sample 代码做 Lua 的分享接口。

    有些 java 代码不得不来吐槽一下,顺便给出我的重构代码,请大家帮忙指正下:

    片段一

    if (!(content.get("title") == null)) { map.put("title", content.get("title")); } if (!(content.get("description") == null)) { map.put("comment", content.get("description")); } if (!(content.get("url") == null)) { map.put("url", content.get("url")); map.put("titleUrl", content.get("url")); } if (!(content.get("site") == null)) { map.put("site", content.get("site")); } if (!(content.get("siteUrl") == null)) { map.put("siteUrl", content.get("siteUrl")); } if (!(content.get("musicUrl") == null)) { map.put("musicUrl", content.get("musicUrl")); } if (!(content.get("extInfo") == null)) { map.put("extInfo", content.get("extInfo")); } 

    碍眼的地方:

    1. 莫非 Java 里面 (!(content.get("content") == null)) 和 (content.get("content") != null) 有什么不同?我 Java 学的少,别骗我。
    2. 这段采用重复手法的代码,让我一个用惯 Lua 的人情何以堪啊。用一个名字 的映射表,然后循环就搞定的事情。
    private static final Map<String, String> NATIVE_FIELDS; static { Map<String, String> map = new HashMap<String, String>(); map.put("text", "content"); map.put("title", "title"); map.put("comment", "description"); map.put("url", "url"); map.put("titleUrl", "url"); map.put("site", "site"); map.put("siteUrl", "siteUrl"); map.put("musicUrl", "musicUrl"); map.put("extInfo", "extInfo"); NATIVE_FIELDS = Collections.unmodifiableMap(map); } for (Map.Entry<String, String> entry : NATIVE_FIELDS.entrySet()) { String nativeName = entry.getValue(); String wantedName = entry.getKey(); Object value = content.get(nativeName); if (value != null) { map.put(wantedName, value); } } 

    片段二

    if (map.containsKey("text")) { oks.setText(String.valueOf(map.get("text"))); } if (map.containsKey("imagePath")) { oks.setImagePath(String.valueOf(map.get("imagePath"))); } if (map.containsKey("imageUrl")) { oks.setImageUrl(String.valueOf(map.get("imageUrl"))); } if (map.containsKey("title")) { oks.setTitle(String.valueOf(map.get("title"))); } if (map.containsKey("comment")) { oks.setComment(String.valueOf(map.get("comment"))); } if (map.containsKey("url")) { oks.setUrl(String.valueOf(map.get("url"))); } if (map.containsKey("titleUrl")) { oks.setTitleUrl(String.valueOf(map.get("titleUrl"))); } if (map.containsKey("site")) { oks.setSite(String.valueOf(map.get("site"))); } if (map.containsKey("siteUrl")) { oks.setSiteUrl(String.valueOf(map.get("siteUrl"))); } 

    比片段一难一点,但是在一个习惯了 Lua 的 字段就是字符的人眼里,还是看着碍眼。
    Java 不是有反射吗?当然反射的代码有点麻烦,还要异常处理。 Android 的 Java 是不是 Java 8 哦?

    private static final Map<String, Method> OKS_FIELDS; private static Method getSetter(String name) throws NoSuchMethodException { return OnekeyShare.class.getMethod(name, String.class); } static { Map<String, Method> map = new HashMap<String, Method>(); try { map.put("comment", getSetter("setComment")); map.put("imagePath", getSetter("setImagePath")); map.put("imageUrl", getSetter("setImageUrl")); map.put("site", getSetter("setSite")); map.put("siteUrl", getSetter("setSiteUrl")); map.put("text", getSetter("setText")); map.put("title", getSetter("setTitle")); map.put("titleUrl", getSetter("setTitleUrl")); map.put("url", getSetter("setUrl")); } catch (NoSuchMethodException e) { Log.e("share", "error", e); } OKS_FIELDS = Collections.unmodifiableMap(map); } try { for (Map.Entry<String, Method> entry : OKS_FIELDS.entrySet()) { String field = entry.getKey(); Method set = entry.getValue(); String value = (String)content.get(field); if (value != null) { set.invoke(oks, value); } } } catch (Exception e) { Log.e("share", "error", e); } 

    最后总结

    1. ShareSDK 在 Android 和 iOS 上的消息格式不一样,导致这里的字段转换,不知道有没有基于 JSON 的借口。
    2. Java 语法还是有点麻烦啊, 比如 初始化 HashMap ,要一个一个设置。
    第 1 条附言    2015-11-10 10:08:02 +08:00

    如果是 Lua ,会写成这样:

    local NATIVE_FIELDS = { text = "content", title = "title", comment = "description", url = "url", titleUrl = "url", site = "site", siteUrl = "siteUrl", musicUrl = "musicUrl", extInfo = "extInfo", } for k, v in ipairs(NATIVE_FIELDS) do map[k] = content[v] end 

    和这样:

    local OKS_FIELDS = { setComment = "comment", setImagePath = "imagePath", setImageUrl = "imageUrl", setSite = "site", setSiteUrl = "siteUrl", setText = "text", setTitle = "title", setTitleUrl = "titleUrl", setUrl = "url", } for k, v in ipairs(OKS_FIELDS) do oks[k](content[v]) end 
    6 条回复    2015-11-24 20:01:29 +08:00
    ruixianxx
        1
    ruixianxx  
       2015-11-08 15:46:56 +08:00
    Sample 代码最重要的就是可读性啊。。
    我倒是觉得写的简单粗暴挺好的 毕竟谁都能看得懂
    xpol
        2
    xpol  
    OP
       2015-11-08 15:55:37 +08:00 via iPad
    @ruixianxx 也是。想拿来直接用的就痛苦了。
    liuxey
        3
    liuxey  
       2015-11-09 09:31:24 +08:00
    为什么我觉得 if else 更舒服。。。
    Tneciv
        4
    Tneciv  
       2015-1109 09:38:59 +08:00
    @liuxey 不是 switch 更舒服吗?
    coolxiao
        5
    coolxiao  
       2015-11-24 14:21:54 +08:00
    应该是 pairs 不是 ipairs 吧
    xpol
        6
    xpol  
    OP
       2015-11-24 20:01:29 +08:00
    @coolxiao 果然。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5137 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 09:26 PVG 17:26 LAX 01:26 JFK 04:26
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86