質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1023閲覧

正しいイベント設計がわからない

ainshutain

総合スコア2

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/09/17 11:00

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 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/17 11:14

Unity の話ですか? であれば、Unity のタグをつけてください。Unity に興味のある人の目を引いてレスが付きやすいという質問者さんにとってのメリットがあるだけでなく、自分のような Unity には興味のない閲覧者にはスレッドを読まなくて済むというメリットもあります。
YAmaGNZ

2020/09/17 11:27

どこの仕様を改善しようという話なのですか? サーバの仕様ですか?クライアントの仕様ですか?
ainshutain

2020/09/17 11:31

Unityの話ではありませんが、タグは積極的に使います。 ありがとうございます。
ainshutain

2020/09/17 11:31

クライアントの仕様を変更しようとしています
YAmaGNZ

2020/09/17 11:43

サーバからどのような情報がどのように来て、クライアントは情報をどこで受けてどこに何を通知するのですか?
ainshutain

2020/09/17 11:53

通信方法はWebSocketです 「通知」と表現したのはイベントの発火と言う意味合いで使いました オフライン時にUserを参照してはいけない原因はUserStatusを汎用的に使いまわしているからですが、イベントを複数作るのも汚いとジレンマになって質問しました
gentaro

2020/09/17 13:15

作ろうとしてるのがどんなものなのかも、質問したいポイントも全くわからないんですが、nullを想定することが初見殺しだというのであれば、NullObjectパターンなどで改善できないんですか?
YAmaGNZ

2020/09/17 13:17

初見殺しって意味が分かりません。 初見殺しって言ってる時点で仕様の説明ができてないってことですよね? ようはオフラインになった時は得られる情報がユーザーIDのみでUserに含まれるオンライン時に得られる情報がないってことですよね。 イベント購読側への仕様開示でnullになりますって説明するだけの話ではないのですか?
ainshutain

2020/09/17 13:22

独学で学んでいる学生です プログラムの設計上、nullを想定する事が良くない設計と思い込んでいたのですが、それは間違いでしょうか?
YAmaGNZ

2020/09/17 13:36

情報がない場合はnullとするというのは不思議なことではないと思います。 そのあたりは設計者の考え方次第かと思います。 データがないときにnullを返すのがいやだというのであれば、gentaroさんの仰るようにNullObjectパターンでの実装でもいいでしょう。 今回の場合、UserConnectionの値で判断する形でUserがnullか判断する必要はなさそうですのでわざわざNullObjectパターンにしなくてもいいような気もします。
ainshutain

2020/09/17 14:20

「情報がない場合はnullとするというのは不思議なことではない」 nullに対して過剰になっていました。 回答ありがとうございました。
guest

回答2

0

ベストアンサー

個人の感覚であったり、いろいろなものとのトレードオフですが、
オンラインになった時のイベントと、オフラインになった時のイベント、
それぞれイベントがあってもいいと思いますよ。

私は、条件分岐を可能な限り少なくしたいので多少冗長なコードになっても
別々のイベントを作る派です。

コードの見やすさは、書いてみて見比べるのが一番早いです。
テストもせず、書くだけだったらそんなに時間はかからないと思います。

投稿2020/09/19 13:30

Kaiser

総合スコア295

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

あなたの思う、理想的な状態にすればいいです。
それができない理由がなにかあるんでしょうか

投稿2020/09/17 11:17

y_waiwai

総合スコア87800

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問