欢迎访问 AI Skills Video ! 海量优质视频教程,助你提升技能。

利用 Trae AI 编程工具进行百万行级iOS项目重构

老张 2026年3月3日 53 次阅读
利用Trae AI编程工具,进行旧项目的重构,进行模块化分类。完整处理超百万行源码的 Obj-C 项目。 介绍项目规则编写、Skill定义、功能路由化处理、解除代码耦合、优化项目资源。 介绍Trae AI工具的优点、缺点。常见的技巧、常见的问题。

利用Trae AI工具进行iOS ObjC项目重构

1. 介绍

1.1 起因

近期因为工作需要,进行已有的iOS项目进行代码优化。项目的情况非常复杂,项目是由多个独立的项目拼合而成的,形成了超级多的代码,

现在需要将代码剥离,保留现有APP中实际可见的功能。删除过时、无用的功能模块。

经过代码统计,纯OC代码量到达80万行,xib文件,以及一些H5项目代码综合能够到达10万行,在如何多的代码海洋中,进行模块划分,代码提取。

1.2 为什么选择 Trae 工具

选择 Trae 工具当初的考量是它的付费模式,起初的付费模式类似于包月模式,预付之后可以持续调用。但是从2026年2月24日以后的采用Token计费了。

并且Trae支持 SOLO Builder模式,支持更加复杂的代码辅助流程。

1.3 重构思路

  • 项目分层:Core,Component,Network,FeatureBase,Features 按照这样的模式进行代码分层;
  • 功能划分:Features 会存放业务功能

2. 利用 Trae 执行代码解耦

代码中的 ViewController 超级多,不同的功能相互引用,直接使用 ViewController 的 alloc 来进行启动 push/present

这样非常不利于代码的分离。定义 FeatureRouter 来实现功能的路由,即使用字符串来定义功能,使用 Map 来保存字符串与实际代码功能的关联。

代码如下:

@interface FeatureRouter ()

/// 存储路由映射表: NSString -> FeatureRouterBlock
@property (nonatomic, strong) NSMutableDictionary<NSString *, FeatureRouterBlock> *routes;
/// 读写锁队列,用于保证 routes 字典的线程安全
@property (nonatomic, strong) dispatch_queue_t queue;

@end

每一个需要重构的功能入口,都定义一个 Entry 类,来进行 FeatureRouter 的注册 代码如下:

@implementation VipEntry

+ (void)registerFeatureRouter {
    FeatureRouter *router = [FeatureRouter sharedRouter];
    [router registerRoute:@"feat.user.vip" handler:^(UIViewController * _Nullable sourceViewController, NSDictionary * _Nullable params) {
        
        if (!sourceViewController) {
            return;
        }
        
        VipViewController *vc = [[VipViewController alloc] init];
        // 其余逻辑代码
     }];
}

//...
@end

利用上述代码逻辑,就可以实现 String - Block 的管理,从而实现通过字符串来调用功能的方案。

当定义好规则,并且进行一个功能的开发之后。就可以利用 Trae 的 skill 模式,定义一个功能路由化的操作技能。

提示词如下:

- FeatureRouter 用于保存已注册的路由信息,通过 featureKey -> FeatureRouterBlock 的形式,来保存对应的路由
- 每一个功能/Controller 可以对应一个 Entry 类,名称为 `功能Entry` 的形式,内部包含一个 registerFeatureRouter 方法,用于注册对应的路由到 FeatureRouter
- featureKey 通常以 `feat.模块.入口` 的格式来定义
- 路由注册通过 FeatureRouter 的 [registerRoute:(NSString *)featureKey handler:(FeatureRouterBlock)] 方法来注册
- 实际的功能启动/页面启动,都是在 FeatureRouterBlock 内部完成
- FeatureRouterBlock: ^(UIViewController * _Nullable sourceViewController, NSDictionary * _Nullable params) 支持传入 Controller 以及 启动参数 params
- 每一个创建的 Entry 都需要在 [AppDelegate initFeatureRouter] 方法中进行路由注册调用
- 注册后需要在 YikuFeatureDispatcher 中创建实际的启动方法,通常采用 `start模块名功能名` 的形式命名,例如: `+(void)startDiscoveryVideoCategoryWithSourceVC:(UIViewController *)vc params:(NSDictionary * _Nullable)params` 的形式,包含来源 ViewController 和 启动参数
- 路由化之后通常需要将原始功能/Controller 的 alloc 启动形式,替换为 YikuFeatureDispatcher 的启动方法,并且传递启动参数
- 路由化之后需要将无用的功能头文件导入删除
- YikuFeatureDispatcher 类只允许添加方法,不允许删除已有方法
- 新创建的 Entry 应该添加到 `project.pbxproj` 中引用

那么后续就可以持续的使用这样的提示词进行操作:针对 AbcViewController 进行路由化 这样就可以进行复杂的操作。

3. 遇到的问题

前文介绍来的,现在我们的项目包含了将近一百万行代码和资源,Trae AI 在进行代码处理的时候,因为重复的代码非常多,造成了经常性的上下文压缩、任务遗忘等问题,经常性的出现模型思考超限的情况,

当然随着代码的持续优化,这种情况会越来越少。在使用的时候,需要注意:每次对话发送任务不要过于宽泛,对于重构问题来说,可以进行小步骤的操作和执行。还是提示词技巧需要掌握。

假设:一个处理会影响10个文件,那么我们可以采用这样的提示词:

针对 AbcViewController 进行路由化操作,不要进行所有的文件处理,而是依次处理,一次执行一个文件的优化操作

这样 Trae AI 就会先创建一个 Todo List,然后依次执行。