【问题标题】:What do i do if need to change a libraries functionality如果需要更改库功能我该怎么办
【发布时间】:2019-01-23 17:29:54
【问题描述】:

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

【问题讨论】:

  • 为库编写适配器或外观,也许...
  • 您可以使用装饰器模式、装饰库类或其他任何东西并添加您的附加功能

标签: java oop open-source


【解决方案1】:

无需使用 图书馆。

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

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

它们都有自己的缺点。

总而言之:在 25 年的专业软件开发中,我看到了外部库的成功使用和彻底的失败。有时,我们在评估现有库(然后发现没有任何匹配项)上投入的时间比我们自己实施特定于项目的解决方案所需的时间更多。

您可以不用的每个库都让配置管理和部署变得更加容易。

【讨论】:

    【解决方案2】:

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

    如果你使用的 java 库有这样的类:

    public class LibraryClass implement ILibraryInterface {
    
        public void someMethod() {
            ...
        }
    }
    

    然后就可以创建Decorator类:

    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

    【讨论】:

    • 我需要的类不使用接口。我需要更改类的构造函数,所以这不起作用。
    【解决方案3】:

    一种解决方案是创建一个扩展您想要更改的类并覆盖您想要更改的部分的类

    【讨论】:

    • 问题说从类继承是不可能的。
    猜你喜欢
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2021-09-13
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多