美文网首页每日更100字
编程 || 面向对象

编程 || 面向对象

作者: 快语 | 来源:发表于2022-04-15 14:36 被阅读0次

这是系列文章第四篇。

回顾

截止今天,我们已经学了三门课。核心的内容——“解决问题”思维。具体的内容——网络规划。本质的内容——信息是什么。

网状知识

我曾经认为知识是树状组织的,但其实更是一个图状的。我们花了大量的力气去印象笔记等软件里试图将所学组成一个树结构,但发现耗费了大量的精力,真正内化在心中的其实不多。

注意力内化

我回想起高中学习的时候,物理老师很喜欢写板书,每次都密密麻麻写一大堆。他的要求是大家要记笔记,把板书都抄下来。但我是一个从来不记笔记的人,更可怕的是我还是物理课代表。我尽管在习惯上没有按照他的要求来,而我实际上的物理成绩是班级第一的。这我觉得背后有一个很深刻的洞察。就是你花了多少时间是不重要,花了多少注意力去内化,才是最重要的。

钉刨精神

所以我会依次讲我认为价值程度最高的内容。
其实学习的过程里,除了“钉子精神”,还要“刨子精神”。对于计算机这样复杂的学科,这样子学也许更持久。当然,更可能的方式是“钉刨精神”,两者合在一起作为你的心法。其实解决问题思维的以终为始,大前提也是要我们对世界有足够了解,如果缺少足够广度的知识面,我们也不知道要去解决什么问题。

面向对象

现在我们进入正题,什么是面向对象。
为什么我认为这个非常重要,因为我见到大量的同学写了多年的Java代码后,依然会写出非常冗余和混乱的代码。
有时候我其实会觉得,这怪不了同学们,冗余和混乱,很多是编程语言的语法层面带来的。
面向对象最重要的思想是“封装”,与之伴随的几个关键词有,模块化,接口,抽象,SOC,契约。

封装的重要性

现实生活中,我们就无处不存在封装。你去买咖啡,你付钱,拿到咖啡。咖啡背后的所有流程你都不需要知道,它可能来自云南的某片咖啡林,经过了播种,灌溉,收割,经过了运输,经过了咖啡店内部的一些处理,最终成型。你不用管这些,只要付钱拿咖啡即可。这就是封装。
只有封装,才可以处理好复杂度。用面向对象的思维来理解,那么你和咖啡师的交互过程中,你和咖啡师都是“对象”。
再进一步,你需要直接和咖啡师交互吗?其实不一定的。一家咖啡店,如果有多个咖啡师,那么,实际情况是你和这个咖啡店的任意一名咖啡师在交互。所以我们要额外创造一个“咖啡店”对象。此时,你不是在和咖啡师交互,而是和咖啡店交互。这又是一次“封装”。
我一直觉得面向对象编程,和写文章非常像。因为其中是无数概念的交织。如果是文章写的逻辑清楚,那么编程也会逻辑清楚。尽管世界上的知识是图状的,甚至写文章也有可能带有一部分图的特征,但面对编程这种天然就难以理解的事务的时候,必须要是树状的。如此才好降低复杂度。当然,我所说“编程树状”,这也是一种最佳实践。

继承、多态

继承是面向对象中的重要特性,但实际上我觉得也不是那么重要,反而还带来了一些复杂度。在初次理解的时候,就可以丢掉继承。甚至写代码的时候,也无需继承。你90%的工作就是写crud,当你写crud的时候,90%的情况下,其实也不需要继承。没有继承,也就几乎没有多态。要继承,就要考虑里氏替换原则。
实际上这个原则是很抽象的,而且也只是一种最佳实践。里氏替换是说,出现父类地方,也要能用你的子类去完全替换。但是,怎么理解呢?比如父类是鸟,子类是鸵鸟。那鸟出现的地方,就一定能用鸵鸟去替换吗?
想的具体一点,鸟会吃喝拉撒,鸵鸟会吃喝拉撒,那没有问题。但是鸟会飞,鸵鸟却不会飞。这是一个现实世界中就存在的一个冷知识,不是那么容易想到。我们知道程序是对现实世界的模拟,那么现实世界就有bug的话,程序世界模拟现实世界,自然也会有bug。这就是我们遵循里氏替换的难度。子类有可能实现不了父类的功能。
里氏替换的另一个问题是,子类如果超出父类的行为,那是否真的合理?我们知道子类继承后,存在重写能力,父类的功能被重写,那么首先按照里氏替换,我把父类原有功能实现,但是又额外加了一部分功能。这时候,是符合还是不符合?多做了一部分的事情,算是限制了父类的功能,还是扩展了父类的功能?这都很难评判。除非你放弃重写,只去增加新的方法。但是,这个时候,场景类中就无法使用父类了。更别说同一个父类,还有多个子类。子类,也可以有子类。当一个事情的逻辑特别复杂,它就很可能不靠谱。
所以,我认为成为高手的核心要素是成事,而不是内卷。对于继承,你选择一个自己的最佳实践,去使用。你可以遵循里氏替换,也可以不遵循里氏替换,更重要的,是你知道自己在做什么。
那你会说,老板会说啊,没遵规范啊。试想一份几十页的阿里代码规约,真正能参考这个去实操的,又有几人?在职场中,责权利是比规范更重要的原则。由你来维护系统,那么,底线是你写的清晰易懂,至于是否无限使用继承,并不核心。
如果我来确定一个最佳实践,如果我们仍要坚持里氏替换,那么,“继承”可以保留,“重写”的特性应该去除。子类中可以新增方法,子类可以复用父类的方法。并且我们非常确定,子类的和父类的同名方法,一定是有相同的行为。从而,我们明白,且践行了里氏替换。否则,还不如不遵行任何原则。
另外,还有句经典的话说的,要“合成不要继承。”如果你不理解继承,你索性扔掉继承。当然了,如果你能用好继承,那自然是更好的,它还是能为你提供大量的帮助。

