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

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

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

6594 次点击
所在节点    程序员
70 条回复
laminux29
2020-12-18 01:21:41 +08:00
@Kasumi20 如果嫌弃老师讲的不好,可以自学,可以找别的老师问。

就算所有老师都答不出来,可以问谷歌。

有些东西,比如 64k 的仿 CS 游戏,比如 12306 架构问题,去问老师,的确有些为难他们了,但绝大部分基础问题,一个学校里的计算机学院,总会有老师知道答案。
l00t
2020-12-18 08:43:12 +08:00
@Braisdom #23 你这样的描述和抽象类有什么区别?你搞个抽象类也可以套上这一二三。当你要引入一个 interface 的概念的时候,你得指出它的特有之处,而不是共性。甚至我不 OO,我就面向过程,搞个头文件,一样能套这一二三。

我还是那句话,体系化的学习已经包含了你提的这些问题。
DeepDarkVan
2020-12-18 09:26:59 +08:00
老哥带带我吧
Braisdom
2020-12-18 10:11:34 +08:00
@l00t 至少三个编程概念是已经得到共识的,你翻看 JDK 的源码,或者 Apache 顶级项目的源码,基本都能看到。

1 )对依赖的封装,2 )对依赖的约束,3 )对整体规范的定义

一项知识讲的太抽象,太空洞,能解释一切,其实你也什么解释不了,真正需要学习的知识是具体的,实际的,可验证的,这样才能对实际的工作有指导意义,否则讲太多理论,等于什么也没讲
Braisdom
2020-12-18 10:18:16 +08:00
@l00t 这三个只是接口的基本使用方法,也是能够很好解决为什么使用接口的规则,但不是强制规则,依赖的方式可以是一个抽象类,也可以是一个接口,但相比而言接口更合理。

至于过程化编程语言和面向对象的编程语言的差异,那是另一个话题,别总剧透呀。
l00t
2020-12-18 10:58:47 +08:00
@Braisdom #44 我再重复一遍…… 当你引入一个概念的时候,你得指出它的特有之处,而不是共性。如果它没有独特之处,那它有什么存在必要呢?

Java 为什么要搞出个 interface, 这要真是个题,那么最大的得分点只会在多重继承上。而这个点,也是几乎所有教材都会提到的内容,并不需要自己瞎琢磨。

我一路看下来,你的思路似乎都是顺毛撸,看到一个东西,啊怎么好怎么好,符合什么什么;但是计算机程序语言的问题大多时候更多的是个取舍问题。要达到一个目的,可以 A 可以 B 可以 C,为什么用 A 不用 B 不用 C,ABC 各有什么优缺点,选择用 A 而不用 B 或者 C 是个好的决策还是不好的决策,这个好或者不好的判断是基于什么而言。这些问题才更能抓住本质。而这些问题读一下各个特性引入时设计者自己的说明、语言的演变历史之类的可以解决很大一部分,剩下的才需要自己思考,想想他们说的对不对,有没有别的他们没考虑到的地方。
Braisdom
2020-12-18 11:04:47 +08:00
@l00t 你的问题很好啊,Java 为什么要设计 Interface? 是一个可以探究的问题,需要研究历史,和最初的设计思想,以及当初所面临的背景问题。

我讨论的是为什么要用 Interface,而不是为什么要设计一个 Interface,如果没有 Interface 又是一个什么样的编程方式?那是另一个话题。

我是以实践为基础,讨论 Interface 在我们的实际工作中到底应该怎么用?寻找不同 Case 之间的规律,提出指导建议。过于抽象的理论对实际工作基本没有什么作用,也就是现有的知识传授体系和书籍的通病。
Braisdom
2020-12-18 11:11:54 +08:00
@l00t 首先,要先明白为什么会出现软件设计这一个管理过程?它的目的是什么?它主要解决了什么问题?

要达到一个目的有很多种可选择的方案,但不同程序员选择方案的规律是什么?背后的原因又是什么?而不是简单讨论优缺点。

我总结出的是规律,就像为什么要定义一个方法一下,我不仅会阐述不程序员选择的规律,而且还会解释背后的原理。Java 接口的使用是一个很大的话题,不是在讨论区中能够讨论清楚的。我只是抛砖引玉。
bjhc
2020-12-18 11:12:14 +08:00
老哥又开始了。。。
hello158
2020-12-18 11:30:59 +08:00
我觉得楼主提的问题非常好,别的问题不说,就说 Exception 的问题,太多人没能用好,胡乱 throw,胡乱 catch 。
xrr2016
2020-12-18 11:46:57 +08:00
赞一个
cian
2020-12-18 11:56:00 +08:00
你草率了
huZhao
2020-12-18 12:05:29 +08:00
虽然我可能用不到楼主的开源库,但是这种分享精神,赞一下,老哥也可以关注一下 我的微信公众号 《独立自由职业者》,我也是爱折腾,爱分享的。可以看到一些干货。当然也期望有更多的读者能给予提高认知。
l00t
2020-12-18 12:16:40 +08:00
@hello158 #50 这个问题是需要琢磨,但是背后并没有什么“规律”和“原理”需要去发现,而是需要总结出一套适合自己实际情况的并且自己喜欢的异常处理机制。这套机制因人而异。
l00t
2020-12-18 12:39:19 +08:00
@Braisdom #48 这不是规律,也不是原理…… 你是不是对规律和原理两个词有误解?我为了实现某个需求,制造了一个工具,你跟我说这个需求是工具的规律??代步是汽车的规律吗?
xcstream
2020-12-18 12:51:12 +08:00
为什么要定义一个 Method 因为 java 不让直接定义一个 function
Braisdom
2020-12-18 13:15:06 +08:00
@l00t “怎么用”,“如何用”是现象,的确会因人而异,但不同人之间使用同样的方式处理问题,背后是存在一定的规律,你可以看看 Apache 里的顶级项目,里面有很多共性,这些是我们去寻找的规律,为什么他们用同样的方式去解决问题,背后的原因是什么?

其它用什么样的名词本身不重要,没必要纠结名词的定义,挖掘背后隐藏的东西,能够指导我们进行工作,这件事有意义就可以。
besscroft
2020-12-18 13:15:32 +08:00
支持一波
Braisdom
2020-12-18 13:25:29 +08:00
@l00t 整理出来的异常处理机制是基础的规范定义,但规范就是规范,相对较为死板,但实际的情况总是多变的,不能一刀切的形式去解决问题。规范的定义只能给出抽象的指导意义,遇到实际问题时,很难套着规范就能做的。只有真正理解了 Exception 的基本原理,整理前辈们在异常处理时遇到的各种问题,理出其中的共性和规律,这样才能用好异常。

如果我用一句话表达我的观点就是:“所谓的规律和规范均来自于前辈们的错误和惨痛的实践,我们要做的就是把它们整理出来,用通俗的语言表达出来。”
GoLand
2020-12-18 13:25:30 +08:00
我还以为 APIJson 那哥们呢,当年那哥们推广起来也是真狠啊,无论在哪儿评论都要留下一个 APIJson 的推广。

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

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

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

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

© 2021 V2EX