前言
面向对象是我们开发过程中必不可少也绕不开的一个环节,他的应用并不难,但是设计好一个面向对象需要一定的总结和思考。根据我长久以来的学习,对于我这种理解能力不突出的人来说,长篇大论讲专属名词的文章对于初学阶段的我很不友好,在之前很长一段时间中我只停留在会用上,并没有理解他的本质。
所以本文就是为了解决这个问题,尽可能用大白话的方式讲清楚让你后续开发能够能面对业务更好的设计他。
现状
在接触很多的朋友或者同事,问他们什么是面向对象,他们第一反应就是** 语言学过,** 语言定义一个类,定义一个方法,找出他们共同的东西进行 "抽象"。
我相信对于初学阶段的很多同学都会这样回答,这样回答是对的,也是他的实际应用,也能够胜任开发工作。但是他并不是很好的回答,如果你这样回答我认为你只停留在他的表象 ,没有深入理解他的本质。面向对象并不是定义一个类使用他这么简单的,这对于编码者来说够用,但是他真的太简单了,实现一个类只要有基础的思维逻辑的稍加训练就能做的很好。
但是对于设计一个好的类,能够让你开发工作更加得心应手的类是很困难的,也是程序员的第一个分水岭。
编程语言和面向对象的关系
想编写好的一个程序代码,第一个概念就是知道编程语言的作用,没有比这个指导思想还要重要了。
程序语言就是现实世界与计算机之间的桥梁 原谅我忘记出处。
只要理解了这一点,离编写好一个好的面向对象代码就已经迈出一大步了。为什么这么说呢?
实际上编程语言就是把你所看到的所想的,用编程语言告诉给机器,通过这个桥梁让他知道你的所思所想,这个道理很简单,但是编写的时候总是会忽略掉。
找到本质,也就是说我们只要能够用现实生活中的语言,描述好一个东西,先不管他代码怎么写,首先你必须得能够用常用的母语描述清楚,再将母语转换成编程语言那么他就是一个面向对象编程。
这里给以前爱钻牛角尖的我来说明一下,为什么一定要用编程语言作为桥梁。首先计算机其实很笨的,他只能看的懂0和1,用编程语言可以解析成二进制码,因为二进制也是01的数据,所以计算机能够看得懂。如果你有其他方式可以让计算机看得懂,那么他可以不是编程语言,可以是你自己找到的东西,前提是计算机能够明白即可。
用中文编写面向对象
理论说完,我们进行实践,我的母语是中文,以下就是用中文来编写面向对象。
用中文那就是做语言的阅读理解。
小米宣布造车是在2021年3月,那么他们造一台车需要做的准备将会是什么?我不知道随便猜猜呗~
- 小米是想做一个四个轮子的车,所以他必须得有四个轮子,四个轮子我先简称为小轿车
- 小轿车应该有主驾驶,有主驾驶的安全带、方向盘、仪表盘、油门、刹车、换挡把手、窗户
- 小轿车应该有副驾驶,有安全带、窗户
- 小轿车应该有后排座位,他们都应该有安全带,同时后排作为只能容纳三个人否则会超载。
- 小轿车应该 电池、电机、电控,通过某种方式把动力传输给轮子使其动起来。
以上就是一时间能想到关于电动汽车的东西,但是他只是电动汽车而不是小米汽车,以上他只能算一台车,并不是小米汽车噢。
继承和多态的中文体现
真正的小米汽车是在此基础上优化他(就是上面罗列的内容)。
例如:
- 外观设计,他们可以设计成保时捷
- 主驾驶可以配合AI智能,座椅可以采用飞行员座椅
- 方向盘可以设计成 键盘的上下左右、wasd键
- ...
这个编程语言叫继承和多态的应用。实际上就是我们能够用语言完全能讲清楚的东西。只要你能够讲清楚这些东西,你就能设计出面向对象的抽象类 (小轿车应该有的功能)和实现类(小米汽车)
中文面向对象转编程语言
我们根据上述定义去写一个抽象类,这和语言没有任何关系,完全可以采用chatgpt来帮我们实现。
golang
package main
import "fmt"
// 定义一个小轿车接口
type SedanCar interface {
// 获取主驾驶座位信息
GetDriverSeat() DriverSeat
// 获取副驾驶座位信息
GetPassengerSeat() PassengerSeat
// 获取后排座位信息
GetRearSeats() []RearSeat
// 启动汽车
Start()
}
// 主驾驶座位
type DriverSeat interface {
GetSafetyBelt() string
GetSteeringWheel() string
GetDashboard() string
GetAccelerator() string
GetBrake() string
GetGearShift() string
GetWindow() string
}
// 副驾驶座位
type PassengerSeat interface {
GetSafetyBelt() string
GetWindow() string
}
// 后排座位
type RearSeat interface {
GetSafetyBelt() string
}
// 具体的小轿车类型
type ElectricSedan struct {
Battery string
Motor string
Control string
}
func (car ElectricSedan) Start() {
fmt.Println("Electric car starts.")
// 实现启动逻辑
}
func (car ElectricSedan) GetDriverSeat() DriverSeat {
// 实现获取主驾驶座位的逻辑
return nil
}
func (car ElectricSedan) GetPassengerSeat() PassengerSeat {
// 实现获取副驾驶座位的逻辑
return nil
}
func (car ElectricSedan) GetRearSeats() []RearSeat {
// 实现获取后排座位的逻辑
return nil
}
func main() {
// 创建一个电动小轿车实例
electricCar := ElectricSedan{
Battery: "Lithium-ion",
Motor: "Electric",
Control: "ECU",
}
// 启动电动小轿车
electricCar.Start()
}
如何去实现一个小米汽车,这就是面向对象的封装继承多态了呀!
代码我就不贴了,你有gpt或者文心一言就能实现,你只需要去修改他的类名之类的,你只要中文描述清楚,gpt就能帮你解决问题。
总结
其实本文省流版本就是,用中文描述你要实现的类。
我说的很多都是为此铺垫和实战应用,当你采用这个方法,你去描述的过程你就能理解这个东西怎么去设计更合适,这个东西究竟是不是属于这个类,这样单一职责的指导思想也是悄无声息的完成了。
这个方法和语言没有任何关系!!!你完全可以让gpt写PHP、Java、Python、C++等代码,他只是桥梁,完全可以是木桥、石桥、什么桥都行管他呢~~~