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


10

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

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

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

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などのユーザーオブジェクト内にネットワークメソッドを配置することは良い習慣ですか?

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

回答:


30

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

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

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

私が説教していることは、ゼロワンインフィニティルールと呼ばれています。最初は明らかではないかもしれませんが、それはあなたのデザインが将来の耐性がないことを私に告げるものです。

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

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

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


4
FacebookProfile, InstagramProfile, ...OPは既に質問に回答したと思います。その言語は、ユーザーがソーシャルネットワークに関連するプロファイルをまったく持っていないか、いくつか持っている可能性があることを示しています。しかし、彼/彼女の内部のプログラマーはこの要素を単なるリンクに変えました。なぜコレクションではないのProfilesですか?CandiedOrangeに同意しました。あなたは未来について考えすぎています。新しいソーシャルネットワークが表示される場合があります。実際のものが消える可能性があります。ユーザーはネットワーク間を行き来できます。
Laiv

これは当て推量です。これらのプロファイルをソーシャルログインに使用するとします。コンポーネントプロファイルがあるので、どこから始めればよいかがわかります。これらのプロファイルを使用して、認証と現在のセッションに関する情報をカプセル化する場所。これはYAGNIまたはオーバーエンジニアリングと見なされる可能性がありますが、これらについて考える価値はありません。これらの機能が要求されるかどうか、またはアプリケーションに価値を提供できるかどうかを確認してください。そうでない場合は、それらを破棄してください。
ライヴ

1
@Prabhuは、それを制限している理由に依存します。私の推測では、GUIに当てはまるものは多くありません。それは結構です。ただし、GUIのためにデータ構造を制限しないでください。GUIは気まぐれで変わります。データ構造は変更にコストがかかります。初めて正しく理解することは、本当に価値があります。
candied_orange

2
それがポイントです。可能な将来の変更がそれほど苦痛にならないような構造を採用するだけです。それ以上でもそれ以下でもありません。私たちCandiedと私は、私(私は生きている)が同じような状況に頻繁に直面しており、変更または進化しやすい機能の可能性を予測しているため、これを言います。最終的に、あなたはプロジェクトとその将来の見通しにより近づきます。
ライヴ

1
@Prabhu:特定のシナリオで最も簡潔なアプローチであるかどうかではなく、良い実践について質問したことに注意してください。私は通常、過剰なエンジニアリングを回避する側にいますが、将来のメンテナンス(リンクの追加/削除、エンティティークラス定義の更新など)のコストは、リンクのコレクションを実装するコストをはるかに上回ります。あなたが列を呼び出した場合link1link2link3、収集の必要性はより明白であったであろう。ただし、列にわかりやすい名前を付けても、繰り返しデータのコレクションであるという事実は変わりません。
2018

6

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

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

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

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

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


まさに私の疑問は、私がこの質問をするように促したことでした。異なるリンク間の唯一の関係は、それらがUIに一緒に表示される可能性があることです。したがって、この場合は、それらを別のオブジェクトに配置するのではなく、Userオブジェクトの直下に置くことをお勧めしますか?
プラブー

1
この場合は役に立たないと思います。複雑さの層を追加することを正当化する問題はまだありません。あなたがもっと多くのプロパティを持っていたなら、グループ化の努力で利益があったかもしれません(グループの適切な名前を使って)。しかし、文脈なしでは何が適切かを判断するのは困難です。一番下の行は、物事を簡単にする必要があります。開発プロセスの次のステップが何であるかを理解し、続行するため。
Martin Maat

I一般的にオーバーエンジニアリングを避けるように、私は不思議を行います。あなたはOPが彼のフィールドを命名していた場合は、同じことを言っただろうかlink1link2link3?データ構造の設計はフィールドの名前とは無関係なので、私の例は機能的に同等です。それは将来の保証の問題です。YAGNIは一般的に適用されますが、どちらかと言えば、ソーシャルメディア自体がバイラルの人気と変化の影響を受けやすいことが証明されています。すべての新しい人気のソーシャルメディアサイトの再開発を回避することが望ましいようです。そうしないと、「もう1つのフィールドは何か」に陥るリスクがあります。巨額の借金を作成することができますトラップ。
2018

1

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.