SuperAPI AI 工具集

ruby-oop

编程与开发

查看项目

更新于 10-16 04:06

技能介绍

用途

该技能用于处理 Ruby 的面向对象编程特性,包括类(class)、模块(module)、继承(inheritance)、混入(mixin)以及方法可见性(method visibility)。Ruby 是纯面向对象语言,一切皆对象。当需要编写或理解 Ruby 的类结构、模块复用、继承层次与方法封装时,可参考本技能。

主要能力

类定义

  • 基本类结构:类变量(@@count,所有实例共享)、常量(MAX_AGE)、类方法(def self.count)、构造器(initialize)、实例变量(@name)、实例方法。
  • 属性访问器:attr_accessor(读写)、attr_reader(只读)、attr_writer(只写)。

方法可见性

  • public:默认,公开方法。
  • protected:可被同类或子类实例调用。
  • private:仅可在本实例内部调用。

示例中 BankAccount 类通过 protected 定义 log_transaction,通过 private 定义 format_currency。

继承

  • 单继承:class Dog < Animal,子类可重写父类方法。
  • 使用 super 调用父类方法或父类构造器。
  • 方法重写与 super:子类 Car 在 initialize 中调用 super(brand),在 start_engine 中调用 super。

模块与混入

  • 模块作为命名空间:module MyApp; module Utils,通过 MyApp::Utils.format_date 调用。
  • 模块作为混入:include Swimmable 将模块方法作为实例方法加入类。
  • extend 与 include 的区别:include 添加为实例方法,extend 添加为类方法。

高级 OOP 模式

  • 单例模式:通过 private_class_method :new 与 self.instance 实现,确保 Database.instance 返回同一对象。
  • method_missing 动态方法:动态处理 getter/setter,并配合 respond_to_missing?。
  • 类实例变量:使用 class << self 与 attr_accessor 管理类级别状态。
  • Struct:定义带方法的数据结构,如 Person = Struct.new(:name, :age)。
  • OpenStruct:动态属性对象,需 require 'ostruct'。
  • 组合优于继承:Car 组合 Engine 与 Wheels 实例。
  • Comparable:实现 <=> 后可使用 sort 等方法。
  • Enumerable:在标题中提及,正文未展开具体示例。
  • 类变量与实例变量对比:@@count 为类变量(共享),@instances 为类实例变量(不与子类共享)。

使用方式

该技能以代码示例形式呈现各主题的写法,可直接参考示例中的类定义、模块混入、继承与 super 调用、可见性修饰符、单例实现、method_missing、Struct/OpenStruct、Comparable 等模式来编写 Ruby 代码。

适用场景

  • 编写或重构 Ruby 类与模块。
  • 设计继承层次或选择组合/混入方案。
  • 需要封装实现细节、控制方法可见性时。
  • 需要动态方法、单例或简单数据结构时。
  • 需要让自定义类支持排序或比较时。

限制与注意事项

  • 资料未提供安装命令、依赖版本、运行环境或平台要求。
  • 资料未提供收费、价格或授权信息。
  • 资料未提供性能数据或效果保证。
  • 资料中的最佳实践与反模式为建议性内容,未提供具体验证数据。
  • Enumerable 仅在标题中提及,正文未给出具体示例。

最佳实践(资料所列)

  • 复杂关系优先使用组合而非继承。
  • 使用模块混入在无关类之间共享行为。
  • 保持类小而专注(单一职责原则)。
  • 使用 attr_accessor/reader/writer 代替手写 getter/setter。
  • 使用 private/protected 封装实现细节。
  • 优先使用实例变量而非类变量,避免意外共享。
  • 简单数据对象使用 Struct 而非完整类。
  • 重写 to_s 以提供有意义的字符串表示。

反模式(资料所列)

  • 不必要地使用类变量(会在继承层次中共享)。
  • 创建上帝对象。
  • 暴露内部状态。
  • 过度使用继承。
  • 忽略可见性修饰符。

相关技能

  • ruby-metaprogramming:动态类/方法生成。
  • ruby-blocks-procs-lambdas:函数式编程模式。
  • ruby-modules:高级模块用法。