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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

phpMyAdmin | mysqli::real_connect(): (HY000/2002): No such file or directory

法一:第一次安装宝塔 第一次安装宝塔mysql服务是默认关闭的,需要手动打开,打开服务再次进入phpMyAdmin发现可以进入了 法二:第一种方法没解决用这种 出现mysqli::real_connect(): (HY000/2002): No such file or directory错误通…

Java | Leetcode Java题解之第206题反转链表

题目: 题解: class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode newHead reverseList(head.next);head.next.next head;head.next null;return newHead;} }

ROS2自定义接口Python实现机器人移动

1.创建机器人节点接口 cd chapt3_ws/ ros2 pkg create example_interfaces_rclpy --build-type ament_python --dependencies rclpy example_ros2_interfaces --destination-directory src --node-name example_interfaces_robot_02 --maintainer-name "Joe Chen" …

20240630 每日AI必读资讯

📚全美TOP 5机器学习博士发帖吐槽:实验室H100数量为0! - 普林斯顿、哈佛「GPU豪门」,手上的H100至少三四百块,然而绝大多数ML博士一块H100都用不上 - 年轻的研究者们纷纷自曝自己所在学校或公司的GPU情况&#xff1a…

vue开发网站--关于window.print()调取打印

1.vue点击按钮调取打印 点击按钮&#xff1a; 调取打印该页面&#xff1a; <div click"clickDown()">下载</div>methods: {//下载-调取打印clickDown() {window.print()}, }<style>/* 点击打印的样式 */media print {.clickDown {display: no…

【测试】软件测试规程(word原件)

软件测试规程的作用在于确保软件测试活动的系统性、规范性和一致性。它明确了测试的目标、范围、方法、流程以及所需资源&#xff0c;为测试人员提供了明确的指导和操作规范。通过遵循测试规程&#xff0c;可以提高测试效率&#xff0c;减少测试遗漏和错误&#xff0c;保证软件…

K8S基础简介

用于自动部署&#xff0c;扩展和管理容器化应用程序的开源系统。 功能&#xff1a; 服务发现和负载均衡&#xff1b; 存储编排&#xff1b; 自动部署和回滚&#xff1b; 自动二进制打包&#xff1b; 自我修复&#xff1b; 密钥与配置管理&#xff1b; 1. K8S组件 主从方式架…

神经网络原理

神经网络原理是一种模拟人脑的机器学习技术&#xff0c;通过大量的神经元和层次化的连接进行信息处理和学习。 图1 神经元 神经网络由许多简单的计算单元或“神经元”组成&#xff0c;这些神经元通过连接传递信息。每个连接都有一个权重&#xff0c;用于调整传递的信号强度。这…

【Red Hat】 Red Hat 系统提示未注册订阅管理,并进行阿里yum源更新的解决方案

目录 &#x1f30a;1. 问题说明 &#x1f30a;2. 解决方案 &#x1f30d;2.1 Redhat 官网注册与订阅 &#x1f30d;2.2 Redhat 登录已订阅账号 &#x1f30d;2.3 更换 Redhat 为阿里yum源 &#x1f30d;2.4 验证 &#x1f30a;1. 问题说明 使用 yum makecache 或 yum up…

内网渗透:端口转发(SSH隧道)

SSH&#xff1a;两台设备之间进行远程登录的协议&#xff08;SSH本身就是一个隧道协议&#xff09; 远程文件传输scp命令&#xff08;scp是基于SSH的&#xff09; 拓扑&#xff1a; SSH隧道搭建的条件 1.获取到跳板机权限 2.跳板机中SSH服务启动 SSH端口转发分类&#xff1…

【工具分享】SQLmap

文章目录 工具介绍安装方式环境准备安装 sqlmap 工具介绍 sqlmap 是一个非常强大的自动化 SQL 注入工具&#xff0c;主要用于渗透测试和安全审计。它能够检测和利用 SQL 注入漏洞&#xff0c;进而访问数据库服务器。 GitHub&#xff1a;https://github.com/sqlmapproject/sql…

为什么IP地址会被列入黑名单?

您是否曾经历过网站访客数量骤减或电子邮件投递失败的困扰&#xff1f;这背后或许隐藏着一个常被忽略的原因&#xff1a;您的IP地址可能已经被列入了黑名单内。尽管您并没有进行任何违法的网络操作&#xff0c;但这个问题依然可能出现。那么&#xff0c;究竟黑名单是什么&#…

通过Python脚本实现字符画

效果 讲解&#xff1a; 用于将3D视图的帧缓冲区转换为字符画&#xff0c;并将字符画输出到文本编辑器中。 首先&#xff0c;获取当前绑定的帧缓冲区、视口信息和视图像素。 然后&#xff0c;将像素矩阵转化为字符串&#xff0c;并将字符串写入到文本编辑器中。 设置文本编辑…

【Lua】第三篇:基本变量类型介绍

文章目录 一. 变量类型介绍二. 基本知识三. 基本类型介绍1. 空类型&#xff08;nil&#xff09;2. 数值类型&#xff08;number&#xff09;3. 字符串类型&#xff08;string&#xff09;4. 布尔类型&#xff08;boolean&#xff09; 一. 变量类型介绍 Lua中一共有如下8中变量…

Nosql期末复习

mongodb基本常用命令&#xff08;只要掌握所有实验内容就没问题&#xff09; 上机必考&#xff0c;笔试试卷可能考&#xff1a; 1.1 数据库的操作 1.1.1 选择和创建数据库 &#xff08;1&#xff09;use dbname 如果数据库不存在则自动创建&#xff0c;例如&#xff0c;以下…

设计模式 - 原型模式,就该这样学!

目录 开始 为什么要引入原型模式 原型模式概述 原型模式代码实现&#xff08;浅拷贝&#xff09; 浅拷贝和深拷贝的区别 原型模式代码实现&#xff08;深拷贝&#xff09; 方式一&#xff1a;直接 copy 方式二&#xff1a;序列化和反序列化&#xff08;推荐&#xff09…

ApolloClient GraphQL 与 ReactNative

要在 React Native 应用程序中设置使用 GraphQL 的简单示例&#xff0c;您需要遵循以下步骤&#xff1a; 设置一个 React Native 项目。安装 GraphQL 必要的依赖项。创建一个基本的 GraphQL 服务器&#xff08;或使用公共 GraphQL 端点&#xff09;。从 React Native 应用中的…

window下git bash设置启动后默认路径进入自己的工程

方法一&#xff1a;更改快捷方式 方法二&#xff1a;修改~/.bashrc

c++类和对象(三)日期类

类和对象 一.拷贝构造函数定义二.拷贝构造函数特征三.const成员函数权限权限的缩小权限的缩放大 四.隐式类型转换 一.拷贝构造函数定义 拷贝构造函数&#xff1a;只有单个形参&#xff0c;该形参是对本类类型对象的引用(一般常用const修饰)&#xff0c;在用已存 在的类类型对象…

期末模拟题---期末复习3

头插法建立单链表 #include <stdio.h> #include <stdlib.h>struct Node //定义结构体 {char data; //数据域struct Node * next; //指针域 };/* 请在这里填写答案 */ struct Node * CreateList (struct Node * head) {struct Node *p;char ch;scanf(&…