Ленскит: ФункСВД
Мне нужно немного изменить алгоритм FunkSVD. По сути, мне просто нужно заменить FunkSVDUpdater, но оказалось, что FunkSVDUpdater и FunkSVDUpdateRule являются конечными классами, а это значит, что я не могу их расширять. Мое решение - скопировать классы FunkSVD и внести необходимые изменения.
- Есть ли причина, по которой FunkSVDUpdater и FunkSVDUpdateRule являются окончательными?
- Есть ли лучший способ изменить алгоритм FunkSVD в Lenskit?
1 ответ
LensKit ведущий разработчик здесь.
Они являются окончательными, потому что мы, как правило, применяем подход "окончательный по умолчанию" (в соответствии с Effective Java), в свою очередь потому, что очень трудно спроектировать классы, которые можно расширять, не нарушая при этом будущих обновлений, особенно при сохранении любой вид гарантий API.
Обычно мы имеем интерфейс (или иногда абстрактный класс), который реализует последний класс, и затем интерфейс может быть переопределён. Это не было сделано для обновлений FunkSVD и классов правил обновления; это в основном недосмотр или еще не достигнутая проблема.
Итак, на данный момент лучший вариант - скопировать код. Мы, безусловно, открыты для открытия этих точек расширения; Я бы порекомендовал открыть вопрос на GitHub, где мы можем более подробно обсудить последствия этого, а также отследить и завершить работу.