• 面向对象程序设计学习日记


    面向对象程序设计学习日记

    持续更新(可能),更新时间不限,催更不管,腰斩就跑(逃~)


    Date:2018.5.1(Elevator_V1.1)

    前言

    五一节每年都过得相当委屈,全国劳动者放假,学生虽然跟着放假却因为劳动者都不足,不少服务不是暂停就是加价,所以放假也只能老实呆在家里宅着。
    但是!今年五一节是我这一生过得最憋屈的一次,QQ列表里的人几乎全去玩了,就我一个没人约,孤独的宅在家里刷空间??然而打开空间就又是一股满满的现充之风铺面而来,还给不给死宅留条活路了(心碎.jpg)。
    五一没人约,B站UP主们也放假视频也没更新,在家闲着没事,想起自己的代码各种无意义的变量名乱飞,类成员权限凌乱不堪,是时候静下心重构自己的代码了。

    变量名命名规范

    重构之前,首先就先把自己凌乱不堪的变量名改了。由于高中竞赛那会儿留下的坏毛病,什么变量都是想到就定义,管他最后有用没用先定义了再说。这显然是不符合编写大型工程的。于是在网上我找了找相关的C++编码规范,找到了这么一篇规范指南:

    (Google开源项目风格指南)[http://zh-google-styleguide.readthedocs.io/en/latest/contents/]

    指南中指出,变量名的命名应该遵循易于理解变量存储的数据的意义,尤其在合作编程的过程中,一个简单明了的变量能使合作伙伴更快的了解变量在一段代码中的作用,事半功倍。
    于是就照着它所介绍的命名规范(驼峰法)开始了艰辛的修改历程。

    类成员管理

    依照封装原则,重构的第一步就是先把所有成员变量私有化。封装的好处有很多,浅显一点就是防止用户在访问的时候修改成员变量的值,也可以让一些内部成员变量不公开。总之,C++类建议我们私有化成员,公开接口保证成员与外界的联系,我便照着这条路径开始重构。
    然而,成员私有化,才是这次重构噩梦的开端。,当我将“public“改为“private“的一刹那,VS code便提示我竟然有99+error。。。看来接下来的过程并不好走啊。。
      
    首先,之前我将电梯分为三个模块——Time(时间)、Floot(楼层)、People(乘客),时间模块管理时间信息,楼层模块管理运行信息,乘客模块管理乘客数量,分块管理数据。
      
    接下来,以最简单的修改方案为例,留下"r_x"和"w_x"作为访问x成员变量的基础接口——r:读取数据,w:修改数据。这样,基本的数据接口就完成了,外部访问时,就调用r_x()成员函数,而如果要修改某一值,就调用w_x()成员函数。
    但是,这样的接口显然不能满足大量的数据交换,于是下一步便是将可能需要实现的步骤以成员函数进行整合,比如电梯到达后需要更新时间、楼层、人数,那么直接调用arrive()成员函数即可,这样可以简化接口,并且可以封装个别数据不允许用户单独修改,防止错误的修改操作。
      
    OK,电梯成员成功封装。然后我考虑到,我是利用dfs作为我的策略算法进行运行决策,而调用dfs之前先经过一个主要的主函数进行预处理,以及在dfs时也会调用决策函数plan(),因此我并不想让外界直接调用dfs()和plan()函数。这么一来,我想到可以建立一个class Run来封装策略函数,保留总调度函数作为接口,这样外界就只能调度这个开放的接口了。

    通过以上四步重构,我自认为封装性做到了比较好的效果,因此类管理重构便到此结束。
    类图:

    总结

    我自以为自己的代码已经做到了一半的面向对象的编程习惯了,然而向@Stolf一番请教后被指出:

    你只是学了语法,没有学到思想。这个程序还是没能脱离面向过程的编程风格,一点面向对象的点都没抓到

    由于我之前写的代码完全是依照面向过程进行编程,而且因为我懒,所以也没有直接推掉原来的代码重构,这导致了这次的重构是不完全的重构,甚至说不上是重构代码。因此,它确实没能脱离面向过程的牢笼。虽然是一个几乎失败的工程,但是作为初次个人理解面向对象并试水的过程,从中学到了不少东西。看来得找个时间完全重构一波了啊。
    留下Stolf大佬的一句名言:

    用心去学,学会很快的。看看别人的源代码,自己学着写写小工程,你每一个失败的工程都能使你收获很多。——@Stolf


    To Be Continue(?)

  • 相关阅读:
    Beyond Compare 4 使用30天后过期续用方法
    cookie和Session是啥?
    如何添加博客园访问次数统计
    获取DataFrame列名的3种方法
    GET与POST方法和用curl命令执行
    Series拼接回DataFrame
    pandas.to_json&to_dict&from_json&from_dict解读
    Mysql判断是否某个字符串在某字符串字段的4种方法
    alias 命令
    python中的pyc和pyo文件和__pyc__文件夹
  • 原文地址:https://www.cnblogs.com/Ace-Monster/p/8990705.html
Copyright © 2020-2023  润新知