从Script到Code Blocks、Code Behind到MVC、MVP、MVVM
从Script到Code Blocks、Code Behind到MVC、MVP、MVVM引言前端架构的进化之路想象一下你正在搭建一个乐高城堡。最初你只是把积木随意堆在一起Script方式后来你把城堡分成底座、塔楼、城门等模块Code Blocks再后来你开始画设计图让不同人负责不同部分Code Behind。最后你甚至发明了一套积木标准让所有城堡的组件可以互换MVC/MVP/MVVM。这就是前端架构的进化史。## 第一阶段Script——混沌初开的时代在Web早期所有代码都混在HTML文件中。JavaScript像散落的乐高积木哪里需要就放哪里。html!-- 1995年的典型页面 --htmlbody h1我的第一个网页/h1 p iddemo点击按钮改变文本/p button onclickchangeText()点击我/button script // 直接写在HTML里的JavaScript function changeText() { document.getElementById(demo).innerHTML 文本被改变了; } /script/body/html这种方式的问题显而易见-难以维护代码混在一起就像把所有衣服塞进一个抽屉-重复代码同样功能要在不同页面重复写-全局污染所有变量都在全局作用域## 第二阶段Code Blocks——模块化的萌芽开发者开始把JavaScript拆分成独立文件就像把不同物品放进不同抽屉。javascript// utils.js - 工具函数模块function formatDate(date) { // 格式化日期 let year date.getFullYear(); let month date.getMonth() 1; let day date.getDate(); return ${year}-${month.toString().padStart(2, 0)}-${day.toString().padStart(2, 0)};}// 导出函数供其他模块使用window.formatDate formatDate;// calculator.js - 计算模块function add(a, b) { return a b;}function multiply(a, b) { return a * b;}window.add add;window.multiply multiply;html!-- 使用模块的页面 --htmlhead script srcutils.js/script script srccalculator.js/script/headbody script // 调用模块中的函数 let today new Date(); console.log(formatDate(today)); // 输出格式化的日期 console.log(add(3, 5)); // 输出8 /script/body/html这种方式的进步在于-逻辑分离不同功能放在不同文件-复用性提高可以在多个页面使用相同模块-命名空间通过对象减少全局污染## 第三阶段Code Behind——代码后置的革新Code Behind模式把业务逻辑从视图HTML中彻底分离。这种模式在ASP.NET中非常流行。python# views.py - 视图逻辑层from flask import Flask, render_template, requestapp Flask(__name__)# 业务逻辑计算商品总价def calculate_total_price(items): total 0 for item in items: total item[price] * item[quantity] return totalapp.route(/checkout, methods[POST])def checkout(): # 获取用户购物车数据 cart_items request.json.get(items, []) # 调用业务逻辑 total calculate_total_price(cart_items) # 返回计算结果 return render_template(checkout.html, total_pricetotal)html!-- checkout.html - 纯视图模板 --!DOCTYPE htmlhtmlbody h1购物车结算/h1 !-- 视图只负责展示不包含业务逻辑 -- p总金额{{ total_price }} 元/p !-- 所有交互逻辑交给Code Behind处理 -- button onclicksubmitOrder()提交订单/button script function submitOrder() { // 通过AJAX请求后端 fetch(/checkout, { method: POST, body: JSON.stringify({items: cartData}) }); } /script/body/htmlCode Behind的核心思想视图View只负责展示代码Code负责逻辑。## 第四阶段MVC——Model-View-ControllerMVC把应用分为三个核心组件-Model管理数据和业务逻辑-View负责数据显示-Controller处理用户输入协调Model和Viewpython# MVC示例简单的待办事项应用# Model - 数据层class TodoModel: def __init__(self): self.todos [] def add_todo(self, task): self.todos.append({task: task, completed: False}) def get_all(self): return self.todos# View - 视图层class TodoView: def display_todos(self, todos): print(\n 待办事项列表 ) for i, todo in enumerate(todos, 1): status ✓ if todo[completed] else print(f{i}. [{status}] {todo[task]}) def get_user_input(self): return input(\n输入新任务或输入q退出)# Controller - 控制层class TodoController: def __init__(self): self.model TodoModel() self.view TodoView() def run(self): while True: # 显示当前数据 self.view.display_todos(self.model.get_all()) # 获取用户输入 task self.view.get_user_input() if task.lower() q: break # 处理数据 self.model.add_todo(task)# 启动应用if __name__ __main__: app TodoController() app.run()MVC的优势-职责明确每个组件只做一件事-可测试性Model和Controller可以独立测试-可扩展性可以轻松替换View或Model## 第五阶段MVP——Model-View-PresenterMVP是MVC的变体主要区别在于View和Presenter的关系更紧密。javascript// MVP模式示例用户登录功能// Model - 数据层class LoginModel { constructor() { this.username ; this.password ; } validateCredentials(username, password) { // 模拟验证逻辑 if (username admin password 123456) { return { success: true, message: 登录成功 }; } return { success: false, message: 用户名或密码错误 }; }}// View - 视图层抽象接口class LoginView { constructor() { this.usernameInput document.getElementById(username); this.passwordInput document.getElementById(password); this.loginButton document.getElementById(loginBtn); this.messageElement document.getElementById(message); } getUsername() { return this.usernameInput.value; } getPassword() { return this.passwordInput.value; } showMessage(message, isSuccess) { this.messageElement.textContent message; this.messageElement.style.color isSuccess ? green : red; } clearInputs() { this.usernameInput.value ; this.passwordInput.value ; }}// Presenter - 控制器class LoginPresenter { constructor(view, model) { this.view view; this.model model; // 绑定事件 this.view.loginButton.addEventListener(click, () this.handleLogin()); } handleLogin() { const username this.view.getUsername(); const password this.view.getPassword(); // 调用Model进行验证 const result this.model.validateCredentials(username, password); // 更新View this.view.showMessage(result.message, result.success); if (result.success) { this.view.clearInputs(); } }}// 初始化const model new LoginModel();const view new LoginView();const presenter new LoginPresenter(view, model);MVP的特点-View完全被动所有逻辑由Presenter处理-测试友好可以Mock View进行测试-适合复杂UI特别适合需要精细控制视图的场景## 第六阶段MVVM——Model-View-ViewModelMVVM是当前最流行的模式通过数据绑定实现自动同步。python# 使用Tkinter实现MVVM示例import tkinter as tkfrom tkinter import ttk# Model - 数据层class UserModel: def __init__(self): self._name self._age 0 self._observers [] def add_observer(self, observer): self._observers.append(observer) def notify_observers(self, property_name, value): for observer in self._observers: observer.update(property_name, value) property def name(self): return self._name name.setter def name(self, value): self._name value self.notify_observers(name, value) property def age(self): return self._age age.setter def age(self, value): self._age value self.notify_observers(age, value)# ViewModel - 视图模型class UserViewModel: def __init__(self, model): self.model model self.name tk.StringVar() self.age tk.StringVar() self.greeting tk.StringVar() # 绑定模型变化 model.add_observer(self) def update(self, property_name, value): if property_name name: self.name.set(value) elif property_name age: self.age.set(str(value)) self._update_greeting() def on_name_changed(self, *args): self.model.name self.name.get() def on_age_changed(self, *args): try: age int(self.age.get()) self.model.age age except ValueError: pass def _update_greeting(self): self.greeting.set(f你好{self.model.name}你今年{self.model.age}岁。)# View - 视图层class UserView: def __init__(self, root, view_model): self.view_model view_model # 创建UI组件 frame ttk.Frame(root, padding10) frame.grid(row0, column0, sticky(tk.W, tk.E, tk.N, tk.S)) # 姓名输入 ttk.Label(frame, text姓名:).grid(row0, column0, stickytk.W) name_entry ttk.Entry(frame, textvariableview_model.name) name_entry.grid(row0, column1) view_model.name.trace(w, view_model.on_name_changed) # 年龄输入 ttk.Label(frame, text年龄:).grid(row1, column0, stickytk.W) age_entry ttk.Entry(frame, textvariableview_model.age) age_entry.grid(row1, column1) view_model.age.trace(w, view_model.on_age_changed) # 显示问候语 ttk.Label(frame, textvariableview_model.greeting).grid(row2, column0, columnspan2)# 运行应用if __name__ __main__: root tk.Tk() root.title(MVVM示例) model UserModel() view_model UserViewModel(model) view UserView(root, view_model) root.mainloop()MVVM的核心优势-双向绑定View和ViewModel自动同步-测试方便ViewModel可以独立于View测试-组件化适合大型应用的模块化开发## 总结架构进化给我们的启示从Script到MVVM这不仅是技术的演进更是思维方式的变革1.从混乱到有序代码组织方式越来越清晰2.从紧耦合到松耦合组件间依赖越来越弱3.从过程式到声明式关注点从如何做转向做什么4.从手动到自动数据同步从手动操作变为自动绑定选择哪种模式取决于项目需求-小项目Script或简单模块化就够了-中型项目Code Behind或MVC是不错的选择-复杂应用MVVM或MVP更适合记住没有银弹每种模式都有其适用场景。关键是要理解背后的设计思想而不是盲目追求最新的架构。架构的进化永远不会停止但分离关注点和降低耦合这两个原则将永远适用。

