2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Ruby】superを使うデメリット(注意点)

Posted at

【Ruby】superを使うデメリット(注意点)

Rubyのsuperは非常に便利な機能であり、クラスの継承階層を活用する上で頻繁に用いられます。しかし、その使用には注意点とデメリットがいくつか存在します。以下に、superの使用に関連する主要なデメリットと注意点を挙げます。

1. 継承の複雑さ

以下のように、superの呼び出しは、継承の階層を持つクラス設計の複雑さを増加させる可能性があります。特に多重継承の場合(Rubyではモジュールの取り込みを考えるとき)、superの動作が直感的でないことがあります。

module A
  def greet
    "Hello from A"
  end
end

module B
  def greet
    super + " and B"
  end
end

module C
  def greet
    super + " then C"
  end
end

class Parent
  def greet
    "Hello from Parent"
  end
end

class Child < Parent
  include A
  include B
  include C

  def greet
    super + " finally from Child"
  end
end

child = Child.new
puts child.greet

# 出力
# Hello from A and B then C finally from Child

モジュールのメソッドはそのモジュールが取り込まれたクラスよりも前にチェーン内で探索されます。

この例では、Childクラスのgreetメソッドが呼び出されると、次の順序でメソッドが探索されます:

Child
C (モジュール)
B (モジュール)
A (モジュール)
Parent
したがって、child.greetの結果は上記のコメントアウトされている出力のようになります。

2. 変更への脆弱性

親クラスのメソッドが変更されると、superを使用しているサブクラスに影響を及ぼす可能性があります。これにより、一部のサブクラスが意図しない動作を示すことが考えられます。

3. オーバーライドの問題

サブクラスでのメソッドのオーバーライドに関連して、superの呼び出しタイミングや、その有無により、予期しない挙動やエラーが生じることがあります。

class Vehicle
  attr_reader :wheels

  def initialize
    @wheels = 4
  end
end

class Car < Vehicle
  attr_reader :brand

  def initialize(brand)
    @brand = brand
    # superの呼び出しを忘れたため、@wheelsが初期化されない
  end
end

car = Car.new("Toyota")
puts car.brand  # => "Toyota"
puts car.wheels # => nil (期待は4だが、superが呼び出されなかったためnilとなる)

4. カプセル化の破壊

superを使用して親クラスの具体的な実装に依存することは、時としてカプセル化の原則に反します。このような依存が強くなると、クラス間の独立性が低下し、変更が難しくなることがあります。

class Parent
  def greet
    "Hello"
  end
end

class Child < Parent
  def greet
    super + ", World!"
  end
end
# Parentクラスのgreetを変更するとChildクラスの出力も変わる

5. 可読性の問題

superの使用は、コードの可読性に影響を及ぼす可能性があります。特に、複数の継承階層が関与する場合、どのクラスのメソッドが呼び出されるのかを特定するのが難しい場面が生じます。


以上のような点を考慮して、superの使用は慎重に行うことが推奨されます。また、継承よりも合成やデリゲーションといったオブジェクト指向の他のパターンを活用することで、これらの問題を避ける方法も考えられます。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?