私の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 を満たすためにこのビットをどのようにリファクタリングする必要がありますか?