Oop 对象内部的数据结构

Oop 对象内部的数据结构,oop,Oop,我有一个关于面向对象设计的简单问题,但我很难找出最好的解决方案。假设我有一个带有一些方法和大量属性的对象,可能是一个Employee对象。属性,如FirstName、Address等,表示数据结构。然后,Employee对象上可能有一些方法,比如IsDueForPromotion(),这更像是OO性质的 混合使用这种方法对我来说不合适,我想将两者分开,但我不知道如何以一种好的方式进行。我一直在考虑将所有属性数据放在一个结构中,并在employee对象中有一个内部结构对象,private Empl

我有一个关于面向对象设计的简单问题,但我很难找出最好的解决方案。假设我有一个带有一些方法和大量属性的对象,可能是一个Employee对象。属性,如FirstName、Address等,表示数据结构。然后,Employee对象上可能有一些方法,比如IsDueForPromotion(),这更像是OO性质的

混合使用这种方法对我来说不合适,我想将两者分开,但我不知道如何以一种好的方式进行。我一直在考虑将所有属性数据放在一个结构中,并在employee对象中有一个内部结构对象,private EmployeeStruct employeData

我不确定这是否真的是个好主意,但是,也许我应该在同一个类中拥有所有的方法和属性,然后继续。如果我将数据与方法分离,会使事情变得复杂吗

如果有人对此有任何想法,我将不胜感激

J

将数据和相应的方法封装在一起不是一个好主意吗

这里的问题是Employee对象如何可能知道begin due for promotion。我猜这个方法属于另一个类的某个地方,这个类拥有决定它的信息。非常愚蠢的例子
Manager m=new Manager();经理晋升(员工对象)

但访问Employee字段的其他方法属于此类

我提出的关于IsDueForPromotion的问题取决于您的应用程序,以及您的员工是否是一名或仅是一名,或者它是否也可以有更多相关的“智能”方法。

将数据和相应的方法封装在一起不是一个好主意吗

这里的问题是Employee对象如何可能知道begin due for promotion。我猜这个方法属于另一个类的某个地方,这个类拥有决定它的信息。非常愚蠢的例子
Manager m=new Manager();经理晋升(员工对象)

但访问Employee字段的其他方法属于此类

我提出的关于IsDueForPromotion的问题取决于您的应用程序,以及您的员工是否是一个或唯一的员工,或者是否也可以有更多关联的“智能”方法。

对象操作(方法)应该使用这些属性。所以我觉得把他们留在一起比较好

如果它不需要属性,那么它是一种实用方法,应该在某些帮助器类中定义。对象操作(方法)应该使用属性。所以我觉得把他们留在一起比较好


如果它不需要属性,那么它是一种实用方法,应该在其他软件中定义,可能在某个助手类中。

好的,OO是一种将属于同一位置的数据和功能分组的方法。我真的不明白为什么你会在“有很多数据”的时候破例。我能想到的唯一原因是易读性

我个人认为,如果使用单独的结构来保存数据,会使事情变得不必要的复杂。我也很矛盾,这是否是一个好的做法。一方面,类实现其功能或存储其数据的方式应该对外界隐藏。另一方面,如果数据属于一个类,那么将其存储在类似于结构的东西中会感觉不自然


查看您拥有的数据,看看是否可以将其建模为更小的域对象,这可能会很有趣。例如,有一个Address对象,该对象包含一个street、housenumber、state、zip、country等值。这样,您的Employee对象将只保存一个Address对象。然后,Address对象可以重新用于公司对象等。

好的,OO是一种将属于同一位置的数据和功能分组的方法。我真的不明白为什么你会在“有很多数据”的时候破例。我能想到的唯一原因是易读性

我个人认为,如果使用单独的结构来保存数据,会使事情变得不必要的复杂。我也很矛盾,这是否是一个好的做法。一方面,类实现其功能或存储其数据的方式应该对外界隐藏。另一方面,如果数据属于一个类,那么将其存储在类似于结构的东西中会感觉不自然


查看您拥有的数据,看看是否可以将其建模为更小的域对象,这可能会很有趣。例如,有一个Address对象,该对象包含一个street、housenumber、state、zip、country等值。这样,您的Employee对象将只保存一个Address对象。然后,地址对象可以重新用于您的公司对象等。

如果您的数据发展速度慢于行为,您可能希望尝试访问模式:

class Employee {

    String name;
    String surName;
    int age;
    // blah blah
    // ...getters
    // ...setters
    // other boilerplate

    void accept(EmployeeVisitor visitor) {
        visitor.visitName(name);
        visitor.visitAge(age);
        // ...
    }
}

interface EmployeeVisitor {

    void visitName(String name);

    void visitAge(int age);
}
使用此设计,您可以添加新操作,而无需更改员工类。
还请选中“使用规范模式”。

如果您的数据发展速度慢于行为,您可能希望尝试访问模式:

class Employee {

    String name;
    String surName;
    int age;
    // blah blah
    // ...getters
    // ...setters
    // other boilerplate

    void accept(EmployeeVisitor visitor) {
        visitor.visitName(name);
        visitor.visitAge(age);
        // ...
    }
}

interface EmployeeVisitor {

    void visitName(String name);

    void visitAge(int age);
}
使用此设计,您可以添加新操作,而无需更改员工类。
检查并使用规范模式。

面向对象编程的基本原则是将数据(如名字和地址)与相应的功能(如IsDueForPromotion())分组。不管对象持有多少数据,它仍然会持有这些数据。唯一需要从对象中删除数据的时间是与该对象无关的时间,例如,当公司名称应存储在公司对象中时,将其存储在Employee对象中。

面向对象编程的基本原则是将数据分组,如FirstName和Address,以及相应的功能,例如IsDueForPromotion()。不管有多少数据