C#探索之路基础篇(1):编程中面向过程、数据、对象的概念辨析

文章目录

      • C#探索之路基础篇(1):编程中面向过程、数据、对象的概念辨析
      • 1 面向过程编程
        • 1.1 概念
        • 1.2 示例代码:
        • 1.3 使用范围与时机:
        • 1.4 注意事项:
        • 1.5 通俗讲法
      • 2 面向对象编程
        • 2.1 概念
        • 2.2 示例代码
        • 2.3 使用范围
        • 2.4 注意事项
        • 2.5 通俗讲法
      • 3 面向数据编程
        • 3.1 概念
        • 3.2 示例代码
        • 3.3 适用范围
        • 3.4 注意事项
        • 3.5 通俗讲法

C#探索之路基础篇(1):编程中面向过程、数据、对象的概念辨析

1 面向过程编程

1.1 概念

面向过程编程(Procedural Programming)是一种编程范式,它将计算视为一系列的程序指令,这些指令按照顺序执行。在面向过程编程中,程序主要由一系列的函数或者过程组成,这些函数或者过程按照特定的顺序调用,以完成任务或者解决问题。

面向过程编程的主要特点包括:

  1. 顺序执行: 程序按照指定的顺序逐步执行,每一步都依赖于上一步的结果。

  2. 函数或过程: 程序主要由一系列的函数或者过程组成,每个函数或者过程负责完成特定的任务。

  3. 数据和算法分离: 在面向过程的编程中,通常会将数据和操作数据的算法分开,即将数据和对数据的处理操作分离开来,这有助于提高代码的可维护性和可重用性。

  4. 可读性较强: 面向过程的代码通常具有较好的可读性,因为它们按照顺序执行,易于理解。

  5. 适用范围: 面向过程编程通常适用于较小规模的程序和简单的问题,例如一些脚本程序或者小型工具等。

面向过程编程的代表性语言包括C语言和Pascal等。虽然面向过程编程具有一定的优点,但它也存在一些缺点,例如难以管理复杂的程序结构、难以扩展和维护等。因此,在处理大型、复杂的软件项目时,通常会选择其他更适合的编程范式,如面向对象编程或函数式编程。

