コーディングインタビューをクラッキングし、第8章:オブジェクト指向設計に関するいくつかの質問があります。質問8.7を例に挙げてください:クラス間のインタラクションを設計する - ソリューションについて8.7コーディングインタビューをクラックする
8.7チャットサーバーの設計方法を説明してください。特に、さまざまなバックエンドのコンポーネント、クラス、およびメソッドについての詳細を提供します。解決すべき最も難しい問題は何でしょうか?
この解決策は、github repoで見つけることができます。
私の一般的な質問は、機能を完成させるために異なるクラスに異なるメソッドを割り当てる方法です。これらの相互作用を行うためのいくつかの原則や共通のアイデアはありますか?一つの特定の機能を取る - ユーザAは、ユーザBを追加 - 例として:
以下がUserManager
の部分的なコードである:
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);
}
...
}
I:
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
の部分的なコードでありますapproveAddRequest(AddRequest req)
とrejectAddRequest(AddRequest req)
がどこに呼ばれているのか不思議です。 AddRequest
が送信または受信された後、実際にこの要求を処理するためのその他の動作は行われません。
また、クラス間のすべてのやりとりがこのようなもの(つまり、さまざまなクラスのメソッドが多数呼び出され、何度も呼び出されていますか?
1.オブザーバーパターンが便利です。ありがとう。私はそれがチャットとは関係ないことを知っています。私はちょうどメソッドを定義するとき、どのようなメソッドメンバーを作成すべきか、オブジェクト間でどのように相互作用があるべきかを知りたいと思います。 3.この[repo](https://github.com/fluency03/ctci/blob/master/java/Chapter%208/Question8_7/User.java)からわかるように、 'User'にはクラス 'UserManager'から' approveAddRequest'と 'rejectAddRequest'を呼び出すことによって' AddRequest'を承認または拒否できるメソッドです。 – fluency03