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“认为”这两行违反了得墨忒耳法则:

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

我不明白。这是定义

函数的得墨忒耳定律要求对象 O 的方法 m 只能调用以下几种对象的方法:

  • O本身
  • m的参数
  • 在 m 中创建/实例化的任何对象
  • O 的直接组件对象
  • 一个全局变量,可以被 O 访问,在 m 范围内

所以?holder变量在. _m

很公平,它的实例化被委托给createViewHolder方法......它应该有所作为吗?(附带问题)。

它不适用于 IDE - 如果我holder直接实例化,仍然会显示警告。

问题:

Android Studio 错了吗?还是我对得墨忒耳法则的理解不够?如果后者是真的,我应该如何重构这个位来满足 LoD?

4

1 回答 1

1

两个对象实际上都没有在“m”中实例化;持有者和结果都是函数的返回值,因此从技术上讲,它是在其他地方创建的对象。

当然你知道“createViewHolder”只是创建一个对象供其他人使用,我假设“inflater.inflate”也是如此;所以你可能会忽略那些误报。但是没有办法以编程方式告诉分析师软件,所以我认为这就是你收到警告的原因。

一点:由于您将 createViewHolder 委托给子类,因此您自己打开代码;因此,我仍然称其为违反得墨忒耳法则。在我看来,这并不意味着您的代码不好。

于 2014-03-25T09:52:56.073 回答