超实用的阅码工具,推荐收藏!

近期在阅读一个陌生Java项目的过程中,学习了“断点回溯法”,也亲测了几个代码阅读工具。这里简单分享一下工具的使用体验。

Idea Debugger

大部分同学应该都是使用 Debugger 方法来读代码的,其最大的好处就是可以逐行展示出运行时堆栈和数据。

但 Debug 模式只能维持当前一个堆栈上下文,还不能回退,这就带来了两个问题:

  • 需要很多次操作,才能搞清楚流程的来龙去脉
  • 需要人脑存储不同的堆栈上下文,遇到复杂项目,直接内存溢出而罢工

因此,这种朴素的方式是比较费劲的。

Debugger-to-Uml

有少部分 jy 提到了这个工具,我就去体验了一下。这是对“Debugger”的一个增强。简单来讲,就是可以把一个堆栈转换成序列图。

体验下来,感觉有点点用,但是不大。毕竟,堆栈就是一个线性的序列,没有分叉。

唯一有点超出预期的地方就是,这个工具可以筛选包名,可以针对性看某个局部。这在一个堆栈非常长的时候,有点用。

在看堆栈的时候,有一个真正的问题,大家却都没有解决,那就是抽象类的问题。比如上面这个堆栈,可以看到很多 Filter 都显示是”OncePerRequestFilter“,这明显不符合预期的,按照Chain的设计模式,一般不会有重复的 Filter。而堆栈之所以这样显示,是因为 OncePerRequestFilter 是一个基础父类,很多Filter都是继承了它去实现的。但这些继承的子类,在堆栈中,却没有展现出来。这个问题,在第一次看代码时,很容易懵逼!

SequenceDiagram

这是比较老的一个静态代码序列图工具。 安装插件后,随便找到一个函数,右键“SequenceDiagram” 就可以生成一个序列图。

 这个插件最大的优点是简便易用,但缺点也很明显:

  • 生成的是静态序列图,没有运行时数据可以参考,不能协助去除分支和抽象,
  • 对于设计模式,没办法有效地展现(比如上图本应该是一个Chain模式,但序列图无法知道下一个Filter是什么)

而现代程序越来越复杂,分支抽象,设计模式充斥其中。 个人体会下来,SequenceDiagram 更多地是一种画图工具,主要用来总结代码,对于阅读陌生代码作用比较有限。

XCodeMap

XCodeMap,动态生成上下文序列图,5分钟就能读懂源码,解决问题。

其官网描写的优势有:

  • 免分支抽象
  • 免设计模式
  • 免反复Debug

其能做到这一点,主要是因为其采集了程序的运行时数据,并保存下来,像分析型数据库一样进行分析。

XCodeMap 一个出乎意料的工具,有很多创新的功能,我的好多文章,都是在它的帮助下完成的。

详情可以查看官网 xcodemap.tech/ 。

体验下来,Idea Debugger 仍然是必不可少的工具,而 XCodeMap 则是一个非常有潜力的工具,在快速进步中,有望改变整个竞争现状,

### 如何使用 Xcode 的 Map 功能 Xcode 提供了丰富的功能来支持开发者创建高质量的应用程序,其中包括地图相关的开发工具。然而,在提供的参考资料中并未提及具体的`XcodeMap`概念[^1]。通常情况下,提到的地图功能是指通过集成苹果的MapKit框架来进行地图显示和交互操作。 #### 集成 MapKit 到 iOS 应用程序 要在一个iOS项目里加入地图展示能力: - **设置权限** 在 `Info.plist` 文件中添加必要的隐私描述键,例如NSLocationWhenInUseUsageDescription,用于解释为什么请求访问用户的地理位置信息。 - **导入 MapKit 框架** 可以在项目的依赖管理配置文件(如Podfile)中引入MapKit库,或者直接在工程设置中的Frameworks, Libraries, and Embedded Content部分添加该框架。 - **初始化 MKMapView 实例** 使用 Interface Builder 或者编程方式向视图控制器添加一个MKMapView对象,并将其关联至ViewController.swift或其他对应的源文件内。 ```swift import UIKit import MapKit class ViewController: UIViewController { var mapView: MKMapView! override func viewDidLoad() { super.viewDidLoad() // 初始化并配置mapView属性... mapView = MKMapView(frame: self.view.bounds) self.view.addSubview(mapView) let initialLocation = CLLocation(latitude: 37.7749, longitude: -122.4194) // San Francisco coordinates as an example centerMapOnLocation(location: initialLocation) } private func centerMapOnLocation(location: CLLocation) { let coordinateRegion = MKCoordinateRegion( center: location.coordinate, latitudinalMeters: 5000, longitudinalMeters: 5000) mapView.setRegion(coordinateRegion, animated: true) } } ``` 此代片段展示了如何定义一个简单的基于位置的地图中心化方法以及基本的地图视图加载逻辑。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值