您当前的位置:首页 > 电脑百科 > 程序开发 > 编程百科

十个优秀的编程范式,你已经用过了几个?

时间:2023-08-07 16:10:58  来源:今日头条  作者:玄明Hanko

编程范式是计算机编程中的基本思想和方法论,它描述了不同的编程风格和抽象层次。随着计算机科学的不断发展,编程范式也在不断演进和扩展,从最早的命令式编程到面向对象、声明式和函数式编程等不同的范式相继涌现。本文将介绍编程范式的发展历程,并探讨各个范式的特点和应用领域。

十个优秀的编程范式,你已经用过了几个?

 

一、命令式编程

命令式编程(Imperative Programming Paradigm)是计算机编程中最早出现的编程范式之一。它的核心思想是通过一步步的指令来描述计算机执行的过程。在命令式编程中,程序员需要详细指定计算机执行的每一个操作,包括控制流程、数据存储和处理。

主要特点和特征:

  1. 易于理解:命令式编程以类似于自然语言的形式描述计算机执行的过程,因此易于理解和阅读。
  2. 易于实现:由于命令式编程描述的是计算机的具体执行过程,因此易于在计算机上实现。
  3. 顺序执行:在命令式编程中,计算机按照给定的顺序依次执行指令,从上到下逐行执行。
  4. 可变状态:命令式编程中,计算机内部的状态可以被修改,程序可以通过改变变量的值来改变计算的结果。
  5. 控制流程:命令式编程使用条件语句(如if-else)和循环语句(如for和while)来控制计算机的执行流程。

示例代码:使用命令式编程实现计算1到n的和

def calculate_sum(n):
    sum = 0
    for i in range(1, n+1):
        sum += i
    return sum

n = 10
result = calculate_sum(n)
print("Sum from 1 to", n, "is:", result)

尽管命令式编程易于理解和实现,但在面对复杂的问题时,往往会导致代码冗长且难以维护。这促使计算机科学家和软件工程师探索其他编程范式,如面向对象编程和声明式编程,以提高代码的可维护性和重用性。然而,命令式编程仍然在许多应用场景中得到广泛应用,并且作为其他编程范式的基础,为程序员提供了编程的起点。

二、结构化编程

结构化编程(Structured Programming Paradigm):旨在提高程序的可读性和可维护性。它主要通过引入结构化控制流程(顺序、选择、循环)来改进传统的无限制的GOTO语句,使得程序的逻辑结构更加清晰和易于理解。

主要特点和原则:

  1. 顺序结构:结构化编程中,程序的执行按照代码的书写顺序逐行执行。每一行代码执行完后,程序自动进入下一行的执行。这样确保了程序逻辑的连续性和一致性。
  2. 选择结构:结构化编程引入条件语句(如if-else语句),根据条件的真假来决定程序的执行路径。这样可以根据不同的条件执行不同的代码块,提高程序的灵活性。
  3. 循环结构:结构化编程支持循环语句(如for和while循环),使得代码块可以重复执行,减少了代码的冗余和重复。
  4. 前进式设计:结构化编程倡导程序设计时采用前进式设计,即从上到下依次设计代码,而不是通过跳转语句来改变程序的执行流程。这样有利于程序的理解和维护。

结构化编程范式的典型代表是Dijkstra的"结构化程序设计"(Structured Programming)理论。在20世纪60年代末和70年代初,Dijkstra等人提出了结构化程序设计理论,将结构化控制流程作为编程的基本单元,以取代过去不受限制的GOTO语句。

示例代码:使用结构化编程实现计算1到n的和

def calculator():
    print("Simple Calculator")
    print("Supported Operations: +, -, *, /")
    
    num1 = float(input("Enter the first number: "))
    operator = input("Enter the operator (+, -, *, /): ")
    num2 = float(input("Enter the second number: "))
    
    if operator == '+':
        result = add(num1, num2)
    elif operator == '-':
        result = subtract(num1, num2)
    elif operator == '*':
        result = multiply(num1, num2)
    elif operator == '/':
        result = divide(num1, num2)
    else:
        result = "Error: Invalid operator."
    
    print("Result:", result)

calculator()

