2016-05-22 8 views
0

コーディングインタビューをクラッキングし、第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が送信または受信された後、実際にこの要求を処理するためのその他の動作は行われません。

また、クラス間のすべてのやりとりがこのようなもの(つまり、さまざまなクラスのメソッドが多数呼び出され、何度も呼び出されていますか?

答えて

0

あなたが探しているのは「オブザーバー」パターンです。

これは、イベント処理のためにGoFによって導入されたベストプラクティスです。

ここで紹介した内容はチャットとは関係ありません。これは、ユーザーとの対話を処理するための単なるユーティリティです。

あなたは最後の質問として、完全なコードが表示されていないため、どこから呼び出されたのかわからないことがあります。まず、完全なソースコードを見つけるべきです。そして、あなたは正しいです、提示されたコードで何の行動も行われませんが、実際のチャットのためにはあります。このすべてのことは模擬です。

+0

1.オブザーバーパターンが便利です。ありがとう。私はそれがチャットとは関係ないことを知っています。私はちょうどメソッドを定義するとき、どのようなメソッドメンバーを作成すべきか、オブジェクト間でどのように相互作用があるべきかを知りたいと思います。 3.この[repo](https://github.com/fluency03/ctci/blob/master/java/Chapter%208/Question8_7/User.java)からわかるように、 'User'にはクラス 'UserManager'から' approveAddRequest'と 'rejectAddRequest'を呼び出すことによって' AddRequest'を承認または拒否できるメソッドです。 – fluency03

関連する問題