独立开发者系列(13)——示例理解面向对象与过程

     专业术语晦涩难懂,特别是当你没有写过稍微大点的系统的时候,你要理解这里面的区别很难。


       从最简单的早期我们学习开始,我们除了练习hello world掌握了入门函数之后,基本都再练习算法。比如水仙花数的获取,冒泡排序,碾转相除法的算法题目,这个时候我们用面向对象来思考,没有太多意义,因为他单纯的只是要解决某个具体的算数层面复杂点。我们大部分情况下,需要的都是推理和算法能力,所以当我们想懂了怎么实现的时候,立刻写几行代码,然后开始run模式,就可以知道我们的想法对了没对。

  更复杂点的工程算法,比如抽奖函数的设计(需要考虑到不同奖品出现不同的概率,而且将不同概率输入该功能函数之后,会返回我们本次的抽奖结果编号),又或者是菜单列表的获取,需要用到递归,读取每个栏目下级的子栏目,同时将这个结果返回给上级结果(递归概念,分类里面最常用的算法),读取文本里面的N行内容,分析提取我们需要的行(简单清洗数据的逻辑)。基本上基础的开发,这些简单算法堆积的时候,发现面向对象毫无优势,甚至是劣势,我为了解答某个题目,脑子里可能出现了N个算法,但是不知道对错,快速写代码跑,直接写肯定比边写还边组织结构要快很多。而且在接入入门早期的时候,我们更倾向于快速实现效果给其他人看,也就是做一个demo的展示产品,这个时候,更快是我们的目标,而对象天然的就增加了这层思考的复杂度。

  于是我们开始操作真正的项目,在真正的项目里面,逻辑链条和关系复杂度比之前的组织几个函数方法完全不同概念,在绝大部分的项目里面,不是算法工程师的话,基本极少用到独自创新的算法,这个时候的工作面临的是无数个模块和函数代码,怎么拼接整理到一起。
最简单的电商产品下单逻辑,我们用流程化的方法来写这个功能。思考的流程是这样的: 我们写个函数

检查商品ID——去数据库查询产品——查询是否下架——查询库存——查询商品其他关联信息——验证登录的用户身份——检查用户——检查用户购买的数量信息——检查用户下单的合法性——.检查优惠券的合法性——计算当前的订单价格——计算订单价格扣除优惠券的计算方法——下单——锁定住优惠券——….

我们将这个流程从头到尾,每一步都实现在一个大型的函数方法里面,洋洋洒洒写了几百行,终于心满意足的感觉完成了这个大型功能。这个时候,需求改了,用户鉴权信息的种类有变更,第二个优惠券可能有很多种,需要重新去N个表里面查询不同的优惠券。过了一阵子,你回头来修改代码,你发现自己密密麻麻的写了一本天书,中间某个地方错误了,你发现不了问题,需要从头到尾一步一步断点打印,而且几乎没有办法的去完善系统。因为出一点问题,要查看自己的一整片代码。

洋洋洒洒写个上几百行代码,封装到一个函数,直接实现了对应功能,感觉上很方便,没有其他的干扰,但是在维护和调试的时候,基本都是瘫痪掉。实在是改不动,如果再碰上别人的代码也是这种风格,逻辑复杂度又很深,基本上就是提桶跑路。接触的几个改不下去的项目,基本都是这种风格,洋洋洒洒,代码堆积在一个方法里面,然后开发不下去了,直接提桶跑路,留给后面的人修改一地鸡毛。这是很典型的面向过程开发者思维,就是以完成过程和实现为核心目标,不考虑后续维护和拓展的开发模式。如果不是刻意去学习对象开发方法,大部分人的第一开发定势都是过程化开发。

而如果是面向对象开始开发,首先我们可以尝试着将上述流程进行对象化处理—— 产品对象,用户对象,优惠券 。
我们使用产品对象的获取方法获取产品(获取失败就退出,那是产品对象出问题了)
同样获取用户对象方法(信息,权限,金额检测)同样失败,退出

