从备考模板到英语学习——代码复用与改造实战案例

img

一、项目演进背景

本项目最初是一个"备考"模板应用(如建造师考试、职业资格考试),后被改造为英语学习 App。这种改造在软件工程中非常典型——利用已有的代码基础,通过复用、替换、新增和删除,快速构建一个全新的垂直应用。

从备考到英语学习的改造,本质上是一次领域驱动的大重构。两个领域虽然不同,但它们的软件架构有很多相通之处:都需要用户登录、内容浏览、答题练习、学习记录、个人中心等功能。

二、可复用的功能模块

1. 登录模块(login_info)

备考模板的用户登录功能直接适用于英语学习。用户注册、手机号登录、第三方登录(微信/支付宝)的逻辑无需改动。

  • 复用的原因:无论考什么、学什么,用户认证的需求完全一致
  • 改动量:几乎没有——只需修改登录页面的文案描述

2. 搜索模块(search + search_question)

搜索功能从"搜索备考题目"改为"搜索英语单词/课程"。底层的搜索逻辑、结果展示、分页机制完全共通。

  • 复用的原因:搜索的核心是"输入关键词-检索-展示结果"
  • 改动量:调整搜索结果的展示模板,适配单词而非题目

3. 答题模块(answer_questions)

备考的答题功能是复用率最高的模块。选择题(单选/多选)、判断题、填空题的做题逻辑在英语学习中也完全适用。

  • 复用的原因:做题的交互模式一致——查看题目、选择答案、提交、查看解析
  • 改动量:题目数据结构微调,适配英语题型(如音标题、拼写题)

4. 个人中心(minePage)

用户信息维护、设置页面、学习记录列表、消息中心等,与学习内容无关,完全复用。

5. 基础组件(commonLib)

RouterMap、PreferenceUtil、Logger、AudioPlayer 等基础设施完全不需要修改。

三、需要替换的内容

1. 课程内容(Course → Word)

备考模板中的课程数据全部替换为英语学习数据:

// 备考模板的课程模型
export class Course {
  name: string;
  chapters: Chapter[];
  examDate: string;
}

// 替换为英语学习的单词模型
@ObservedV2
export class WordCard {
  @Trace word: string;
  @Trace phonetic: string;
  @Trace translation: string;
  @Trace example: string;
}

数据源从 500 个 CET/GRE 单词替代了原本的考试题目数据。DEFAULT_WORD_CARDS 提供了 500 个示例单词,分为基础、CET-4、CET-6、雅思和 GRE 五个等级。

2. 首页内容(HomePage)

首页的今日学习卡、轮播图、功能栏、练习模式保留了布局结构,但内容从"备考课程"替换为"英语学习":

// 功能栏图标替换
@Local functions: CourseCoreBar[] = [
  new CourseCoreBar($r('app.media.ic_practice_camera'), '搜单词'),   // 之前是"搜题目"
  new CourseCoreBar($r('app.media.ic__practice_wrong_question'), '易错词'), // 之前是"易错题"
  new CourseCoreBar($r('app.media.ic_practice_star'), '生词本'),     // 替换"收藏"
  new CourseCoreBar($r('app.media.ic_practice_notes'), '笔记'),
  new CourseCoreBar($r('app.media.ic_chart_report'), '学习报告')
];

图标图标保持不变,文案做了替换。

3. 主题配色(Resources)

应用的图标和品牌色从备考风格调整为英语学习风格。资源文件中的颜色值、图片进行了替换,但资源引用的方式($r('app.color.xxx'))完全不变。

四、需要新增的内容

1. 音频播放(AudioPlayer)

英语学习特有的功能——单词发音播放。新增了 AudioPlayer 单例类:

export class AudioPlayer {
  private static instance?: AudioPlayer;
  private avPlayer: media.AVPlayer | null = null;

  public static getInstance(): AudioPlayer {
    if (!AudioPlayer.instance) {
      AudioPlayer.instance = new AudioPlayer();
      AudioPlayer.instance.initPlayer();
    }
    return AudioPlayer.instance;
  }

  public play(url: string): void {
    // 播放音频逻辑
  }
}

这在备考模板中是不需要的功能。

2. 生词本管理(NewWordManager)

英语学习特有的生词本功能,管理用户标记的"不认识"的单词。新增了 NewWordManager 类来管理生词本的增删改查,使用 Preferences 持久化存储。

3. 学习统计(StatisticsManager)

英语学习需要统计每日学习量、学习时长、掌握单词数等。新增了 StatisticsManager 来聚合这些数据。

4. 单词卡片页(WordCardPage)

全新的页面——单词卡片翻转交互。备考模板中没有对应功能。包含了:

  • 3D 卡片翻转动画
  • 正面显示单词/音标
  • 背面显示中文含义/例句
  • 左右滑动切换
  • 自动播放模式
  • 标记"已掌握"功能

五、需要删除的内容

1. 支付模块(aggregated_payment)

备考模板中的课程购买功能在英语学习 App 中暂不需要(当前版本为免费学习)。支付模块代码保留但不再使用。

2. 考试报名模块

备考模板中的考试报名、准考证管理等功能不再适用,已移除。

3. 特定的答题模式

备考模板中的"模拟考试"(完整试卷计时)改为"每日挑战"和"专项练习"两种模式。

六、改造的收益总结

通过这次"从备考到英语学习"的改造,团队获得了以下收益:

类别 模块数 代码复用率 说明
完全复用 6 个 100% login_info, search, commonLib, minePage, feedback, base_select
微小调整 3 个 80% homePage(首页替换文案), answer_questions(适配题型), select_category
全新开发 2 个 0% WordCardPage, AudioPlayer/NewWordManager
废弃 1 个 - aggregated_payment 暂不启用

总体代码复用率达到约 **70%**。这意味着一个新领域应用的核心功能,70% 的代码来自已有系统。这是模块化架构设计带来的最大价值——业务可替换,基础设施持久可用。

七、总结

从备考模板到英语学习 App 的改造实践,验证了多模块架构在业务转型中的强大能力。可复用的(登录、搜索、答题)、可替换的(课程→单词)、可新增的(音频、生词本、统计)和可删除的(支付)——这四种类型的代码管理策略,使得业务转型成了高效的模块重组,而不是从零开始的重写。对于需要快速构建垂直领域应用的团队来说,这种"复用+改造"的模式是最高效的路径。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