Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby에서 싱글톤 패턴을 사용하는 방법(그리고 피해야 하는 이유)

하나의 인스턴스만 가질 수 있는 클래스를 만들고 싶었던 적이 있습니까?

예? 아니? 아마도?

음...

이것이 바로 싱글톤 패턴입니다. 입니다.

문제가 없습니다.

그러나 어떤 사람들은 이것을 나쁜 디자인에 대한 변명으로 사용할 수 있기 때문에 이것을 안티 패턴이라고 부릅니다.

작동 방식을 배울 수 있도록 코드 예제를 살펴보겠습니다.

싱글톤 패턴 코드 예

싱글톤 패턴의 개념은 하나의 인스턴스만 있는 클래스를 원한다는 것입니다.

방법은 다음과 같습니다. :

  • new 비공개 방법
  • instance라는 클래스 메서드를 정의합니다. 클래스에 대한 고유한 인스턴스를 반환합니다.

이것은 인기 있는 디자인 패턴이기 때문에 Ruby 표준 라이브러리에는 Singleton 모든 클래스에 포함할 수 있는 모듈입니다.

이렇게 생겼어요 :

require 'singleton'

class Shop
  include Singleton
end

이제 Shop을 만들려고 하면 Shop.new가 있는 개체 다음 항목이 표시됩니다.

Shop.new
# NoMethodError: private method `new' called for Shop:Class

그리고 하나뿐인 Shop을 원하신다면 instance를 사용할 수 있는 개체 방법:

Shop.instance.object_id

# 5659218

Shop.instance.object_id

# 5659218

object_id 절대 변하지 않습니다.

기억해야 할 사항 :

이것은 간단한 패턴으로 개체 생성을 1개의 개체로 제한하며 원할 때마다 해당 개체를 요청할 수 있습니다.

이 패턴을 사용하면 안 되는 이유

싱글톤 패턴은 종종 어떤 형태의 전역 변수를 갖는 핑계이며 전역 변수를 제어할 수 없기 때문에 전역 변수가 나쁘다는 것을 알고 있습니다. 이는 테스트를 어렵게 만들고 결합을 증가시킬 수 있습니다.

<블록 인용>

"Singleton의 진짜 문제는 개체의 적절한 가시성에 대해 신중하게 생각하지 않는 좋은 핑계를 제공한다는 것입니다." – 켄트 벡

대부분의 클래스가 의존하는 객체가 있다고 상상해보세요. 이것이 바로 싱글톤 패턴이 될 수 있는 것입니다. 리팩토링을 하시길 바랍니다!

지금 :

이 패턴에 좋은 용도가 있습니까?

Github에서 검색하면 Null 개체 패턴과 함께 Singleton 패턴을 사용하는 일부 repos가 나타났습니다.

그게 말이 되는 것 같아요. Rails는 이것을 ActionPack의 일부로 사용합니다.

코드는 다음과 같습니다. :

class AllType < Type
  include Singleton

  def initialize
    super "*/*", :all
  end

  def all?; true; end
  def html?; true; end
end

Type에서 상속받은 클래스입니다. .

AllType을 만들 때 instance를 통한 객체 메서드를 호출하면 super를 호출하고 개체를 반환합니다.

instance를 호출할 때마다 그 후에는 동일한 개체를 얻게 됩니다.

결론 :

예, 이 패턴은 적절한 상황에서 유용할 수 있지만, 그것에 대해 많이 생각하지 않고 사용하고 싶지는 않습니다.

동영상

요약

싱글톤 디자인 패턴, Ruby에서 구현하는 방법, 대부분 피해야 하는 이유에 대해 배웠습니다.

이 패턴에 대해 어떻게 생각하세요? 전에 본 적이 있습니까? 댓글로 알려주세요 🙂

읽어주셔서 감사합니다!