优惠券对象方法(检测优惠券的相关信息)

这样我不能再按照之前的的流程化逻辑实现我要的功能,而是设计好一个一个对象,然后我用我的总对象去调用各个对象里面的方法,如果某块出现了问题,我只要直接去调试对应的对象模块即可。

从这里可以很明显的看出俩者的特征,当项目的规模比较小的时候,过程化开发更有优势,因为快速。而面向对象需要不断设计对应的对象,还要梳理结构。

反过来,当项目越来越大的时候,模块不断交叉,对象方法复用度也大幅度提升,对象化开发方法优势非常明显。

而考虑到当前的主要项目,其实一般都是第一期简单,如果有二三四期开发工程的情况,如果你为了快速完成一期使用了过程化开发方法,后面会非常痛苦来调整,所以在一般情况下,大部分项目(除了极少部分你确定知道规模很小的项目)默认采用对象化开发方法,为后期拓展性奠定比较好的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/37970.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis的使用和原理

目录 1.初识Redis 1.1 Redis是什么? 1.2 Redis的特性 1.2.1 速度快 1.2.2 基于键值对的数据结构服务器 1.2.3 丰富的功能 1.2.4 简单稳定 1.2.5 持久化 1.2.6 主从复制 1.2.7 高可用和分布式 1.3 Redis的使用场景 1.3.1 缓存 1.3.2 排行榜系统 1.3.3 计数器应用 1.3…

【操作系统期末速成】 EP04 | 学习笔记(基于五道口一只鸭)

文章目录 一、前言🚀🚀🚀二、正文:☀️☀️☀️2.1 考点七:进程通信2.2 考点八:线程的概念2.3 考点九:处理机调度的概念及原则2.4 考点十:调度方式与调度算法 一、前言🚀…

排序(冒泡排序、选择排序、插入排序、希尔排序)-->深度剖析(一)

欢迎来到我的Blog,点击关注哦💕 前言 排序是一种基本的数据处理操作,它涉及将一系列项目重新排列,以便按照指定的标准(通常是数值大小)进行排序。在C语言中,排序算法是用来对元素进行排序的一系…

FPGA 690T NVME高速存储设计

高速存储设计会有各种需求的考虑,那么对应的方案也不完全相同,这篇文章出一期纯FPGA实现的高速存储方案。用纯fpga实现高速存储板卡有易国产化,功耗低和体积小等特点,缺点就是灵活性不是很强,实现标准ext4和nfs文件系统…

数据仓库建模基础理论-01-为什么需要数据建模?

