gpt4 book ai didi

Java - 这是一个成语还是模式,没有状态的行为类

转载 作者:行者123 更新时间:2023-11-29 09:57:44 25 4
gpt4 key购买 nike

我正在尝试将更多的函数式编程习语合并到我的 Java 开发中。我最喜欢并避免副作用的一种模式是构建具有行为但不一定具有任何状态的类。行为被锁定在方法中,但它们只对传入的参数起作用。

下面的代码是我试图避免的代码:

public class BadObject {

private Map<String, String> data = new HashMap<String, String>();

public BadObject() {
data.put("data", "data");
}

/**
* Act on the data class. But this is bad because we can't
* rely on the integrity of the object's state.
*/
public void execute() {
data.get("data").toString();
}

}

下面的代码没什么特别的,但我对参数进行操作,状态包含在该类中。我们仍然可能会遇到此类问题,但这是方法和数据状态的问题,我们可以解决例程中的问题,而不是不信任整个对象。

这是某种成语吗?这与您使用的任何模式相似吗?

public class SemiStatefulOOP {

/**
* Private class implies that I can access the members of the <code>Data</code> class
* within the <code>SemiStatefulOOP</code> class and I can also access
* the getData method from some other class.
*
* @see Test1
*
*/
class Data {
private int counter = 0;
public int getData() {
return counter;
}
public String toString() { return Integer.toString(counter); }
}

/**
* Act on the data class.
*/
public void execute(final Data data) {
data.counter++;
}

/**
* Act on the data class.
*/
public void updateStateWithCallToService(final Data data) {
data.counter++;
}

/**
* Similar to CLOS (Common Lisp Object System) make instance.
*/
public Data makeInstance() {
return new Data();
}

} // End of Class //

上面代码的问题:

  1. 我想将 Data 类声明为私有(private),但我无法真正在类外引用它:

  2. 我无法覆盖 SemiStateful 类并访问私有(private)成员。

用法:

final SemiStatefulOOP someObject = new SemiStatefulOOP();
final SemiStatefulOOP.Data data = someObject.makeInstance();

someObject.execute(data);
someObject.updateStateWithCallToService(data);

Edit-1:这是一个很好的评论。我的回答是:“一旦您使数据类在主类之外可访问,您就暴露了实现细节,”-- 评论。

我的回应:Data 类是一个简单的 POJO,将像其他带有 setter 和 getter 的 pojo 一样工作。我在上面的类(class)中所做的是尝试仅操作行为类 SemiStatefulOOP 中的数据类。我确实打算拥有无状态类,但我希望与状态类和行为类有明确的区分。

相关:

无状态设计模式 http://guides.brucejmack.biz/Pattern%20Documents/Stateless%20Design%20Pattern.htm

最佳答案

有一种有趣的 OO 架构风格旨在分离系统的数据和行为,以便它们可以独立发展:the DCI Architecture .

在实践中,您为您的领域概念创建数据对象(可能只有与数据本身相关的简单行为);与数据对象一起工作并实现系统用例的行为对象。这些行为对象被视为领域对象可以扮演的角色,并以trait (pdf)的OO概念具体化。 .

Scala 有特性,但 Java 没有。您可以尝试使用 Qi4J framework在 Java 中。

关于Java - 这是一个成语还是模式,没有状态的行为类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4692845/

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