web-dev-qa-db-ja.com

関連する一連のプロパティを独自の構造体/クラスにラップすることは良い習慣ですか?

私の質問は強く型付けされた言語に関するものの、SwiftでUserオブジェクトを書くこと。ユーザーは多数のリンク(FacebookProfile、InstagramProfileなど)を持つことができます。これに関するいくつかの質問。

  1. リンクを独自のオブジェクトでラップすることは良い習慣ですか?
 struct User {
 var firstName:string 
 var lastName:string 
 var email:string 
 var links:Links 
} 
 struct Links {
 var facebook:string 
 var instagram:string 
 var Twitter:string 
} 

それともルーズにすべきですか?技術的にはどちらの方法でも問題ないことはわかっていますが、一般的に、特に読みやすさのために、推奨されるアプローチがあるかどうか疑問に思います。

struct User { 
   var firstName: string
   var lastName: string
   var email: string
   var facebookLink: string
   var twitterLink: string
   var instagramLink: string
}
  1. このようなシナリオでは、リンクはコレクション/リストにする必要がありますか?利用可能なリンクオプションの数は決まっており、増えているわけではないので、リストにすべきではないと考えました。私の考えは正しいですか?

  2. GetUsers、getUser、updateUserなどのユーザーオブジェクト内にネットワークメソッドを配置することは良い習慣ですか?

これらは主観的である可能性があることは知っていますが、同様の状況でのベストプラクティスを理解しようとしています。任意のポインタをいただければ幸いです。

10
Prabhu

あなたはどちらかが必要になります

  • 物事のゼロ、
  • 一つのこと、または
  • モノの任意の数。

必要なリンクの数は常に3つであり、それらの名前が永久に何であるかを知っているとあなたの設計が予測していることに私はショックを受けました。

私が説教しているのは zero one infinity rule と呼ばれています。最初は明らかではないかもしれませんが、それはあなたのデザインが将来の耐性がないことを私に告げるものです。

これらのリンクについて、彼らにとって特別なものがあるとしたら、私は違和感を覚えるでしょう。 Twitterリンクでは実行しないFacebookリンクへのアクセス時に、私が異なるいくつかの特別なこと。それは彼らを別のものにするでしょう。しかし、それはこのコードでは示されていません。

それが、メールの文字列に悩まされない理由です。私はそれがリンクとは異なる方法で使用されていることを知っています。

したがって、これらのリンクを別の方法で使用する理由がわかるまで、私はリンクコレクションの側にいます。

30
candied_orange

あなたは「技術的な可能性が見えます」という罠に陥る寸前です。

アイテム間で共通の特性が表示されるからといって、アイテムに何らかの集計を適用することが意味があるとは限りません。集約は何かを意味するはずです。技術的なレベルではなく、問題の領域です。

それらはすべて問題なくリンクですが、ユーザークラスのコンテキストでは、それは何か意味がありますか?いいえ。「strings」と「numbers」という名前のクラスを使用してサブグループ化するのと同じくらい意味がありません。

この種の問題は、モデルがぼやけることです。コードリーダーは、ドメインを完全に理解する前に、意味のないものから意味のあるものを切り離す必要があります。

ユーザーのリンクについて誰も話しません。集計をSocialNetworkIdsと呼ぶ場合は異なります。これは実際には何かを意味するので、任意の技術的なコレクションではなく、Userの真のプロパティになります。

6
Martin Maat

一般に、それぞれに同様の操作を適用する可能性が高い場合、特に常にすべての操作に対して同じ操作を実行する場合は、リンクを独自のstructにするのが妥当だと思います。それらがあなたのアプリケーションで無関係な目的のためであるならば、私はそれらを別々にします。たとえば、ユーザーのホームページ、健康保険プロバイダーのWebサイト、お気に入りのニュースサイトへのリンクである場合、それらは無関係であると思われるため、グループ化しないでください。しかし、3つのソーシャルメディアサイトの場合、それらはアプリ内で同様に扱われるように思われるため、おそらく一緒にグループ化する必要があります。 Linksよりわかりやすい名前を使用します。 (どのような種類のリンクですか?アプリの目的は何ですか?)

#2についてのあなたの考えに同意します。上で述べたように、数が増えたり変動したりする場合は、リストまたは他のコレクションが適切な選択ですが、これまでに説明したシナリオには適していません。

ネットワークによって取得されたデータを保持するオブジェクト内にネットワークメソッドを配置しません。データの取得元と取得方法は、通常、クラスの主な目的とは無関係です。将来、ディスクからデータを取得したい場合はどうなりますか?または、ユーザーに入力してもらいたいですか?その道のりを十分に進んで、単純なUserクラスには、データの入力と取得のすべての可能なメソッドを処理するコードが必要です。 Userクラスにデータを保持させ、メモリに保持するだけです。その他はすべて、より適切なクラスで処理できます。

1
user1118321