gpt4 book ai didi

java - 仅仅为了分层结构而拥有抽象类是否有意义?

转载 作者:行者123 更新时间:2023-12-02 01:22:57 27 4
gpt4 key购买 nike

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

2年前关闭。




Improve this question




假设一个 Java 类(例如一个辅助类),它有很多可以被分成不同层的方法。我所说的层是指为每个类设计更清晰的职责并降低复杂性。在这种情况下,通过使用抽象类来实现目标,在干净的代码和软件设计的意义上是否有意义?

我在一个项目中遇到过这样的情况,其中有一个辅助类过于复杂,而且行数太多。这个类在某种程度上扮演着至关重要的角色,充当一种类型助手,帮助其他对象获取和操作类型信息。每当一个新的/现有的类型需要额外的类型信息时,这个类就会派上用场,因此在实现方法时变得更重和更复杂。尽管我肯定可以将这些方法分类并分成许多类。我发现这些方法之间存在结构相关性。请看下面的代码示例:

假设一个 Type 可以有一些 TypeProperty:s。还假设在代码中有一个 Type 类和一个 TypeProperty 类,它们都具有基本的 getter 和 setter,同时还有一个 Helper 类 Helper。

public class Helper{

static final T CONSTANT_A = new A(...);
static final T CONSTANT_B = new B(...);

final Type theType;

//constructor etc.

Type getType(){
return theType;
}

Type getTypeByKey(Key typeKey){
//...
}

Collection<TypeProperty> getPropertiesByType(Type t){
//...
}

Collection<TypeProperty> getProperties(){
return theType.getProperties();
}

TypeProperty findSpecificPropertyInTypeByKey(Key propertyKey){
Set<TypeProperty> properties= theType.getProperties();
//loop through the properties and get the property,
//else return null or cast exception if not found
}

boolean isTypeChangeable(){
return findSpecificPropertyInTypeByKey().isChangeable();
}

//many more methods
}

我希望重构 Helper 类,以便代码更易于维护和扩展,并且不那么复杂。我认为可以将方法分成不同的类,但是,这可能会导致类太多,并且职责并不直接,因为它们不在帮助类中。与此同时,我想到了使用抽象类的想法。那会有意义吗?说重构后会有
  • 具有旋转类型本身的方法的 TopLevelHelper,例如isTypeChangeable & getType(),以及所有的常量;
  • 扩展 TopLevelHelper 的 SecondLevelHelper,它将逻辑作为中间件,例如getProperties 和 getPropertiesByType;
  • 扩展 SecondLevelHelper 的 LastLevelHelper,它执行具体和详细的​​工作,例如查找SpecificPropertyInTypeByKey。

  • 尽管这些类都没有抽象方法,但没有具体的实现,因为高级助手中的任何方法都不会被覆盖。这样的设计似乎不适合抽象类的使用,但我觉得它把职责分成了三层。应该这样做还是应该在这种情况下使用其他技术?

    最佳答案

    当然没有明确的答案,但我认为你应该坚持你所拥有的。抽象类对于实现 template methods 最有意义和类似的模式。在您的情况下,在不同的层次结构级别上拆分一个类确实感觉很奇怪,因为这些方法似乎属于不同的组,而不是不同的级别。如果 java 允许多重继承、特征或类似的东西,你可以制作 mixin 类。

    但是,具有多种方法的类很好。尽管 OOP 设计指南经常说您应该将您的类限制为例如 5 个方法,但您的类似乎更像是一种智能数据结构而不是类,并且您的方法主要是访问器和属性。因此,由于它们简单且概念上相似,因此拥有许多它们并没有真正的问题。 Java 本身一直都在这样做(例如,请参阅字符串和集合类引用)。

    关于java - 仅仅为了分层结构而拥有抽象类是否有意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57373238/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com