接口

接口不是继承,目的可以说完全不一样。实际上我认为接口是需要的,而继承是不需要的。接口对应的是“实现”。
如果我们加上一条,实现接口的类,不可再被实现。这就非常地清爽。于是就是非常清爽的1对多的关系。
实际上我认为实现多接口的类,也不该存在。我们始终强调,一个类应该就做一件事,但你从语法层面就放开了一个类可以实现多个接口,一个接口也可以继承多个接口,这又是混乱的源头。
我们看大名鼎鼎的Spring,要我说,简直是代码简洁之道的反面。谁要去学着Spring的风格去学编程,可能5年都不会有大的进步。当然,Spring还是非常好的,我认为对于Spring的态度就是运用,用好了,比什么都好。

总结

面向对象非常重要,编程中你需要细细体会,并且可能需要在学习大量的源码之后,才会体会到它的价值所在。而且这是一个一旦学会,就会内化于心的功夫。不像是徒手写一个动态代理、徒手写一个单例,这个完全可以自己收集好,用的时候拿出来嘛。
我们要通过实例,学习它背后的道。学到了道,在工作中遇到具体场景,在寻找它的实例。如此,你才会学得更多的道,以及道上之道。否则,我们就会陷在五颜六色的具象世界里找不到出路。
除了编程以外,面向对象对于管理也非常的有价值,其价值就在于权责利的界定方法论。这个方法论是没有既定之法,需要你不断去思考,去辩证,去批判,去抽象,去封装,去调试。大家都知道公司要财务、要人事,都是行业最佳实践,所以定这样的岗位根本没什么复杂度,是老板靠这些岗位在滋养。但是对于业务部门,尤其是一件创新性的事情,如何去抽象,定岗,定人,定组,这就要用到面向对象思维了。这也是复杂度和价值所在。但优秀的程序员天然就有这样的优势,因为做了十几年这样的事情。所以技术出身,逻辑性上都是好的,有非常多优秀的企业家,都是技术出身。甚至任正非当时就说,接班人一定是技术背景,当然,后来的故事大家可能也知道,不过足够让我们理解其想法。不过技术出身的管理者,也会有他的问题,这个以后再说。

荐书

《冒号课堂》用问答的形式,启发式地让你理解。市面上大多数书是把知识放在那儿,而不曾想撕开一条口子,让知识灌入。能带来思考的书,比单纯放在那儿的书,更有价值。

相关文章

  • 面向对象_初识

    目录 面向对象编程介绍 类与对象介绍 私有属性与私有方法 面向对象编程 1. 面向对象编程介绍 面向对象编程:Ob...

  • 谈谈面向对象编程

    何为面向对象编程 面向对象编程简介 面向对象编程(Object-oriented Programming,缩写:O...

  • 面向对象基础

    面向对象编程包括: 面向对象的分析(OOA) 面向对象的设计(OOD) 面向对象的编程实现(OOP) 面向对象思想...

  • python-day14

    一、面向对象编程 编程思想:1.面向对象编程 --> 算法,逻辑2.函数式编程 --> 函数3.面向对象编程 ...

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • PHP全栈学习笔记8

    面向对象的基本概念,面向对象编程,oop,面向对象,面向对象的分析,面向对象的设计,面向对象的编程,什么是类。 类...

  • 面向对象浅析

    ### 面向对象编程和面向对象编程语言 面向对象编程的英文缩写是 OOP,全称是 Object Oriented ...

  • 2017-08-14

    面向对象编程用对象的思想去写代码,就是面向对象编程-面向过程-面向对象面向对象编程的特点1.抽象 抽取一样的东西...

  • 面向对象编程,类和对象

    面向对象编程 Java是面向对象的一门编程语言,所以余姚使用者具备面向对象编程的思想。 那么,什么是面向对象编程呢...

  • Swift和OC的区别

    一、编程范式 Swift可以面向协议编程、面向函数编程、面向对象编程。 OC主要是面向对象编程。 二、类型安全 S...

网友评论

    本文标题:编程 || 面向对象

    本文链接:https://www.haomeiwen.com/subject/wjgfertx.html