结构化编程范式对编程的进步做出了重要贡献,它使得程序的逻辑更加清晰和易于理解,提高了代码的可读性和可维护性。尽管现代编程语言和编程范式已经发展到更高级的层面,但结构化编程的基本思想仍然被广泛应用于编程实践中。

三、面向对象编程

面向对象编程(Object-Oriented Programming,OOP)是一种广泛应用的编程范式,它将程序中的数据和对数据的操作封装成对象,并通过类描述对象的行为和属性。面向对象编程强调对象的概念,通过封装、继承和多态等特性来实现数据的抽象和复用。

主要特点和原则:

  1. 对象:对象是面向对象编程的核心概念,代表现实世界中的实体和其行为。对象具有状态(属性)和行为(方法)。
  2. 类:类是对象的抽象描述,是一种模板或蓝图,用于创建对象。一个类可以创建多个对象,这些对象都具有相同的属性和行为。
  3. 封装:封装是将对象的状态和行为封装在一起,对外部隐藏对象的内部实现细节。只暴露必要的接口,提供更好的数据保护和安全性。
  4. 继承:继承是面向对象编程中实现代码复用的一种机制。子类可以继承父类的属性和行为,并可以在此基础上添加新的特性。
  5. 多态:多态允许一个方法在不同的对象上执行不同的操作,提高了代码的灵活性和可扩展性。通过继承和接口,可以实现运行时多态性。

面向对象编程的典型代表是JAVA和C++等编程语言。它在软件开发中得到广泛应用,尤其是在大型复杂系统的开发中。面向对象编程可以使得代码结构更加清晰、易于理解和维护,同时也提供了良好的代码复用性。

示例代码:使用面向对象编程实现简单的计算器类

class Calculator {
    private int result;

    public Calculator() {
        this.result = 0;
    }

    public void add(int number) {
        result += number;
    }

    public int getResult() {
        return result;
    }
}

public class ObjectOrientedProgrammingDemo {
    public static void mAIn(String[] args) {
        Calculator calculator = new Calculator();
        calculator.add(5);
        calculator.add(10);
        int result = calculator.getResult();
        System.out.println("Result is: " + result); // Output: Result is: 15
    }
}

面向对象编程以对象为核心,通过封装、继承和多态等特性来实现数据的抽象和复用。面向对象编程使得代码结构更加清晰和易于理解,提高了代码的可读性、可维护性和可扩展性。在现代软件开发中,面向对象编程仍然是一种非常流行和广泛应用的编程范式。

四、函数式编程

函数式编程(Functional Programming):它将计算视为数学函数的计算,并避免使用可变状态和改变状态的操作。函数式编程强调使用纯函数(Pure Function),即对于相同的输入,总是产生相同的输出,不会对外部环境产生副作用。函数式编程主要依赖于高阶函数、匿名函数、递归和惰性求值等特性。

主要特点和原则:

  1. 纯函数:函数式编程鼓励使用纯函数,避免副作用和状态改变。纯函数不依赖于外部状态,只依赖于输入,并返回输出,对于相同的输入总是产生相同的输出。
  2. 不可变性:函数式编程中,数据一旦创建就不能再修改。变量和数据结构都是不可变的,而不是可变的。
  3. 高阶函数:函数式编程支持高阶函数,即函数可以作为参数传递给其他函数,也可以返回其他函数。
  4. 递归:函数式编程常常使用递归来进行迭代和循环操作,而不是使用循环结构。
  5. 惰性求值:函数式编程通常采用惰性求值(Lazy Evaluation),只有在需要结果时才进行计算。

函数式编程在数学中有很强的理论基础,尤其是λ演算(Lambda Calculus)。函数式编程在处理数据和并发编程方面有一些优势,并且能够更好地处理大规模和分布式计算。

示例代码:使用函数式编程风格计算列表中所有元素的平方

Python/ target=_blank class=infotextkey>PythonCopy code
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 使用map函数对列表中的每个元素进行平方操作
squared_numbers = list(map(lambda x: x * x, numbers))

print("Squared numbers:", squared_numbers) # Output: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

在上述示例中,我们使用函数式编程风格计算了列表numbers中所有元素的平方。我们使用了map高阶函数和匿名函数,将每个元素平方,并将结果存储在squared_numbers列表中。这里没有修改原始数据,而是创建了一个新的列表来保存计算结果,符合函数式编程的不可变性原则。

