为什么这段代码被认为违反了得墨忒耳法?

时间:2014-01-12 14:14:06

标签: oop law-of-demeter

以下是我的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?

1 个答案:

答案 0 :(得分:1)

这两个对象实际上都没有在&#34; m&#34;中实例化。 holder和result都是函数的返回值,所以在技术上是一个在别处创建的对象。

当然你知道&#34; createViewHolder&#34;只是为别人的使用创造了一个对象,我认为对于&#34; inflater.inflate&#34 ;;所以你可以忽略那些误报。 但是,没有办法以编程方式告诉分析师软件,所以我假设这就是你收到警告的原因。

有一点:既然您已将createViewHolder委托给子类,那么您可以自己打开代码;因此,我仍称它违反了得墨忒耳法则。在我看来,并不意味着你的代码很糟糕。