【发布时间】:2016-05-22 13:47:48
【问题描述】:
我正在学习《Cracking the Coding Interview》这本书,并且对第 8 章:面向对象设计有一些疑问。以8.7题为例:
8.7 解释您将如何设计聊天服务器。特别是,提供有关各种后端组件、类和方法的详细信息。最难解决的问题是什么?
可以在github repo 找到解决方案。
我的一般问题是:如何将不同的方法分配给不同的类以完成功能?进行这些交互是否有一些原则或共同想法?以一个特定的功能——用户 A 添加用户 B——为例:
以下是UserManager的部分代码:
public class UserManager {
...
public void addUser(User fromUser, String toAccountName) {
User toUser = usersByAccountName.get(toAccountName);
AddRequest req = new AddRequest(fromUser, toUser, new Date());
toUser.receivedAddRequest(req);
fromUser.sentAddRequest(req);
}
public void approveAddRequest(AddRequest req) {
req.status = RequestStatus.Accepted;
User from = req.getFromUser();
User to = req.getToUser();
from.addContact(to);
to.addContact(from);
}
public void rejectAddRequest(AddRequest req) {
req.status = RequestStatus.Rejected;
User from = req.getFromUser();
User to = req.getToUser();
from.removeAddRequest(req);
to.removeAddRequest(req);
}
...
}
以下是User的部分代码:
public class User {
...
public boolean addContact(User user) {
if (contacts.containsKey(user.getId())) {
return false;
} else {
contacts.put(user.getId(), user);
return true;
}
}
public void receivedAddRequest(AddRequest req) {
int senderId = req.getFromUser().getId();
if (!receivedAddRequests.containsKey(senderId)) {
receivedAddRequests.put(senderId, req);
}
}
public void sentAddRequest(AddRequest req) {
int receiverId = req.getFromUser().getId();
if (!sentAddRequests.containsKey(receiverId)) {
sentAddRequests.put(receiverId, req);
}
}
public void removeAddRequest(AddRequest req) {
if (req.getToUser() == this) {
receivedAddRequests.remove(req);
} else if (req.getFromUser() == this) {
sentAddRequests.remove(req);
}
}
public void requestAddUser(String accountName) {
UserManager.getInstance().addUser(this, accountName);
}
...
}
我只是想知道approveAddRequest(AddRequest req) 和rejectAddRequest(AddRequest req) 在哪里被调用。在发送或接收AddRequest 后,将不再进行任何行为来真正处理此请求。
另外,我想知道:类之间的每次交互都应该是这样吗(即,来自不同类的许多方法被调用并被多次调用)?
【问题讨论】:
标签: java function class methods object-oriented-analysis