点击进入微信为什么弹出bad_badparam怎么解决呢?

这么多年一直在写Java代码。在编码规范和代码优雅问题上一直都有自己的一套理论,脑中有大量有型的案例。习惯在周末的时候独自在家大批量的重构项目中的代码,看到不规范的代码就有要修改它的冲动。对代码有洁癖,也喜欢重构。一个周末重构上百个类,真的挺爽的。重构的多了,觉得挺没意思,因为感觉都在重复同样的工作,都不用动脑子,重构的过程感觉是在休息和偷懒。。。

从理性上,我觉得把代码写好看,注意是要好看。是每个程序员必备的基本技能。

从感性上,我能理解有大量的coder写出来的代码像狗啃的,毕竟对代码优雅度的追求,需要一个过程。

花了几天时间把阿里规约华山版,看了好几遍。我很喜欢它的大量的条条框框。我觉得很有价值。也要求我的团队按照规范去写。还去阿里云做了一下认证考试。98分,也不知道哪一题错了。

对于这套规范,我很认同。但总觉的少了点什么。规范是阿里在大量的项目工程实践中抽象出来的产物,是结果,而缺少了一些过程。很大一部分人无法从结果直接体会到某些条目的价值和重要性,也就很难从内心深处去深刻理解,并且规范自己。

每个有经验的coder都是通过代码堆出来的(并不是在说不用动脑子),实际上就是通过大量的案例来告诉自己选择哪种写法是比较好的,选着哪种写法不太优,选择哪种写法是傻X行为。我希望能写一些我认为有意思的案例或者想法说明某些条条框框的准则的价值。

Java本身就有一些默认的潜在行业规范,阿里规约算是把行业规范更加明晰的写了出来,并且加入了更多的细节。从实践角度,我认为每个项目都有自己的业务特色,项目组内一般都会有一些自己特定的规范,包括各个公司可能也有一些自己特定的规范,当然很多还是借鉴了行业规范。如果按照重要程度排序的话,应该是这样的:项目组内规范 > 公司规范 > 阿里规约(行业规范)。

举个例子,一个语义解析的项目,要在一个Enum中定义所有的100个语义意图。比如:调整音量,关窗,开窗,打开XXX,退出,询问明星等等,一些列的意图。这个时候还在Enum中把这些及其复杂的中文意图翻译成英文,然后变成大写再写进Enum中,人读的时候还要脑子里再翻译下,当然可以写注释。我想说,这是吃饱了撑得,直接用中文不行吗。在这个项目的业务层面,这样子去约定有它的必要性,哪怕违反了一些我们常规的基本准则。有些朋友可能会说,在Enum中写死上百个意图本身就不合理,应该放到数据库或者缓存。我们不在这边去纠结某个细节,因为类似于这种问题是否合理,需要结合场景,需要平衡优劣和得失。我举这么个例子,只是想说明项目组内很多时候由于业务的特点需要违反一些普遍行规,但这种违反,不是大面积的,只会在某几个点上,并且每一个点都有严格的组内规范去说明并且执行。

经常在CodeReview的时候听到一句话:我这么写好像也没什么,我觉得也挺好看的,可能发生的一些影藏问题在咋们的场景中不会发生,要不就这样不改了。不知道大家是否也听过,或者有同样的感受。我个人不喜欢,我希望在一个项目中,所有人写的代码就跟一个人写的一样,都严格遵循同一种写法,同一种规范。我希望达到的那种偏理想化的结果,仅靠阿里规约恐怕是不够的,举几个例子。

// 利用computeIfAbsent,只有当key不存在时,后续的表达式才会被执行。不会影响性能 // 其次得到的必然是最新的值。多写几次会比较适应这样的写法


// 从Dubbo的源码中不小心找到的,其他所有的接口声明都没有这问题,应该是不小心漏了 // 这个案例拿出来,还是强调细节,可能很多人觉得多写个public没什么,那怎么不把abstract也写上呢? // 说到第还是习惯问题,不要写没有必要的废代码 // 这些细节idea是可以检查出来的,或者发布前全量扫描下代码也是可以修正的 // 重构后,接口中的行为声明不要带上public

