문제

나는 일부 개인 프로젝트에서 PHP5에서 Python으로 천천히 이동하고 있으며 현재 경험을 좋아합니다. 파이썬 루트를 내려 가기 전에 나는 루비를 보았다. 루비 커뮤니티에서 내가 알아 차린 것은 원숭이 패치가 일반적이지 않고 고도로 유명하다는 것입니다. 나는 또한 a 많은 누군가가 약간의 일을하기 위해 상대적으로 무해한 도서관을 포함했지만 아무에게도 말하지 않고 심하게 사용 된 핵심 물체를 패치했기 때문에 Ruby S/W 디버깅 시험에 관한 공포 이야기에 대한 이야기.

나는 (다른 이유들 중에서) 더 깨끗한 구문과 그것이 루비가 할 수있는 모든 것을 할 수 있다는 사실을 선택했습니다. Python은 OO 클릭이 PHP보다 훨씬 나아지고 있으며,이 더 나은 이해를 향상시키기 위해 OO 원칙에 대해 점점 더 많이 읽고 있습니다.

오늘 저녁에 나는 읽고있다 로버트 마틴의 견고한 원칙 :

  • 에스책임 원칙,
  • 영형펜/폐쇄 원리,
  • Iskov 대체 원칙,
  • nterface 분리 원리 및
  • ependency 반전 원리

나는 현재까지 영형: 소프트웨어 엔티티 (클래스, 모듈, 기능 등)는 확장을 위해 열려 있어야하지만 수정을 위해 닫힙니다..

내 머리는 OO 디자인의 일관성을 보장하는 것과 원숭이 패치를하는 것 사이의 갈등을 돌리고 있습니다. 나는 파이썬에서 원숭이 패치를하는 것이 가능하다는 것을 이해합니다. 나는 또한 "Pythonic"이라는 것이 일반적이고 잘 테스트 된 OOP 베스트릭트 및 원칙을 따르는 것임을 이해합니다.

내가 알고 싶은 것은 두 가지 반대 주제에 대한 공동체의 의견입니다. 그들이 서로를 상호 작용하는 방법, 서로를 사용하는 것이 가장 좋을 때, 원숭이 패치가 전혀 수행되어야하는지 ... 나에게 문제에 대한 해결책을 제공 할 수 있기를 바랍니다.

도움이 되었습니까?

해결책

원숭이 패치 (기존 방법을 덮어 쓰거나 수정)와 새로운 방법의 간단한 추가 사이에는 차이가 있습니다. 나는 후자가 완벽하게 괜찮다고 생각하고, 전자는 의심스럽게보아야하지만 여전히 그것을 유지하는 것을 선호합니다.

나는 제 3 자 확장이 핵심 라이브러리를 랑게하고 물건을 깨뜨리는 문제를 꽤 많이 만났다. 불행히도, 그들은 모두 솔루션을 올바르게 구축하는 방법에 대해 생각하기보다는 저항력이 가장 적은 경로를 취하는 제 3 자 확장 개발자에서 비롯된 것 같습니다.
이것은 짜증나지만, 사람들이 때때로 스스로 자르는 나이프 제작자의 잘못보다 원숭이 패치의 잘못은 더 이상 없습니다.

원숭이 패치에 대한 합법적 인 필요성을 본 유일한 시간은 제 3 자 또는 핵심 라이브러리의 버그를 해결하는 것입니다. 이것만으로, 그것은 귀중한 것이며, 그들이 그것을 할 수있는 능력을 제거한다면 정말 실망 할 것입니다.

C# 프로그램의 버그 타임 라인 : 우리는 다음과 같습니다.

  1. 이상한 버그 보고서를 읽고 CLR 라이브러리의 사소한 버그에 문제를 추적하십시오.
  2. 이상한 장소에서 예외를 포착하는 작업 및 코드를 많이 타협하는 많은 해킹과 관련된 해결 방법을 제시하는 투자 일
  3. Microsoft가 서비스 팩을 출시 할 때 해킹 해결 방법을 퇴치하는 날을 보내십시오.

레일 프로그램에서 버그의 타임 라인 : 우리는 다음과 같습니다.

  1. Ruby Standard Library의 Strange Bug Reports를 읽고 사소한 버그에 문제를 추적하십시오.
  2. Ruby Library에서 버그를 제거하기 위해 Minor Monkey-Patch를 수행하는 데 15 분을 보내고 Ruby의 잘못된 버전에서 실행되면 경비원을 여행 할 때 경비원을 배치하십시오.
  3. 정상적인 코딩을 계속하십시오.
  4. 다음 버전의 루비가 출시 될 때 나중에 monkeypatch를 삭제하십시오.

버그 픽싱 프로세스는 원숭이를 제외하고는 15 분 솔루션이며 5 초 동안 '추출'을 제외하고는 비슷해 보이지만 고통과 고통은 계속됩니다.

추신 : 다음 예는 "기술적으로"원숭이를 입히는 것이지만, "도덕적으로"원숭이를 태우는가? 나는 어떤 행동도 바꾸지 않습니다 - 이것은 루비에서 AOP를하는 것만으로도 ...

class SomeClass
  alias original_dostuff dostuff
  def dostuff
    # extra stuff, eg logging, opening a transaction, etc
    original_dostuff
  end
