1

我需要稍微改变 FunkSVD 算法。基本上,我只需要替换 FunkSVDUpdater,但事实证明 FunkSVDUpdater 和 FunkSVDUpdateRule 都是最终类,这意味着我无法扩展它们。我的解决方案是复制 FunkSVD 类并进行必要的更改。

  • 有没有一个原因,为什么 FunkSVDUpdater 和 FunkSVDUpdateRule 是最终的?
  • 有没有更好的方法来改变 Lenskit 中的 FunkSVD 算法?
4

1 回答 1

0

LensKit 首席开发人员在这里。

它们是最终的,因为我们通常采用“默认情况下最终”的方法(与 Effective Java 一致),反过来,因为在面对未来的更新时很难设计要扩展的类而不会严重破坏,尤其是在维护时任何类型的 API 保证。

通常,我们所做的就是拥有一个最终类实现的接口(或有时是一个抽象类),然后可以重新实现该接口。FunkSVD 更新程序和更新规则类没有这样做;这主要是一个疏忽或尚未解决的问题。

因此,目前最好的选择是复制代码。我们当然愿意开放这些扩展点;我建议在 GitHub 上打开一个问题,在那里我们可以更详细地讨论这样做的后果,并跟踪和完成工作。

于 2016-01-12T17:06:06.387 回答