有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

针对包含其他对象的对象的java OOP最佳实践

我一直在努力寻找实现这一点的最佳方法。假设我有两个对象,一个是用户对象,另一个是note对象。Note对象将保存患者的便笺,并存储谁创建了便笺以及上次由谁更新了便笺。更好的选择是什么:

选项A两个对象,一个仅包含注释特定信息,另一个是此对象的扩展,包含患者/作者/更新者的用户对象:

public class Note {
    private int noteId;
    private int patientId;
    private int authorId;
    private int updatedById;
    private String noteText;
    private Date noteDate;
}

public class NoteExt extends Note {
    private User patient;
    private User author;
    private User updater;
}

选项B-一个Note对象,带有用于患者、作者、更新者的用户类

public class Note {
    private int noteId;
    private User patient;
    private User author;
    private User updater;
    private String noteText;
    private Date noteDate;
}

选项A会为应用程序增加大量文件,用于额外的objects/db调用,但在获取项目列表时会加快速度。(在这种情况下使用extend是否正确?)

选项B意味着不必担心在只有一个数据库功能的情况下记住要使用哪个对象,而是会重复数据,例如,如果我得到一个用户创建的所有注释的列表

有更好的选择C吗


共 (2) 个答案

  1. # 1 楼答案

    C计划可能是这样的。将所有对象创建为具有一个组合的独立实体。使便笺更可用于其他应用程序

    public class Note {
        private int noteId;
        private String noteText;
        private Date noteDate;
    }
    
    public class PatientNote {
        private Note note;
        private User patient;
        private User author;
        private User updater;
    }
    
  2. # 2 楼答案

    看起来你把对象设计和数据库设计搞混了。这是可以理解的,因为您正在创建需要在数据库中表示的对象。然而,我发现在很多情况下,很容易“忘记”数据库,只设计对象,然后回来使用模型映射器设计模式为对象创建映射器,根据需要添加唯一id

    因此,您使用选项B,但对于存储/加载到数据库或从数据库加载,您使用单独的映射器类:即UserMapper、NoteMapper等。。。然后,秘密在于映射程序使用IdentityMap,这样当按ID加载时,就可以使用对象的本地缓存副本,而不是反复访问数据库,为用户ID(例如)获取相同的用户对象

    public class Note {
        private int noteId;
        private User patient;
        private User author;
        private User updater;
        private String noteText;
        private Date noteDate;
    }
    
    public class UserMapper {
        public User getUserById(int userId){
            User user = UserIdentityMap.getUser(userId);
            if(user == null) {
                user = fetchUserFromDb(userId);
                UserIdentifyMap.cache(userId, user);
            }
            return user;
        }
    }