Joe Armstrong의 바나나 원숭이 정글 문제를 설명하는 샘플 코드


14

책에서 직장에서 코더 조 암스트롱 밝혔다 :

재사용 성 부족은 기능적 언어가 아닌 객체 지향 언어에서 비롯된 것 같습니다. 객체 지향 언어의 문제는 그들이 가지고 다니는 모든 암시 적 환경을 가지고 있다는 것입니다. 바나나를 원했지만 바나나와 정글 전체를 들고있는 고릴라

나는 여기에 그것을 얻지 못한다. 문제가 바나나를 얻는 것이라면 'getBanana'함수 뒤에있는 모든 논리를 캡슐화 할 수 있습니다. 이 맥락에서 원숭이와 정글은 어떻게 관련되어 있습니까? 누군가의 쓰기 방법을 이해하기 쉽게에서 문제를 설명하는 코드 수, 말은 사실 증명 Banana개체가를 필요로 Monkey하고 Jungle, 제발 시작하는 객체를?



동정은 닫혔다. 좋은 토론이 나왔다. 첫 번째 클래스 기능을 초보자로 살펴보십시오.
로비 디

1
@Euphoric 토론 유형의 질문 은 실제로 허용 되지만 주관적인 질문은 ... 주관적 일 수 있습니다.
로비 디

2
이 인터뷰는 Joe Armstrong이 박사 학위 논문을 쓰기 전에 열렸다고 생각합니다. 암스트롱 박사는 박사 학위 논문을 작성하면서 OO 의 실제 정의에 대해 배웠고 Erlang이 실제로 모든 현재 주류 언어의 객체 지향이라는 것을 깨달았습니다. Erlang은 아마도 가장 객체 지향적 인 언어 일 것입니다! 그는 Erlang이 실제로 OO 언어라는 것을 알았다면 그런 말을하지 않았을 것입니다. 그가 말하고 있는 것은 OO와는 전혀 관계 가없는 주변 권위 입니다.
Jörg W Mittag

1
안녕하세요, 제 질문은 저와 다른 사람들이 문제를 더 잘 이해하는 데 도움이되는 샘플 코드를 제공하는 것입니다. 문제를 보여주는 코드 스 니펫은 의견 만이 아니라 수용 가능합니다.
Kha Nguyễn

답변:


16

그는 실제 OOP 프로그램의 대다수가 우려의 분리를 존중하지 않는다는 사실을 암시하고있다. 예를 들어 다음과 같은 클래스를 가질 수 있습니다.

public class Banana
{
    public Monkey Owner {get;}
}

public class Monkey
{
    public Jungle Habitat {get;}
}

public class Jungle
{
}

당신이 사용하는 경우 Banana, 또한에 의존 이적으로 필요 Monkey하고 Jungle.

그러나 나는 이것이 OOP의 문제이며 기능적 스타일에 어쨌든 가지고 있지 않다는 것에 완전히 동의하지 않습니다. 이것은 올바른 추상화를 도입하여 OOP에서 쉽게 고칠 수 있습니다.

문제는 관심사 분리를 신경 쓰지 않는 개발자에 관한 것입니다. 그리고 OOP 프로그래머 대부분이 초보자라고 주장하는 것을 두려워하지 않을 것입니다. 기능적 프로그래머에게는 약간의 경험이 있으며 코드를 올바르게 분리하도록 동기를 부여합니다.

가능한 추상화는 다음과 같습니다.

public class Banana
{
    public IBananaOwner Owner {get;}
}

public interface IBananaOwner
{
}

public class Monkey : IBananaOwner
{
    public Jungle Habitat {get;}
}

public class Jungle
{
}

이렇게하면 Banana소유자가 있다는 것을 알 수 있지만 반드시 그럴 필요는 없습니다 Monkey. 무엇이든 될 수 있습니다. 또한 Banana소유자가 수행 할 수 있는 작업을로 정의 된 작업으로 만 제한하므로 IBananaOwner추론이 간단 해집니다.


반대로 기능적 언어는 즉시 사용 가능한 퍼스트 클래스 기능을 지원하지만 기능 X는 부작용없이 기능 Y에 의해 안전하게 사용될 수 있습니다.
로비 디

비록 당신이 훌륭한 지적을했지만, 나는 당신이 여기서 약간 벗어나려고 할 것입니다. 인용구 에는 코드가 설계된 방식이 아닌 환경이 명시 적으로 언급되어 있습니다 .
로비 디

@RobbieDee MonkeyJungle환경입니다 Banana. 와 같은 추상화를 도입함으로써 IBananaOwner환경이 명확 해집니다. 이 환경이 어떻게 설계 되었는가가 그의 문제의 전부입니다.
Euphoric

당신은 아주 잘 맞을 수도 있지만 도움이되지 수 있지만 읽은 생각 방 (다른 동물을 추가하는)의 코끼리가 문제가 함수형 프로그래밍은, 역사적으로,이 기능의 올바른 구성에 있다는 것을 다른 것들 사이 더 빌려주었습니다.
로비 디

@RobbieDee 작성한 함수를 간단한 함수 구성으로 바꿀 수 없습니다. 적어도 장난감 예제 문제가 아닙니다. 실제로 OOP 디자인을 완전히 대체하기 위해서는 복잡한 제네릭, 타입 클래스, 모나드 등이 필요합니다. 그리고 그것은 단지 다른 종류의 복잡성을 변화시키고 있습니다.
Euphoric April

13

고릴라는 원숭이가 아닙니다!

이를 제쳐두고 " getBanana " 함수 뒤에있는 모든 논리를 캡슐화 할 수 있습니다 . 내가 원하는 것은 바나나이지만, 그것을 얻으려면 클래스 getBanana의 인스턴스와 같은 객체 를 호출해야합니다 Gorilla. 그러면 바나나 개체는 자신이 속한 고릴라에 대한 참조를 포함하고 그 고릴라 개체는 그에 속한 숲에 대한 참조를 갖게됩니다. 그래서 나는 바나나를 요구하지만 그 뒤에는 정글 전체가 캡슐화되어 있습니다.

극단적 인 예이며 항상 그렇게 나쁘지는 않습니다. 그러나 이와 같은 OO 시스템으로 끝나는 것은 드문 일이 아닙니다. 따라서이 getBanana방법 을 테스트 하려면 전체 포리스트를 인스턴스화하거나 조롱해야합니다.


1
이것은 샘플 코드가 없기 때문에 질문에 대답하지 않습니다 ...
Robbie Dee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.