凡事就怕问为什么(认识的升级)系列一

2020-12-17 15:24:55 +08:00
 Braisdom

首先,V 站是个很好的平台,活跃度很高,同时能听到各种不同的声音,修正自身的认知。这个系列是我一直都想整理的,它是我以前在面试时经常会问的问题,很多同事希望我能把比较准确的答案整理出来,大家互相学习。借着这段空闲的时光,认真整理一下,共勉。

很多时候,我们学习一门知识或科学,在编程领域学习一门编程语言或第三方框架,体系化的知识总是能很快掌握,但背后隐藏的规律和原理却不容易被发现。本质上,那些原理和规律是我们已经知道我们不知道的东西,其背后还有很多我们不知道我们不知道的东西,这就需要我们学会不断的问为什么?以 Java 编程和 OO 为基础:

还有很多,甚至会问为什么会出现 Java 语言?设计模式的作用是什么?为什么它会流行等等,不断的问自己为什么,其实就是一种认知的提升。这种哲学式的思辨,也能树立自身的理论,而不是只会认为:它本来就这样,大家都这么用,我也这么用了。现有的所谓系统化的理论,只是教给你知识,却很少告诉你为什么?很多知识只是告诉你创新的结果,却很少告诉你创新的过程和原始的动力,“凡事就怕问为什么” 系列,我以我的认知水平描述一系列“为什么”背后的规律和初衷,欢迎讨论和批评。

系列一:为什么要定义一个 Method

Java 中的 Method 是传统数学的过程化的概念,它的定义和表现形式不再详述,只是从最原始的角度分析?在我们编程的过程中,定义一个 Method 的场景有哪些,寻找其背后的规律,从而形成自身的理解。

面向对象中,Method 被定义为对象的“行为”,是沿用传统过程化编程的概念,将复杂问题逐步分解的一种编程方式,起到描述业务实现逻辑的作用,既然是描述业务特性,其命名就应以业务概念为基础,相互协作的方式也应遵循业务领域中的逻辑特征。当然,业务逻辑的代码实现过程中,也会存在纯粹的程序化的概念,或者交织的概念,这些概念所产生的 Method 没有固定的标准,其实也就是对纯粹程序化概念的英文命名的习惯而已,可以参考 JDK 的代码或者 Apache 项目的代码。

经过上面三种方式的定义,我们基本可以理解为什么要定义一个方法,以及常见的定义方法的必要性,通俗点讲,就是将问题不断分解,使得每个过程都能清晰描述业务实现。我按我的理解, 再补充几点容易识别的必要性:

总得来说,代码不仅是写给机器执行的,更多的是写给人看了。代码是活着的业务文档,注释是补充说明,更多的是需要可运行的代码说明。上述只是我个人的见解,欢迎补充和挑战。

本人最近在找工作,有合适岗位的可以联系我:微信:braisdom

我的开源项目: https://github.com/braisdom/ObjectiveSql

该文档的确存在推广的嫌疑,但请理解。作为一个开源的作者,总希望更多人知道,我在不断推广的同时,也能体现项目的价值和我对项目的期待,如果项目对大都数人都没有任何意义,相信我也会很快放弃。

6575 次点击
所在节点    程序员
70 条回复
IrisFrankie
2020-12-17 15:42:34 +08:00
。。。
DeepDarkVan
2020-12-17 15:46:12 +08:00
老哥又开始了...........
Braisdom
2020-12-17 15:52:14 +08:00
@IrisFrankie
@DeepDarkVan

感谢你们的回复
darling19961030
2020-12-17 15:53:18 +08:00
老哥又开始了...........
zhazi
2020-12-17 16:05:02 +08:00
问题挺好。但是我面试的时候从来都问我 堆、栈、算法、数据结构、图、树。卷就完了。你聊这些你不怕面试官答不上来吗?
zhazi
2020-12-17 16:07:12 +08:00
另外说一下你的开源项目,现在国内市场讲究攀交情比名气。所以找个好靠山背书(比如阿里的开源)比研究这些见效快
Braisdom
2020-12-17 16:08:22 +08:00
@zhazi 那些都太技术了,多看几次,多试几次都能学会的,都是“术”,正在写过程序的人,有深刻理解的人应该都能回答上面的问题,是否全面就另说了。
l00t
2020-12-17 16:43:59 +08:00
问题提得太烂,打回重来。
Braisdom
2020-12-17 16:49:39 +08:00
@l00t 提提你的想法,贴出来,让我学习,我的目的不是传教,自我我的提升也很重要,
l00t
2020-12-17 17:11:22 +08:00
@Braisdom #9

体系化的知识学习里,一般已经包括了为什么要定义一个 method,为什么要定义个一个 class,interface 之类的东西了,这几乎是本入门教材都有…… 都不用再提。

而 Exception 什么时候 throw 什么时候 catch,日志怎么打之类的,更多的是一个策略,而不是规律或者知识。各人有各人的做法和偏好。
wysnylc
2020-12-17 17:14:43 +08:00
绝了
Braisdom
2020-12-17 17:18:46 +08:00
@l00t
1 )日志打印,异常的处理,后续我会介绍,远远不是个人偏好,期间有经过大量程序员的错误所积累的逻辑和规律。
2 )体系化的知识里只告诉你如何定义?怎么使用?至于为什么也是在大量实践过程中积累的。

个人偏好的确会用不同的方法使用,但背后的经验和规律则大致相同,所有的经验和规律都来自惨痛的经验。

既然你已经提出挑战,我们就讨论一下:“为什么要定义一个 Java Inteface ?”,大家也可以观点...
gyh
2020-12-17 17:43:13 +08:00
楼主的几个帖子都看了,特别佩服楼主冷静开放包容的态度,我觉得讨论就得是这个样子。
l00t
2020-12-17 17:48:49 +08:00
@Braisdom #12 体系化的知识怎么会只告诉你定义呢?难道是看的教材问题?

至于为什么要定义一个 interface,不也是早就写过不知道多少遍了嘛…… 为了分离声明和实现,为了多重继承,为了满足设计者的偏好。
Kirsk
2020-12-17 17:54:38 +08:00
吃瓜 坐等更新 做成知识付费也是可以的
yukong
2020-12-17 17:56:49 +08:00
老哥考虑来蚂蚁吗
fewok
2020-12-17 17:58:52 +08:00
时常问为什么容易陷入价值观。比如,为什么要做 java 的 ORM,而不是更简单更直接更需要强大功能的 golang 的 ORM ??
xuanbg
2020-12-17 18:38:49 +08:00
还是不习惯说“方法”,习惯说“函数”,改不过来……
yule111222
2020-12-17 20:27:54 +08:00
@Braisdom 为了把类具有的某种能力(行为,方法)更高的抽象出来,方便外界调用或者去实现。个人习惯是一个行为现在或者将来有多种实现方式的情况下,大概率就需要定义接口。往后面讲会还涉及到依赖倒置和接口隔离等等,这里不细说。我认为国内的 JAVA 开发对于接口是滥用了,90%的接口可以不写,比如一些业务 service 类,在可以预见的未来根本不会有其他实现,就算有接口八成也要跟着改,根本不需要定义接口。
haosamax
2020-12-17 20:46:17 +08:00
一直疑惑的地方是异常处理,什么时候抛出去,什么时候 catch,不知道怎么选择

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/736407

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX