Skip to content

模块注册的代码是不是应该出现在模块的代码里而不是 main.rs 中 #3

@limingth

Description

@limingth

目前模块注册的代码 cat::init(&mut app); 出现在了 main.rs 中,这样的结构会导致以后所有实现具体命令的模块的开发者,
都需要修改 main.rs 框架层的代码才行,这样的实现可能不是一个好的设计。

好的设计原则应该是框架层定义好接口/模块规范后,尽量不再被改动,模块来适应框架,只改模块里面的代码。

例如 Linux 设备驱动的 framework,可以支持以后各种各样的新增硬件设备加入到驱动框架里,驱动只做驱动层,不会改动框架代码。

fn main() {
  // 新建 app
  let mut app = App::new();

  /* 注册模块 start */
  cat::init(&mut app);
  /* 注册模块 end */

  loop {
    let mut s = String::new();

    // 等待用户输入
    io::stdin().read_line(&mut s).unwrap();
    s = s.trim_end().to_string();

    if s.is_empty() {
      panic!("空字符串");
    }

    let (cmd, args) = {
      match s.split_once(' ') {
        Some(res) => (res.0, Some(res.1)),
        None => (&*s, None),
      }
    };

    // 获取命令
    let command = app.get_command(cmd);

    // 执行命令
    command.execute(args);
  }
}

image

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions