From 2ac3083b2b2c94beed2169ce3c2d1f9013c6b113 Mon Sep 17 00:00:00 2001 From: pangyaxuan Date: Tue, 19 May 2026 11:02:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=20'W9'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- W9/.gitignore | 4 ++ W9/Command.java | 9 ++++ W9/CrawlCommand.java | 49 ++++++++++++++++++++ W9/ExitCommand.java | 24 ++++++++++ W9/HelpCommand.java | 23 ++++++++++ W9/History.java | 27 +++++++++++ W9/List共享引用风险分析.md | 70 +++++++++++++++++++++++++++++ W9/Main.java | 25 +++++++++++ W9/README.md | 17 +++++++ W9/W9.zip | Bin 0 -> 22 bytes W9/W9ai协助记录.docx | Bin 0 -> 10902 bytes W9/pom.xml | 51 +++++++++++++++++++++ 12 files changed, 299 insertions(+) create mode 100644 W9/.gitignore create mode 100644 W9/Command.java create mode 100644 W9/CrawlCommand.java create mode 100644 W9/ExitCommand.java create mode 100644 W9/HelpCommand.java create mode 100644 W9/History.java create mode 100644 W9/List共享引用风险分析.md create mode 100644 W9/Main.java create mode 100644 W9/README.md create mode 100644 W9/W9.zip create mode 100644 W9/W9ai协助记录.docx create mode 100644 W9/pom.xml diff --git a/W9/.gitignore b/W9/.gitignore new file mode 100644 index 0000000..0925d0a --- /dev/null +++ b/W9/.gitignore @@ -0,0 +1,4 @@ +*.jar +*.jar +*.class +*.log \ No newline at end of file diff --git a/W9/Command.java b/W9/Command.java new file mode 100644 index 0000000..f6e49b5 --- /dev/null +++ b/W9/Command.java @@ -0,0 +1,9 @@ +package com.example.datacollect.command; + +import com.example.datacollect.model.Article; +import java.util.List; + +public interface Command { + String getName(); + void execute(String[] args, List
articles); +} diff --git a/W9/CrawlCommand.java b/W9/CrawlCommand.java new file mode 100644 index 0000000..cd0333e --- /dev/null +++ b/W9/CrawlCommand.java @@ -0,0 +1,49 @@ +package com.example.datacollect.command; + +import com.example.datacollect.model.Article; +import com.example.datacollect.util.UrlValidator; +import com.example.datacollect.view.ConsoleView; +import java.util.List; + +/** + * 爬取命令(带 URL 验证) + */ +public class CrawlCommand implements Command { + private final ConsoleView view; + + public CrawlCommand(ConsoleView view) { + this.view = view; + } + + @Override + public String getName() { + return "crawl"; + } + + /** + * 获取命令别名 + */ + public String[] getAliases() { + return new String[]{"c"}; + } + + @Override + public void execute(String[] args, List
articles) { + if (args.length < 2) { + view.printError("Usage: crawl 或 c "); + return; + } + + String url = args[1]; + + // URL 格式验证 + if (!UrlValidator.isValid(url)) { + view.printError("URL 格式错误:" + UrlValidator.getValidationError(url)); + view.printInfo("示例:crawl https://www.example.com"); + return; + } + + view.printInfo("正在爬取:" + url); + // TODO: 实现实际爬取逻辑 + } +} diff --git a/W9/ExitCommand.java b/W9/ExitCommand.java new file mode 100644 index 0000000..e0eff23 --- /dev/null +++ b/W9/ExitCommand.java @@ -0,0 +1,24 @@ +package com.example.datacollect.command; + +import com.example.datacollect.model.Article; +import com.example.datacollect.view.ConsoleView; +import java.util.List; + +public class ExitCommand implements Command { + private final ConsoleView view; + + public ExitCommand(ConsoleView view) { + this.view = view; + } + + @Override + public String getName() { + return "exit"; + } + + @Override + public void execute(String[] args, List
articles) { + view.printSuccess("Bye!"); + System.exit(0); + } +} diff --git a/W9/HelpCommand.java b/W9/HelpCommand.java new file mode 100644 index 0000000..f86cc06 --- /dev/null +++ b/W9/HelpCommand.java @@ -0,0 +1,23 @@ +package com.example.datacollect.command; + +import com.example.datacollect.model.Article; +import com.example.datacollect.view.ConsoleView; +import java.util.List; + +public class HelpCommand implements Command { + private final ConsoleView view; + + public HelpCommand(ConsoleView view) { + this.view = view; + } + + @Override + public String getName() { + return "help"; + } + + @Override + public void execute(String[] args, List
articles) { + view.printInfo("Commands: crawl , list, help, exit"); + } +} diff --git a/W9/History.java b/W9/History.java new file mode 100644 index 0000000..3b5bb3a --- /dev/null +++ b/W9/History.java @@ -0,0 +1,27 @@ +package com.example.datacollect.command; + +import com.example.datacollect.model.Article; +import com.example.datacollect.view.ConsoleView; +import java.util.List; + +/** + * 查看历史命令 + */ +public class History implements Command { + private HistoryCommand historyCommand; + + public History(HistoryCommand historyCommand) { + this.historyCommand = historyCommand; + } + + @Override + public String getName() { + return "history"; + } + + @Override + public void execute(String[] args, List
articles) { + ConsoleView view = new ConsoleView(); + historyCommand.showHistory(view, articles); + } +} diff --git a/W9/List共享引用风险分析.md b/W9/List共享引用风险分析.md new file mode 100644 index 0000000..601edb3 --- /dev/null +++ b/W9/List共享引用风险分析.md @@ -0,0 +1,70 @@ +# List
共享引用的风险分析 + +## 问题描述 +在 Main.java 中,`List
articles` 被传递给多个对象(CrawlerController、Command 等),这存在共享引用风险。 + +## 主要风险 + +### 1. 数据不一致风险 +多个对象持有同一个 List 的引用,任何地方对 List 的修改都会影响其他地方。例如: +- CrawlCommand 添加了新 Article +- ListCommand 在遍历 +- 如果同时修改,可能导致 ConcurrentModificationException + +### 2. 封装性破坏 +List 在多个类之间共享,违反了封装原则: +- 任何持有引用的类都可以随意修改 List +- 无法追踪是谁、在什么时候修改了数据 +- 难以进行数据验证和完整性检查 + +### 3. 线程安全问题 +如果未来引入多线程: +- 多个线程同时访问同一个 List +- 没有同步机制会导致数据损坏 +- 可能出现脏读、丢失更新等问题 + +### 4. 测试困难 +- 单元测试时难以隔离 +- 一个测试可能影响另一个测试的结果 +- 需要手动清理共享状态 + +## 解决方案 + +### 方案 1:使用不可变集合 +```java +// 返回不可变列表 +public List
getArticles() { + return Collections.unmodifiableList(articles); +} +``` + +### 方案 2:防御性拷贝 +```java +// 创建副本 +public List
getArticlesCopy() { + return new ArrayList<>(articles); +} +``` + +### 方案 3:使用 Repository 模式 +```java +// 通过 Repository 管理,不直接暴露 List +public class ArticleRepository { + private List
articles = new ArrayList<>(); + + public void add(Article article) { } + public List
findAll() { + return new ArrayList<>(articles); // 返回副本 + } +} +``` + +## 总结 +共享引用虽然方便,但会带来数据一致性、封装性、线程安全等问题。 +最佳实践是: +1. 最小化共享 +2. 必要时使用防御性拷贝 +3. 使用不可变集合 +4. 通过接口/Repository 封装访问 + +(字数:约 450 字) diff --git a/W9/Main.java b/W9/Main.java new file mode 100644 index 0000000..73335ca --- /dev/null +++ b/W9/Main.java @@ -0,0 +1,25 @@ +package com.example.datacollect; + +import com.example.datacollect.command.HistoryCommand; +import com.example.datacollect.controller.CrawlerController; +import com.example.datacollect.model.Article; +import com.example.datacollect.view.ConsoleView; +import java.util.ArrayList; +import java.util.List; + +public class Main { + + public static void main(String[] args) { + ConsoleView view = new ConsoleView(); + List
articles = new ArrayList<>(); + HistoryCommand historyCommand = new HistoryCommand(); + CrawlerController controller = new CrawlerController(view, articles, historyCommand); + + view.printSuccess("Welcome to CLI Crawler (w9_1)! Type help for commands."); + while (true) { + String input = view.readLine(); + historyCommand.record(input); // 记录用户输入的命令 + controller.handle(input); + } + } +} diff --git a/W9/README.md b/W9/README.md new file mode 100644 index 0000000..f8af0e4 --- /dev/null +++ b/W9/README.md @@ -0,0 +1,17 @@ +# DataCollect 教学项目 — 最小可运行版本 + +这是一个最小可用的 Java CLI 演示工程,目标:打印帮助信息以验证运行环境。 + +构建: +```bash +mvn -q package +``` + +运行(示例): +```bash +java -jar target/datacollect-cli-0.1.0-jar-with-dependencies.jar --help +``` + +项目结构(最小): +- `src/main/java/com/example/datacollect/Main.java` — CLI 入口,打印帮助 +- `pom.xml` — Maven 构建配置,生成可执行 jar diff --git a/W9/W9.zip b/W9/W9.zip new file mode 100644 index 0000000000000000000000000000000000000000..15cb0ecb3e219d1701294bfdf0fe3f5cb5d208e7 GIT binary patch literal 22 NcmWIWW@Tf*000g10H*)| literal 0 HcmV?d00001 diff --git a/W9/W9ai协助记录.docx b/W9/W9ai协助记录.docx new file mode 100644 index 0000000000000000000000000000000000000000..a01958f294c83899f7de89a5828bcf6a37faa261 GIT binary patch literal 10902 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 Cjyb*n literal 0 HcmV?d00001 diff --git a/W9/pom.xml b/W9/pom.xml new file mode 100644 index 0000000..5599c10 --- /dev/null +++ b/W9/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + com.example + datacollect-cli + 0.1.0 + + 11 + 11 + UTF-8 + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.11.0 + + 11 + 11 + UTF-8 + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.3.0 + + + + com.example.datacollect.Main + + + + jar-with-dependencies + + + + + make-assembly + package + + single + + + + + + +