相关新闻

BP神经网络在车牌识别系统中的优化实践

BP神经网络在车牌识别系统中的优化实践

1. 项目背景与核心价值 车牌识别作为智能交通系统的核心技术之一,在停车场管理、违章抓拍、高速公路收费等场景中发挥着关键作用。传统基于图像处理的车牌识别方案在复杂光照、污损车牌等场景下识别率骤降,而BP神经网络凭借其强大的非线性映射能力&#…

2026/7/26 19:12:14 阅读更多 →
如何用REFramework实现游戏模组的零代码开发:终极可视化编程指南

如何用REFramework实现游戏模组的零代码开发:终极可视化编程指南

如何用REFramework实现游戏模组的零代码开发:终极可视化编程指南 【免费下载链接】REFramework Mod loader, scripting platform, and VR support for all RE Engine games 项目地址: https://gitcode.com/GitHub_Trending/re/REFramework 在游戏模组开发领域…

2026/7/26 19:11:14 阅读更多 →
如何在Windows上免费实现本地离线LaTeX公式识别:MixTeX完整指南

如何在Windows上免费实现本地离线LaTeX公式识别:MixTeX完整指南

如何在Windows上免费实现本地离线LaTeX公式识别:MixTeX完整指南 【免费下载链接】MixTeX-Latex-OCR MixTeX multimodal LaTeX, ZhEn, and, Table OCR. It performs efficient CPU-based inference in a local offline on Windows. 项目地址: https://gitcode.com/…

