Node.js Socket.io OO项目类的结构

时间:2017-03-24 11:38:44

标签: node.js socket.io

我在构建node.js socket.io项目时遇到了问题。 用户可以加入客房。游戏室有一个队列,他们可以排队等待游戏。如果有足够的人排队,他们会被扔进游戏大厅。客房实现聊天功能,应该在Gamerooms和Lobbies中使用。

现在我将io对象传递给实例化,并使用它来侦听特定于其类功能的事件。

我可以做些什么改进?为什么这是一个糟糕或好的设计选择?有什么替代品?有什么需要考虑的? 我应该分开课程" Room"," Gameroom"和"大厅"进入一个更加独特的模型&控制器。

我知道这是一个相当"讨论"问题,但我对每一个输入都是开放的。感谢。

UML Diagram

服务器实例化房间。

const io = socket.listen(
    http.createServer(app).listen(8080)
  );

console.log('Server listening..');

app.get('/', function (req, res) {
    res.sendFile(__dirname + '/test.html');
  });

var main = new Room('', io);
var a = new Gameroom('a', io);
var b = new Gameroom('b', io);

Room是父类,但也可以实例化。它应该是一个根通道,每个人登录时都会加入。

class Room {
  constructor(name, io) {
    this.name = name;
    this.users = [];
    this.namespace = io.of('/' + name);
    this.listenOnRoom();
  }

  listenOnRoom() {
    this.namespace.on('connection', (socket) => {
      ...

      socket.on('disconnect', (msg) => {
        ...
      });

      socket.on('chatMessage', (msg) => {
        ...
      });
    });
  }
}
module.exports = Room;

Gameroom增加了为游戏排队的能力。

class Gameroom extends Room {
  constructor(name, io) {
    super(name, io);
    this.io = io;
    this.queue = [];
    this.lobbies = [];
    this.listenOnGameroom();
  }

  listenOnGameroom() {
    this.namespace.on('connection', (socket) => {

      socket.on('userJoinQueue', () => {
        ...
        this.lobbies.push(new Lobby(this.name ,lobbyId, participants, this.io));
      });

      socket.on('userLeaveQueue', () => {
        ...
      });

      socket.on('userLeaveLobby', () => {
        ...
      });
    });
  }
}

module.exports = Gameroom;

当队列中有足够的玩家时,游戏室会实例化大厅。

class Lobby extends Room {
  constructor(gameroom, name, users, io) {
    super(gameroom + '/' + name, io);
    this.users = users;
    this.readyUsers = [];
    this.listenOnLobby();
  }

  listenOnLobby() {
    this.namespace.on('connection', (socket) => {

      socket.on('userReady', () => {
        ...
      });

      socket.on('userUnready', () => {
        ...
      });
    });
  }
}

module.exports = Lobby;

0 个答案:

没有答案