문제

핵심 CS 질문은 여기에 : 감마 등에 나열된 설계 패턴 중 하나 인 경우 원숭이를 포함하는 경우? 또한, 어떤 종류의 문제에 대해, 원숭이가 적절한 것과 하위 클래싱은 무엇입니까? 핵심 라이브러리 클래스에서 버그 패치는 하나입니다. 다른 사람이 있습니까? 나는 stackoverflow에서의 원숭이 삽입에 대해 많은 Sturm Und Drang을 들었습니다. 대부분의 사람들은 그것에 대해 강한 오해를 느끼는 것처럼 보이지만 프로그래머로서 나는 일반적인 기능을 캡슐화하고 내 객체 모델에 레일에 포함시키는 능력을 정말 좋아합니다.

예를 들어 ThoughtBot-PaperClip을 가져 가십시오. 예를 들어 오늘날 존재하는 원숭이 chatch 접근 방식과 비교하여 왜 서브 클래스를 원하십니까?

감사합니다, -eric

도움이 되었습니까?

해결책

나는 원숭이를 디자인 패턴이라고 생각하지 않습니다. 핵심 클래스 확장 언어 기능이 무시하는 것처럼 보입니다.

나머지는 Jeff Atwood의 견해를 살펴보십시오. 그의 블로그에있는이 기사.

그의 (그리고 나의)의 oppinion에서, 원숭이 삽입의 가장 큰 문제는 기존 방법을 수정하면 디버깅을 매우 어렵게 만들 수 있다는 것입니다. 우리 인간은 기계뿐만 아니라 모든 "작은 스 니펫"을 추적 할 수 없습니다. 서브 클래스는 더 명확한 분리를 안정시킵니다.

따라서 Monkeypatching에 대한 개인적인 규칙은 다음과 같습니다.

  • 원숭이를 입히지 않고 할 수 있고 잘 작동한다면 원숭이를 사용하지 마십시오.
  • 클래스에 새로운 방법을 추가 할 수 있지만 기존 방법을 수정할 수는 없습니다.
  • 매우 눈에 띄고 명백한 방식으로 수행하십시오. 즉, 숨겨진 /myvendor/submodule/se.rb가 아닌 /lib에서 string_extensions.rb라는 파일.
  • 현지 여야합니다. 라이브러리를 사용하지 않는 클래스는 영향을받지 않아야합니다.

이제 당신의 예에 : PaprClip.

  • 내 아는 한, 그것은 당신의 activerecord 클래스에 메소드를 추가하지만 기존 클래스를 수정하지 않습니다.
  • 추가해야합니다 has_attachment 종이 클립을 사용하는 클래스에 대한 지침은 영향을받지 않습니다.

그래서 변화는 현지화되고 명백합니다 (실제로는 그것이 관리한다고 생각합니다. 개선하다 디버깅 : 인간이 읽기가 더 쉽습니다 has_attachment 대신에 class MyModel < Paperclip::ActiveRecordWithAttachment).

서브 클래싱은 또한 서브 클래스를 사용한 다른 플러그인 외에도 Paplip을 사용할 수 없기 때문에이 경우에도 나쁜 아이디어입니다. Rails는 단일 상속입니다.

그리고 종이 클립의 경우, 그것은 분명히 has_a aTuthment와의 관계가 아닙니다 is_a 하나. 서브 클래스의 적절한 사용은 아니라고 주장 할 수있다.

마지막으로, 종이 클립에는 일부 경우에 서브 클래싱이 필요하다는 것을 지적하고 싶습니다 (페이퍼 클립 프로세서를 만들려면 서브 클래싱을 사용해야합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top