- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是用 ES2015 编写的,但这个问题也可以应用于其他语言。
在我的情况下,我有一个像这样的 Chat
类:
// Chat.js
import { socket, config } from "./Util.js";
import User from "./User.js";
class Chat {
constructor(socket, config) {
// …
}
roomExists(room) {
// …
}
createRoom(room) {
// …
}
}
// Make sure to export the same instance to every other module,
// as we only need one chat (resembling a singleton pattern)
export default new Chat(socket, config);
现在,此类在 createRoom()
中的某个位置使用了 User
。问题是 User
类需要使用我们导出的 Chat
实例:
// User.js
import chat from "./Chat.js";
export default class User {
join(room) {
if (chat.roomExists(room)) {
// …
}
}
}
但现在我们在 Chat.js
和 User.js
之间存在依赖循环。该脚本不会运行。解决此问题的一种方法是永远不要直接导入 Chat.js
,而是执行以下操作:
// Chat.js
import { socket, config } from "./Util.js";
import User from "./User.js";
class Chat {
constructor(socket, config) {
// Pass `this` as a reference so that we can use
// this chat instance from within each user
this.userReference = new User(this);
}
roomExists(room) {
}
createRoom(room) {
}
}
// No need to export a singleton anymore, as we pass the
// reference to the chat in the User constructor
但是现在,所有其他类都依赖于 Chat
,并且一旦我们实例化它,就必须为其提供对聊天实例的引用。这也不干净,是吗? 聊天
现在是一个单点故障,以后很难进行交流。
是否有更简洁的方法来管理此问题?
最佳答案
已更新
显然,用户
不应该有聊天
。所以,聊天应该是这样的
class Chat{
//other declarations
addUser(user,room) {}
createSpecificRoom(user,name){}
moveUserToRoom(user,newRoom) {}
}
如果您想从用户对象执行操作,我们可以使用双重调度。
class User{
joinChat(chat,room){
chat.addUser(this,room);
}
}
var chat=new Chat();
var user= new User();
user.joinChat(chat,room);
但是,IMO 最好的办法是仅使用 Chat
来添加/删除用户。从语义上讲,它的工作是跟踪房间和用户。关于单例,如果您使用支持 DI 的框架,几乎任何服务都是单例,但您不应该关心这一点。只需在需要的地方注入(inject) Chat
即可。
关于javascript - 类层次结构 : Is there a cleaner pattern for this?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31640323/
我正在尝试将多个水平链接的 Button 和 TextView 垂直链接为 View 集,但仍保持平面 View 层次结构。这是我的初始布局和代码:
到目前为止,我已经在Google BigQuery上训练了几种模型,目前我需要查看模型的外观(即架构,损失函数等)。 有没有办法获取这些信息? 最佳答案 仔细阅读文档后,我可以说该功能尚不存在。我什至
本文实例讲述了PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)。分享给大家供大家参考,具体如下: 前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个
我是一名优秀的程序员,十分优秀!