1.2 示例代码:
using System;class Program
{static void Main(string[] args){// 从用户输入获取两个数Console.WriteLine("请输入第一个数:");int num1 = int.Parse(Console.ReadLine());Console.WriteLine("请输入第二个数:");int num2 = int.Parse(Console.ReadLine());// 调用函数计算两个数的和int sum = Add(num1, num2);// 显示计算结果Console.WriteLine("两个数的和为:" + sum);// 等待用户按任意键退出Console.ReadLine();}// 定义一个函数用于计算两个数的和static int Add(int a, int b){return a + b;}
}

在这个示例中,程序按照顺序执行。首先,从用户输入获取两个数,然后调用 Add 函数计算它们的和,最后显示计算结果。整个程序是按照一系列顺序执行的,没有引入复杂的控制流程或数据结构。这就是典型的面向过程编程范式的特点。

1.3 使用范围与时机:

面向过程编程通常适合以下情况和使用范围:

  1. 小型项目或简单任务: 面向过程编程适用于小规模的项目或者解决简单任务的情况。如果你只需要完成一些简单的操作,例如对一些数据进行简单处理或者执行一些特定的任务,那么面向过程编程是一个合适的选择。

  2. 性能要求较高: 面向过程编程通常比其他编程范式更加高效,因为它直接操作数据,没有额外的抽象层。在一些对性能要求较高的场景下,例如嵌入式系统或者对计算速度要求较高的算法实现中,面向过程编程可能更适合。

  3. 简单的数据处理和转换: 如果你需要进行简单的数据处理、转换或者计算,而且这些任务可以直接用一系列的步骤来描述,那么面向过程编程可能是一个很好的选择。

  4. 学习编程的起点: 面向过程编程通常是编程学习的起点,因为它的概念相对简单,易于理解。如果你是初学者,那么从面向过程编程开始可以帮助你建立起对编程的基本理解和思维方式。

1.4 注意事项:
  1. 复杂项目和大型系统: 面向过程编程在处理复杂项目和大型系统时可能会导致代码结构混乱、难以维护和扩展的问题。因此,对于大规模的软件项目,可能更适合选择其他更具结构化的编程范式,如面向对象编程或者函数式编程。

  2. 可扩展性和可维护性要求较高: 如果你需要构建一个需要频繁扩展和维护的系统,那么面向过程编程可能不是最佳选择。因为它通常缺乏良好的组织结构和模块化设计,难以应对复杂系统的需求变化。

  3. 团队协作和代码复用: 面向过程编程通常缺乏代码复用的机制,难以实现高效的团队协作。如果你需要多人合作开发一个项目,或者希望能够在不同的项目中复用代码,那么面向对象编程可能更加适合,因为它提供了更好的封装和抽象机制。

总的来说,面向过程编程是一种简单直接的编程范式,适合解决小规模、简单任务或对性能要求较高的情况。但在处理复杂项目和大型系统时,可能需要考虑其他更具结构化和抽象的编程范式。

1.5 通俗讲法

面向过程主要用于针对局部功能的实现,它可以是一个简单的加减计算,它也可以是面向对象编程中的某一个功能的局部实现。

2 面向对象编程

2.1 概念

面向对象编程(Object-Oriented Programming,OOP)是一种编程范式,它将软件系统中的数据(对象)与操作数据的行为(方法或函数)组织为一个相互关联的整体。在面向对象编程中,软件系统被抽象为一组对象,这些对象通过消息传递来进行通信和交互。面向对象编程强调的是对象的概念和封装、继承、多态等特性。

面向对象编程的主要概念包括:

  1. 类与对象: 类是对象的模板或蓝图,它定义了对象的属性(成员变量)和行为(方法)。对象是类的实例,具有类定义的属性和行为。

  2. 封装(Encapsulation): 封装是将数据(属性)和操作数据的方法(行为)打包在一起的机制。通过封装,对象的内部实现细节被隐藏起来,只对外部提供有限的接口来访问和操作对象。这样可以提高代码的安全性、可维护性和可重用性。

  3. 继承(Inheritance): 继承是一种机制,允许一个类(子类)基于另一个类(父类)的定义来定义自己的属性和方法。子类继承了父类的属性和方法,并且可以在其基础上进行扩展或者修改。通过继承,可以实现代码的重用和扩展。

  4. 多态(Polymorphism): 多态是指同一个消息可以被不同的对象接收并产生不同的行为。在面向对象编程中,多态通过继承和方法重写来实现。多态性使得代码更加灵活和可扩展,能够处理不同类型的对象而不需要修改原有的代码。

面向对象编程的优点包括:

  • 模块化: 将程序分解为多个对象,每个对象负责特定的功能,使得程序结构更清晰,易于理解和维护。

  • 可重用性: 通过类和对象的封装和继承,可以实现代码的重用,减少代码的重复编写,提高开发效率。

  • 灵活性: 多态性和继承机制使得程序能够适应不同的需求和变化,使得代码更具有扩展性和适应性。

  • 可维护性: 封装机制使得对象的内部实现细节被隐藏起来,使得修改和维护代码更加方便和安全。

面向对象编程是目前软件开发中最为广泛应用的编程范式之一,许多流行的编程语言(如Java、C#、Python等)都支持面向对象编程。

2.2 示例代码
using System;// 定义学生类
class Student
{// 属性public string Name { get; set; }public int Age { get; set; }public string Major { get; set; }// 构造函数public Student(string name, int age, string major){Name = name;Age = age;Major = major;}// 方法public void DisplayInfo(){Console.WriteLine($"姓名:{Name},年龄:{Age},专业:{Major}");}
}// 定义学生管理类
class StudentManager
{// 添加学生public void AddStudent(Student student){// 在这里可以进行学生信息的存储、验证等操作Console.WriteLine("添加学生信息成功!");}
}class Program
{static void Main(string[] args){// 创建一个学生对象Student student1 = new Student("张三", 20, "计算机科学");// 创建一个学生管理对象StudentManager manager = new StudentManager();// 添加学生到管理系统中manager.AddStudent(student1);// 显示学生信息student1.DisplayInfo();// 等待用户按任意键退出Console.ReadLine();}
}

在这个示例中,我们定义了一个 Student 类来表示学生对象,包括姓名、年龄和专业等属性,以及一个 DisplayInfo 方法用于显示学生信息。然后我们定义了一个 StudentManager 类来管理学生对象,包括添加学生等操作。最后,在主程序中创建了一个学生对象并添加到学生管理系统中,然后显示学生信息。

这个示例清晰地展示了面向对象编程的概念,通过定义类和对象来组织和管理代码,使得代码结构更加清晰、灵活和易于扩展。

2.3 使用范围

面向对象编程(OOP)适用于许多不同的使用范围和时机,但也有一些情况下它特别适合:

  1. 大型项目和复杂系统: 当你需要开发大型、复杂的软件系统时,面向对象编程能够提供一种组织代码的有效方式。通过将系统分解为多个对象,每个对象负责特定的功能或责任,可以使系统的设计和实现更加模块化和清晰,从而提高代码的可维护性和可扩展性。

  2. 团队协作: 面向对象编程提供了一种自然的结构,使得多人协作开发变得更加容易。通过定义清晰的类和对象,以及规范化的接口和继承关系,团队成员可以更容易地理解和扩展彼此的代码,提高开发效率和代码质量。

  3. 代码重用: 面向对象编程的封装和继承机制使得代码更易于重用。通过定义通用的基类或者抽象类,以及在子类中重写或者扩展父类的方法,可以实现代码的重用,减少重复编写代码的工作量。

  4. 模块化设计: 面向对象编程鼓励将系统分解为多个相互独立的模块,每个模块都包含一个或多个相关联的类。这种模块化的设计能够降低系统的复杂度,提高代码的可理解性和可维护性。

  5. 需求变更频繁: 面向对象编程使得代码更具有灵活性和适应性,能够更容易地应对需求变更。通过多态性和继承机制,可以实现对程序的修改和扩展而不影响原有的代码结构和功能。

总的来说,面向对象编程是一种通用的编程范式,适用于大多数软件开发场景。但也要注意,在一些小型、简单的项目中,可能面向对象编程会显得过于繁琐,不太适合。因此,需要根据具体的项目需求和情况来选择合适的编程范式。

2.4 注意事项

在编程的过程中,有一些注意事项可以帮助你编写出更高质量、更可维护的代码。以下是一些重要的注意事项:

  1. 理解需求: 在编码之前,确保充分理解需求和问题的本质。明确目标并且考虑到边界情况和可能的异常情况。

  2. 良好的命名和文档: 使用有意义的变量名、函数名和类名,以便于其他人阅读和理解你的代码。另外,编写清晰的注释和文档,解释代码的作用、参数含义以及返回值等信息。

  3. 模块化和可复用性: 将代码分解为小的、独立的模块,每个模块负责一个特定的功能或任务。这样做可以提高代码的可维护性和复用性,并且使得代码更易于测试和调试。

  4. 遵循编码规范和最佳实践: 遵循一致的编码规范和最佳实践有助于保持代码的统一性和可读性。例如,使用一致的缩进风格、命名约定和代码组织结构等。

  5. 异常处理: 考虑到可能发生的异常情况,并且适当地处理这些异常。使用 try-catch 块捕获异常,以保护程序免受错误的影响,并提供适当的错误处理机制。

  6. 测试和调试: 编写测试代码来验证你的程序的正确性和稳定性。进行充分的测试,并且在出现问题时使用调试工具来诊断和修复错误。

  7. 版本控制: 使用版本控制系统(如Git)来管理你的代码,确保每个版本都能够追踪和回滚。定期提交代码,并且在进行重大更改之前创建分支来保护主代码库。

  8. 持续学习和改进: 不断学习新的编程技术和工具,并且不断改进自己的编码技能。参与社区和开源项目,与其他开发者交流经验,从中学习并提高自己的水平。

通过遵循以上注意事项,你可以编写出更加清晰、健壮和可维护的代码,从而提高自己的编程效率和代码质量。

2.5 通俗讲法

面向对象编程旨在我们在实现一个模块、复杂功能的时候,对所要实现的功能进行抽象,抽象成某一个具体的类型,这么做的原因是为了后续更好的扩展。

①正如案例中的学生,当学生的信息属性变多的时候,不仅仅只是一个 名字(name)、年龄(Age)、专业(Major)的时候,我们也可以很好的进行扩展。

我们只需要在学生类中加入对应的属性。eg:如果我们想要加入成绩的属性,那我们只需要在Student类加入成绩(score)这个属性即可。

②当我们要面向不同的群体,我们想要学生有对应的类别,男学生、女学生时,我们可通过继承的方式来更加便利的去实现对应的功能。

3 面向数据编程

3.1 概念

面向数据编程(Data-Oriented Programming)是一种编程范式,它将数据视为程序设计的中心和核心,以数据的处理和转换为主要目标。与传统的面向对象编程强调对象和行为不同,面向数据编程更加关注数据的处理和操作。

面向数据编程的主要概念包括:

  1. 数据驱动: 面向数据编程将数据视为程序的驱动力,程序的设计和实现主要围绕着数据的处理展开。数据在程序中被视为一个独立的实体,程序的目标是对这些数据进行操作、转换和处理。

  2. 数据结构: 面向数据编程强调对数据的组织和管理。程序设计中的主要任务是设计合适的数据结构来存储和组织数据,以便于有效地访问和处理数据。

  3. 数据流: 面向数据编程强调数据的流动和变化。程序的执行过程可以看作是数据在不同处理阶段之间流动和转换的过程,而不是对象之间消息传递和方法调用的过程。

  4. 函数式编程思想: 在面向数据编程中,通常会使用函数式编程的思想来处理数据。函数式编程强调不可变性和纯函数,即函数的输出仅依赖于输入,不会对外部状态产生影响,这样可以更加简化数据处理过程并提高代码的可靠性和可维护性。

  5. 并行和并发处理: 面向数据编程通常更容易实现并行和并发处理,因为数据操作和转换可以相对独立地进行,不涉及共享状态和副作用的问题。

面向数据编程的主要目标是使得程序更加直观、简洁和高效,尤其适用于需要大量数据处理和计算的应用场景,如数据分析、科学计算、图形渲染等。面向数据编程通常与面向对象编程、函数式编程等其他编程范式相结合,以实现更加灵活和高效的程序设计。

3.2 示例代码
using System;class TemperatureConverter
{// 将摄氏温度转换为华氏温度public static float CelsiusToFahrenheit(float celsius){return celsius * 9 / 5 + 32;}// 将华氏温度转换为摄氏温度public static float FahrenheitToCelsius(float fahrenheit){return (fahrenheit - 32) * 5 / 9;}
}class Program
{static void Main(string[] args){// 定义一个摄氏温度数组float[] celsiusTemperatures = { 0, 10, 20, 30, 40 };// 将摄氏温度转换为华氏温度并打印结果Console.WriteLine("摄氏温度转换为华氏温度:");foreach (float celsius in celsiusTemperatures){float fahrenheit = TemperatureConverter.CelsiusToFahrenheit(celsius);Console.WriteLine($"{celsius}摄氏度 = {fahrenheit}华氏度");}// 定义一个华氏温度数组float[] fahrenheitTemperatures = { 32, 50, 68, 86, 104 };// 将华氏温度转换为摄氏温度并打印结果Console.WriteLine("\n华氏温度转换为摄氏温度:");foreach (float fahrenheit in fahrenheitTemperatures){float celsius = TemperatureConverter.FahrenheitToCelsius(fahrenheit);Console.WriteLine($"{fahrenheit}华氏度 = {celsius}摄氏度");}// 等待用户按任意键退出Console.ReadLine();}
}

在这个示例中,我们首先定义了一个 TemperatureConverter 类,其中包含了两个静态方法用于进行温度转换。然后在 Main 方法中,我们定义了两个数组,分别存储了摄氏温度和华氏温度。通过调用 TemperatureConverter 类中的方法,将摄氏温度转换为华氏温度,或者将华氏温度转换为摄氏温度,并打印转换结果。

这个示例中,我们将数据(温度值)作为程序的核心,并围绕这些数据进行转换操作,体现了面向数据编程的概念。

3.3 适用范围
  1. 数据密集型应用程序: 面向数据编程适用于需要大量数据处理和转换的应用程序,如数据分析、科学计算、图形渲染等。在这些应用程序中,数据是程序的核心,程序的主要任务是对这些数据进行处理和操作。
  2. 并行和并发处理: 面向数据编程通常更容易实现并行和并发处理,因为数据操作和转换可以相对独立地进行,不涉及共享状态和副作用的问题。因此,面向数据编程适用于需要高效利用多核处理器和并行计算资源的应用程序。
  3. 数据流处理: 面向数据编程强调数据的流动和变化,程序的执行过程可以看作是数据在不同处理阶段之间流动和转换的过程。因此,面向数据编程适用于需要对数据进行流式处理和转换的应用程序,如实时数据处理、流式数据分析等。
  4. 大规模系统和复杂系统: 面向数据编程提供了一种组织代码的有效方式,使得程序的设计和实现更加模块化和清晰。因此,面向数据编程适用于需要开发大型、复杂的软件系统的情况,可以帮助降低系统的复杂度,提高代码的可维护性和可扩展性。
  5. 数据驱动的应用程序: 面向数据编程适用于以数据为核心的应用程序,如数据可视化、数据挖掘、机器学习等。在这些应用程序中,数据是驱动程序行为和决策的主要因素,因此面向数据编程能够更好地满足这些应用程序的需求。

总的来说,面向数据编程适用于需要大量数据处理和转换、需要并行和并发处理、需要流式处理和转换以及需要开发大型、复杂的系统的应用程序。通过将数据视为程序的核心,面向数据编程能够帮助提高程序的效率、可维护性和可扩展性。

3.4 注意事项
  1. 数据一致性: 确保数据的一致性是面向数据编程的关键。在对数据进行处理和转换的过程中,要确保数据的正确性和完整性,避免出现数据丢失、重复或者不一致的情况。
  2. 数据安全: 在处理敏感数据时,要注意数据的安全性。采取必要的安全措施来保护数据的机密性和完整性,如加密、访问控制等。
  3. 数据质量: 保证数据的质量是面向数据编程的重要任务之一。在对数据进行处理和转换之前,要进行数据质量分析和清洗,识别和处理数据中的错误、不一致性和异常值,以确保数据的准确性和可信度。
  4. 性能优化: 面向数据编程通常涉及大量数据的处理和转换,因此性能优化是必不可少的。要注意选择合适的数据结构和算法,优化数据访问和处理的性能,以提高程序的效率和响应速度。
  5. 并行和并发处理: 面向数据编程通常涉及并行和并发处理,要注意处理并发访问和竞争条件的问题。采取必要的同步和互斥机制,确保对共享数据的安全访问,避免数据的损坏和不一致性。
  6. 异常处理: 考虑到可能发生的异常情况,并且适当地处理这些异常。在对数据进行处理和转换的过程中,要检测和处理可能出现的错误,以保护程序免受错误的影响,并提供适当的错误处理机制。
  7. 可扩展性和灵活性: 考虑未来的需求变化和业务规模的增长,设计具有良好的可扩展性和灵活性的数据处理方案。避免硬编码特定的数据结构和处理逻辑,采取抽象和通用化的设计方法,以便于未来的扩展和变更。
  8. 测试和验证: 编写充分的测试代码来验证数据处理和转换的正确性和稳定性。进行单元测试、集成测试和端到端测试,确保程序在各种情况下都能够正确地处理数据。

通过注意以上事项,可以帮助保证面向数据编程的程序具有良好的性能、可靠性和可维护性,从而满足业务需求并提高工作效率。

3.5 通俗讲法

面向数据旨在处理数据,在这个过程中,我们又会用到面向过程的这么一种思维,而我们面向过程的目的旨在处理数据,我们最终的代码实现应该是服务于数据,而不是服务于过程。

这一点需要我们明确,面向数据编程旨在我们要关心,数据是否正确。

而面向过程,旨在我们为了得到正确的数据,去对一个单一的过程进行编写,使得我们能够拿到正确的数据。

而我们的数据同时也是为了服务于对象。

所以到这,我们也就明白了,其实在编程的过程中,这三种思维其实是共同作用的,而不是只是单一的使用。

即:

面向对象的过程中——需要面向数据的支撑

而面向数据的支撑——需要面向过程的处理

从而实现一些模块化、复杂性的系统的功能

在这里插入图片描述

公众号:平平无奇代码猴
也可以搜索:Jackiie_wang 公众号,欢迎大家关注!欢迎催更!留言!

作者:ProMer_Wang

链接:https://blog.csdn.net/qq_43801020/article/details/136925319

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

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

相关文章

软考高级:UML定时图概念和例题

作者:明明如月学长, CSDN 博客专家,大厂高级 Java 工程师,《性能优化方法论》作者、《解锁大厂思维:剖析《阿里巴巴Java开发手册》》、《再学经典:《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

KW音乐搜索参数

声明: 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标: …

【Git】第一课:Git的介绍

简介 什么是Git? Git是一个开源的分布式版本控制系统,用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建,现已成为开源软件开发中最流行的版本控制系统,没有之一。Git允许多人同时在不同的分支上工作&…

【leetcode热题】轮转数组

给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4…

Linux配置bond(网卡绑定)

Linux配置bond(网卡绑定) 最近需要搭建测试环境,为了保证带宽不成为瓶颈,就需要使用bond来提升网络带宽 1 概念、原理、工作模式 1.1 概念:网卡捆绑 网卡绑定,也称作网卡捆绑。就是将两个或者更多的物理网卡绑定成一…

Leetcode 200. 岛屿数量

心路历程: 在没有看图论这一章之前看这道题没什么直接的思路,在看完图论之后,学着使用DFS和BFS去套用解决。第一次自己做的时候还是遇到了很多小问题。整体思路很流畅,但是需要处理的细节第一次没怎么处理好,花了很多…

Postgresql数据库入门简介

Postgresql入门 1.Postgresql数据库简介 PostgresQL是一个功能强大的开源数据库系统。经过长达15年以上的积极开发和不断改进,PostgreSQL已在可靠性、稳定性、数据一致性等获得了业内极高的声誉。目前PostgreSql可以运行在所有主流操作系统上,包括Linux…

WebGIS管线在线编辑器(电力、水力、燃气、热力、热能管线)

随着GIS等信息技术的发展,地下管线管理也从二维平面向三维立体管理迈进。传统管线信息管理系统将管线及其附属设施抽象成二维平面内的点、要素,并使用各类点符号、不同颜色线段进行表达。虽能一定程度上满足城市智慧运行的需要,但不能很直观的…

分布式锁简单实现

分布式锁 Redis分布式锁最简单的实现 想要实现分布式锁,必须要求 Redis 有「互斥」的能力,我们可以使用 SETNX 命令,这个命令表示SET if Not Exists,即如果 key 不存在,才会设置它的值,否则什么也不做。 …

Premiere模板|200个视频标题文字动画pr字幕模板包

Premiere模板,13个类别200个Pr视频标题字幕文字动画模板mogrt包。 几乎适用于任何场景。粗体标题,标注,未来主义和线条标题,下三分之一,霓虹灯,带数字的标题,倒计时,表格&#xff0c…

【Mock|JS】Mock的get传参+获取参数信息

mockjs的get传参 前端请求 const { data } await axios("/video/childcomments", {params: {sort: 1,start: 2,count: 5,childCount: 6,commenIndex: 0,},});后端获取参数 使用正则匹配url /*** # 根据url获取query参数* param {Url} urlStr get请求获取参数 eg:…

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测

回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测 目录 回归预测 | Matlab基于SAO-BiLSTM雪融算法优化双向长短期记忆神经网络的数据多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab基于SAO-B…

ENISA 2023年威胁态势报告:主要发现和建议

欧盟网络安全局(ENISA)最近发布了其年度2023年威胁态势报告。该报告确定了预计在未来几年塑造网络安全格局的主要威胁、主要趋势、威胁参与者和攻击技术。在本文中,我们将总结报告的主要发现,并提供可操作的建议来缓解这些威胁。 介绍 ENISA 威胁态势报告…

CVX安装新版本Mosek求解器

在使用连续凸近似(SCA)求解优化问题时遇到了报错 Problem status : ILL_POSED Solution status : PRIMAL_ILLPOSED_CER并且最后给出的结果为NaN。 在CVX论坛中找到一条回答 具体链接如下: The status is failed 因为我使用的是CVX自带的…

垃圾回收-垃圾回收中的相关概念

目录 System.gc()的理解 内存泄漏(Memory Leak) 内存溢出(OOM) Stop The World 垃圾回收的串行、并行与并发 安全点与安全区域 强、软、弱、虚引用 强、软、弱、虚引用 终结器引用 System.gc()的理解 在默认情况下&#…

嵌入式驱动学习第四周——设备树

前言 掌握设备树是 Linux 驱动开发人员必备的技能!因为在新版本的 Linux 中,ARM 相关的驱动全部采用了设备树。本篇博客重点介绍一下设备树与设备树语法。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本…

Vue3的与2的简单区别

Vue2选项式api Vue3组合式API setup方法的使用,最后需要return setup语法糖省略了内部的export default{} 和return 内容 以及组件的注册 reactive生成响应式对象,只能适用于复杂对象,简单类型不可 ref生成响应式数据:复杂类型和简…

详细剖析多线程(更新中...)

文章目录 前言一、认识线程1.1线程概念1.2为什么要有线程1.3线程和进程的区别(经典面试题) 二、创建线程2.1继承 Thread 类,重写run2.2实现 Runnable 接口,重写run2.3继承 Thread 类,重写run,匿名内部类2.4实现 Runnable 接口,重写run&#x…

Linux信号补充——信号捕捉处理

一、信号的捕捉处理 ​ 信号保存后会在合适的时间进行处理; 1.1信号处理时间 ​ 进程会在操作系统的调度下处理信号,操作系统只管发信号,即信号处理是由进程完成的; ​ 1.信号处理首先进程得检查是否有信号;2.进程…

赋能智能未来:AI大模型的学习之旅

随着人工智能的迅速发展,AI大模型已经成为技术领域的一个热点。这些模型以其强大的数据处理能力和预测精度,正在不断推动着科技的边界,并且在医疗、金融、交通等多个行业中显示出了巨大的潜力。然而,构建和训练一个高效的AI大模型…