如果需要更改库功能我该怎么办

What do i do if need to change a libraries functionality

我在 Java 库 (open-m3u) 中有一个 class,我需要稍作更改。 该功能很容易在不使用库的情况下自行实现。该库是开源的,所以我可以访问它的所有代码。 class 的制作方式无法继承甚至更改那一小部分。我的问题是我应该复制 class 和它依赖的所有 classes 并将它们放在我自己的代码库中并更改功能还是应该自己实现功能。或者还有其他选择吗?

一种解决方案是制作一个 class 来扩展您想要更改的部分并覆盖您想要更改的部分

Decorator pattern 允许您向现有对象添加新功能。

如果您使用的 java 库有任何 class 这样的:

public class LibraryClass implement ILibraryInterface {

    public void someMethod() {
        ...
    }
}

然后你可以创建Decorator class:

public class LibraryClassDecorator implement ILibraryInterface {

    private LibraryClass libObj;

    public LibraryClassDecorator(LibraryClass libObj) {
        this.libObj = libObj;
    }

    public void someMethod() {
        libObj.someMethod();
        // here you can do whatever you want. 
        // Add some additional logic
        // transform result value if there is some
    }

}

注意:您必须实现相同的接口才能遵循Liskov substitution principle

The functionality is easy to implement on my own without using the library.

恕我直言,那就这样吧。您的其他选择是:

  • 围绕库构建功能:您说这在您的情况下是不可能的。
  • 在您自己的源代码控制系统中创建库的一个分支。这意味着您必须使该存储库与库维护者保持同步,这意味着永久的负担。而且你必须检查图书馆的许可证关于分叉的内容。
  • 将相关部分复制到您的代码库中并在那里进行修改。那么您将不会从未来的增强功能或错误修复中获益,但仍然必须维护由其他人创建和构建的代码,这些代码并不完全符合您的要求。并且你必须检查图书馆的许可证关于将部分复制到外国代码库的内容。

它们都有缺点。

总的来说:在 25 年的专业软件开发中,我见过外部库的成功使用和完全失败。有时,我们在评估现有库(然后发现没有任何匹配项)上投入的时间超过了我们自己实施特定于项目的解决方案所需的时间。

每一个你都可以不用的库,使配置管理和部署更容易。