ジョーアームストロングによるバナナモンキージャングルの問題を説明するサンプルコード[終了]


14

仕事中のコーダーの本で、ジョー・アームストロングは次のように述べています。

再利用性の欠如は、関数型言語ではなくオブジェクト指向言語で発生すると思います。オブジェクト指向言語の問題は、それらが持ち歩くこの暗黙の環境をすべて持っているためです。バナナが欲しかったのに、バナナとジャングル全体を持ったゴリラが手に入れた

ここではあまりわかりません。問題がバナナを取得することである場合、関数 'getBanana'の背後にあるすべてのロジックをカプセル化できます。猿とジャングルはこの文脈にどのように関係していますか。誰かの書き込みがあるという事実を証明、と言う、方法を理解しやすくして、問題を説明するコードスニペットでしたBananaオブジェクトが必要とするMonkeyJungle、開始されるようにしてくださいオブジェクトを?



残念なことに、これは良い議論を生み出していました。スターターとしてファーストクラスの機能を調べてください。
ロビーディー

1
@Euphoric Discussionタイプの質問は実際に許可されますが、どの質問が主観的であるかは主観的です。
ロビーディー

2
このインタビューはジョー・アームストロングが博士論文を書く前に開催されたと思います。彼の博士論文を書いている間、アームストロングはオブジェクト指向の本当の定義について学び、Erlangが実際にすべての現在の主流言語の実際に徹底的にオブジェクト指向であることに気づきました、Erlangはおそらく最もオブジェクト指向の言語です!彼は、Erlangが実際にオブジェクト指向言語であることを知っていれば、そのような方法でそのような声明を出さなかっただろう。彼が話しているのは、アンビエントオーソリティです。これは、オブジェクト指向とは関係ありません。
ヨルグW

1
こんにちは、私の質問は、私(および他の人)が問題をよりよく理解するのに役立つサンプルコードを提供することです。問題を示すコードスニペットは、意見だけでなく受け入れられます。
Khaのグエン

回答:


16

彼は、実際のOOPプログラムの大部分は懸念の分離を尊重していないという事実をほのめかしています。たとえば、次のクラスを使用できます。

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

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

public class Jungle
{
}

あなたが使用している場合はBanana、それも依存する推移必要があるMonkeyJungle

しかし、これは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 MonkeyおよびJungleは、の環境ですBanana。のような抽象化を導入することによりIBananaOwner、環境は明示的になります。そして、この環境がどのように設計されているかが、彼の問題のすべてです。
陶酔

あなたは非常に正しいかもしれませんが、私は部屋の象が(別の動物を追加するために)他のものの間でこれを読んだことを助けることはできませんそれ以上を貸し出しました。
ロビーディー

@RobbieDee私が書いたものを単純な関数合成で置き換えることはできません。少なくとも外のおもちゃの例の問題ではありません。実際には、OOP設計を完全に置き換えるには、複雑なジェネリック、型クラス、モナドなどが必要です。そして、それはある種の複雑さを別の種類に変えるだけです。
陶酔

13

ゴリラはサルではありません!

それはさておき、「getBanana関数」の背後にあるすべてのロジックをカプセル化できます自分の質問に答えます。欲しいのはバナナだけですが、それを取得するにgetBananaは、Gorillaクラスのインスタンスなどのオブジェクトを呼び出す必要があります。このバナナオブジェクトには、所属するゴリラへの参照が含まれている可能性が高く、そのゴリラオブジェクトには、所属するフォレストへの参照が含まれます。バナナをお願いしますが、背後にカプセル化されているのはジャングル全体です。

これは極端な例であり、必ずしもそれほど悪いわけではありません。しかし、このようなオブジェクト指向システムで終わることは珍しくありません。そのため、そのgetBanana方法をテストするには、フォレスト全体をインスタンス化、つまりモックする必要があります。


1
それは...何のサンプルコードを持っていないので、これは質問に答えていません
ロビーディー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.