質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.81%

インターフェースを実装するべき側の判断について

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 835

hogefugapiyo

score 1741

お世話になっております。

現在、インターフェースを用いてプレイヤーがアイテムを拾えるかどうかの機能を作成しています。
機能自体は問題なく作ることができたのですが、ここで疑問となったのが、インターフェースを実装すべき側はどちらなのかということです。

例えば、下記の条件があったとします
・【プレイヤー】は、【フルーツ】を拾える。

この時に

  1. プレイヤー側にフルーツを拾うことができる IItemGettable のようなインターフェースを実装するべきなのか
  2. フルーツ側に、拾われることができる IGettable というインターフェースを実装するべきなのか

サンプル #1 プレイヤー側に実装する場合

IItemGettable

using UnityEngine;

public interface IItemGettable {
    void PickUp(GameObject obj);
}

Player.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

    public class Player : MonoBehaviour, IItemGettable {
        public void PickUp(GameObject obj) {
            Debug.Log(obj.name + "を手に入れた");
        }
    }

Fruits

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Fruits : MonoBehaviour {

    private void OnCollisionEnter(Collision collision) {
        var target = collision.gameObject.GetComponent<IGettable>();

        if (target != null) { target.Pickup(gameObject); }
    }

}

サンプル #2 フルーツ側に実装する場合

IGettable

public interface IGettable  {
    void Get ();
}


Player.cs

void OnTriggerEnter (Collider collision) {
    var iGettable = collision.GetComponent<IGettable>();

    if (iGettable != null) {
        iGettable.Get();
        Debug.Log("アイテムを取得しました");
    }

}

Fruits.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


public class Gem : MonoBehaviour, IGettable {
    public void Get () {
        GetComponent<Renderer>().enabled = false;
        Debug.Log("自身を消す(取得された)");                
    }
}

サンプル間で多少のコードの差はあるとしても、どちら側が主体となるべきなのか、どちら側が処理を判断すべきなのか。
インターフェースを実装する際の考え方など、ご教授いただければ幸いです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Zuishin

    2020/01/22 21:04

    両方です。

    Pickup の引数が GameObject ですが、GameObject なら何でも拾えるわけではないと思います。ならば拾われる対象ということを示すために拾われるオブジェクトにインターフェースを実装するのが良いでしょう。
    また拾われたオブジェクトはプレイヤーの持ち物としてリストに入るはずです。ならばプレイヤーへの操作が必要なのでプレイヤーは操作されるためのインターフェースを実装するのが良いと思います。

    ただし、物を拾えるのがプレイヤーのみである場合、プレイヤーはインターフェースを実装する必要はありません。プレイヤークラスであることがすでにインターフェースであるからです。

    キャンセル

  • hogefugapiyo

    2020/01/24 09:29

    ご回答ありがとうございます。
    プレイヤーが一人である場合はたしかに一意であるという内容、当たり前の話かもしれませんが改めて聞いてすごく納得する内容でした。

    キャンセル

回答 2

checkベストアンサー

+7

こんにちは。

この情報だけだとどんな回答をしても正当化できてしまいますが、今回は一般論に限って述べます。

結論から言うと、お互いのオブジェクトの関係が「一対多」であると仮定したとき、「多」のオブジェクト側にインターフェースを実装します。
具体例をあげると、

  • 「一人の」プレイヤーが、「様々な」フルーツを拾える状況である場合、フルーツ側にインターフェースを実装し、プレイヤーは唯一つのインターフェースにアクセスすることで、どのようなフルーツでも拾えるようにします。
  • 「様々な形態の」プレイヤーが、「とある」フルーツに対して拾うアクションを起こせるのであれば、プレイヤー側にインターフェースを実装します。

実際には、複雑化してくると「多対多」の関係になる場合が多く、その場合では「両方にそれぞれのインターフェースを実装する」ことになります。
プレイヤーは「アイテムを拾うことができる」性質を持ち、アイテムは「拾われることができる」性質を持ちます。
最終的に、「拾う者は、拾えるモノを拾える」という、禅問答のような定義に落ち着くのです。

インターフェースは性質の定義であり、オブジェクトが特定の機能を持つことを保証するものです。
多数のオブジェクトを横断して「とある性質を持つ」ものを同一視できることがインターフェースを利用する最大の目的になるので、「一対多の関係性」を考慮してインターフェース設計を行ってください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/24 09:26

    わかりやすい解説を頂きましてありがとうございます。
    確かに禅問答のようにどちらにどちらをと繰り返していたので理解しやすい内容で助かりました。

    それぞれの要素の関係性を考えて今後作成していきたいと思います。ありがとうございました。

    キャンセル

+3

どちらが良いかは全体の設計次第なのでこれだけの情報では答えようがありません。
が、質問を見てこの記事を思い出しましたので参考にどうぞ。

[CEDEC 2011]AIに命を。「ぽかぽかアイルー村」のアフォーダンス指向によるAI事例と「ARMORED CORE V」の三次元的な移動経路検索

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/24 09:27

    興味深い内容のURLを共有いただきありがとうございます。
    アフォーダンス志向という内容はとても興味深く、ある種わかりやすい内容だったのでとてもありがたいです。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る