Skip to content

[Quality] YAGNI 原则: 发现~2367行未使用/占位符代码 #18

@newtontech

Description

@newtontech

[Quality] YAGNI 原则: 发现多处过度设计和未使用代码

实际问题汇总

通过代码审查发现,项目中存在大量 YAGNI (You Aren't Gonna Need It) violations - 即实现了未来可能需要但当前并未使用的功能,导致:

  • 代码维护负担增加
  • 测试覆盖困难
  • 新开发者理解成本上升
  • 潜在的依赖膨胀

问题 1: hyper_polar.py - 948行代码中80%为占位符

文件: pymultiwfn/analysis/properties/hyper_polar.py
行数: 948 行
问题: 仅有1个核心方法实现,其余为TODO占位符

实际代码问题:

# 第 201-219 行: 未实现的方法
# TODO: Implement finite field polarizability calculation
# This would involve calculating dipole moments under different
# electric field perturbations and taking numerical derivatives

# 第 375 行
def _calculate_first_hyperpolarizability(self, ...):
    # TODO: Implement first hyperpolarizability calculation
    return beta  # 返回空零矩阵

# 第 399 行  
def _calculate_second_hyperpolarizability(self, ...):
    # TODO: Implement second hyperpolarizability calculation
    return gamma  # 返回空零矩阵

# 第 866 行
def calculate_sos_hyperpolarizability(self, ...):
    # TODO: Implement SOS first hyperpolarizability calculation
    
# 第 873 行
def calculate_sos_hyperpolarizability(self, ...):
    # TODO: Implement SOS second hyperpolarizability calculation

改进建议:

  • 删除此文件或将其移至 experimental/ 目录
  • 仅保留 parse_gaussian_polarizability() 方法(唯一实现的方法)
  • 当实际需要时再从Git历史恢复

文件引用次数: 仅在自身文件中被引用(测试代码)


问题 2: GUI模块 - 661行PyQt5代码完全未使用

文件: pymultiwfn/vis/gui/main_gui.py
行数: 661 行
问题: 完整的GUI实现,但从未在项目中启动或使用

实际代码问题:

# 第 644-661 行: main() 函数从未被调用
def main():
    """Main entry point for GUI application"""
    app = QApplication(sys.argv)
    # ... 完整GUI实现
    window = MultiwfnGUI()
    window.show()
    sys.exit(app.exec_())

if __name__ == "__main__":
    main()

使用情况检查:

$ grep -r "MultiwfnGUI\|main_gui" --include="*.py" pymultiwfn/ | grep -v "^pymultiwfn/vis/"
# 无任何输出 - GUI完全未被使用

改进建议:

  • 移至单独的 pymultiwfn-gui 包中
  • 或添加 [gui] extras_require 使其成为可选依赖
  • 当前强制依赖 PyQt5 增加了安装负担

问题 3: weak_interaction.py - 664行仅在vis模块内使用

文件: pymultiwfn/vis/weak_interaction.py
行数: 664 行
问题: 复杂的弱相互作用分析,但仅在GUI中引用,未集成到主功能

使用情况:

  • 仅在 pymultiwfn/vis/__init__.pypymultiwfn/vis/gui/main_gui.py 中导入
  • 从未在核心分析流程中使用

改进建议:

  • 与GUI一同移至 experimental 分支
  • 或标记为 @experimental 装饰器

问题 4: 空文件和占位符解析器

文件 4.1: pymultiwfn/io/parsers/qeparser.py (17行)

class QEParser:
    def load(self) -> Wavefunction:
        # TODO: Implement Quantum ESPRESSO input parsing
        raise NotImplementedError("Quantum ESPRESSO parser not yet implemented")

文件 4.2: pymultiwfn/utils/edflib_utils.py (1行)

# TODO: Implement functionality from edflib.f90

文件 4.3: pymultiwfn/analysis/properties/__init__.py (1行)

# TODO: Implement functionality for properties analysis

改进建议:

  • 删除这些空文件
  • 当实际实现时再添加
  • 避免给用户"功能已存在"的错误印象

问题 5: VASP解析器 - 75%未实现

文件: pymultiwfn/io/parsers/vasp.py (76行)
问题: 4个类中仅1个有基本实现

实际代码问题:

class CHGCARLoader(VASPParser):
    def _parse(self) -> Wavefunction:
        # TODO: Implement CHGCAR parsing for charge density
        raise NotImplementedError("CHGCAR parser not yet implemented")

class VASPGridLoader(VASPParser):
    def _parse(self) -> Wavefunction:
        # TODO: Implement VASP grid file parsing
        raise NotImplementedError("VASP grid parser not yet implemented")

改进建议:

  • 删除未实现的类,仅保留 POSCARLoader
  • 或移至 parsers/experimental/vasp.py

统计汇总

文件/模块 行数 问题类型 建议操作
hyper_polar.py 948 80%为TODO占位符 删除或移至experimental
vis/gui/main_gui.py 661 完全未使用 移至独立包
vis/weak_interaction.py 664 仅在vis内使用 移至experimental
io/parsers/qeparser.py 17 完全未实现 删除
utils/edflib_utils.py 1 完全为空 删除
io/parsers/vasp.py 76 75%未实现 精简或移除
总计 ~2367行 死代码/占位符 清理

为什么重要

  1. 维护成本: 每次重构都需要考虑这些未使用代码
  2. 测试负担: 这些代码难以测试(许多抛出NotImplementedError)
  3. 依赖膨胀: GUI强制依赖PyQt5,即使命令行用户也需要安装
  4. 认知负荷: 新开发者需要理解哪些功能是真正可用的
  5. CI时间: 不必要的文件增加了静态分析和类型检查时间

建议实施计划

Phase 1: 立即删除(低风险)

  • utils/edflib_utils.py
  • analysis/properties/__init__.py(空文件)
  • io/parsers/qeparser.py

Phase 2: 移至experimental分支(中风险)

  • analysis/properties/hyper_polar.py
  • vis/gui/ 整个目录
  • vis/weak_interaction.py

Phase 3: 精简(低风险)

  • io/parsers/vasp.py - 仅保留POSCARLoader

优先级

  • 高 - 影响系统稳定性/安全性
  • 中 - 影响代码质量
  • 低 - 改进建议

此问题属于高优先级,因为未使用的GUI代码强制引入PyQt5依赖,可能在某些环境中造成安装问题。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions