你可不能像给狗狗取名字那样给类、方法、变量命名。仅仅因为它很可爱或者听上去不错。
在写代码的时候,你要经常想着,那个最终维护你代码的人可能将是一个有暴力倾向的疯子,并且他还知道你住在哪里。
为什么命名很重要?
Aliware
在项目中,从项目的创建到方法的实现,每一步都以命名为起点,我们需要给变量、方法、参数、类命名,这些名字出现在代码的每个角落,随处可见,混乱或错误的命名不仅让我们对代码难以理解,更糟糕的是,会误导我们的思维,导致对代码的理解完全错误。如果整个项目始终贯穿着好的命名,就能给阅读者一个神清气爽的开始,也能给阅读者一个好的指引。
为什么很难正确命名?
Aliware
有人称编程中最难的事情就是命名。我同样深以为然,中国有句古话叫做万事开头难。抛开环境搭建,真正到了编码阶段第一件事就是命名,而最常见的一种情况,就是毫无目的、仅凭个人的喜好的去决定了一个名字。但因为没有想清楚目标和具体实施步骤,所以进行过程中往往会面临无数次的小重构甚至是推倒重来。
1、缺乏意愿
2、缺乏思考
3、缺乏技巧
如何正确的命名?
Aliware
这里不讨论具体语言的命名规则,原因是不同编程语言命名规则各不相同,甚至不同团队间相同语言的命名规则也有出入。这里主要从提高可读性出发,结合我所在的客户端团队日常开发情况,以Java作为演示语言,给一些关于命名的建议。
1、名副其实
代码示例:
public interface OnRequestListener {/*** 请求结束 只有成功点才认为是真正的结束* @param ...*/void onRequestEnd(....);/*** 请求开始* @param ...*/void onRequestStart(...);}
// 省略注释public interface OnRequestListener {void onStart(....);void onSuccess(....);void onFailure(...);}
2、避免误导
在每种语言中都有内置的标识符,他们都有特定的含义,如果和他们没有关联就不要在命名中加上他们。
代码示例:
private List dataSet; 大脑活动:
private ListdataList; 或者private Listsections;
代码示例:
/** 作者+日期 */public class RItemOverlayView {}
/** 作者+日期 */public class NRItemOverlayView {}
大脑活动:
// 放在首页推荐场景的包下public class ItemOverlayViewCreator {}
// 放在购后推荐场景的包下public class ItemOverlayViewCreator {}
代码示例:
private int isFirstEnter = 0;大脑活动:
private boolean isFirstEnter = true;代码示例:
....if (InfoFlowOrangeConfig.getBooleanValue(POST_DELAYED_HIDE_COVER_VIEW_ENABLE, true)) {hideCoverImageView();} else {delayedHideCoverImageView();}
大脑活动:
....if (InfoFlowOrangeConfig.getBooleanValue(IMMEDIATELY_HIDE_COVER_VIEW_ENABLE, true)) {hideCoverImageView();} else {delayedHideCoverImageView();}
问题示例:
public interface IR4UDataSource {....}
声明2:
public interface RecommendIDataSource {....}
声明3:
public interface IRecommendDataResource {....}
声明4:
public class RecmdDataSource {....}
大脑活动:
public void showOverlay(@NonNull View view ...) {...View rootView = getRootView(view);DxOverlayViewWidget dView = createDxOverlayViewWidget();dView.showOverLayer(view.getContext(), (ViewGroup)rootView, cardData, itemData);...}
public void showOverlay(@NonNull View hostView ...) {...ViewGroup parentView = getParentView(hostView);DxOverlayViewWidget dxOverlayViewWidget = createDxOverlayViewWidget();dxOverlayViewWidget.showOverLayer(hostView.getContext(), parentView, ...);...}
/*** Created by *** on 16/8/6.*/public interface IR4UDataSource {....}
大脑活动:
public interface IRecommendForYouDataSource {....}
....// 标题指示器(indicators)private LinearLayout mTabLL;private TabLayout mTabLayout;....
大脑活动:
....private LinearLayout mTabLayoutParentView;private TabLayout mTabLayout;....
....for (PageParams.GroupBuckets ss:params.groupBucketIds.values()) {if (ss != null) {bucketIds.removeAll(ss.bucketIdsAll);Collections.addAll(bucketIds, ss.currentBucketIds);}}....
大脑活动:
for (PageParams.GroupBuckets groupBuckets :params.groupBucketIds.values()) {if (groupBuckets != null) {....}}
public static void updateImmersiveStatusBar(Context context) {....if (TextUtils.equals(isFestivalOn, "1")) {if (TextUtils.equals(navStyle, "0") || TextUtils.equals(navStyle, "1")) {....} else if (TextUtils.equals(navStyle, "2")) {....}}....}
大脑活动:
public static final String FESTIVAL_ON = "1";public static final String NAV_STYLE_FESTIVAL = "0";public static final String NAV_STYLE_SKIN = "1";public static final String NAV_STYLE_DARK = "2";public static void updateImmersiveStatusBar(Context context) {....if (TextUtils.equals(isFestivalOn, FESTIVAL_ON)) {if (TextUtils.equals(navStyle, NAV_STYLE_FESTIVAL)|| TextUtils.equals(navStyle, NAV_STYLE_SKIN)) {....} else if (TextUtils.equals(navStyle, NAV_STYLE_DARK)) {....}}....}
代码示例:
public interface xxx {....void destory();}
public interface xxx {....void destroy();}
7、方法的命名
/*** 处理主图的数据** @return 如果有浮层数据就返回true,没有就返回false*/private boolean processMainPic() {....boolean hasMainPicFloat = false;....return hasMainPicFloat;}// 调用处boolean hasMainPicFloat = processMainPic();
/*** 是否有浮层数据** @return 如果有浮层数据就返回true,没有就返回false*/private boolean hasFloatData($MainPictureData) {....boolean hasFloatData = false;....return hasFloatData;}// 调用处boolean hasFloatData = hasFloatData(mainPictureData);
// 10多处调用... = GatewayUtils.processTime(System.currentTimeMillis());public class GatewayUtils {....// 这个方法没有注释public static long processTime(long time) {return time + (SDKUtils.getTimeOffset() * 1000L);}....}
public static long currentNetworkTime() {return System.currentTimeMillis() + (SDKUtils.getTimeOffset() * 1000L);}
// 唯一调用处final IPageProvider pageProvider = checkActivityAvaliable();if (pageProvider == null) {....return;}// 函数声明private IPageProvider checkActivityAvaliable() {IPageProvider pageProvider = pageProviderWeakReference.get();if (pageProvider == null) {PopFactory.destroyPopCenter(pageName);return null;}return pageProvider;}
大脑活动:
final IPageProvider pageProvider = pageProviderWeakReference.get();if (pageProvider == null) {PopFactory.destroyPopCenter(pageName);....return;}
Aliware
1.对自己严格自律,自己写代码时要有一种希望把每个名称都命名好的强烈意识和严格的自律意识;
来源:阿里巴巴开发者
本篇文章为 @ 阿里巴巴中间件 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。