五、逻辑式编程

逻辑式编程(Logic Programming):是一种基于逻辑推理的编程方法。在逻辑式编程中,程序员描述问题的逻辑规则和关系,而不是显式指定计算步骤。程序通过逻辑推理来求解问题,即根据已知的逻辑规则和事实推导出结果。

主要特点和原则:

  1. 声明式编程:逻辑式编程是一种声明式编程范式,程序员描述问题的逻辑关系,而不是指定计算的具体步骤。
  2. 规则和事实:逻辑式编程使用一组规则(规则库)和已知的事实来求解问题。程序员提供问题的逻辑规则和初始事实,然后系统根据这些规则和事实进行逻辑推理。
  3. 逻辑推理:逻辑式编程使用逻辑推理技术来从已知的规则和事实中推导出新的结论。它尝试通过逻辑推理来找到问题的解决方案。
  4. 形式化:逻辑式编程的规则和事实通常是形式化的,采用一种形式逻辑(如谓词逻辑)来表达问题的逻辑关系。

逻辑式编程的代表性语言包括Prolog(PROgramming in LOGic)和Datalog。在这些语言中,程序员描述问题的逻辑规则和事实,然后通过查询来获取结果。逻辑式编程在人工智能、数据库查询、自然语言处理等领域得到广泛应用。

示例代码:使用Prolog实现一个简单的家庭关系查询

father(john, bob).
father(bob, alice).
father(bob, eve).
mother(lisa, alice).
mother(lisa, eve).

parent(X, Y) :- father(X, Y).
parent(X, Y) :- mother(X, Y).

ancestor(X, Y) :- parent(X, Y).
ancestor(X, Y) :- parent(X, Z), ancestor(Z, Y).

在上述示例中,我们使用Prolog语言定义了一些家庭关系规则。规则包括father、mother、parent和ancestor,分别表示父亲、母亲、父母和祖先之间的关系。然后我们可以通过查询来查找家庭成员之间的关系,例如查询ancestor(john, alice)将返回true,表示"john"是"alice"的祖先。

六、泛型编程

泛型编程(Generic Programming Paradigm):实现通用、灵活的数据结构和算法,提高代码的复用性和可扩展性。泛型编程通过参数化类型和算法来实现通用性,使得程序员可以编写一次代码,然后在不同的数据类型上重复使用。

主要特点和原则:

  1. 参数化类型:泛型编程使用参数化类型,也称为泛型,来表示通用的数据类型。这使得可以编写适用于多种数据类型的代码,而不需要为每种数据类型编写特定的实现。
  2. 数据结构和算法:泛型编程通常应用于数据结构和算法的实现。通过泛型,可以在同一份代码中处理不同类型的数据,从而提高代码的复用性。
  3. 类型安全:泛型编程在编译时进行类型检查,确保代码的类型安全性。这样可以避免在运行时出现类型错误。
  4. 适用于多种数据类型:泛型编程可以适用于不同的数据类型,包括基本数据类型和自定义数据类型。

泛型编程的代表性语言包括C++和Java。在这些语言中,泛型可以通过模板(Template)机制(C++)或泛型类和泛型方法(Java)来实现。

示例代码:使用泛型编程实现一个通用的栈数据结构

public class GenericStack<T> {
    private List<T> stack;

    public GenericStack() {
        stack = new ArrayList<>();
    }

    public void push(T item) {
        stack.add(item);
    }

    public T pop() {
        if (!isEmpty()) {
            return stack.remove(stack.size() - 1);
        } else {
            throw new RuntimeException("Stack is empty");
        }
    }

    public boolean isEmpty() {
        return stack.isEmpty();
    }
}

public class GenericProgrammingDemo {
    public static void main(String[] args) {
        GenericStack<Integer> intStack = new GenericStack<>();
        intStack.push(1);
        intStack.push(2);
        intStack.push(3);

        while (!intStack.isEmpty()) {
            System.out.println(intStack.pop()); // Output: 3, 2, 1
        }

        GenericStack<String> stringStack = new GenericStack<>();
        stringStack.push("Hello");
        stringStack.push("World");

        while (!stringStack.isEmpty()) {
            System.out.println(stringStack.pop()); // Output: "World", "Hello"
        }
    }
}

