2

私のAndroidアプリからのメソッドは次のとおりです。

public ViewHolderBase buildView(PlayerResult playerResult)
{
    View result = inflater.inflate(
        R.layout.player_result,
        null);
    this.helper = new ViewHelper(result);

    ViewHolderBase holder = createViewHolder();

    TextView playerName = helper.findTextView(R.id.playerName);
    holder.setPlayerNameTextView(playerName); // <-- alleged violation

    TableLayout tableLayout = helper.findTableLayout(R.id.tlPossibleResults);
    populateTableLayout(holder, tableLayout, playerResult);
    holder.setView(result); // <-- another one
    return holder;
}

Android Studio は、次の 2 行がデメテルの法則に違反していると「考えます」。

holder.setPlayerNameTextView(playerName);
holder.setView(result);

理解できません。定義は次のとおりです。

関数のデメテルの法則では、オブジェクト O のメソッド m は、次の種類のオブジェクトのメソッドのみを呼び出すことができます。

  • 〇そのもの
  • m のパラメーター
  • m 内で作成/インスタンス化されたオブジェクト
  • O の直接コンポーネント オブジェクト
  • m のスコープ内で、O からアクセスできるグローバル変数

そう?holder変数内で作成/インスタンス化されますm

当然のことながら、インスタンス化はメソッドに委譲されてcreateViewHolderいます...違いはありますか? (副質問)。

IDE にはありませんholder。代わりに直接インスタンス化すると、警告が引き続き表示されます。

質問:

Androidスタジオは間違っていますか? それとも、デメテルの法則に対する私の理解が不足しているのでしょうか? 後者が真の場合、LoD を満たすためにこのビットをどのようにリファクタリングする必要がありますか?

4

1 に答える 1

1

どちらのオブジェクトも実際には "m" でインスタンス化されません。holder と result の両方が関数の戻り値であるため、技術的には別の場所で作成されたオブジェクトです。

もちろん、「createViewHolder」は単に他の誰かが使用するオブジェクトを作成することを知っています。「inflater.inflate」についても同じことが当てはまると思います。したがって、おそらくそれらを誤検知として無視できます。しかし、アナリスト ソフトウェアにプログラムでそれを伝える方法はないため、警告が表示されるのはそのためだと思います。

1 つのポイント: createViewHolder を子クラスに委譲しているため、自分でコードを開きます。したがって、私はそれをデメテルの法則の違反と呼んでいます. 私の意見では、あなたのコードが悪いという意味ではありません。

于 2014-03-25T09:52:56.073 に答える