代码美学(摘要)

如何给变量或类型起名字

不要使用以下的命名方式

  • 不要使用单字母:简洁的变量命名是来自数学中的命名习惯,数学家喜欢公式的精简和优美,但是会丢失大量的上下文信息,让你读代码的时间比写代码的时间还要长

  • 不要使用缩写:与单字母的方式一样,无法理解上下文的信息,让代码很难阅读

  • 不要在命名中添加类型说明: 新生的程序工作者可能不会接触到这个命名方式,它来自于匈牙利命名法在类型提示不完善的年代,增加对变量类型的说明 intTotal,strName

  • 不要再类型中添加类型描述: 最典型的就是对interface的定义使用 IBoxProps

  • 不要再类或类型中添加 BaseAbstract: 可能你会习惯性的把基础类命名中添加 Base, 但是这并不能说明他应该被继承或是被实现,只需要直接命名即可,例如 Box
    另外你的命名对子类如何使用并不会有影响,例如 (box:Box)=>void, 并不关心 Box 是不是抽象类
    当你不知道如何给基础类命名的时候,可以考虑是否需要对子类修改命名方式,添加更多信息, 例如子类实现了不同颜色的盒子 YellowBox

推荐的命名方式

  • 在命名中增加单位描述: delaySeconds , 对于一些强类型语言可以使用类型标注,例如 C# TimeSpan, 而对于弱类型语言可以在命名中添加单位描述

你可能不需要Utils文件

可能你正在用一个Utils方法过滤电影列表

1
2
3
class Utils {
filterMove(){}
}

但事实上这应该是电影类中的一部分

1
2
3
class Movie {
filterMove(){}
}

当你准备写一个utils方法的使用请考虑它是否足够抽象, 亦或者考虑将他放到更明确的类或功能模块中去。

使用组合而不是继承

继承最大的问题在于,无法找到一个完美的抽象,随着业务和需求的发展,总是需要调整被继承的类,这将会影响全局。

如果需要使用类,遵循以下的原则:

  • 需要实现的类中有大量重复的接口
  • 避免直接访问受保护的成员变量
  • 显式的为子类创建需要重写的API
  • 每个方法都需要标注行为 final/sealed/private, 避免修改时导致错误

如是使用继承,需要注意以下几点:

  • 组合会导致功能定义时产生大量的重复初始化代码
  • 如果想从类中暴露方法,需要写大量的包装函数
    1
    2
    3
    4
    5
    class Box{
    getName(){
    return this.type.getName()
    }
    }
  • 虽然会导致少量冗余,但是好处远远大于坏处,它可以让你的代码耦合程度更低。
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2015-2025 SunZhiqi

此时无声胜有声!

支付宝
微信