在上述示例中,用泛型编程实现了一个通用的栈(Stack)数据结构GenericStack。通过在类定义中使用泛型参数<T>,我们可以创建适用于不同数据类型的栈对象。在示例中,我们分别创建了一个存储整数的栈和一个存储字符串的栈,并对它们进行了一些操作。

七、并发编程

并发编程(Concurrent Programming Paradigm):充分利用多核处理器和分布式计算环境的优势,使得程序能够更加高效地利用计算资源,提高系统的性能和吞吐量。

主要特点和原则:

  1. 并发性:并发编程关注同时处理多个计算任务,通过同时执行多个任务来提高程序的效率。
  2. 线程和进程:并发编程通常使用线程和进程作为基本执行单位,允许多个任务在同一时间并行执行。
  3. 共享资源:并发编程中的任务可能共享同一资源(如内存、文件等),需要合理地进行协调和同步,避免出现竞态条件和数据不一致问题。
  4. 锁和同步:为了保证共享资源的正确访问,并发编程使用锁和同步机制来实现资源的互斥访问。

示例代码:使用多线程并发编程计算列表中所有元素的平方

def square(num):
    return num * num

def calculate_square(numbers):
    results = []
    for num in numbers:
        results.Append(square(num))
    return results

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 创建两个线程来并行计算列表中元素的平方
thread1 = threading.Thread(target=lambda: calculate_square(numbers[:5]))
thread2 = threading.Thread(target=lambda: calculate_square(numbers[5:]))

# 启动线程
thread1.start()
thread2.start()

# 等待两个线程执行完毕
thread1.join()
thread2.join()

# 合并两个线程的结果
results = thread1.result + thread2.result

print("Squared numbers:", results)

在上述示例中,使用多线程并发编程计算列表numbers中所有元素的平方。我们创建了两个线程来分别计算前半部分和后半部分的元素平方,并通过线程的result属性将结果合并。

八、分布式编程

分布式编程:用于开发分布式系统。分布式系统是由多台计算机(或节点)组成的系统,在这些计算机之间共享任务和资源,以完成复杂的任务。分布式编程的目标是协调不同节点之间的通信和合作,使得系统能够高效地工作并具有可扩展性。

主要特点和原则:

  1. 通信:在分布式编程中,节点之间需要通过网络进行通信。节点可以是位于同一地点或全球范围的计算机。
  2. 同步和异步:节点之间的通信可以是同步的(阻塞式)或异步的(非阻塞式)。异步通信常用于提高系统的并发性和性能。
  3. 容错性:分布式系统可能面临节点故障或网络故障。分布式编程需要考虑容错性,确保系统在出现故障时仍能正常工作。
  4. 一致性:分布式系统中的数据可能分布在不同的节点上。分布式编程需要解决一致性问题,确保数据在所有节点上保持一致。

分布式编程在现代计算中非常重要,特别是在云计算、大数据处理和分布式数据库等领域。常见的分布式编程框架包括Apache Hadoop、Apache Spark、Apache Kafka等。这些框架提供了丰富的分布式编程工具和库,使得开发分布式系统更加便捷和高效。

示例代码:使用Java实现一个简单的分布式计算任务

public class DistributedProgrammingDemo {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 创建一个线程池
        ExecutorService executorService = Executors.newFixedThreadPool(4);

        // 定义一个计算任务
        Callable<Integer> task = () -> {
            int result = 0;
            for (int i = 1; i <= 100; i++) {
                result += i;
            }
            return result;
        };

        // 提交任务到线程池进行计算
        Future<Integer> future1 = executorService.submit(task);
        Future<Integer> future2 = executorService.submit(task);

        // 获取计算结果
        int result1 = future1.get();
        int result2 = future2.get();

        // 关闭线程池
        executorService.shutdown();

        // 打印结果
        System.out.println("Result 1: " + result1);
        System.out.println("Result 2: " + result2);
    }
}

在上述示例中,使用Java的ExecutorService来创建一个线程池,然后定义一个计算任务task,该任务计算1到100的和。我们将这个任务提交给线程池进行计算,并通过Future对象来获取计算结果。通过线程池,我们可以将计算任务分布到不同的线程上并行执行,实现了简单的分布式计算。

