…Helperまたは…Managerクラスを回避する方法


9

プロジェクトにはかなりの数のヘルパークラスがあります。これは悪いことだと読んだことがありますが、「ヘルパー」がサフィックスとして間違っていると思います。例を挙げましょう。

まず、Userクラスがあります。GetSuggestedFriends()ユーザーのための方法が必要です。提案された友達のリストをUserクラスから除外するためのロジックを保持したいので、肥大化しません。現在、コンストラクターでFriendshipHelperを受け取るがありUserます。友達候補を取得するためのロジックが含まれているので、を呼び出すことができますmyUser.FriendshipHelper.GetSuggestedFriends()

元々FriendshipHelperは静的メソッドのみがあり、Userオブジェクトはそれぞれに渡されていました。今、クラスを最初から作成している場合は、それを呼び出すかもしれませんFriendshipManager-友達の追加や削除なども行います。

...Managerただし、クラスが悪いことも読みました。私はこのクラスを何と呼ぶべきですか?または、これは「不良コード」ですか?友達候補、現在の友達、友達の追加と削除のロジックはどこにあるべきですか?きっとすべてが巨大なUserクラスにいるわけではありませんか?


このコードはどこにありますか?サービスですか?データストアにアクセスしますか?これは、この友好的なことを行うためのUIですか?
Telastyn、2015年

3
すべての静的メソッドを削除し、OOP設計で実際のホームを見つけたら、これらのクラスは実際にはヘルパークラスではないので、自由に名前を変更してください。プロジェクトで友情を管理する必要がある場合、FriendshipManagerに問題はありません。
JeffO

何が問題になっていFacebookますか?
toniedzwiedz 2015年

回答:


10

「ヘルパー」または「マネージャークラス」を回避する方法«

一般的に:優れた設計

まず、Userクラスがあります。ユーザー用のメソッドGetSuggestedFriends()が必要です。

はい。A user 他のと関係がありusersます。そして、その関係はuser、たとえばのメソッドとして表現できますuser.isFriend(user2)。これはuserオブジェクトの責任です。さらに、別のオブジェクト他の友達を探す手助けを求めます。あなたは委任責任のために友人を見つける別のオブジェクトには、それはだ、非常に細かいです

現在、コンストラクタでUserを受け取るFriendshipHelperがあります。提案された友達を取得するためのロジックが含まれており、myUser.FriendshipHelper.GetSuggestedFriends()を呼び出すことができます

それ自体は悪いことではありませんが、欠点があります。「ヘルパー」を1つで初期化するとuser、可能性がそのヘルパーに限定されますuser

必要なのはオブジェクトです。これは、あらゆるユーザーの友達を見つけるのに役立ちます。したがって、一般的な方法は理にかなっています。userMatcher.findFriendsFor(user)これは、見返りに友人のコレクションを提供しますuser)。

今、クラスを最初から作成している場合は、FriendshipManagerと呼ぶかもしれません。

あなたの問題は「ヘルパークラス」を書くことではなく、正しい名前を見つけることです。;)

また、友達の追加や削除なども行います。

それは間違ったデザインです。自分の例を挙げましょう:あなたのママはあなたの人生に友達を追加しますか、それとも自分で追加しますか?

もちろん、友達コレクションはそれ自体の所有物であり、メソッドやuseruser.addFriend(user)user.removeFriend(user)

私はこのクラスを何と呼ぶべきですか?

前に述べたように、名前の問題のみがあり、「ヘルパー」は大丈夫です。しかし、各オブジェクトの責任についてもっと注意深く考える必要があります。

友達候補、現在の友達、友達の追加と削除のロジックはどこにあるべきですか?きっとすべてが巨大なUserクラスにあるわけではない

いいえ。これらは、出会い系機関がある実際の生活のように、1つの個別のオブジェクトが必要な2つのジョブです。


3
素晴らしい説明ですが、あなたは明らかに私の母に会ったことがありません。: '(
マット

1
@ HEATH3Nそれがソフトウェアのモデリング機能に影響を及ぼさないことを願っています。
トーマスジャンク2017年

3

FriendshipService(非静的)GetSuggestedFriends(User)メソッドを持つクラスがあることをお勧めします。テストがより困難になるインターフェースを実装できないため、静的メソッドは避けてください。単一のユーザーに特に関連しないメソッドでFriendshipServiceを拡張したい場合があるため、コンストラクターにユーザーオブジェクトを追加しないでください。(たとえば、ユーザーのセットに友達を提案したり、何か他のものに基づいて友達を提案したりすることができます)

ユーザーはFriendshipService(単一の責任パターンのため)に気づいていない可能性が高い


7
接尾辞を「ヘルパー」から「サービス」に変更しても、クラスの責任をその名前で理解するのは簡単ではありません。これが問題の核心だと思います。
マイクパートリッジ

まあ、名前自体はそれほど意味がないかもしれませんが、サフィックス「Service」を使用することは、クラスが何らかの高度なロジックを実行することを伝えるより標準化された方法であると言えるでしょう。「ヘルパー」クラスは(少なくとも私の経験では)通常、単純なフォーマットや小さな静的メソッドなどの非常に単純なタスクに関連しています。「サービス」インターフェースを別の実装に置き換えることができると思います。さらに、名前だけでなく、多くの質問があります。
ビョルン2015年

同意した。「ヘルパー」、「マネージャー」、および「サービス」の3つはすべて、メソッドをグループ化して単一のメソッドで大量の超特定クラスを回避する方法ですが、「サービス」にはもう少し意味があります。さらに、クラスがサービスレイヤーインターフェイスの一部であることを意味し、特定のドメインクラスのビジネスロジック(より多くの特定のクラスで構成されている場合があります)へのアクセスを簡略化するのに役立ちます。提案ロジックを追加/削除ロジックとは別のクラスに含めるかどうかは、提案ロジックの実装がどの程度複雑かによって異なります。
Mike Partridge 2015年

クラスにThingManagerまたはThingServiceと名前を付けると、制御不能に成長するクラスを作成するための扉が開きます。名前はクラスに属する特定のものを明確に示していないため、何も除外しません。Thingを扱う新しいメソッドが必要です。どこに行くの?Idk、他のすべてのメソッドと一緒にThingManagerに入れます。
Scott Hannen、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.