Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “如何重构”;“严格打字”;密码?_Java_String_Oop_Types_Refactoring - Fatal编程技术网

Java “如何重构”;“严格打字”;密码?

Java “如何重构”;“严格打字”;密码?,java,string,oop,types,refactoring,Java,String,Oop,Types,Refactoring,我目前正在开发一个代码库,其中有一些变量类,比如数据库路径,它们只是表示为字符串。这些(非)类型上的大多数操作都是在实用程序类中定义的 我创建了一个新的类来表示一个数据库,使用传统的OOP风格将操作定义为实例方法。然而,遍历大型代码库并对其进行重构以使用新类型是相当困难的。有人对如何快速有效地执行此操作有什么建议吗?对我来说,数据库路径听起来应该是字符串。还有什么是有意义的?它们应该被外部化,要么在配置文件中,要么在数据库中。这是你最小的问题 持久性已经结束了很多次(例如Hibernate、Sp

我目前正在开发一个代码库,其中有一些变量类,比如数据库路径,它们只是表示为字符串。这些(非)类型上的大多数操作都是在实用程序类中定义的


我创建了一个新的类来表示一个数据库,使用传统的OOP风格将操作定义为实例方法。然而,遍历大型代码库并对其进行重构以使用新类型是相当困难的。有人对如何快速有效地执行此操作有什么建议吗?

对我来说,数据库路径听起来应该是字符串。还有什么是有意义的?它们应该被外部化,要么在配置文件中,要么在数据库中。这是你最小的问题

持久性已经结束了很多次(例如Hibernate、SpringJDBC、iBatis等等),我想知道您如何改进它们。如果你必须去重构的麻烦-你必须-我建议使用任何东西,而不是你所做的

如果你必须写一些东西,谷歌搜索“通用DAO”。你会得到这样的东西:


如果您的工作没有按照这样的方式进行模式化,请将其丢弃并重新思考。

迁移实用程序类以使用新类。那么实用程序类方法应该只包含两条语句。一个用于创建类,另一个用于调用类。之后,可以内联实用程序类方法,从而消除对它的需要


当您完成这项工作后,您需要寻找一种方法来避免一次又一次地实例化新类。这应该通过将局部变量重构为在构造时初始化的实例字段来实现。

我通常会尝试在应用程序/进程边界的极限处隔离字符串,例如从数据库检索字符串或通过web操作接收字符串时

在这种情况下,应用程序/进程边界通常是将字符串映射/转换/反序列化为更合适的对象模型的理想位置,无论您使用何种语言都支持这种映射/转换/反序列化

类似地,对象模型可以在退出应用程序/进程边界时映射/转换/序列化回字符串形式

值得注意的是,这种严格的键入可能有些微妙。我经常看到xml侵入应用程序层和域层。NET空间中的一个类似示例是,无法在收到ADO.NET数据表(带有字符串列名和非类型化字段值)后立即将其映射到类/对象中。我毫不怀疑Java世界中有许多类似的等价物。严格类型化不仅仅局限于日期值,正如笑话所说。

我在C#中使用的一种技术(刚刚移植到Java——如果我犯了错误,我很抱歉,我是Java新手)是创建严格类型化类,例如基类

public abstract class StringlyTyped {
    private String value;

    public StringlyTyped (String value){

        if (value == null){
            throw new IllegalArgumentException("value must not be null");
        }
        this.value = value;
    }

    public String getValue() { return value; }

    @Override
    public boolean equals(Object other){
        if (other == this) {
            return true;
        }

        if (other == null || !this.getClass().equals(other.getClass())){
            return false;
        }

        StringlyTyped o = (StringlyTyped)other;
        return o.getValue().equals(this.getValue());
    }

    @Override
    public int hashCode(){ return this.getValue().hashCode(); }

    @Override
    public String toString() { return this.getValue();  }
}
然后派生类

public class ProviderName extends  StringlyTyped {

    public ProviderName(String value) {
        super(value);
    }
}
用法

public void Foo(ProviderName provider) { 
}
当您有具有许多字符串参数的方法时,这是有意义的,例如,您可以避免

public void Foo(String username, String password, String db, String table, String constraint) 
而是使用如下强类型的代码:

public void Foo(UserName username, Password password, DatabasePath db, TableName table...) 

等等

无论是将数据库路径存储在变量中,还是创建一个类来表示在方法中定义了操作的数据库,听起来都很不错。使用hibernate、spring等的直接方法可能不是最好的方法,因此基于自己的代码进行中间步骤可能是有充分理由的。我自己也见过几次。教授hibernate和spring也是一项艰巨的任务。我同意hibernate,我不会向任何人推荐它。但我完全不同意SpringJDBC。它非常简单,设计精良。您可以使用部分弹簧,而无需掌握所有弹簧。