以下是我的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“认为”这两行违反了得墨忒耳法则:
holder.setPlayerNameTextView(playerName);
holder.setView(result);
我不明白。这是the definition:
函数的Demeter定律需要一个对象的方法m O只能调用以下类型对象的方法:
- O本身
- m的参数
- 在m
中创建/实例化的任何对象- O的直接组件对象
- 一个全局变量,可由O访问,范围为m
所以?在holder
中创建/实例化m
变量 。
很公平,它的实例化被委托给createViewHolder
方法......它应该有所作为吗? (附带问题)。
它不适用于IDE - 如果我直接实例化holder
,则仍会显示警告。
问题:
Android Studio错了吗?或者我对Demeter法缺乏了解吗?如果后者是真的,我应该如何重构这个位以满足LoD?
答案 0 :(得分:1)
这两个对象实际上都没有在&#34; m&#34;中实例化。 holder和result都是函数的返回值,所以在技术上是一个在别处创建的对象。
当然你知道&#34; createViewHolder&#34;只是为别人的使用创造了一个对象,我认为对于&#34; inflater.inflate&#34 ;;所以你可以忽略那些误报。 但是,没有办法以编程方式告诉分析师软件,所以我假设这就是你收到警告的原因。
有一点:既然您已将createViewHolder委托给子类,那么您可以自己打开代码;因此,我仍称它违反了得墨忒耳法则。在我看来,并不意味着你的代码很糟糕。