• 智能指针、单件模式、函数式编程、c/c++


           智能指针的由来,是因为对对象指针的控制,除了问题。当一个对象有多个指针链接的时候,谁来delete 这个对象就成了问题。这种对象和指针的关系应是这样的。当第一个使用这个指针的时候,我们创建这个对象,那么什么时候删除这个对象呢,应该在全部对象都不在使用这个对象的时候。
          像上面这个需求我们或许都用过吧,都用什么方案解决的呢?其实智能指针就是解决这种方案的一个方法。现在回到这个需求,这个需求的两个点,创建没有问题,第一个指针需要的时候就创建,那么全部都不用的时候才析构。那么就需要有一个记录全部都析构这个事情的数据承载。其实无论用什么手段,只要每个指针做析构的时候都告诉系统一声,那么这个问题就解决了。
           智能指针的解决方法是啥呢,用一个技术控制使用对想的数量,有引用就+1,有析构就-1.最终这个对象为0的时候就真正的析构这个对象。
           其实在做工控的时候,也遇到过这类问题,比如一个设备他属于多个生产线的公共部分,有一个生产线启动,他就要启动。但是只有全部的生产线都结束的时候他才能结束。这中需求是不是和智能指针的这种需求有点像。我当时是这么做的,这个对象只有收到一个启动命令就启动,然后把这个工单号写入工单列表。没收到工单结束命令的时候都都不相应的工地由工单列表中删除了,然后在看工单列表数,是否为0,如果为0,给这个设备下发设备结束的命令。

            说的有点远了,就是想说明智能指针本身就是一种需求。

            在说说智能指针的这种应用场景,其实大部分的场景是我作为一个服务对象,为其他很多组件提供服务,所以很多组件有我的指针。但是大部分场景都是,我创建了,其他的服务也创建了,系统运行的时候就创建;直到系统结束的时候,大家都结束,几乎没有智能指针需求的问题。

            所以大部分开发的场景是不需要智能指针的。但是关于多指针单对象的需求确实存在,但这里为了简化问题先不展开。就如上面我提到的最普遍的情况,还有一个要求,就是对象必须一个。如果创建了两个对象,会有啥情况呢,就会出现数据不统一的问题,所以这本身还有一个单件的需求。我们其实用单价模式能够解决这种情况的大部分问题。

            总结一下,其实我们应用的数据对象,无非两种类型,一是我上面提到的一个服务的指针,一个就是作为数据拷贝的那种对象,存数据,比如函数的入参等。而这种情况计划都是深拷贝的临时数据,几乎不用考虑生命周期,他的生命就是在函数内。所以这类对象不存在需要智能指针的问题。

            那么这样我们把问题简单化了,尽管把一切程序定义为上面两种数据类型,并不严谨,但几乎能解决全部问题,个别效率需求我们在特殊讨论,这了暂时先把问题简单化。

            下面我在把这个问题引向函数式编程,基于上面的两种对象,指针类对象,由函数+内部成员构成。另一种对象就时数据,加起来这样:函数+类内成员+入参数+返回值。我们在用函数来分解这些,那就变成这样:函数+函数内数据+函数外数据,函数内的数据都是过程数据我们不需要关系,函数外的数呢:参数(入参、出参)+返回值+成员数据。这里成员数据变成外部数据的一种,把需要入参的放到入参里,把函数处理完受影响的放到“返回值”和“出参”里。
            那么程序变成这样了 函数+参数(入参、出参)+返回值;我们这里把“成员数据”都转给了函数的参数和返回值里,也即意味着不需要对象。 那么这种编程方式有点像啥呢,就像时c++变成了c。而这种方式就有点像函数式编程了,那么C就时标准的函数式编程吗。不完全是,稍微加点要求就是;如果C的每一个函数都能够保证处理的依据只来自入参,处理的影响只反映给出参和返回值,那么c就是标准的函数式编程了。
            这里有人会问?函数除了影响入参和出参和返回值还能影响其他的吗?当然能影响,比如一个在函数外的公共变量,是哪个函数都可以处理的。这些就是破坏函数式编程的关键(如c编程把这个种影响转到返回值和出参数,c就是函数式编程)C++把这些放到了类内,就成了面向对象编程。

  • 相关阅读:
    java毕业设计——基于java+Jsp+Tomcat的敬老院管理系统设计与实现(毕业论文+程序源码)——敬老院管理系统
    C++:优先级队列模拟实现和仿函数的概念使用
    用pyinstaller打包LGBM模型为ELF/EXE可执行文件
    Vue不能watch数组和对象变化解决方案
    Syntax Error: TypeError: this.getOptions is not a function
    信息系统项目管理师Part13-UML
    C++ 学习(17)STL - vector容器、string容器
    【sqlite3 如何避免插入重复数据】
    使用scp局域网内传输文件速度很慢的原因排查
    使用MASA Blazor开发一个标准的查询表格页
  • 原文地址:https://blog.csdn.net/xie__jin__cheng/article/details/138160888