使用Java为何总写出C风格的代码?

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

“你看你所有代码都是把字段取出来计算然后再塞回去。各种不同层面的业务计算混在一起将来有一点调整所有代码都得跟着变。”

在实际的开发过程中有不少人都这么写代码的。Java写的代码应该有Java的风格而这种却处处体现着C风格。

1 编程范式Programming paradigm

程序的编写模式。使用什么编程范式通常意味着主要使用的代码结构。设计角度编程范式决定你在设计时可使用的元素有哪些。主流的编程范式

1.1 结构化编程structured programming

通过一些结构化的控制结构进行程序的构建。最熟悉控制结构是if/else这样的选择结构和do/while这样的循环结构。

结构化编程是最早普及的编程范式现在最典型的结构化编程语言是C语言。C语言控制结构的影响极其深远成为了很多程序设计语言的基础。

1.2 面向对象编程object-oriented programming

最主流编程范式核心概念是对象。写出的程序本质就是一堆对象之间的交互。给我们提供了一种管理程序复杂性的方式最重要的就是多态polymorphism。

1.3 函数式编程functional programming

近些年重新崛起的编程范式。核心概念是函数。它的函数来自于数学里面的函数所以和我们常规理解的函数有个极大不同不变性。即一个符号一旦创建就不再改变。

函数式编程的代表性语言LISP还没哪门函数式编程语言能够完全独霸一方。

编程范式不仅仅是提供了一个个的概念更重要的是它对程序员的能力施加了约束

  • 结构化编程限制使用goto语句它是对程序控制权的直接转移施加了约束
  • 面向对象编程限制使用函数指针它是对程序控制权的间接转移施加了约束
  • 函数式编程限制使用赋值语句它是对程序中的赋值施加了约束。

与其说这些编程范式是告诉你如何编写程序倒不如说它们告诉你不要怎样做。

2 多范式编程

编程范式与具体语言的关系不大就好比你的思考与用什么语言表达是无关的。但实际每种语言都有自己的主流编程范式。
如C语言主要是结构化编程而 Java主要是面向对象编程。但丝毫不妨碍程序员们在学习多种编程范式之后打破“次元壁”将不同编程范式中的优秀元素吸纳进来。这里的重点是“优秀”而非“所有”。

比如在Linux设计中有个虚拟文件系统Virtual File System简称 VFS的概念你可以把它理解成一个文件系统的接口。在所有的接口中其中最主要的是file_operations它就对应着我们熟悉的各种文件操作。

下面是这个结构的定义这个结构很长我从中截取了一些我们最熟悉的操作

struct file_operations {
  loff_t (*llseek) (struct file *, loff_t, int);
  ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
  ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
  int (*open) (struct inode *, struct file *);
  int (*flush) (struct file *, fl_owner_t id);
  int (*release) (struct inode *, struct file *);
  ...
}

如果你要开发一个自己的文件系统只需要把支持的接口对应着实现一遍也就是给这个结构体的字段赋值。

换个角度看这个结构体主要的字段都是函数指针文件系统展现的行为与这些函数的赋值息息相关。只要给这个结构体的字段赋值成不同参数也就是把不同的函数关联上这个文件系统就有了不同的行为。
熟悉面向对象编程这不就是多态

C是一门典型的结构化编程语言而VFS的设计展现出来的却是面向对象编程的特点编程范式的“次元壁”在这里被打破。

类似的设计还有很多比如Java里有一个著名的基础库Google出的Guava。它里面就提供了函数式编程的基础设施。在Java 8之前Java在语法上并不支持函数式编程但这并不妨碍我们通过类模拟函数。
C++有一个functor概念也就是函数对象通过重载 () 这个运算符让对象模拟函数的行为。

无论是在以结构化编程为主的语言中引入面向对象编程还是在面向对象为主的语言中引入函数式编程在一个程序中应用多种编程范式已经成为趋势。

越来越多的程序设计语言开始将不同编程范式的内容融合起来。Java从Java 8开始引入了Lambda语法写出函数式编程代码。

多范式编程会越来越多是因为关注点是做出好的设计写出易维护代码所以我们会尝试着把不同编程风格中优秀的元素放在一起。比如我们采用面向对象来组织程序而在每个类具体的接口设计上采用函数式编程的风格在具体的实现中使用结构化编程提供的控制结构。

开头之所以批评关键点就是没有把各种编程范式中优秀的元素放到一起。Java是提供对面向对象的支持面向对象的强项在于程序的组织它归功的设计元素应该是对象程序应该是靠对象的组合来完成而把它写成平铺直叙的结构化代码这不值得鼓励。

学习不同的编程范式将不同编程范式中的优秀元素应用在我们日常的软件设计之中已经由原来的可选项变成了现在的必选项。否则你即便拥有强大的现代化武器也只能用作古代的冷兵器。

3 总结

编程范式指的是程序的编写模式。编程范式对程序员的能力施加了约束理解编程范式的一个关键点在于哪些事情不要做。

编程范式与具体语言的关系不大但很多语言都有着自己主流的编程范式。但现在的一个趋势是打破编程范式的“次元壁”把不同编程范式中优秀的元素放在一起。

可以通过设计模拟出其他编程范式中的元素
程序设计语言的发展趋势也是要融合不同编程范式中优秀的元素
学习不同的编程范式已经成为每个程序员的必修课。

学习不同的编程范式将其中优秀的元素运用在日常工作中。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: Java