end

다른 팁

제 생각에, 원숭이를 입히는 것은 유용하지만 남용 할 수있는 것이 유용합니다. 사람들은 그것을 발견하는 경향이 있으며 모든 상황에서 사용되어야한다고 생각합니다.

나는 그것이 당신이 금지해야 할 일이라고 생각하지 않습니다. 그것은 루비 사람들이 사용하는 것입니다. Python과 비슷한 일을 할 수는 있지만 커뮤니티는 상황이 더 단순하고 더 분명해야한다는 입장을 취했습니다.

Monkey Patching은 Ruby-Victicit이 아니며, 부정적인 (IMO) 효과와 함께 JavaScript에서도 수행됩니다.

내 개인적인 의견은 원숭이 패치는

a) 필요한 언어의 새 버전으로 제공되는 기존 언어에 기능을 추가하십시오.

b) 다른 "논리적"장소가 없을 때.

원숭이 패치를 정말 끔찍하게 만드는 쉬운 방법은 많이 있습니다. 덧셈 일하다.

내 입장은 당신이 그것을 피할 수 있다면 그렇게한다는 것입니다.

당신이 그것을 좋은 방법으로 피할 수 있다면, 당신에게 kudos.

당신이 그것을 피할 수 없다면, 당신은 아마도 그것에 대해 충분히 생각하지 않았기 때문에 200 명의 의견을 얻으십시오.

내 애완 동물이 싫어 mootools를 확장하고 있습니다 기능 물체. 예, 당신은 이것을 할 수 있습니다. 사람들이 JavaScript의 작동 방식을 배우는 대신 :

setTimeout(function(){ 
    foo(args); 
}, 5000 ); 

모든 기능 객체에 새로운 방법이 추가되었습니다 (예, 농담하지 않음) 기능이 이제 고유 한 기능을 갖습니다.

foo.delay( 5000 , args );

이런 종류의 쓰레기의 추가 효과가 유효합니다.

foo.delay.delay( 500,  [ 500, args ] ); 

그리고 그 광고 무한대처럼.

결과? 더 이상 도서관과 언어, langauge가 도서관에 활을 가지고 있지 않으며 도서관이 범위에 빠지면 더 이상 언어가 없으며 배울 때 행해진 방식으로 일을 할 수 없습니다. 언어, 대신 배워야합니다 새로운 명령의 하위 집합은 얼굴에 평평 해지지 않도록합니다 (과도한 둔화 비용으로!)

foo.delay도 자체 방법으로 객체를 반환 했으므로 할 수 있습니다.

x = foo.delay( 500, args ); 
x.clear(); 

그리고 심지어

 x.clear.delay(10); 

지나치게 유용하게 들릴지 모르지만 ...이 실행 가능하게 만드는 데 사용되는 대규모 오버 헤드를 고려해야합니다.

 clearTimeout(x); 

너무 힘들어!

(면책 조항 : MOO를 사용한 지 얼마되지 않아 잊어 버리려고했지만 기능 이름/구조가 잘못 될 수 있습니다. 이것은 API 참조가 아닙니다. 자세한 내용은 사이트를 확인하십시오 (죄송합니다. API 참조가 빨라집니다!). )

mokeypatching은 일반적으로 잘못되었습니다. 적절한 서브 클래스를 만들고 메소드를 추가하십시오.

프로덕션 코드에서 원숭이를 한 번 사용했습니다.

문제는 REST를 사용하여 Get, Post, Put and Delete를 사용한다는 것입니다. 그러나 Django Test 클라이언트는 Get and Post 만 제공합니다. Put (예 : Post) 및 삭제 (예 : get)에 대한 방법을 monkeypatched.

Django 클라이언트와 Django 테스트 드라이버 사이의 긴밀한 바인딩으로 인해 전체 휴식 테스트를 지원하기 위해 MonkeYpatch가 가장 쉬운 것처럼 보였습니다.

당신은 깨달음을 찾을 수 있습니다 이 토론 Ruby의 오픈 클래스와 개방형 원칙에 대해.

루비를 좋아하지만 원숭이 패치는 일을 끝내기위한 최후의 수단의 도구라고 생각합니다. 모든 것이 평등합니다. 저는 기능적 프로그래밍의 뿌리를 뿌린 전통적인 OO 기술을 사용하는 것을 선호합니다.

내 눈에는 원숭이 패치가 AOP의 한 형태입니다. 기사 측면 지향 설계 원칙 : 객체 지향 디자인의 교훈 (PDF)는 AOP에 견고하고 다른 OOP 원칙을 어떻게 적용 할 수 있는지에 대한 아이디어를 제공합니다.

첫 번째 생각은 원숭이 패치가 OCP를 위반한다는 것입니다. 수업의 클라이언트는 해당 수업이 일관되게 작동하기를 기대할 수 있기 때문입니다.

원숭이 패치는 단지 평범합니다 잘못된, IMHO. 나는 당신이 전에 언급 한 열린/폐쇄 원칙을 발견하지 못했지만, 내가 오랫동안 본 원칙입니다. 나는 100%에 동의합니다. 나는 원숭이 패치를 대규모 코드 스 셀린으로, 코딩-필로 페오 피스 스셀로 생각합니다.

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