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

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

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


在实际的开发过程中,有不少人都这么写代码的。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 总结

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


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


可以通过设计,模拟出其他编程范式中的元素

程序设计语言的发展趋势也是要融合不同编程范式中优秀的元素

学习不同的编程范式,已经成为每个程序员的必修课。


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

12.png

目录
相关文章
|
17天前
|
设计模式 Java
Java设计模式:组合模式的介绍及代码演示
组合模式是一种结构型设计模式,用于将多个对象组织成树形结构,并统一处理所有对象。例如,统计公司总人数时,可先统计各部门人数再求和。该模式包括一个通用接口、表示节点的类及其实现类。通过树形结构和节点的通用方法,组合模式使程序更易扩展和维护。
Java设计模式:组合模式的介绍及代码演示
|
7天前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
20 5
|
9天前
|
Java API 开发者
探索Java中的Lambda表达式:简洁与强大的代码实践
本文深入探讨Java中Lambda表达式的定义、用法及优势,通过实例展示其如何简化代码、提升可读性,并强调在使用中需注意的兼容性和效率问题。Lambda作为Java 8的亮点功能,不仅优化了集合操作,还促进了函数式编程范式的应用,为开发者提供了更灵活的编码方式。
|
5天前
|
Java 开发者
探索Java中的Lambda表达式:简化你的代码之旅##
【8月更文挑战第62天】 Java 8的发布为开发者带来了诸多新特性,其中最引人注目的无疑是Lambda表达式。这一特性不仅让代码变得更加简洁,还极大地提升了开发的效率。本文将通过实际示例,展示如何利用Lambda表达式来优化我们的代码结构,同时探讨其背后的工作原理和性能考量。 ##
|
8天前
|
Java API 开发者
探索Java中的Lambda表达式:简化代码,提升效率
【9月更文挑战第27天】在Java 8中引入的Lambda表达式为编程带来了革命性的变化。通过简洁的语法和强大的功能,它不仅简化了代码编写过程,还显著提升了程序的执行效率。本文将深入探讨Lambda表达式的本质、用法和优势,并结合实例演示其在实际开发中的应用。无论你是Java新手还是资深开发者,都能从中获得启发,优化你的代码设计。
|
9天前
|
Java Linux Python
Linux环境下 代码java调用python出错
Linux环境下 代码java调用python出错
24 3
|
8天前
|
存储 Java 索引
使用java代码实现左右括号查找
使用java代码实现左右括号查找
|
9天前
|
算法 Java
java 概率抽奖代码实现
java 概率抽奖代码实现
|
17天前
|
Java 程序员 API
Java中的Lambda表达式:简化代码的秘密武器
在Java 8中引入的Lambda表达式是一种强大的编程工具,它可以显著简化代码,提高可读性。本文将介绍Lambda表达式的基本概念、优势以及在实际开发中的应用。通过具体示例,您将了解如何使用Lambda表达式来简化集合操作、线程编程和函数式编程。让我们一起探索这一革命性的特性,看看它是如何改变Java编程方式的。
25 4
|
17天前
|
Java 开发者
探索Java中的Lambda表达式:简化你的代码
【8月更文挑战第49天】在Java 8的发布中,Lambda表达式无疑是最令人兴奋的新特性之一。它不仅为Java开发者提供了一种更加简洁、灵活的编程方式,而且还极大地提高了代码的可读性和开发效率。本文将通过实际代码示例,展示如何利用Lambda表达式优化和重构Java代码,让你的编程之旅更加轻松愉快。
下一篇
无影云桌面