当前位置: 首页 > news >正文

信用门户网站建设观摩百度搜索关键词优化

信用门户网站建设观摩,百度搜索关键词优化,xyz域名做网站好么,如何夸奖一个网站做的好面向对象编程 面向对象编程Object-Oriented Programming,OOP) 作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征&#xff0…

面向对象编程

面向对象编程Object-Oriented Programming,OOP)
作为一种新方法,其本质是以建立模型体现出来的抽象思维过程和面向对象的方法。模型是用来反映现实世界中事物特征的。任何一个模型都不可能反映客观事物的一切具体特征,只能对事物特征和变化规律的一种抽象,且在它所涉及的范围内更普遍、更集中、更深刻地描述客体的特征。通过建立模型而达到的抽象是人们对客体认识的深化。

一、OOP的优势

(来自chatgpt)

代码组织和可读性提升: 使用类似于对象的结构体和函数指针来组织代码,可以将相关的数据和操作放在一起,使代码更易于理解和维护。

封装和信息隐藏: 通过将数据隐藏在结构体中,只暴露必要的操作接口,实现对实现细节的封装,避免外部直接访问内部数据,增强了代码的安全性。

代码重用和扩展性: 使用类似于继承的技巧,可以创建派生结构体来扩展已有的功能,实现代码的重用和扩展,减少了重复编写代码的工作量。

多态性和灵活性: 通过函数指针的动态绑定,可以在运行时根据对象的类型调用相应的方法,实现多态的效果,增加了代码的灵活性和可扩展性。

更接近硬件: C语言相对较接近底层,通过模拟面向对象的方式,可以在嵌入式系统等场景中实现更高层次的代码组织和抽象。

代码可测试性: 将数据和操作封装在对象中,可以更容易地进行单元测试,通过独立测试对象的方法,减少了测试复杂性。

二、如何实现OOP

尽管C语言时面向过程,但可以通过结构体和函数指针模拟面向对象编程。后面会以rt-thread的设备源码分析OOP的实现。以I/O设备模型为例,其模型如下图所示:
在这里插入图片描述

图一 rt-thread的IO设备

2.1 抽象

对于单片机来说有很多驱动外设,如GPIO、UART、SPI、I2C等,这些外设都可以抽象成一个设备结构体rt_device其定义如下

struct rt_device
{struct rt_object          parent;        /* 内核对象基类 */enum rt_device_class_type type;          /* 设备类型 */rt_uint16_t               flag;          /* 设备参数 */rt_uint16_t               open_flag;     /* 设备打开标志 */rt_uint8_t                ref_count;     /* 设备被引用次数 */rt_uint8_t                device_id;     /* 设备 ID,0 - 255 *//* 数据收发回调函数 */rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);const struct rt_device_ops *ops;    /* 设备操作方法 *//* 设备的私有数据 */void *user_data;
};
typedef struct rt_device *rt_device_t;

我们可以想象一下GPIO、UART、SPI、I2C这些不同的外设是否都具有这些属性和方法。

2.2 封装

分装主要包含两层意思:

  1. 将数据和操作捆绑在一起,创造出一个新的类型的过程。
  2. 将接口与实现分离的过程。

回顾rt_device 结构体,将该对象的属性与该对象具有的方法ops封装在一起,便于代码的维护。外部程序只能通过结构体访问相关数据也增加了代码的安全性。

2.3 继承

rt_device结构体中存在一个基类rt_object也是其父类。也就是说每个rt_device都从rt_object中继承了这些属性。每次使用rt_device声明不同对象时都不需要重复定义rt_object,实现代码的重用和扩展,减少了重复编写代码的工作量。

struct rt_object
{char       name[RT_NAME_MAX];                       /**< name of kernel object */rt_uint8_t type;                                    /**< type of kernel object */rt_uint8_t flag;                                    /**< flag of kernel object */void      *module_id;                               /**< id of application module */rt_list_t  list;                                    /**< list node of kernel object */
};

2.4 多态

rt_device结构体中存在 rt_device_ops *ops 方法。

/*** operations set for device object*/
struct rt_device_ops
{/* common device interface */rt_err_t  (*init)   (rt_device_t dev);rt_err_t  (*open)   (rt_device_t dev, rt_uint16_t oflag);rt_err_t  (*close)  (rt_device_t dev);rt_size_t (*read)   (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);rt_size_t (*write)  (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);rt_err_t  (*control)(rt_device_t dev, int cmd, void *args);
};

通过函数指针的方式实现多态。实际项目中我们会遇到多个模块的适配问题,比如AT的wifi模块,犹豫各个厂商AT指令不兼容,当项目中产生替代料时,使用多态则再合适不过了。
对于client应用层业务主要分:连接服务器发送数据接收应答断开连接四部分,分别对应openwritereadclose四个操作。
若使用乐鑫esp则需要实现esp_connect(),esp_send(),esp_recv(),esp_close()四个功能,
若使用移远模块,则需要实现quectel_connect(),quectel_send(),quectel_recv(),quectel_close()功能。
通过device_init函数使client.ops根据实际模块绑定对应函数即可。APP层操作只会是client.ops->open()client.ops->write(),client.ops->read(),client.ops->close()
增加了代码的灵活性和可扩展性,也实现了代码的应用与驱动分层,朝着“高内聚、低耦合”的方向前进。

http://www.hengruixuexiao.com/news/54034.html

相关文章:

  • 厂字型布局网站2020十大网络热词
  • 网站咨询弹窗是怎么做的百度人工客服在线咨询
  • 邢台做移动网站多少钱seo综合检测
  • 做淘客网站的推广神器app
  • 自助建站网站源码电子商务网站建设规划方案
  • 信通网站开发中心seo网站
  • 日本人真人做真爱的网站市场调研报告怎么写
  • 北京好的网站建设搜索量排行
  • 网站建设书籍推荐长沙大型网站建设公司
  • 网站页面吸引力网络推广平台代理
  • 网站后台无法上传图片制作网页
  • 东莞网站页设计制作域名站长工具
  • 旅游网站建设方案的总结百度首页网站推广多少钱一年
  • 2013年以前pc网站建设2024年疫情还会封控吗
  • 有哪些建设网站的大公司百度问答优化
  • 徐州网站公司社群营销的案例
  • 眉山市住房和城乡建设局网站网址收录入口
  • 网站开发文章怎么分类网站友链查询源码
  • wordpress+培训模板seo的基本步骤包括哪些
  • 公司网站最新版营销培训
  • 做淘宝一件代发的网站邵阳seo优化
  • 赚钱软件排行流程优化四个方法
  • 广州网站建设报价苏州网站建设哪家靠谱
  • jsp网站建设技术案例手机搜索引擎排名
  • 如何免费找精准客户广州seo网站优化培训
  • 让人做网站需要准备什么条件厦门网站流量优化价格
  • 网站开发 兼职项目免费域名注册
  • 注册公司名称查询系统官网林哥seo
  • 360建站abc官网有什么平台可以推广信息
  • 建网站 绑定域名 网址黑帽seo教程