Java 最佳实践-akka actor中的助手方法

Java 最佳实践-akka actor中的助手方法,java,akka,helpers,Java,Akka,Helpers,我最近重构了我的actor,最终得到了许多helper方法,它们都是actor的一部分。这样做对吗?所有助手方法都应该是自己的参与者吗?我怎样分开 public class MyActor extends UntypedActor { public MyActor () { } @Override public void onReceive(Object msg) throws Exception {

我最近重构了我的actor,最终得到了许多helper方法,它们都是actor的一部分。这样做对吗?所有助手方法都应该是自己的参与者吗?我怎样分开

  public class MyActor extends UntypedActor {



        public MyActor () {

        }

        @Override
        public void onReceive(Object msg) throws Exception {


        if ( msg instanceof doSomethingComplex) {
                doSomethingComplex message = (doSomethingComplex) msg;
               doSimple(message.prop);
}

private void  doSimple(String prop){
doSimpler(prop);
....
}

private void  doSimpler(String prop){
...
....
}
}

助手方法应该在哪里?这些人也应该是演员吗

助手方法是帮助另一个方法执行其任务的方法 任务通常在方法必须执行 由几个较小的任务组成的复杂任务。这个 较小的任务通常由助手方法执行

助手方法通常只用于将较大的任务划分为较小的、更有组织的方法。助手方法应该位于使用它们的类的层次结构中

所有助手方法都应该是自己的参与者吗?如何进行分离?

在回答这些问题时,思考演员是什么很有帮助。德里克·怀亚特(Derek Wyatt)在其著作《阿克卡并发》(Akka Concurrency)中,将演员与人进行了类比(以下是他书中的一段摘录):

你的日常世界充满了并发性。你把它强加给自己 还有你周围的人,他们把这些强加给你。现实世界 关键部分和锁以及同步方法的等价物 数据都是你自己和世界上的人自然处理的。 人们通过一次只做一件事来实现这一点。我们喜欢 假装我们可以同时完成多项任务,但事实并非如此。有什么有意义的吗 我们这样做要求我们只做那一件事。我们可以暂停这项任务 然后再继续,把它换成别的东西,然后 回到它,但实际上一次做不止一件事并不在我们的驾驶室里

那么如果我们想一次做不止一件事呢?答案是 很明显:我们只是使用了不止一个人。房间里没有多少东西 我们从中受益的世界并不是由一群才华横溢的人创造的 人们

这就是为什么参与者使我们的应用程序开发更加直观和高效 我们的应用程序设计更容易推理:它们是按照我们的 日常生活

在同一章的后面,他写道:

演员一次只做一件事;这就是并发的模型。如果你 如果你想让不止一件事情同时发生,那么你需要 创建多个参与者来完成该工作。这很有道理, 正当我们一直在说,演员编程吸引了很多人 你的日常生活经历。如果你想让工作做得更快,就多放点钱 在职人员

在设计参与者系统时,将系统的主要部分分配给具有不同职责的参与者是一个很好的原则。例如,在ETL管道中,可能有:

  • 订阅队列以获取新数据的参与者
  • 解析原始数据的参与者
  • 筛选用户感兴趣的信息片段的已解析数据的参与者
  • 将结果保存到数据库的参与者
  • 将结果发布到用户可以订阅的队列的参与者
  • 假设解析器参与者使用一个helper方法。该方法是否应该封装在自己的actor中取决于该方法的功能。将任务分解为子任务是一个好主意,但在某个时刻,您必须确定任务太“小”——太小,无法成为自己的参与者

    回到人物类比,让我们把管道中的每个阶段想象成一个人。让我们假设解析器人员需要一支削尖的铅笔来完成他的工作,并且当前解析器自己获得铅笔。雇佣一个地位低下的实习生(从怀亚特的书中借用另一幅插图),他唯一的工作就是削铅笔,并在需要时交给解析器人员,这有意义吗?如果大量数据流入,在不雇佣任何实习生的情况下雇佣更多的解析器人员就足够了吗?如果让30名铅笔削实习生为10名语法分析器工作,可能效率不高。换句话说,我们可能不需要根据解析器的数量独立地调整实习生的数量。如果我们确实需要这样做,这将表明实习生的工作意义重大,足以证明聘用实习生是合理的

    总结这一主观思考:

    • 将系统分解为具有明确职责的部分。将每个角色分配给演员
    • 如有必要,将每个部分分解为子任务。将每个子任务分配给参与者。帮助确定是否需要进一步分解的一个关键方法是确定独立扩展子任务是否有效
    • 如果您愿意,可以将太小而不能作为自己的参与者的功能放在助手方法中

    助手方法应该在哪里?

    有几个想法:

    • 如果一个助手方法只与某个参与者相关,那么在您执行操作时在参与者内部声明它
    • 如果一个助手方法可以在不同类型的参与者中使用,那么在一个声明中声明它。或者,将其声明为actor中的

    这是同一个类的一部分吗?是的,我会这样做,你会考虑一个包装类吗?这不是我想要的,但我相信这是可能的。我喜欢将我的helper方法与使用它们的类一起保存,假设它是唯一使用它们的类及其子类。非常感谢您的解释。感谢链接资源,我很难找到AKKA框架的“最佳实践”文档,尤其是与Java一起使用时