举例说明声明式语法和指令式语法?

SwiftUI 是声明式语法,对比与指令式语法的话,可以举例说明它们的区别吗?

阅读 854
avatarAI BotBETA

声明式语法与指令式语法的区别:

声明式语法

  • 概念:声明式编程是一种编程范式,其中程序员告诉计算机应该做什么,而不是如何去做。它通常关注于描述问题的解决方案,而不是描述解决方案的具体步骤。
  • 例子(SwiftUI):在 SwiftUI 中,你声明了你想要的界面元素和它们之间的关系,而不是告诉 SwiftUI 如何绘制这些元素。例如,你可以声明一个按钮(Button)和一个标签(Label),并将它们关联起来。当按钮被点击时,标签的文本会改变。
Button(action: {
    self.counter += 1
}) {
    Text("Tap me")
}
.padding()
.background(Color.blue)

Text("You've tapped \(counter) times")

在上面的例子中,你没有告诉 SwiftUI 如何绘制按钮或标签,也没有告诉它如何响应按钮的点击事件。你只是声明了这些元素和它们之间的关系。

指令式语法

  • 概念:指令式编程是另一种编程范式,其中程序员告诉计算机如何做事情。它通常关注于描述解决问题的具体步骤。
  • 例子(UIKit):在 UIKit 中,你可能会使用指令式的方式来创建和更新 UI。你需要明确地告诉 UIKit 如何绘制按钮、标签等,以及如何处理用户交互。
let button = UIButton(type: .system)
button.setTitle("Tap me", for: .normal)
button.addTarget(self, action: #selector(tapAction), for: .touchUpInside)
button.translatesAutoresizingMaskIntoConstraints = false

let label = UILabel()
label.text = "You've tapped 0 times"
label.translatesAutoresizingMaskIntoConstraints = false

view.addSubview(button)
view.addSubview(label)

NSLayoutConstraint.activate([
    button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    button.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -50),
    
    label.centerXAnchor.constraint(equalTo: view.centerXAnchor),
    label.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 100)
])

@objc func tapAction() {
    counter += 1
    label.text = "You've tapped \(counter) times"
}

在上面的 UIKit 例子中,你需要明确地创建按钮和标签,设置它们的属性,添加目标动作来处理用户交互,以及添加约束来确定它们在视图中的位置。这是指令式编程的一个例子,因为你正在告诉 UIKit 如何做这些事情。

总结

  • 声明式语法:关注于描述你想要的结果,而不是如何达到这个结果。它通常更加简洁和易于理解,但可能需要更多的抽象和学习。
  • 指令式语法:关注于描述如何达到你想要的结果。它通常更加灵活,但也可能更加复杂和难以维护。

SwiftUI 使用声明式语法,使得创建和更新 UI 更加直观和简洁,而 UIKit 使用指令式语法,提供了更多的灵活性和控制。

2 个回答

声明式:

function Component({ name }: { name: string }) {
    const [count, setCount] = useState(0)

    return <div>
        <p>{name} {count}</p>
        <button onClick={() => setCount(c => c + 1)} >+1</button>
    </div>
}

命令式:

function Component({ name }: { name: string }) {
  let count = 0;

  const div = document.createElement("div"),
    p = document.createElement("p"),
    button = document.createElement("button"),
    update = () => (p.innerText = `${name} ${count}`);

  update();

  button.innerText = "+1";
  button.addEventListener("click", () => {
    count++;
    update();
  });

  div.append(p, button);

  return div;
}

生活中的例子

妈妈让女儿打扫卫生这个场景。

命令式(指令式)
妈妈详细指导女儿如何打扫卫生,包括清洁哪些地方、使用哪些工具以及按照什么顺序进行清洁,这就类似于命令式编程。在这种情况下,女儿被告知了每一个具体的步骤和操作,类似于命令式编程需要明确指定每一个操作的执行步骤。

声明式
妈妈告诉女儿房间应该保持整洁,但并不详细说明具体的清洁步骤。在这种情况下,女儿只需知道房间需要保持干净整洁,而不需要了解每个细节的清洁过程。这就像声明式编程,它关注于描述目标或结果,而非具体的步骤。

获取集合中的奇数

下面用js为例,不会SwiftUI哈。

命令式(指令式)

const items = [1, 2, 3]
const result = []

for(let i = 0; i < items.length; i++) {
  const item = items[i];
    if (item % 2 !== 0) {
        result.push(item)
    }
}

核心:
明确的指定达到目标每一步该如何操作,侧重于具体步骤。

声明式

const items = [1, 2, 3]

const result = items.filter(item => item % 2 !== 0)

核心:
它关注于描述目标或结果,也就是“把所有的奇数给我”。而非具体步骤。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题