独立开发者系列(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…

【计算机网络】HTTPS——更安全的HTTP通信(个人笔记)

学习日期:2024.6.26 内容摘要:HTTPS存在的意义、特点和工作方式 HTTP的缺点——易窃听、伪装、篡改 在Web及网络基础中,我们已经知道了网页是怎么打开的,HTTP确实是一个相当优秀和方便的协议,但HTTP也有很多不足&…

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

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

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

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

FPGA 690T NVME高速存储设计

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

计算机的错误计算(十六)

摘要 计算机的错误计算(十五)中历史事件给我们的启示或警示。 计算机的错误计算(十五)介绍了历史上发生的一些事件。从这些事件我们可以得到一些启示或警示。 若不是油气平台的沉没,设计者会得出精度低了吗&#x…

信息盲盒系统设计

信息盲盒系统是一种结合了随机性和趣味性的信息传递和接收方式,类似于实体盲盒的概念,但在数字领域应用。这种系统通常用于增加用户参与度、提升用户体验或作为营销策略的一部分。设计一个信息盲盒系统需要考虑以下几个关键要素: 1. 定义目标…

数据仓库建模基础理论-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;} …

在Ubuntu 16.04上安装和配置GitLab的方法

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 GitLab CE(Community Edition)是一个开源应用程序,主要用于托管 Git 仓库,并提供额…

AI在创造还是毁掉音乐之论文

AI在创造还是毁掉音乐? 简介:最近一个月,轮番上线的音乐大模型,一举将素人生产音乐的门槛降到了最低,并掀起了音乐圈会不会被AI彻底颠覆的讨论。短暂的兴奋后,AI产品的版权归属于谁,创意产业要…

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

一秒记单词,从小学到高中,一秒牢记 一、小学生记单词,快速突破 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;发现…

gcop:简化 Git 提交流程的高效助手 | 一键生成 commit message

&#x1f496; 大家好&#xff0c;我是Zeeland。Tags: 大模型创业、LangChain Top Contributor、算法工程师、Promptulate founder、Python开发者。&#x1f4e3; 个人说明书&#xff1a;Zeeland&#x1f4e3; 个人网站&#xff1a;https://me.zeeland.cn/&#x1f4da; Github…

[SAP ABAP] 数据字典

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

华为面试题及答案——大数据

(1)namenode内存满了,如何进行扩容,调什么参数。 1. 增加 NameNode 的内存 在 hadoop-env.sh 文件中,可以增加 JVM 分配给 NameNode 的内存。通常是在 HADOOP_NAMENODE_OPTS 中增加 -Xmx 参数来增加最大堆内存。 export HADOOP_NAMENODE_OPTS="-Xmx8g -Xms4g ${HA…

集合,Collection接口

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