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

我在构buildnode.js socket.io项目时遇到了问题。 用户可以join房间。 一个Gameroom有一个队列,他们可以排队等待一场比赛。 如果有足够的人排队,他们会被扔进游戏厅。 客房实现聊天function,应该在Gamerooms和Lobbies中使用。

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

我可以做什么改进? 为什么这是一个糟糕的或好的deviseselect? 还有什么替代方法? 有什么要考虑的? 我应该把“房间”,“游戏室”和“大厅”分成更独特的模型和控制器。

我知道这是一个相当“讨论”的问题,但我对每一个input都是开放的。 谢谢。

UML图

服务器实例化房间。

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); 

房间是父类,但也可以实例化。 它应该是大家在login时join的根通道。

 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;