变量声明方法的一些考虑

在学习许多编程言语后,发现尽管大部分言语都支撑变量声明,并且语义都相同,可是声明的语法却有许多种。正好近期也在规划这样的语法,就结合曩昔触摸的言语来阐述自己的感触。

(尽管前面说到的都是变量声明,可是本文把常量声明、指针声明这类把值和称号相关的语法也一起评论)

0. 写在最初

各个言语的变量声明方法并不影响程序运行时的效率,最多对言语处理程序的开发和履行有点影响,而变量声明方法的改变影响最大的其实是开发者阅览代码时的感触。因而,本文在评论一种表达方法时,不考虑其对程序和言语处理程序的影响,仅从阅览的角度来谈论。(由于不同的人学习的第一个开发言语都可能不同,“母语”会对人承受新事物发生巨大影响,而开发阅历和学过的言语也不同,理解也不同,所以难以做到客观点评,我也只能尽量“客观”地去剖析了)

1. 常见的变量声明方法

Java的变量声明

首要来看最为常见的Java的变量声明

int a;
int x = 1;
final int y = 2;
int[] nums = new int[10];
int nums2[] = {1,2,3,4,5};
List<Integer> numList = new LinkedList<>();

我们能够看到java言语里,等号前面的声明都把变量名放在最终,除了数组的声明有两种方法,一种是把[]放在变量称号后边。这种把润饰变量的要害字悉数放在称号前的表达,一致性比较高,即便今后言语扩展了,也能够在前面继续追加要害字。

至于缺点嘛,要害字长可能是一个吧(不过这也意味着信息表达地更全面一些),例如,你能够看到这样的声明:

private static final int x = 0;

别的,Java的类型声明中有两个“潜规则”:1. 类的成员变量中假如没有private/protected/public润饰时则为包拜访权限;2. 变量没有final润饰时,能够被赋值。我个人主观上不太喜欢这类“潜规则”,尽管带来了一些便利,可是降低了一致性,并且假如其他言语在类似语法采用不同的“潜规则”,也给学习带来了一些费事。

C言语的变量声明

接下来看一下类似的C言语的变量声明方法:

int x = 1;
int *p1;
const int x2 = 1;
int *const p = &x;
const int *const px = &x;
int nums[10];

emmm…看上去C言语和Java的表达有点像,可是指针的引进让变量的声明有一点点杂乱了,毕竟“*”号的方位会决定这个符号对应的到底是常量指针仍是指针常量,这个对新手仍是有些费事的。类似的把润饰标识放在变量名前面的规划,主观上我更倾向于简略的规则,或者没有规则。

JavaScript言语的变量声明

js的变量声明大概是最//常量
var x1 = 1;
let x2 = 2;
let a1 = 1, a2 = 2
const s = "asdf"

js的声明比较简略(尽管作用域并不简略),不过相对的也没法表达较杂乱的变量信息。

Scala言语的变量声明

Scala的变量声明有点不相同:

var x1 = 1
val x2 = 2
var x3: Int = 3
val x4: Int = 4
var x5: (Int, String) = (1, "hello")
var f1 = (x:Int, s:String) => {
    return x + s.length
}
val f2:(Int, String) => String = (x, s) => {
    x + " - " + s
}
val ints: List[Int] = List(1, 2, 3)

它将变量的类型放在称号后边,用冒号分隔,变量的可变性经过前面的varval操控,并且由于scala支撑类型推导,所以能够省略类型声明。但这也引进新的问题,便是什么时候应该声明类型?还有便是当等号两边表达式都比较长的时候,或者不止一个等号的时候,代码阅览起来会有些费事。

Python言语的变量声明

Python的变量声明有比较大的不同,

a = 100
PI = 3.14
class Student(object):
    count = 0
    def __init__(self, name, score):
        self.__name = name
        self.__score = score
        Student.count += 1

python程序里等号的左侧除了名字没有任何润饰,是一种极简的表达,这使得程序看上去更加简练,而经过命名来操控目标属性的拜访限制也是一种有用的实现,既没有使程序变得过长,该表达的信息也都表达清楚了。不过这样对简练的寻求也导致了一些问题,声明和赋值合为一体后,变量的作用域有些模糊;别的寻求简练也就意味着无法增加过多的表达。

2. 一些古怪的想象

变量的和常量的表达

看了上面的一些实现大都专门用一个要害字来区别,例如:varvalfinalconst等等,那么可不能够用赋值/相关符号来区别呢,比方:

int x = 1 //变量
int y : 2 //常量

等号用于变量,冒号用于常量,由于变量能够重新赋值,而常量不能够。

又或者使用变量名前后缀来表达:

int a = 1   //变量
int |x| = 1 //常量
int !x = 1  //常量

润饰语后置

一般都将润饰变量的要害字放在前面,那么悉数放在后边呢:

a<int> = 1
a<int, const, sync> = 1

尽管看着有点怪,不过也看得曩昔。

其他

后续更新