九、响应式编程

响应式编程(Reactive Programming):主要用于处理异步数据流和事件序列。它通过使用观察者模式或迭代器模式来处理数据的变化,自动传播数据的变化并引起相关依赖项的更新。响应式编程范式的目标是提供一种简洁、灵活和高效的方式来处理异步数据流,同时减少代码中的回调地狱和复杂性。

主要特点和原则:

  1. 数据流:响应式编程将数据视为一系列的事件或数据流,而不是静态的值。这些数据流可以是来自用户输入、网络请求、传感器数据等。
  2. 响应式机制:响应式编程使用观察者模式或迭代器模式来监听数据流的变化,并在数据发生变化时自动更新依赖项。
  3. 异步处理:响应式编程通常用于处理异步操作,例如处理网络请求或用户输入等。它可以避免使用传统的回调函数或回调地狱,提高代码的可读性和可维护性。
  4. 响应式链式操作:响应式编程通常支持链式操作,允许通过一系列操作符对数据流进行转换和处理。这样可以方便地对数据进行过滤、映射、合并等操作。

响应式编程范式在现代编程中越来越受欢迎,尤其在处理复杂的前端应用和响应式UI中,如使用React、Angular和Vue.js等框架。同时,响应式编程也在后端和服务端编程中发挥重要作用,用于处理异步任务和事件驱动的应用。

示例代码:使用响应式编程处理简单的数据流

public class ReactiveProgrammingDemo {
    public static void main(String[] args) {
        // 创建一个包含1到5的数据流
        Observable<Integer> observable = Observable.range(1, 5);

        // 对数据流进行操作,将每个元素都乘以2
        observable
            .map(number -> number * 2)
            .subscribe(
                // 订阅处理每个元素
                number -> System.out.println("Processed number: " + number),
                // 订阅处理错误
                error -> System.err.println("Error: " + error),
                // 订阅完成
                () -> System.out.println("Processing complete!")
            );
    }
}

在上述示例中,使用响应式编程处理一个简单的数据流,其中包含1到5的整数。我们通过Observable创建数据流,然后使用map操作符将每个元素乘以2,最后订阅数据流并处理每个元素。

十、面向领域编程

面向领域编程(Domain-Specific Programming):旨在解决特定领域的问题,并为该领域定义专门的语言和工具。面向领域编程将关注点从通用的编程语言转移到特定领域的需求上,使得程序员可以更专注于解决领域问题,而不是关注实现细节。

主要特点和原则:

  1. 领域特定语言(DSL):面向领域编程使用领域特定语言(DSL),这是一种专门为解决特定领域问题而设计的语言。DSL可以根据领域需求定义领域相关的关键字、语法和语义,使得程序员可以用更接近自然语言的方式表达领域问题。
  2. 领域建模:面向领域编程重视对领域进行建模和抽象,从而更好地理解和解决领域问题。领域建模可以通过定义领域模型和领域对象来实现。
  3. 领域专家参与:面向领域编程鼓励领域专家和程序员之间的密切合作,以确保领域需求得到准确地反映在DSL和程序设计中。

面向领域编程通常应用于特定的领域,如科学计算、金融、医疗、游戏开发等。DSL可以是内部DSL(嵌入在通用编程语言中的DSL)或外部DSL(独立于通用编程语言的DSL)。

示例代码:使用面向领域编程实现一个简单的规则引擎DSL

class RuleEngine:
    def __init__(self):
        self.rules = []

    def add_rule(self, condition, action):
        self.rules.append((condition, action))

    def run(self, data):
        for condition, action in self.rules:
            if condition(data):
                action(data)
                break

                # 面向领域编程实现一个简单的规则引擎DSL
engine = RuleEngine()

# 定义规则
engine.add_rule(lambda data: data["temperature"] > 30,
                lambda data: print("It's hot! Turn on the fan."))

engine.add_rule(lambda data: data["temperature"] < 10,
                lambda data: print("It's cold! Turn on the heater."))

# 运行规则引擎
data = {"temperature": 25}
engine.run(data) # Output: "It's hot! Turn on the fan."