一、什么是数据模型? 数据模型是数据库的基础结构,用于描述和组织数据的方式。 它不仅是数据库的底层结构,还是一个概念性工具,帮助理解数据的含义和关系。 数据模型包括数据本身、数据之间的关系、数据的语义(含义和…

C++ | Leetcode C++题解之第206题反转链表

题目: 题解: class Solution { public:ListNode* reverseList(ListNode* head) {if (!head || !head->next) {return head;}ListNode* newHead reverseList(head->next);head->next->next head;head->next nullptr;return newHead;} …

一秒记单词:音通义通,一秒牢记

一秒记单词,从小学到高中,一秒牢记 一、小学生记单词,快速突破 1.1 好的开始,是成功的一半 sun n.太阳 【通】尚 moon n.月亮 【通】母恩 mother n.母亲,妈 【通】妈汁 sea n.海,大海 【通】细 sand …

【MySQL基础篇】SQL指令:DQL及DCL

1、DQL DQL - 介绍 DQL英文全称是Data Query Language(数据查询语言),数据查询语言,用来查询数据表中的记录。(在MySQL中应用是最为广泛的) 查询关键字:SELECT DQL - 语法 SELECT 字段列表 FROM 表名列表 WHER…

【人工智能学习之图像操作(六)】

【人工智能学习之图像操作(六)】 Hough变换直线检测圆检测 图像分割 Hough变换 在图像处理中,霍夫变换用来检测任意能够用数学公式表达的形状,即使这个形状被破坏或者有点扭曲 直线检测 import cv2 import numpy as np image …

利用微信开放标签<wx-open-launch-weapp>在H5中跳转微信小程序报错完美的解决方案

一、报错&#xff1a; [WXTAG] [JSCORE] The slot <template> or <script type"text/wxtag-template"> of <wx-open-launch-weapp> is missing 二、源码 官方源代码如下&#xff0c;<script type"text/wxtag-template"></sc…

美团外卖搜索基于Elasticsearch的优化实践--图文解析

美团外卖搜索基于Elasticsearch的优化实践–图文解析 前言 美团在外卖搜索业务场景中大规模地使用了 Elasticsearch 作为底层检索引擎&#xff0c;随着业务量越来越大&#xff0c;检索速度变慢了&#xff0c;CPU快累趴了&#xff0c;所以要进行优化。经过检测&#xff0c;发现…

[SAP ABAP] 数据字典

ABAP数据字典是定义和管理数据库对象的工具 系统的所有全局数据类型以及数据库表结构等都需要在数据字典中创建和维护(数据字典中的对象对所有ABAP程序都是全局的) 通过数据字典&#xff0c;我们可以把数据库对象管理好&#xff0c;后续才能顺利的进行功能开发&#xff0c;SA…

集合,Collection接口

可动态保存任意多个对象&#xff0c;使用比较方便 提供了一系列方便操作对象的方法&#xff1a;add&#xff0c;remove&#xff0c;set&#xff0c;get等 使用集合添加删除新元素&#xff0c;代码简洁明了 单列集合 多列集合 Collection接口 常用方法 List list new Arra…

多媒体基础

笔者按&#xff1a; 昨日复习的信息网络安全约莫是挂了&#xff0c;常言道&#xff1a;知耻而后勇。诚如斯言 于是决心多媒体是不能再挂了&#xff0c;不然直接变成xxx之流&#xff0c;自增笑耳 语雀链接&#xff1a;多媒体基础 一.多媒体计算机概述 媒体&#xff1a;承载信息…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-21多输入多输出通道

21多输入多输出通道 import torch from d2l import torch as d2ldef corr2d(X, K):"""计算二维互相关运算"""h, w K.shapeY torch.zeros((X.shape[0] - h 1, X.shape[1] - w 1))for i in range(Y.shape[0]):for j in range(Y.shape[1]):Y[i,…

go语言DAY7 字典Map 指针 结构体 函数

Go中Map底层原理剖析_go map底层实现-CSDN博客 目录 Map 键值对key,value 注意&#xff1a; map唯一确定的key值通过哈希运算得出哈希值 一、 map的声明及初始化&#xff1a; 二、 map的增删改查操作&#xff1a; 三、 map的赋值操作与切片对比&#xff1a; 四、 通用所有…

[leetcode hot 150]第一百二十二题,买卖股票的最佳时机Ⅱ

题目&#xff1a; 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。 返回 你能获得的 最大…

【C++】初识C++(一)

一.什么是C C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度 的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20世纪80年代&#xff0c; 计算机界提出了OOP(object o…

图形处理单元(GPU)在现代计算中的应用与挑战(研究论文框架)

摘要:随着高性能计算需求的日益增长,图形处理单元(GPU)已从专业的图形渲染处理器转变为具有高性能并行处理能力的多功能计算平台。本文将探讨GPU的核心优势、编程模型、在不同领域的应用以及面临的挑战和限制。此外,还将讨论GPU技术的未来发展趋势和潜在的研究机会。 关键…

mongodb 查询语句学习笔记

基础查询 正则查询 {status: A,$or: [{ qty: { $lt: 30 } }, { item: { $regex: ^p } }] }AND 查询 { "size.h": { $lt: 15 }, "size.uom": "in", status: "D" }OR 查询 { $or: [ { status: "A" }, { qty: { $lt: 30 } …