Room という名前のクラスがあり、そのプロパティの 1 つとしてすべての Player エンティティを含む配列があります。
players = [];
Room クラスには、実際にラウンドに参加したプレイヤーのみを返すメソッドがあります。
// below method is called by the room's timer
var getPlayersWhoFinished = function() {
playersWhoFinished = [];
for (i = 0; i < players.length; i++) {
if (players[i].isFinished()) {
playersWhoFinished.push(players[i]);
};
};
return playersWhoFinished;
}
したがって、上記を Room クラスにそのまま残すことができることはわかっていますが、すでに大きなクラス (300 行以上) に、より複雑なマッピングを持つ他の 3 つの関数が既にあります。これらの種類のメソッドを他のクラスにカプセル化する方法がわかりません。それらは Room クラスと適切なユーザーに送信されるすべての Room 参照に非常に密接に関連しているためです。
上記のコードを変更して Player クラスに挿入することは、ある程度理にかなっていますが、これを機能させる唯一の方法は、静的メソッドを使用してルーム オブジェクトをそれに送信することです。
// players is now a member of the Player class
Player.getPlayersWhoFinished = function(room, players) {
playersWhoFinished = [];
for (i = 0; i < players; i++) {
if (players[i].getRoom() == room) {
playersWhoFinished.push(players[i]);
}
}
return playersWhoFinished;
}
とにかく、これは面倒で非効率に思えます。Room クラスをできるだけ柔軟にする方法を見つけるのに本当に苦労しています。