ScreenLockDetector/docs/MIGRATION_GUIDE.md

296 lines
6.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 或联系开发团队
## 总结
对于大多数用户:**无需任何修改**,直接重新编译即可。
对于高级用户:新架构提供了更好的扩展性和可维护性,值得花时间理解新的设计。
祝您使用愉快!