// 这个类中attachments是不可能为null的。这个从业务层面保证了的。所以这个方法中的判空是没有意义的。属于非代码 // attachments不可能为null,判空没有意义。如果真为空了,反而要看看这个类的结构是否哪边出问题了。

有人说,Java代码就像是老太太的裹脚布,又臭又长。我内心不想认同,当我接触了PythonGO语言后,对比发现有时候的确是这样。但我任然喜欢写Java。于此同时,我希望尽可能不要写费代码。合理利用封装,继承(不要排斥继承),多态,组合,完全能写出优雅的代码。

不是谈帕斯卡,骆驼命名等问题。而是说说业务模块和技术模块的一些命名优劣。以订单模块为例,我会给出OrderServiceOrderDao中一些基本的接口定义。

下面先列出,我认为不太友好的服务接口定义方式:

// 我先给出DAO的定义,这个DAO的定义没有问题的,主要看下面的OrderService的定义
 // 根据用户Id和状态查询订单
 // 根据订单Id查询订单
 
// 这个接口定义是我自己编出来的,虽然不完全真实。但我想大家项目中一定见到过在业务逻辑中这么与定义方法名字。
// 看着像是DAO的定义,但有不完全像,下面注释具体说问题。
 // 根据用户Id和状态查询订单
 // 问题① select不应该出现在业务层,可以使用query代替,偏业务化
 // 问题② state状态不应该暴露给外面,订单状态应该有订单模块内部控制
 // 根据订单Id查询订单
 // 问题① select不应该出现在业务层,可以使用query代替,偏业务化
 // 问题① insert不应该出现在业务层,从业务角度我们可以说初始化订单,生成订单,创建订单等等,但是不要用插入这种数据库专用名词
 // 问题① update不应该出现在业务层,我们可以换个方式去暴露接口
 // 问题② state状态不应该暴露给外面,订单状态应该有订单模块内部控制
 
// 查询用户初始化订单 // ① 把select修改成了偏业务化的query,也不再有by,userId,state这种数据库关键字或者字段化的概念了 // ② 把订单状态对其他模块屏蔽了,其他模块只需要向订单模块发起查询初始化订单的请求,不再需要知道初始化订单状态是啥数字 // 查询用户完成订单 // ① 把select修改成了偏业务化的query,也不再有by,userId,state这种数据库关键字或者字段化的概念了 // ② 把订单状态对其他模块屏蔽了,其他模块只需要向订单模块发起查询完成订单的请求,不再需要知道完成订单状态是啥数字 // 根据订单Id查询订单 // ① 把select修改成了偏业务化的query,也不再有by,orderId这种数据库关键字或者字段化的概念了 // ① 插入订单的概念被修改成初始化订单,更偏业务化,而不是机械动作 // ① 更新订单状态的行为不再交由外部模块控制,而是由订单模块内部自己控制。 // 订单模块只管给外部提供支付成功的通知接口,其他模块不关心通知过后订单模块干了啥,接到通知,是否要修改订单状态,订单状态要修改成什么,是订单模块自己的事情。 // ① 更新订单状态的行为不再交由外部模块控制,而是由订单模块内部自己控制。 // 订单模块只管给外部提供支付失败的通知接口,其他模块不关心通知过后订单模块干了啥,接到通知,是否要修改订单状态,订单状态要修改成什么,是订单模块自己的事情。 // 根据上述订单服务,简单列了几个基本的订单状态,不是很严谨。

在三层架构(展示层,业务逻辑层,数据访问层)下,我们编码时应该要充分考虑每一层各自的职责。业务逻辑层的重要性谁都清楚。但很多时候,我经常看到业务逻辑层的方法命名长得跟DAO类似。特别是updateXXXinsertXXX。分层或者分模块的目的就是为了解耦合,各自职责独立,我们应该严格遵守迪米特法则,把对外暴露的接口信息降到最低。