2026/7/26 19:11:14 阅读更多 →

最新新闻

如何快速下载B站视频?BilibiliDown终极指南

如何快速下载B站视频?BilibiliDown终极指南

如何快速下载B站视频?BilibiliDown终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili…

2026/7/26 19:32:21 阅读更多 →
SilentPatch深度解析:恶霸鲁尼奖学金版Windows 10崩溃问题的架构级解决方案

SilentPatch深度解析:恶霸鲁尼奖学金版Windows 10崩溃问题的架构级解决方案

SilentPatch深度解析:恶霸鲁尼奖学金版Windows 10崩溃问题的架构级解决方案 【免费下载链接】SilentPatchBully SilentPatch for Bully: Scholarship Edition (fixes crashes on Windows 10) 项目地址: https://gitcode.com/gh_mirrors/si/SilentPatchBully …

2026/7/26 19:32:21 阅读更多 →
Django毕业设计-基于 Django 的智能化在线考试管理系统设计与实现 高校线上考试答题与自动阅卷系统开发(源码+LW+部署文档+全bao+远程调试+代码讲解等)

Django毕业设计-基于 Django 的智能化在线考试管理系统设计与实现 高校线上考试答题与自动阅卷系统开发(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/26 19:32:21 阅读更多 →
2026超全测评|会议音视频转文字+智能生成纪要,哪款工具最好用?

2026超全测评|会议音视频转文字+智能生成纪要,哪款工具最好用?

在日常工作中,尤其是技术评审会、项目复盘会、跨部门沟通会、线上研讨会,绝大多数人都面临同一个痛点:全身心参会就没时间记笔记,低头记笔记就错过关键决策、技术细节。传统手动整理会议纪要,需要反复回放录音、筛选无…

2026/7/26 19:32:21 阅读更多 →
数据增强与内容生成技术解析及RAG系统应用

数据增强与内容生成技术解析及RAG系统应用

1. 技术背景与核心概念在当今信息处理领域,数据增强(Augmentation)与内容生成(Generation)技术已成为提升系统性能的关键手段。这两项技术共同构成了现代检索增强生成(RAG)系统的核心支柱&#…

2026/7/26 19:32:21 阅读更多 →
Python毕设项目:轻量化机器视觉人脸检测认证系统设计 图像降噪优化的 OpenCV 人脸识别系统 (源码+文档,讲解、调试运行,定制等)

Python毕设项目:轻量化机器视觉人脸检测认证系统设计 图像降噪优化的 OpenCV 人脸识别系统 (源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/26 19:31:21 阅读更多 →

日新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/26 0:00:31 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/26 0:00:31 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/26 0:00:31 阅读更多 →

月新闻