- 变量/函数状态坚持最小化表达 【annotate_overrides,prefer_const_declarations,prefer_final_fields】
一个变量或者方法如果重写了,请明确加上override注解。一个变量如果确定是const变量,请加上const关键字。一个变量如果没有再被赋值,请定义成final。坚持最小化表达,有如下几点收益:
- 最小化变量状态表达能精准刻画变量状态
最小化变量状态是指用最严格的属性描述变量。例如一个变量从之前的多处赋值,改为一处赋值。那么变量其实自带了final的隐形属性。最小化状态表达要求必须加上final关键字,而不是推断是final。因为一旦加上final关键字,后续在赋值就会报错。这能减少不必要的理解成本,最大限度避免变量状态的隐形改变。
- 提升代码性能
增加的final const关键字能让编译器做更多优化,提升代码的整体性能。
▐ 风格一致
多人开发的团队中,每个人都有自己的喜好。代码管理应该避免出现“破窗效应”。一个人把代码写烂了,后面的同学照着写都烂了。正所谓,无规矩不成方圆。基础代码的表达,不追求绝对的对与错,追求的是在风格上的尽可能统一。这里有太多典型例子:
-
命名规范大体遵循驼峰的方式【camel_case_types,non_constant_identifier_names,constant_identifier_names 】
-
控制流中尽量使用大括号【curly_braces_in_flow_control_structures】
-
import顺序按照先dart引用,再package引用,再相对引用方式分模块,模块内引用按字母表排序【directives_ordering】
-
required 关键字标识的变量请排到前面 【always_put_required_named_parameters_first】
-
flutter布局中优先使用SizedBox而不是Container【sized_box_for_whitespace】
-
flutter颜色定义使用8位16进制整数标识颜色值【use_full_hex_values_for_flutter_colors】
-
flutter widget在构造函数中加入key参数【use_key_in_widget_constructors】
这里的每一条都不具有非这样不可的理由。但是在闲鱼写代码就必须遵循这个规范。不为别的就为了风格的统一,为了提升团队同学业务轮转的效率。
▐ 代码质量
Linter检查的另一个重要的目标是发现潜在的代码缺陷。这对代码管理来说就更为重要了,因为这直接关系到稳定性的大局。稳定性是开发人员的底线,再怎么小心也不为过。同样举几个典型的例子:
1.避免给void赋值 【void_checks】
2.变量比较之前先判断类型 【unrelated_type_equality_checks】
3.避免catch 空实现【empty_catches】
4.避免使用隐形类型传递 【avoid_shadowing_type_parameters】
5.避免await 非future对象 【await_only_futures】
6.集合的remove需要传递符合集合的类型的参数【list_remove_unrelated_type】
如果这些问题代码带到生产环境,轻者出现exception,重则功能不可用。防患于未然,在代码最开始编写阶段,就及时处理这些问题,代码才能更健壮。
▐ 维护成本
效率对一个团队固然很重要,但是追求一时的效率,而不顾及代码生命周期内整体的效率是非常短视的行为。我们今天越发关注代码在后期的维护成本。基于此,文档&注释的重要性正越发凸显出来。一个好的注释,能省下很多的答疑,很多的试错,很多的猜疑。不断引导大家写并维护文档及注释,是闲鱼代码规范明确的目标。举几个明确的例子:
1.Deprecated函数需要给出明确的注释[provide_deprecation_message]
2.注释中的变量引用,符合引用的约束[comment_references]
▐ 规则权威
闲鱼团队Liner规则的制定,不是一家之言。邀请了团队所有同学参与到规则的制定过程。一个规则的权威性来源于所有执行者发自内心的认同。举一个典型例子:
在讨论标准格式化的时候,团队同学集中讨论了一个规则:
【- lines_longer_than_80_chars # 争议规则,每行长度不超过80字符】
大家认同统一格式化代码风格的重要性。大家争议的焦点是:80字符在很多高分辨率显示器上太短了。这会导致很多不必要的换行,降低代码阅读体验。我们听取了开发同学反馈,把该条规范去掉了。改为统一android studio配置来执行。最终标准是12号字,一行最多160字符。
写在最后
当然仅仅做到上面的部分,仅仅是万里长征的第一步。基础代码规范这件事,我们并不追求规则的多,而是更在意规则实际的效率收益。规则制定的过程中,我们听取了开发同学真实的反馈,删除了很多并不必要的规则。简单,高效,并不为了规范而规范是我们核心的目标。当然最终确定的规则,要尽最大努力保证执行。目前我们正在积极建设更完善的CI体系,将规范规则化。通过持续快速检测,实时给使用者反馈,降低规范落地的成本。代码是研发团队的核心资产,需要我们共同守护。
附录
上面介绍的规则细节,如果有不清楚的,可以在下面的链接中找到更详细的解释。
linter-rules[7]
▐ 闲鱼核心Liner规则
附上闲鱼的核心Liner规则,给大家一点参考。
命名
排序
格式化
评论
库使用
NULL
字符串
集合
函数
成员变量
构造函数
异常处理
Mixin
类型
参数
质量
Core集合融合部分
Recommended 集合融合部分
Flutter 集合融合部分
其他规则融合部分
Reference
[1] effective_dart: https://pub.dev/packages/effective_dart
[2] effective_dart: https://pub.dev/packages/effective_dart
[3] pedantic: https://pub.dev/packages/pedantic
[4] flutter_lints: https://pub.dev/packages/flutter_lints
[5] pub.dev: https://pub.dev/
[6] lints: https://pub.dev/packages/lints
[7] linter-rules: https://dart.dev/tools/linter-rules#lints
✿ 拓展阅读
作者|****意境
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
学习分享
在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了
很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘
如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。
2021最新上万页的大厂面试真题
七大模块学习资料:如NDK模块开发、Android框架体系架构…
只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。
由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
[外链图片转存中…(img-4k39g3Ju-1712393134415)]
七大模块学习资料:如NDK模块开发、Android框架体系架构…
[外链图片转存中…(img-86Y6KCxB-1712393134415)]
只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。