FriendStatusChanged」はフレンドのステータスを通知するイベントです。
サーバー側の仕様で、フレンドがオフラインになった場合にはUserオブジェクトは含まれません。
ですのでUserにnullを代入していています。
初見殺し状態になっており、改善したいと思っています。
改善案:ステータスごとにイベントを定義する(オンラインになった場合 オフラインになった場合 etc...)
イベントの定義が多くなり逆に悪いコードになりそうです。
どうすれば綺麗に解決できますか?
C#
1 public event EventHandler<SocketEventArgs<UserLocation>> FriendLocationChanged; 2 public event EventHandler<SocketEventArgs<User>> FriendProfileChanged; 3 public event EventHandler<SocketEventArgs<UserStatus>> FriendStatusChanged; 4 5 public class UserStatus 6 { 7 [JsonProperty("user")] 8 public User User { set; get; } 9 10 [JsonProperty("userId")] 11 public string UserID { set; get; } 12 public enum Connection 13 { 14 Online, 15 Ofline, 16 Active 17 } 18 public Connection UserConnection { set; get; } 19 } 20 21 switch (type) 22 { 23 case "friend-online": 24 socketEventArgs.Item.UserID = jobectContent["userId"].ToObject<string>(); 25 socketEventArgs.Item.User = jobectContent["user"].ToObject<User>(); 26 socketEventArgs.Item.UserConnection = UserStatus.Connection.Online; 27 break; 28 case "friend-active": 29 socketEventArgs.Item.UserID = jobectContent["userId"].ToObject<string>(); 30 socketEventArgs.Item.User = jobectContent["user"].ToObject<User>(); 31 socketEventArgs.Item.UserConnection = UserStatus.Connection.Active; 32 break; 33 case "friend-offline": 34 socketEventArgs.Item.UserID = jobectContent["userId"].ToObject<string>(); 35 socketEventArgs.Item.User = null; 36 socketEventArgs.Item.UserConnection = UserStatus.Connection.Ofline; 37 break; 38 default: 39 return; 40 }
Unity の話ですか? であれば、Unity のタグをつけてください。Unity に興味のある人の目を引いてレスが付きやすいという質問者さんにとってのメリットがあるだけでなく、自分のような Unity には興味のない閲覧者にはスレッドを読まなくて済むというメリットもあります。
どこの仕様を改善しようという話なのですか?
サーバの仕様ですか?クライアントの仕様ですか?
Unityの話ではありませんが、タグは積極的に使います。
ありがとうございます。
クライアントの仕様を変更しようとしています
サーバからどのような情報がどのように来て、クライアントは情報をどこで受けてどこに何を通知するのですか?
通信方法はWebSocketです
「通知」と表現したのはイベントの発火と言う意味合いで使いました
オフライン時にUserを参照してはいけない原因はUserStatusを汎用的に使いまわしているからですが、イベントを複数作るのも汚いとジレンマになって質問しました
作ろうとしてるのがどんなものなのかも、質問したいポイントも全くわからないんですが、nullを想定することが初見殺しだというのであれば、NullObjectパターンなどで改善できないんですか?
初見殺しって意味が分かりません。
初見殺しって言ってる時点で仕様の説明ができてないってことですよね?
ようはオフラインになった時は得られる情報がユーザーIDのみでUserに含まれるオンライン時に得られる情報がないってことですよね。
イベント購読側への仕様開示でnullになりますって説明するだけの話ではないのですか?
独学で学んでいる学生です
プログラムの設計上、nullを想定する事が良くない設計と思い込んでいたのですが、それは間違いでしょうか?
情報がない場合はnullとするというのは不思議なことではないと思います。
そのあたりは設計者の考え方次第かと思います。
データがないときにnullを返すのがいやだというのであれば、gentaroさんの仰るようにNullObjectパターンでの実装でもいいでしょう。
今回の場合、UserConnectionの値で判断する形でUserがnullか判断する必要はなさそうですのでわざわざNullObjectパターンにしなくてもいいような気もします。
「情報がない場合はnullとするというのは不思議なことではない」
nullに対して過剰になっていました。
回答ありがとうございました。
回答2件
あなたの回答
tips
プレビュー