ScreenLockDetector/docs/MIGRATION_GUIDE.md

296 lines
6.6 KiB
Markdown
Raw Normal View History

# ScreenLockDetector 迁移指南
## 从旧版本迁移到重构版本
本指南帮助您从旧的单一类结构迁移到新的面向对象架构。
## 好消息:无需修改代码!
如果您只使用 `ScreenLockDetector` 类的公共接口,**无需修改任何代码**。新版本完全向后兼容。
### 接口保持不变
```cpp
// 创建实例(保持不变)
ScreenLockDetector *detector = new ScreenLockDetector(parent);
// 初始化(保持不变)
detector->initialize();
// 获取状态(保持不变)
bool locked = detector->isScreenLocked();
// 连接信号(保持不变)
connect(detector, &ScreenLockDetector::screenLocked, ...);
connect(detector, &ScreenLockDetector::screenUnlocked, ...);
connect(detector, &ScreenLockDetector::lockStateChanged, ...);
```
## 架构变化
### 旧架构
```
ScreenLockDetector
├── Linux 代码 (#ifdef Q_OS_LINUX)
└── macOS 代码 (#ifdef Q_OS_MAC)
```
### 新架构
```
ScreenLockDetectorBase (抽象基类)
├── ScreenLockDetectorLinux
└── ScreenLockDetectorMacOS
ScreenLockDetector (工厂类)
```
## 文件重命名对照表
| 旧文件名 | 新文件名 | 说明 |
|---------|---------|------|
| `screenlockdetector_mac.h` | `screenlockdetector_macos.h` | 规范化命名 |
| `screenlockdetector_mac.mm` | `screenlockdetector_macos.mm` | 规范化命名 |
| N/A | `screenlockdetector_base.h` | 新增抽象基类 |
| N/A | `screenlockdetector_base.cpp` | 新增抽象基类 |
| N/A | `screenlockdetector_linux.h` | Linux 实现分离 |
| N/A | `screenlockdetector_linux.cpp` | Linux 实现分离 |
## 如果您扩展了原类
如果您继承或扩展了 `ScreenLockDetector` 类,需要做以下调整:
### 场景 1: 继承 ScreenLockDetector
**旧代码:**
```cpp
class MyDetector : public ScreenLockDetector {
// 自定义实现
};
```
**新代码 - 选项 A (推荐):**
继承抽象基类并实现自己的平台
```cpp
class MyDetector : public ScreenLockDetectorBase {
public:
bool initialize() override {
// 您的实现
return true;
}
};
```
**新代码 - 选项 B:**
继承现有的平台实现
```cpp
#ifdef Q_OS_LINUX
class MyDetector : public ScreenLockDetectorLinux {
// 扩展 Linux 实现
};
#endif
```
### 场景 2: 访问平台特定成员
**旧代码:**
```cpp
#ifdef Q_OS_LINUX
detector->m_gnomeInterface->call(...);
#endif
```
**新方法:**
平台特定成员现在是私有的。如果需要访问,应该:
1. 添加公共方法到对应的平台类
2. 或者通过信号/槽机制通信
3. 或者使用组合而非继承
```cpp
// 示例:添加新方法到平台类
class ScreenLockDetectorLinux : public ScreenLockDetectorBase {
public:
// 添加新的公共方法
bool querySpecificState() {
if (m_gnomeInterface) {
return m_gnomeInterface->call("GetActive").value();
}
return false;
}
};
```
## 构建系统变化
### CMakeLists.txt
如果您修改了 `CMakeLists.txt`,请注意源文件列表的变化:
**旧配置:**
```cmake
if(APPLE)
list(APPEND SOURCES
src/screenlockdetector.cpp
src/screenlockdetector_mac.mm
)
endif()
```
**新配置:**
```cmake
# 通用源文件(所有平台)
set(SOURCES
src/screenlockdetector.cpp
src/screenlockdetector_base.cpp
...
)
# 平台特定源文件
if(APPLE)
list(APPEND SOURCES
src/screenlockdetector_macos.mm
)
elseif(UNIX)
list(APPEND SOURCES
src/screenlockdetector_linux.cpp
)
endif()
```
## 添加新平台支持
新架构使添加平台变得更容易:
### 步骤 1: 创建平台类
```cpp
// screenlockdetector_windows.h
#ifndef SCREENLOCKDETECTOR_WINDOWS_H
#define SCREENLOCKDETECTOR_WINDOWS_H
#include "screenlockdetector_base.h"
#ifdef Q_OS_WIN
class ScreenLockDetectorWindows : public ScreenLockDetectorBase {
Q_OBJECT
public:
explicit ScreenLockDetectorWindows(QObject *parent = nullptr);
~ScreenLockDetectorWindows() override;
bool initialize() override;
};
#endif
#endif
```
### 步骤 2: 实现平台类
```cpp
// screenlockdetector_windows.cpp
#include "screenlockdetector_windows.h"
#ifdef Q_OS_WIN
ScreenLockDetectorWindows::ScreenLockDetectorWindows(QObject *parent)
: ScreenLockDetectorBase(parent) {
}
bool ScreenLockDetectorWindows::initialize() {
// Windows 特定的初始化代码
return true;
}
#endif
```
### 步骤 3: 更新工厂方法
```cpp
// screenlockdetector.cpp
ScreenLockDetectorBase* ScreenLockDetector::createPlatformDetector() {
#ifdef Q_OS_MAC
return new ScreenLockDetectorMacOS(this);
#elif defined(Q_OS_LINUX)
return new ScreenLockDetectorLinux(this);
#elif defined(Q_OS_WIN)
return new ScreenLockDetectorWindows(this); // 新增
#else
return nullptr;
#endif
}
```
### 步骤 4: 更新 CMakeLists.txt
```cmake
if(WIN32)
list(APPEND SOURCES src/screenlockdetector_windows.cpp)
list(APPEND HEADERS src/screenlockdetector_windows.h)
endif()
```
## 调试技巧
### 查看使用的平台实现
```cpp
ScreenLockDetector *detector = new ScreenLockDetector(this);
if (detector->initialize()) {
// 在调试器中检查 detector->m_detector 的实际类型
qDebug() << "Detector initialized successfully";
}
```
### 测试不同平台
在开发时,可以临时修改工厂方法来测试特定平台:
```cpp
ScreenLockDetectorBase* ScreenLockDetector::createPlatformDetector() {
// 强制使用特定平台(仅用于测试)
// return new ScreenLockDetectorLinux(this);
// 正常的平台检测
#ifdef Q_OS_MAC
return new ScreenLockDetectorMacOS(this);
// ...
}
```
## 常见问题
### Q: 为什么要重构?
A: 新架构提供:
- 更清晰的代码组织
- 更容易添加新平台
- 更好的可测试性
- 减少预处理器指令
### Q: 性能有影响吗?
A: 没有。运行时性能完全相同,只是多了一层间接调用(虚函数),但这对于事件驱动的应用影响可以忽略不计。
### Q: 旧的头文件还能用吗?
A: `screenlockdetector_mac.h/mm` 文件仍然存在但已弃用。建议在方便时更新引用。
### Q: 如何回退到旧版本?
A: 使用 git
```bash
git checkout <old-commit-hash> src/screenlockdetector*
```
## 支持
如果遇到迁移问题,请:
1. 查看 `docs/REFACTORING.md` 了解架构详情
2. 检查示例代码在 `src/main.cpp``src/mainwindow.cpp`
3. 提交 Issue 或联系开发团队
## 总结
对于大多数用户:**无需任何修改**,直接重新编译即可。
对于高级用户:新架构提供了更好的扩展性和可维护性,值得花时间理解新的设计。
祝您使用愉快!