代理对象的设计原则或不同的方法

时间:2016-07-13 22:12:01

标签: architecture rust

主要问题:

我编写了一个cli应用程序来与http服务器通信。服务器为我提供了几个端点和这些端点下的一些功能(例如/todo/add/other_endpoint/del)。访问库应该代表这些端点(例如master.todo.add(...)master.other_endpoint.del(...))。

我的第一个尝试是将Master添加为所有端点对象的引用。

struct Todo {
    m: Master
}

Master将对象保存到所有端点

struct Master {
    todo: Todo,
    other_endpoint: OtherEndpoint,
    server: Server,
}

Master拥有一个server对象来与http服务器通信。因此端点对象可以通过self.master.server.communicate()调用此服务器对象。

但是我把我的铁锈车开到了recursive type 'Master' has infinite size。在那之后,我尝试了m: &'a Master所有生命定义。但没有成功。

我现在有两个问题:

  1. 我需要做些什么才能让它发挥作用?
  2. 是否存在另一种设计(可能是更好的设计)?
  3. 编辑:

1 个答案:

答案 0 :(得分:1)

由于编译器告诉你TodoMaster是递归类型,因此具有无限大小,你需要

  

在某个时刻插入间接(例如,BoxRc&

所以你基本上有三个选择:

  1. Master
  2. 中保留Todo作为参考

    这会为您的结构引入生命周期,但应该是可能的:

    struct Server {}
    
    struct Todo<'a> {
        m: &'a Master<'a>
    }
    
    struct Master<'a> {
        todo: Todo<'a>,
        server: Server,
    }
    
    1. box master
    2. 看起来更简单,您不会从一开始就遇到生命周期问题。但请注意,box生命周期为'static。您可能需要更改它。

      struct Server {}
      
      struct Todo{
          m: Box<Master> // or if 'static is not what you need Box<Master + 'a>
      }
      
      struct Master {
          todo: Todo,
          server: Server,
      }
      
      1. 编译器提供给您的最后一个选项是指向Master
      2. 的引用计数指针

        引用计数引入了一个小的运行时开销。但是当你处理那些应该可以忽略不计的http请求时。

        use std::rc::Rc;
        struct Server {}
        
        struct Todo{
            m: Rc<Master>
        }
        
        struct Master {
            todo: Todo,
            server: Server,
        }
        

        这是您的三个基本选项。我建议你和他们一起玩,以了解他们。