有朋友会说,queryUserInitOrdersqueryUserFinishOrders分开了,那如果订单表有10个状态,岂不是得写10个方法。我想说对,就是这样。封装10个不同状态的查询接口是订单模块细粒度提供服务的职责。

如果想要查询某用户下所有终止状态(完成和关闭)的订单,还需要封装queryUserEndOrders的服务,这算是门面模式。

绝对业务化的命名方式有几个好处。

① 模块多了,各个模块的业务方法多了,维护业务+数据库混杂命名的方法,会晕的。维护纯业务命名的方法会舒服一些。

② 其他模块的开发者并不想知道你内部模块实现细节,干嘛要在命名中带有隐晦的提现。

③ 做一个系统,我一般定先定流程骨架,业务模块只写接口定义,不写实现,业务模块的命名对我后期来完善方法具体实现有指导价值。

④ 显得专业,不,是真的专业。

Enum真的是个好东西,香。

在实际的项目中,一定会碰到很多需要需要横向扩展的场景,比如:技术方面的,Dubbo的负载均衡策略,协议策略,序列化策略等等。业务方面的,支付策略(支付宝,微信,余额),登录策略(用户名密码,验证码)。这些场景都是在一定范围内可以枚举,并且需要有横向扩展的能力,需要符合开闭原则。

Dubbo用了自己的SPI,目的是为开发者做二次开发留下很好的扩展口,这方面知识可以参考文档:。系统开发或者业务开发,没有必要提供二次开发扩展口的情况下,可以用Enum来做到比较优雅的实现。

Enum作为策略的列表枚举

Springbean工场可以替代SPI作为策略实现类动态获取的工具。

下面分别以Dubbo的负载策略和支付策略为案例说明下这种方式。


Dubbo的负载均衡策略

// 从多个待选执行列表中选出一个 // 负载均衡策略,参照dubbo的4种。只是示意 // 四种实现方式,具体实现都省略了。只是表意。 // 这个类作为对其他模块暴露的入口

支付工具策略(我上个项目的真实代码)

// 第三方支付结果的通知 // 对,你没看错,我真的用了中文作为enum的value。 // 我们在适当的场景下,有这么做的必要性,别碰我。

上述案例是真实项目,我个人特别喜欢这种方式去使用Enum

用enum开定义错误码

阿里规约泰山版中定义了错误码列表。我之前很多项目都是用常量类来定义一堆错误码,并且加上中文注释,用的时候可以方便查看。类似于下面这样。

用时间长了,总感觉不舒服。在代码中看到的永远是一堆编号,得点进去才能看见中文解释。怎么能在代码中直接看见中文?并且在接口out出系统时转换成编码呢?用Enum。我在项目中尝试了,因为用了中文,称不上优雅,但很舒服。下面介绍下。

// 使用了中文,在代码中不管是抛出点,还是拦截点,都能看到 // 我考虑过要使用英文,但是看到满屏的错误码,果断放弃了,如果真用了满屏的英文,还不如来点错误码数字了。。。 // 这个方法用来对比某个exception实例是否与当前这个相同 // 实际项目中用起来,可读性很高。看下面的演示 // 做异常判断,并且转换。使用isMessage方法来判断。可读性高 // 都是直接来中文,容易理解和维护

对于Enmu,介绍了2种用途,关于这部分,只是我的个人经验。能解决问题的方法才是好方法。

不是想说this的用法特点,而是想说对私有方法调用时,希望可以加上this关键字。有助于后期代码的阅读。当然,这只是我的个人习惯和观点。说说为什么,来看看代码。

