zoukankan      html  css  js  c++  java
  • 重新思考面向过程与面向对象

    博客:blog.shinelee.me | 博客园 | CSDN

    面向过程与面向对象的思考方式

    面向过程面向对象的差异主要体现在思考方式上,面对同样一个任务,

    面向过程的思考方式,首先想的是一步步该怎么做

    • 对任务进行分解,先干什么后干什么,划分成不同阶段的子任务
    • 对每个阶段的子任务进一步分解,形成函数,根据输入输出将所需数据整理为数据结构
    • 将任务串接起来,完成总任务
    • 重构,将重复工作抽象成单独的函数
    • 复用的单元是函数

    面向对象的思考方式,首先想的是任务中利益相关方都有谁

    • 找到任务中的所有利益相关方,并对其归类
    • 确定每个利益相关方类别的属性,并划分责任和义务,定义出行为,抽象出类别
    • 对类进行实例化,实例间相互协作配合完成任务
    • 重构,疏理类别之间的关系,将共有部分抽离成基础类,其他类从基础类继承而来
    • 复用的单元是类

    如果以开公司为例的话:

    面向过程的思考方式是,要采购原材料、生产产品、卖产品、管理入账出账,因此需要生产人员、销售人员、财务等,将他们串起来,公司就运转起来了。

    面向对象的思考方式是,公司要分为生产部门、销售部门、财务等,分别有各自的职责,生产的要记录生产数据、接收原材料、产出产品,销售的要记录销量、卖出产品……

    面向过程的思考方式偏逻辑、偏动作、偏执行,更符合人类的思考方式,像员工视角,把人做事的步骤函数化代码化

    面向对象的思考方式偏抽象、偏数据、偏象形,像上帝模式,像老板视角,各个利益相关方仿佛具有了生命,它们之间通过相互配合完成任务

    在我看来,思考方式是面向过程与面向对象的最大差异,而不在于多态等语言特性。

    面向过程与面向对象的联系

    面向过程 和 面向对象并不是对立的。在问题复杂后,面向过程也会模块化,把同一类操作以及共有的数据结构整理在一起,朝面向对象迈进,就像公司从混乱的小作坊做大后就会形成部门;面向对象在执行具体工作时,仍是面向过程的,也是有步骤的,就像公司生产线上质检员工,仍需要第一步检查什么、第二步检查什么。

    此外,再谈谈语言层面面向过程语言(比如C语言),可以是流程化的,一个函数一个函数地调用,但也能表达面向对象思想,比如模块化后,将结构体和函数规划好所属类别,使用时类和对象的思想在脑袋里;支持面向对象的语言(比如C++),是在语言层面对类和对象的思想提供了支持,将脑袋里的类别用语言中的class具现出来,将类别间的衍生关系用语言中的继承具现出来,同时在编译器(编辑器)上提供了访问的边界,并有相应的语法来界定。

    如何选择

    两种编程思路并无明显优劣之分,一切只看适不适合。面向过程模块化做得好,也可以很清晰。面向对象设计过度,也会恶心人。如何选择呢?

    这里直接贴上SIGAI丁老师的建议,

    • 评估方法:预测未来,找到复用概率最高的几个点
    • 将这几个点用如下原则进行初步评估:高内聚,低耦合
    • 按照以上方法评估之后,心中往往已经有了答案

    一般而言:

    • 注重复用和可维护性时, 面向对象多数要胜出的
    • 注重短期开发速度,而且是一次性的,面向过程肯定是首选

    以上。

    参考

  • 相关阅读:
    400 Bad Request
    Django 中间件 阅读目录 初步了解 中间件 中间件的介绍 自定义中间件 process_template_response(用的比较少) 中间件的执行流程 中间件版登录验证
    关于python语言优化的一些思考
    从系统角度考虑性能优化 【被面试官吊打】从系统角度考虑性能优化 目录 什么是性能? 定义系统范围 重定义功能 关注价值 总结
    需求设计
    开源软件评选白热化,这些项目冲击 Top 5
    两个向量的outer product
    协同过滤算法中皮尔逊相关系数的计算 C++
    求向量间的点积
    string 类型的翻转
  • 原文地址:https://www.cnblogs.com/shine-lee/p/10040102.html
Copyright © 2011-2022 走看看