00:00
我们现在接着对家庭收支记账软件进行下一个的改进,把面向过程这个方法啊,这种方式改成面向对象这种方式,OK,好,我们来看一看。首先呢,我们可以看到,目前我们写的这一个代码实际上是面向过程的,对不对,那么我们怎么把它改成面向对象呢?好,我们来分析一下。这就是我们所说的第四一个改进。来先把我们的代码这一块呢,稍微的整理一下,板述一下。这是第四一个功能。对吧,好,我先说一下自己的思路好不好,我先分析一下这个思路。呃,我们看看这个思路怎么走呢?思路分析。我是这样想的啊,同学们。因为你现在呢,是面向过程的。
01:00
你现在要要把它改成面向对象,是这意思吧,那我们这样子说,我们这样这样思考这个问题,就是干什么呢把。把这个记账,把这个就是。呃,把这个记账软件。记账软件的这个功能,功能,它的所有的功能。封装到。封装到一个结构体中。结构体中,然后然后调用,调用该结构体的方法。就可以了。然后通过调用该结构的方法来实现,来实现这个记账。记账,还有显示明细。明细。以及出呃记记账和显示明细,这样就可以了,对吧,那这个结构体,这个结构的名字呢,我们取个名字,这是第一个,这是第一个思路啊,那结结构体的名字我们取取好。
02:07
结构。结构体的名字,我们把它写成my account。ACC。我看看我这儿取的名字是什么?OK,叫my family account。My family account。对吧,到时间我们这个结构的名字直接就叫family account就可以了啊,这是第一个要说的,第二个呢,我们通过。再通过创建一个在哪里呢?在这个命方法中。们方法中创建一个结构体。注意听啊,结构体,哪个结构体呢?就这个family account结构体的实例。实例,就创建这个结构体的实例,实现实现功能的使用,实现这个记账。
03:02
即。大家看这个意思清楚了没有,就说首先我们把记账。记账的功能,还有显示明细的功能,把它放到一个结构体里面去,能明白这意思吧?肯定要放到结构体面去,然后在main方法里面去干什么呢?调用这个my family account实例就实现这个记账功能就可以了。好,那么我们的代码实现。代码实实现,来,同学们跟上老师思路啊,我们把它完成一把。我们把它完成一把。那首先呢,这些代码不可能存再重新写一遍了,不可能再重新写一遍,老师直接在这个面向过程的基础上进行修改就可以了啊还有一点啊,代码不需要完全重写。代码。代码并不需要。不需要重写。
04:00
啊,只需。只需要重新组织一下就可以了,只需要重新组织一下即可,那么我们现在开始来完成这个案例,打开这个地方好了,我们现在呢,新建一个,干脆我们新建一个这个文件夹好不好?我们新建一个文件夹,这个叫什么呢?我们就叫家庭记账软件family。Five account ACC ACC没问题吧,然后呢,我们在这里建两个文件,一个是me me文件夹。第二个呢,我们把这个结构体,就是那个完成各个功能的结构体呢,我们封装到另外一个文件里面去,叫U,这是个工具。对吧,好,我现在呢,就在这里写我们刚才说的那个结构体名字好不好,我估计我们就叫family。啊,这个叫呃,Account ACC。
05:05
BY。Five me account c go。理解啊,现在呢,我们给他打一个包包,Package us没问题吧,Import。然后呢,我们写这么一个结构体了。呃,Type。Type这个结构体呢,我们就叫什么account。那么这个结构体里面有哪些属性呢?呃,有哪些字段呢先。写啊第声明声明必要的必必要的这些字段,大家想一想这些字段。这些要声明的字段是不是就是这个test my account里面的这些字段,因为你要用的就是这些啊,所以说不用犹豫,也不用彷徨,把这一段代码整个拷贝一下。
06:05
放到哪里去呢?放到我们的这一个结构体里面去就可以了。对吧,当然了,呃,你因为这个地方已经变成字段了,所以说你在这里呢,就不能像这样写了,你得全部改一改。怎么改,这个地方是一个字符串是不是,所以说你在这儿呢,就要写成是最。明白这意思吧,死罪。好的,那这个loop是个布尔类型。对不对,那这样就是字段。能能能理解意思吧,就是你把这些变量就换成字段了。同样这个呢,也是一个字段,它是一个呃,Float类型的,比如说叫。我们把这个balance。改成注意看怎么改的啊,同学们这这块还是比较重要,注意听讲。然后这个是一个也是一个float。
07:03
FLOAT64。没没有问题吧,好,这个地方是一个字符串。是这个地方呢,也是一个布尔类型。那当然这个不叫字段了,叫呃,不叫变量,叫字段了。对不对,收支情况呢,我们也用这个字符串来记录好,这块呢,我们把它改了叫寸。能看懂吧,也就是说这些字段我们现在先先有了,先保存一下。这块看看有没有报错。啊,这边因没有用,没有没有报错,所以说啊报错了,但是一会我们就用这个包里面的方法对不对。好了,那有了这一个结构体过后呢,我们就给这个结构体,给该结构体。结构体编写什么呢?就是绑定,绑定相应的方法,那么我们来分析一下它这里面有哪些方法呢?
08:00
大家看一下我们原先代码,同学们可以看到我们这里面的功能应该有这么一些功能,首先呢,要显示主菜单。是不是应该有显示主菜单这个地方,我们先把这块代码这边看到。我把这块代码整个拷贝。这块其实就是完成一个主菜单的形式,对吧。诶,这块是不是主菜单。For循环嘛。或循环,他要做什么事,我就调用什么方法,是这意思吧,所以说我先呢把这块复制一下,能理解吧,好,开始来做这个工工作,第一个方法是。显示主菜单。看老师思路,Fun。然后呢,我们这写个this给谁绑定呢?给这个类型吧,Family。Account。用一个指针类型的对吧,那么我们写个叫me。
09:00
没,没有。Me nu就是显示这个主菜单,然后呢,写到这里来,这个主菜单它是怎么显示的呢?它是循环显示的,所以说我复制一下。到这来。看到没有,那什么时候,那这里面应该怎么写,同学们是不是还是要这么去写呀。Switch。这些代码。你可以把它拷贝一下。你可以把它拷贝一下,对不对。没有问题吧,这个。应该是没有问题的,For循环是不是还少了一个?啊,这。For循环我们可以看到哦,这个for循环里面有一个这个这个就多了。把它整理一下,注意看啊,这块是大刀阔斧的进行进行这个改进哦。好把整个代码呢,稍微的改一改。好,整体往这边挪一下。
10:04
对吧,整体往这边挪一下,好这个呃,我们可以看到。这块和谁对应啊?和这对应,应该Switch没有没有毛病,整体把这个再挪一下,但是这里面有很多要改变的东西了。首先大家看。这个方法。你就不能。一下写到这里了,因为你这一个主菜单,你像这样用的话显得很不专业,于是乎我们可以把这个收支明细显示,收支明细封装到一个方法里面去,是不是我们可以把。收入登记,收入封装到一个函数里面去,我们可以把支出封装到一个方法里面去,我们可以把退出也封装到一个方法里面去,是不是这样子才是我们面向对象的一种编写方式啊?是不是好,所以说呢,我们的代码应该这样再做一个扩展,怎么扩展请看。
11:04
江。将。什么呢?将显示明细。明细。明细。封装到封装到或者绑定的啊,写成一个函数吧,写成一个方法。是不是这个道理,好,现在你看我怎么改啊,注意看代码,同学们注意听讲。这里呢,我们写个叫受什么呀,Details。没问题吧,受,那这里面的代码其实就是它,于是乎我把它剪切掉。剪掉了,没有剪了。看到。放这儿写完了,那写完以后。写完以后,同学们注意听,你要去调用这个so details是不是非常简单,你只需要用这个this。去调它就可以了,this.so details。
12:01
不就完了吗?你看这个代码显得很简洁了。是不是这个意思啊?能能理解吧,同样的道理,各位朋友,这里的代码是不是用来。这个登记收入的,我也把它减掉。是不减掉了,然后呢,我也把它封装到或者说绑定到这个结构体中,做一个方法叫什么呢,将。登记。注意听登记收入写成一个方法,和谁绑定,和这个my family account这个指针类型绑定,能理解吧,绑定。OK,好,现在呢,我们就来把它绑一绑。斜下方块啊,对面跟上思路,那这块呢,我们就叫income。收入嘛,然后把刚才这一个,诶。这个地方我忘了啊,这块我只能从这边再粘一份了,好吧,理解我把这个复制一下。
13:06
拷贝到咱们这一块去。考不到哪去啊,考不到这里面去,考不到这里面过后同学们想一想。此时此刻我们这个地方调用的时候,是不是就用this.incoming就可以了。是不是又很简单,同样的道理,这个支出是不是也可以绑定到一个方法里面去,是不是好,我们又按照这个方式来进行一个,呃,面向对象的处理。将登记支出。当将登记支出。注意听登记支出也写成一个方法,和这个结构体指针进行一个绑定。没问题吧?好,在这里我写一个方法叫什么呢,叫配。付款吗?付款好付款的话呢,这个方法。
14:00
这块方法呢,就把它拿过来剪切掉。放到哪里去啊,放到这来。大家看我现在正在做这个面向对象的一个改进啊。好,写完了过后,写完了过后,那这个时候我们要调用它的时候。如果用户输入三表示要登记支出,那这个时候怎么办呢?这是顶配完事。对吧,退出一样的,那退出呢,我们也把它绑定成一个方法。好,将退出。退出系统。诶,这个退出啊,退出系统也写成一个方法,写成一个方法对吧,同样和这个my family。指针进行一个绑定。没问题吧,那这块呢,我们再来绑定一下。注意听啊,同学们。好,这里面我直接写个exit退出,然后把这段代码,把哪段代码,把退出的这一段代码的处理逻辑整体。
15:05
捡走,放到我们这个方法里面去,大家看,这才是面向对象哦。也就是说,你实际上是通过一个结构体的方法来实现这些功能的,能理解吧,那这样看起来就比较简洁了。大家体验一下,是不是跟原先比起来,这个代码比以前要简洁很多了,这个写完了,那么写完了过后呢,我们来保存一下,我们看看有很多错误。我们看错误在哪里,我们一个个的看啊,同学们看。首先我们看这里提示了很多错误。他说。Flag没有定义,这是为什么呀?因为你这个flag其实是定义到这个结构体里面的一个字段,因此你在这直接用肯定是用不了的,怎么用啊,我们原先学结构体的时候,老师反复的讲述过,要去调用这个结构体传进来的这一个变量,其实是通过这个变量来调用的,是吧?因此这块应该写什么这点。
16:03
同样,这个地方是不是也是this点?是不是好一保存这地方就没错了。接着往下看,下面的各个变量的使用,或者说叫各个字段的使用也如法炮制。因为你现在用的是这一个。Family account传过这个family account的这个变量里面的,呃,这个结构体变量里面的这个这个字段,所以说要用this来取,因为你这儿名字叫this嘛,如果你要别的名字,那你这就应该是别的名字,能理解吧。好,这点。这样是不是也要调用this,点这边怎么写this,点下面这个东是不是全部都要来一个this啊。表示是对这个船就是调用我这个方法的这个结构体变量里面的字段。这句话说起来很绕很绕啊,我讲课我也觉得很郁闷,因为这个这个你要明白,到时间调用这个incoming的时候,实际上是my family account这个结构体指针的一个变量来调用的,那么我在调用它字段的时候呢,我必须要通过这个变量名来调用,能理解吧。
17:15
这个我相信同学们能理解啊,这是点。全部都要给我加上这个this,同样这也要加this。好,这个写完了过后呢,我们再保存。这块又没有错误了是吧,下面接着来下面呢,这个money this。是不是这是一样的道理?是不是一样的道理啊,This?好,这边也是类似点。This点。好,这地方也是Z点。好,Detail this点。同样这方也像类似。类似点。然后认识点note这个地方也是一样的,保存一下这块又没有错误了,诶这方有个break。
18:01
好了,这个地方就不能用break语句了。为什么这么这个地方不能用break语句了?因为你原先是在一个Switch里面,现在不在了。不在了,那你这样就直接怎么办呢?Return就可以了,因为你在这看啊。你在这调动它的时候,这直接return。呃的话还行对吧。还不,还不能用return。还不能用return。好,我们想一想这个地方怎么处理金额不足,那就那就不用管它,就不用退出它,因为它执行完了过后。执行完了过后,自然就退出这个Switch语句了,所以说这个break呢就不要了就完了。好,不要了,注销就可以了。对吧。好,接着下面这个exit退出,这边也有相应的处理啊,大家看这里面是不是也要写个Z4。Loop。好,同学们看,经过一番改进哦,我们看还有下面还有问题是吧?哦,这也是一样的道理,因为你这个men main u呢,也是和一个结构体指针类型绑定的,所以说这个K呢,它仍然是属于这个this变量里面一个字段,是不是因此呢,咱们这也要写上this。
19:19
这也写Z。好,这一方也要写上Z,好,写完了。好,大家看到这时候代码就没有错误了是吧,那么虽然没有错误了,可是这个结构体呢,我们其实是有可能是一个小写的。那么我不管怎么样,我还是给他提供一个类似构造方法啊,其实是一个工厂模式,我们编写一个工厂。工厂模式的构造方法。构造方法返回,返回一个什么呢?返回一个这样的实例。就是my family的实力。
20:02
啊,当然准确的讲是返回它的这个指针的一个实例更好一点,因为这样呢,我们效率会更加的提高,Bank。好,我写了啊六。有一个什么呀,Family account,大家注意听哈,这地方我写了一个方法,我要干什么呢?我要返回一个这样的实例。这个工厂模式写的,大家还还记得是什么,干什么事的啊,走。然后让他返回一个这样的实例。怎么做?还记得吗?还记得怎么返回?是不是return?我们的一个my family account。初始化一下,大家想一想。这个时候这些变量这些字段是不是没有初始值啊。是不是没有初始值,但是以前我们在写面向过程的时候,是不是这里面都有初始值,看到没有?是不是都有初始值,因此我们在返回这样一个实例的时候呢,也应该给他相应的初始值来完成这个事情。来,同学们,我们一起写写K。
21:09
K的初始值应该是空。第一个搞定,第二个loop。乐普初始值应该是处还记得吧,要搞定我们再来看balance,那balance初始值还记得是多少,是不是1万?好,不要少了一个逗号,我们还有money money这个初始值应该给多少比较合理,0.0。是不是以前也是这么写的,Note note是一个说明对吧,初始值为空串。再来看下一个flag,还记得flag初始值是多少吗?Flag初始值默认force。因为这个这个flag是用来干什么的呀,是用来记录是否有收支行为的,在默认情况下,Flag是没有收支行为,因为他刚刚启用的时候还没有一笔收支,因此这个flag呢,默认为false,最后一个就是details。
22:11
Details初始值是多少?还有印象没有?好,是不是这个值啊。把它给他就可以了,我复制一下。然后呢,放到这里来就OK了。好,同学们,可以看到此时此刻我们已经完成了这一个结构体的所有的封装功能,也就是说现在呢,老师已经完成这个事情了,把记账工软件的功能封装到一个结构体中,然后可以调用该结构的方法来实现记账,显示明细等等。也就是说我把相应的字段。和方法已经跟这个结构体怎么样绑定在一起了,那下面呢,我们要做第二步工作。我们通过这个命方法去创建一个family实例,实现计算功能就可以了。来吧,同学们,首先打开我们这地方,我现在这里呢,写一个文件叫main main.go。
23:13
跟着老师思路啊,到现在呢,我们有个package面包。好,现在呢,我们就写一个主函数。来了,同学们想一想。因为我在这个文件里面要使用。是不是要我要使用到这这个这个方法,因为这个方法才会返回一个my family account,一个指针类型,对不对,因此我首先要把这个包引进来,还记得吧,好,怎么引进来非常的简单。开始引入,引入的时候是从这个src下面开始计计算对吧?Go code怎么写斜杠。然后呢,我们这个项目的名称叫family。
24:01
Account对不对?再来一个斜杠,我要引的是UT这个包包,实际上就是引到这个文件夹对不对,那引到这个文件夹过后呢,我们来提示一句话,我们先看看啊,一句话说。这个这个是面向对象的方式完成。对吧,给他一个提示。那你怎么来完成它呢?大家看我的思路。创建一个。Family account实力实现就可以了,那怎么来实现这个方法呀,非常简单,大家看U里面他不是写了一个方法吗?而且这个方法是一个工厂模式方法。它可以返回一个这样的这样的一个指针类型,对不对,好,我把它复制一下,注意听讲啊。我把它放到这里括起来,请问这时返回的类型是不是就是my family account这个引用。然后我直接。
25:03
调用他的命。他的这个。菜单。显示这个主菜单是不是就可以了。诶,我的那个man没有上哪去了。妹妹又上哪儿去了?There is show details。退出哦,妹妹又在这。好,我把它复制一下,同学们注意听讲。点一下O了。嘿,大家看是不是。我这句话是先创建了一个family account这个结构体的一个指针实例,然后呢,再调用它的main me,这个main main右其实就是这个方法,是不是他就把这个打印出来了,然后在这里面又调用了这一个结构体里面的各个方法。这才是面向对象。大家感感受一下,是不是有点封装的感觉,是不是有点封装的感觉,这个不是乱写的,是不是,大家想一想是不是这个道理。
26:03
从这个地方来看呢,我们其实这个代码更加的清晰了。怎么做的呀,其实说白了就是把我们的字段大家看。把所有的字段封装到一个结构体里面。然后把相应的方法。也给这个结构体进行一个绑定,因为你就是个记账软件嘛,那我把这些方法呢,跟他一个绑定,最后我提供了一个new family account,一个工厂模式的构造方法,然后呢,返回它的一个实例,最后我在main里面去创建了一个这样的实例,再调用它的菜单,完事了。思路非常清晰啊。思路,思路非常清晰。思非常的清晰。对吧,清晰好,那这样子同学们我们来保存一下,看看它能否顺利的运行起来。
27:01
好,代码有问题看哪里哦这帮因为啊,干脆我就不说这句话了吧,哎,说也行。我一个包包。一个包包,来,朋友们来玩一把。现在注意听啊,我们是使用的是什么呀,面向对象的方式来完成的CD。Family account。DR里面是不是有两个文件夹,一个是me,一个是UT包,我进到me这边去DR。里面是不是有一个main.go这个main.go就是刚才老师写的这段代码,现在很简洁了,我们把大量的功能都封装到这一个five account结构体里面了,是不是如果你学过Java的同学就更好的理解了这个特点,如果你是学过Java的同学啊,那就更好的理解这一个封装的特性。那么我们不说废话,我们来运行起来,看看能否。顺利的运行成功。
28:01
抛下。我们可以看到没有任何问题,而且同学们可以看到目前用的就是刚才老师写的代码,是面向对象的方式完成的,来吧,我们玩一把,首先输一个一。完全没问题。他说,当前没有收支明细,来一笔吧,我们来登记一笔收入。100块。工资。好,我们再来说一下,我们可以看到入账了,那现在呢,我们来登记一个支出。好,这次呢,我花了90块钱干什么呢,看电影。好,看电影回车,好,我们再来支出一下,可以看到看电影花了90块钱也没有问题。那么这时呢,我们再来演示一个退出。也就是说明细收入和支出都没问题。我们来看。退出软件,你看是否要退出啊,我瞎输一个。O。
29:00
他说你的输入有误,请重新输入。好,我们再来输一个N。是不是不退出啊,又打印出这个主菜单,我们这次真的退出Y退出成功。大家看到没有,退出成功了,好,那经过这段代码,大家应该可以看到,我们这一个把面向过程改成面向对象还是非常顺利的,从这地方我们可以体验到面向对象的一种好处。面向对象有什么好处啊,你看原先的代码。都写到一个main方法里面的,看你看main方法很乱。说老师这个也不算很乱呀,思路还是很清晰,对,如果说炸开一眼的话,其实你也不不觉得很乱,这是因为我们目前这个功能很简单,如果这个功能越来越复杂,你你想想,你可能把所有的方法都封装到一个面。都把所有的功能都放到一个main main方法里面去吗?不现实。
30:00
但是我们反观我们这个面向对象,你看啊,我们这个面里面其实就是创建了一个这样的结构体实例。然后呢,调用它主塞呢,完事了,而把所有的功能封装到了这个结构体里面去看。结构体里面有有字段,结构体里面有相应的方法,非常清晰。非常清晰,要改起来呢,也比较容易,对不对?你看最后我们留在这个主菜单,你看思路很清晰的,如果输一,我就调用这个方法,如果输二,我就调用incoming方法,如果数三调用配方法,以此类推。所以说如果同学们认真听讲的话呢,你会感觉到面向对象的方式仍然是比面向过程方式要方便,这是第一点,第二点从这个项目开发这个分工来看呢,我们面向对象也很方便,你看如果是我有五个人来写这个代码,我可以。
31:00
分配,我可以把这个功能分成好几个结构体,对吧,我让每一个人去写一个结构体,然后呢,到时候我在主函数里面去根据实际情况来完成一个调用就完事了。对吧,他这个也利于我们的。合作完成一个项目。开发项目的功能呢,开开发项目的效率呢,也会大大的提高。好,同学们,那现在呢,代码我们就说完了,同学们看看理解了没有啊,理解了没有啊好,那现在呢,我把这个代码给大家稍微的整理一下,首先我们这样写的啊,同学们跟着跟着老师入,首先我们在我们写了一个项目叫family。里边呢米对吧,Account。我们写了一个mean包,里面有个mean.go是不是这个这个文件啊,这个文件我们写了这么一段代码。就写了这么一个东西。很简单一个代码。
32:00
对吧,其实大量的工作呢,是由他来完成的。我把它放到这里来。这大家大家应该能看懂,紧接着我们完成了一个最核心的功能,是还是在这个,还是在这个包包下面。对吧。诶,我把它粘贴一下。在这里呢,我有一个。这个文件夹叫什么呀?叫U里面呢,我写了一个family。Family account。点购对吧,这个文件,那这个文件里面我们写了什么东西,打开来看一下。是不是就写了这么多东西啊?是不是把它全部封装起来了,然后呢,通过一个主菜单调用起来的,好,因为代码比较多,老师就抽一个来啊,我把它复制一下。直接放到我们的一个这个表格里面去完事。好。大家看看理解了没有,如果认真观察的同学,你们会发现我只有这个地方是大写的,看到没有?
33:07
同学们注意发现没有,方法里边这个M是大写的其他方法。大家看。退出。还有配。还有。Incoming,我都是小写的,这样呢,也体现出封装的特性。也体现出一种封装的特性,对吧,好了同学们,到现在为止呢,我们就把这个项目就是哪一个呀,就是家庭收支记账软件,从无到有。写完了同时呢,我们又把它由面向过程修改成了面向对象,这一点希望大家好好的体会和完好好的体验一下啊,好好的走一走,那代码呢,我们已经放到笔记里面去了,我希望同学们在听完老师这一个项目之后呢,自己能够独立的完成。这个代码自己能够独立的完成啊,你可以在上面再加一点功能,再加一些功能,比如说老师这儿只有一个收入和支支出啊,同时你们也可以加点转账功能,比如说老师,诶,我现在给大家一个布置,布置一个任务,你完成一个转账。
34:14
你看你怎么去设计,比如说我们能够把我们这个账号加一个账号转给另外一个账号,大家能不能完成这个功能呢?对吧,我做一个课后的一个设计啊。对项目的扩展功能。功能的一个练习说明,希望同学们在课后呢能够把这个完成。哪些功能第一个。完成一个转账功能。对,这个家庭。对上面的项目完成一个转账。转账功能。转账。之按照啊转账功能,这是第一个。
35:00
那么第二个呢,大家看到没有,我每次在用的时候,其实根本就没有登录就用了,这个呢也很危险,所以说呢,如果你给我再加一个功能,就是输入一个用户名和密码,才能去使用我们这个记账软件,这个功能呢,也也让同学们呢去完成一下,就是在。使用该软件前。有一个登录的功能。只有输入,只有输入了正确的用户名和密码才能操作。密码才能才能操作。啊,那你想一想怎么去完成。你去想想怎么去完成。那肯定说你先上来过后先给他提示一下,请输入用户名,再输入密码。把用户名和密码拿到过后,通过验证。通过验证,如果用户名和密码正确,我们才让他去使用这个软件,能理解这意思吧?大家把这个功能给我扩展一下好了,同学们,那关于我们这个家庭收支记账软件一个。
36:11
比较综合的案例呢,我们就给大家讲到这里,课后同学们争取把这两个功能给我完成了,好。关于这一讲,我们就先给同学们介绍到这里。
我来说两句