// invokeCallback是一个私有方法,但是我第一眼看这个方法,无法直接明白那行代码在调用一个私有方法,我会考虑它可能是本类的方法,或者是父类的方法,如果不是在IDE中,我还得看看它是不是静态方法。我需要1秒的思考时间。 // 为了减少这1秒的思考,我喜欢加上辨识度更高的this关键字。 // 我不用思考就会知道它大概率是本类私有方法。 // 而且this关键字在IDE中的辨识度很高,直接就可以看到它是个方法,而不是个普通变量 // 我只是在大部分情况下,不希望在看代码时有过多的卡顿时间

关于加this关键字对本地私有方法的前缀。没有很明显的案例。不过我一直坚持这么做,我认为效果很好。


案例1(没有必要的hash浪费)

// 重构后,用一个零时变量接一下,就不需要做2次hash了

// 这个方法写的挺奇怪的。两层try,没必要的。 try {// 对于资源处理,没有必要使用2层try

案例3(if内容体,任何时候都加上大括号)

// 前面2个if都是的内容体都是单行的。第二个加上了大括号,第一个却没有加

案例4(来一段复杂的)

// 我数了下,最深12层。这段代码不在里面瞎写了,太复杂,影响阅读 // 重构后,最深变成了6层

很多东西,我不太知道怎么通过案例去表达。比如:怎么重构业务架构(代码量太大,东西太多,太碎,不知道咋写,写出来会乱),适当减少静态方法的使用,怎么用实体会话服务作为主线来构建架构。类似于这些东西过于偏思想,我希望写的东西是思想与实际案例结合的,是能从具体上去感受的,而不是只有抽象。

先说这么多,后面有想法继续写。

}

目前有部分用户有如下错误,想问下各位有遇到过这个问题的吗

2.付款,获取后台统一下单参数

4.弹出如下提示框,无法进行支付

}

  网站内容自动更新(第二种扫码登录的原理很简单,核心就是依靠微信带参二维码、EasyWeChat二维码文档简单的解释一下扫描)

  其实二次扫码登录的原理很简单,核心就是依靠微信二维码带参数,EasyWeChat二维码文档

  简单解释一下带参数扫描这个二维码的区别:

  看到这里,相信你已经明白了,整理一下:

  实战请求登录二维码

  前端通过点击事件请求微信登录二维码

  // 方便清除轮询

// 请求参数是二维码中的场景值

  后端带参数生成二维码逻辑,EasyWeChat配置请参考文档

// 查询 cookie,如果没有就重新生成一次

// 缓存微信带参二维码

// 有效期 1 天的二维码

// 自定义参数返回给前端,前端轮询

  用户扫描二维码后的处理

* 微信消息接入(这里拆分函数处理)

* 事件引导处理方法(事件有许多,拆分处理)

* 扫描带参二维码事件

// 关注事件的场景值会带一个前缀需要去掉

// 判断请求是否有微信登录标识

// 根据微信标识在缓存中获取需要登录用户的 UID

// 登录用户、并清空缓存

  OK,一个很实用的功能,赶紧加入你的项目吧!

  感谢您关注“GitHub Hot”公众号,为您展示科技圈的热点和新鲜事物!

  本作品采用《CC协议》,转载须注明作者及本文链接

  感谢您关注“GitHub Hot”公众号

 优采云采集器是一个根据用户提供的关键词,云端自动采集相关文章并发布到用户网站的网站采集器。它能够自动识别各种网页上的标题、正文等信息,不需要用户编写任何采集规则就可以实现全网采集。采集到内容后,会自动计算内容与所设定的关键词的相关度,只把相关的文章推送给用户。支持标题前缀、关键词自动加粗、插入固定链接、自动提取Tag标签、自动内链、自动配图、自动伪原创、内容过滤和替换、电话号码和网址清理、定时采集、百度主动提交等一系列SEO功能。用户只需设置好关键词和相关需求,就能实现全托管、零维护的网站内容更新。不限网站数量,不管是单个网站还是大批量站群,都可以非常方便的进行管理。

}

我要回帖

更多关于 badparam怎么解决 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信