Java 基于布尔流的重构

Java 基于布尔流的重构,java,design-patterns,boolean,refactoring,api-design,Java,Design Patterns,Boolean,Refactoring,Api Design,我们的应用程序是围绕一个上下文类构建的,该类包含许多基本字段和布尔值 几乎在所有流中都传递上下文,并根据布尔标志做出决策。现在为了实现新功能,在上下文中添加了一个新的布尔值,必须在10个不同的位置对其进行检查。一般流程的结构类似于此示例 public void handle(context) { if (context.isBig()) drawBigThing(context) else drawSmallThing(context) //more code

我们的应用程序是围绕一个上下文类构建的,该类包含许多基本字段和布尔值 几乎在所有流中都传递上下文,并根据布尔标志做出决策。现在为了实现新功能,在上下文中添加了一个新的布尔值,必须在10个不同的位置对其进行检查。一般流程的结构类似于此示例

public void handle(context) {
  if (context.isBig())
     drawBigThing(context)
  else 
     drawSmallThing(context)
  //more code
  ...... handleColor(context) //somewhere deeper in the flow/stack

}

private void handleColor(context) {
  if (context.isBig())
     takeMoreColor(context.getColor())
  else
     takeLessColor(context.getColor())
}
正如您在代码的不同部分看到的,我们回顾同一个标志,但根据它做出不同的决定。现在,如果我添加context.isVeryBig(),您可以看到这可能会爆炸

对于从具有不同职责的方法/类查询的布尔标志,但仍然对同一标志感兴趣,重构布尔标志(在Java8工具上)有什么想法


一个想法是使上下文更智能,不是持有布尔标志,而是每个责任的状态/策略,但这会泄露上下文中的责任(也许它们可以解耦?),我仍然会有IFs,但至少它们会被分组在一个地方,在流程开始之前,这是一个概念性的问题。所以,也许我没有完全回答这个问题

一个想法是使上下文更智能,而不是保留布尔标志 但每个责任都有一个国家/战略,但这是一个漏洞 上下文中的责任(可能以某种方式) 解耦?)

使用策略似乎是个好主意。尽管如此,我还是不想让上下文过于巧妙。上下文应包含数据或名称具有误导性及其责任。

您想知道上下文和处理是否可以解耦。你可以,我认为应该

我仍然会有国际单项体育联合会,但至少他们将被分组在一个 在流程开始之前放置和

我同意。为什么不在工厂类中,以便通过契约进行通信,并在返回的实现中更加灵活

我建议你用两种方法来解决这个问题

1)一种灵活的处理方式,由具体的处理人员全面实施处理

界面:

public interface FlowHandler{

     void handle(Context context);
}
以及根据需要的实现(根据使流的行为发生变化的Boolean):

这种设计是灵活的,因为它允许每个实现按照自己的意愿处理问题。

尽管如此,如果所有处理程序的操作都应该具有相同的性质并以相同的顺序执行,那么可以使用另一种朝这个方向推进的设计

2)一个预定义的过程,该过程约束处理步骤并对步骤的处理进行分解

您可以通过在一个具体类(
FlowHandler
)中声明一个具体方法
(句柄(上下文上下文)
),该方法为任何执行的流链接所需的操作。被调用的操作依赖于由策略实现的工厂方法。
具体类(
FlowHandler
)回答什么问题(流程的步骤及其顺序),第二个回答如何(流程步骤的实现)


这是一个概念性的问题。所以,也许我没有完全回答它

一个想法是使上下文更智能,而不是保留布尔标志 但每个责任都有一个国家/战略,但这是一个漏洞 上下文中的责任(可能以某种方式) 解耦?)

使用策略似乎是个好主意。不过,我不会让上下文太聪明。上下文应该包含数据,或者名称有误导性,其责任也有误导性。

你想知道上下文和处理是否可以解耦。你可以,我认为应该

我仍然会有国际单项体育联合会,但至少他们将被分组在一个 在流程开始之前放置和

我同意。为什么不在工厂类中,以便通过合同进行沟通,并在返回的实现中更加灵活呢

我建议你用两种方法来解决这个问题

1)一种灵活的处理方式,由具体的处理人员全面实施处理

界面:

public interface FlowHandler{

     void handle(Context context);
}
以及根据需要的实现(根据使流的行为发生变化的Boolean):

这种设计是灵活的,因为它允许每个实现按照自己的意愿处理问题。

尽管如此,如果所有处理程序的操作都应该具有相同的性质并以相同的顺序执行,那么可以使用另一种朝这个方向推进的设计

2)一个预定义的过程,该过程约束处理步骤并对步骤的处理进行分解

您可以通过在一个具体类(
FlowHandler
)中声明一个具体方法
(句柄(上下文上下文)
),该方法为任何执行的流链接所需的操作。被调用的操作依赖于由策略实现的工厂方法。
具体类(
FlowHandler
)回答什么问题(流程的步骤及其顺序),第二个回答如何(流程步骤的实现)

A) 是的,你最好摆脱这种做法。基本上,这里有很多全局状态,直接访问字段并不能使它变得更好B)状态机和状态机,多态性是OO中的“通用”答案。请看哪一种适用于您的案例IMO。a)是的,您最好摆脱这种方法。基本上,这里有很多全局状态,直接访问字段并不能使它变得更好B)状态机和状态机,多态性是OO中的“通用”答案。
public interface HandlerOperations{
 drawThing(Context context);
 takeColor(Context context);
}

public class FlowHandler{

     public FlowHandler(HandlerOperations handlerOperations){
            this.handlerOperations = handlerOperations;
     }

     public void handle(Context context){
           handlerOperations.drawThing(context);
           handlerOperations.takeColor(context);
    }
}