在上述示例中,使用面向领域编程实现了一个简单的规则引擎DSL。我们定义了两个规则,一个用于判断温度是否大于30摄氏度,另一个用于判断温度是否小于10摄氏度。根据输入的数据,规则引擎会根据规则进行条件判断并执行相应的动作。



Tags:编程   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
“不懂编程就是文盲”?别用焦虑论调裹挟家长
据3月17日中新网报道,随着科技的发展和社会的进步,科创教育逐渐走入千家万户,少儿编程作为代表,近年来更是备受瞩目。然而,“未来的文盲,就是不懂编程的人”的论调也甚嚣尘上。必...【详细内容】
2024-03-19  Search: 编程  点击:(9)  评论:(0)  加入收藏
编程二十年,38岁谷歌程序员的16条建议,涉创业、技术淘汰、拿大厂offer……
以能够让项目自负盈亏,并在这一约束下优化其增长的方式来管理和调整项目,这是这个世上最厉害的本事。距离我正式开始编程的工作已经过去二十年了。在这些年里,我有以下收获: 获...【详细内容】
2024-03-10  Search: 编程  点击:(4)  评论:(0)  加入收藏
C#异步编程:Task.Run vs. async-await,掌握基础与高级用法
概述:C#中的异步编程有两主要方式:Task.Run用于在后台线程执行同步操作,而async-await更适用于清晰表达异步流程。基础用法展示了它们的简单应用,高级用法则演示了它们的结合使...【详细内容】
2024-03-09  Search: 编程  点击:(23)  评论:(0)  加入收藏
C++多线程编程:解锁性能与并发的奥秘
今天我们将深入探讨C++中的多线程编程,揭示多线程如何解锁性能潜力,提高程序的并发性能。什么是多线程?在计算机科学中,多线程是指一个进程(程序的执行实例)中的多个线程同时执行...【详细内容】
2024-02-03  Search: 编程  点击:(69)  评论:(0)  加入收藏
主流编程语言哪个更容易学?
主流编程语言哪个更容易学?在当今数字化时代,编程语言已成为一项重要的技能,越来越多的人开始学习编程。然而,对于初学者来说,选择一门容易入门的编程语言是至关重要的。在本文中...【详细内容】
2024-01-31  Search: 编程  点击:(128)  评论:(0)  加入收藏
用于人工智能开发的主流编程语言都有哪些?
在人工智能开发领域,编程语言的选择至关重要。目前,主流的编程语言主要包括Python、Java、C++、JavaScript和Swift等。这些语言各具特色,适用于不同的人工智能开发场景。首先,Py...【详细内容】
2024-01-31  Search: 编程  点击:(129)  评论:(0)  加入收藏
不容错过的4款宝藏GPTs:程序员新宠,让编程不再枯燥!
原文来源:硬 AI自从GPT Store“开业”以来,我们就一直在使用不同的GPTs,尝试自动化一些重复繁琐的日常工作。在浩如烟海的GPTs中,虽然真正有用的并不多,很多GPTs的功能都比较局限...【详细内容】
2024-01-24  Search: 编程  点击:(45)  评论:(0)  加入收藏
Java并发编程高阶技术
随着计算机硬件的发展,多核处理器的普及和内存容量的增加,利用多线程实现异步并发成为提升程序性能的重要途径。在Java中,多线程的使用能够更好地发挥硬件资源,提高程序的响应...【详细内容】
2024-01-19  Search: 编程  点击:(105)  评论:(0)  加入收藏
在 Rust 编程中使用泛型
本文的内容将涉及泛型定义函数、结构体、枚举和方法, 还将讨论泛型如何影响代码性能。1.摘要Rust中的泛型可以让我们为像函数签名或结构体这样的项创建定义, 这样它们就可以...【详细内容】
2024-01-09  Search: 编程  点击:(89)  评论:(0)  加入收藏
Go编程中调用外部命令的几种场景
在很多场合, 使用Go语言需要调用外部命令来完成一些特定的任务, 例如: 使用Go语言调用Linux命令来获取执行的结果,又或者调用第三方程序执行来完成额外的任务。在go的标准库...【详细内容】
2024-01-09  Search: 编程  点击:(101)  评论:(0)  加入收藏
▌简易百科推荐
即将过时的 5 种软件开发技能!
作者 | Eran Yahav编译 | 言征出品 | 51CTO技术栈(微信号:blog51cto) 时至今日,AI编码工具已经进化到足够强大了吗?这未必好回答,但从2023 年 Stack Overflow 上的调查数据来看,44%...【详细内容】
2024-04-03    51CTO  Tags:软件开发   点击:(5)  评论:(0)  加入收藏
跳转链接代码怎么写?
在网页开发中,跳转链接是一项常见的功能。然而,对于非技术人员来说,编写跳转链接代码可能会显得有些困难。不用担心!我们可以借助外链平台来简化操作,即使没有编程经验,也能轻松实...【详细内容】
2024-03-27  蓝色天纪    Tags:跳转链接   点击:(12)  评论:(0)  加入收藏
中台亡了,问题到底出在哪里?
曾几何时,中台一度被当做“变革灵药”,嫁接在“前台作战单元”和“后台资源部门”之间,实现企业各业务线的“打通”和全域业务能力集成,提高开发和服务效率。但在中台如火如荼之...【详细内容】
2024-03-27  dbaplus社群    Tags:中台   点击:(8)  评论:(0)  加入收藏
员工写了个比删库更可怕的Bug!
想必大家都听说过删库跑路吧,我之前一直把它当一个段子来看。可万万没想到,就在昨天,我们公司的某位员工,竟然写了一个比删库更可怕的 Bug!给大家分享一下(不是公开处刑),希望朋友们...【详细内容】
2024-03-26  dbaplus社群    Tags:Bug   点击:(5)  评论:(0)  加入收藏
我们一起聊聊什么是正向代理和反向代理
从字面意思上看,代理就是代替处理的意思,一个对象有能力代替另一个对象处理某一件事。代理,这个词在我们的日常生活中也不陌生,比如在购物、旅游等场景中,我们经常会委托别人代替...【详细内容】
2024-03-26  萤火架构  微信公众号  Tags:正向代理   点击:(10)  评论:(0)  加入收藏
看一遍就理解:IO模型详解
前言大家好,我是程序员田螺。今天我们一起来学习IO模型。在本文开始前呢,先问问大家几个问题哈~什么是IO呢?什么是阻塞非阻塞IO?什么是同步异步IO?什么是IO多路复用?select/epoll...【详细内容】
2024-03-26  捡田螺的小男孩  微信公众号  Tags:IO模型   点击:(8)  评论:(0)  加入收藏
为什么都说 HashMap 是线程不安全的?
做Java开发的人,应该都用过 HashMap 这种集合。今天就和大家来聊聊,为什么 HashMap 是线程不安全的。1.HashMap 数据结构简单来说,HashMap 基于哈希表实现。它使用键的哈希码来...【详细内容】
2024-03-22  Java技术指北  微信公众号  Tags:HashMap   点击:(11)  评论:(0)  加入收藏
如何从头开始编写LoRA代码,这有一份教程
选自 lightning.ai作者:Sebastian Raschka机器之心编译编辑:陈萍作者表示:在各种有效的 LLM 微调方法中,LoRA 仍然是他的首选。LoRA(Low-Rank Adaptation)作为一种用于微调 LLM(大...【详细内容】
2024-03-21  机器之心Pro    Tags:LoRA   点击:(12)  评论:(0)  加入收藏
这样搭建日志中心,传统的ELK就扔了吧!
最近客户有个新需求,就是想查看网站的访问情况。由于网站没有做google的统计和百度的统计,所以访问情况,只能通过日志查看,通过脚本的形式给客户导出也不太实际,给客户写个简单的...【详细内容】
2024-03-20  dbaplus社群    Tags:日志   点击:(4)  评论:(0)  加入收藏
Kubernetes 究竟有没有 LTS?
从一个有趣的问题引出很多人都在关注的 Kubernetes LTS 的问题。有趣的问题2019 年,一个名为 apiserver LoopbackClient Server cert expired after 1 year[1] 的 issue 中提...【详细内容】
2024-03-15  云原生散修  微信公众号  Tags:Kubernetes   点击:(6)  评论:(0)  加入收藏
站内最新
站内热门
站内头条