Ich habe einige Helferklassen in meinem Projekt. Ich habe gelesen, dass dies eine schlechte Sache ist, aber ich vermute, dass "Helper" das falsche Suffix für sie ist. Ich werde ein Beispiel geben.
Erstens habe ich eine User
Klasse. Ich brauche eine Methode GetSuggestedFriends()
für einen Benutzer. Ich möchte die Logik zum Bestimmen der Liste der vorgeschlagenen Freunde aus der User
Klasse heraushalten , damit sie nicht aufgebläht wird. Im Moment habe ich eine, FriendshipHelper
die eine User
in ihrem Konstruktor erhält . Es enthält die Logik, um vorgeschlagene Freunde zu finden, und ich kann jetzt anrufen myUser.FriendshipHelper.GetSuggestedFriends()
.
Ursprünglich gab es FriendshipHelper
nur statische Methoden, und User
in jedes wurde ein Objekt übergeben. Wenn ich die Klasse jetzt von Grund auf neu schreiben würde, würde ich sie vielleicht nennen FriendshipManager
- sie macht auch Dinge wie das Hinzufügen und Entfernen von Freunden.
Ich habe auch gelesen, dass der ...Manager
Unterricht schlecht ist. Wie soll ich diese Klasse nennen? Oder ist das "schlechter Code"? Wo sollte die Logik zum Abrufen vorgeschlagener Freunde, aktueller Freunde und zum Hinzufügen und Entfernen von Freunden live sein? Sicher nicht alle in einer Riesenklasse User
?
quelle
Facebook
?Antworten:
Im Allgemeinen: durch gutes Design
Ja. A
user
hat eine Beziehung zu anderenusers
. Und die Beziehung könnte als Methode ausgedrückt werdenuser
, zuser.isFriend(user2)
. Dies liegt in der Verantwortung desuser
Objekts. Außerdem bitten Sie ein anderes Objekt um Hilfe bei der Suche nach anderen Freunden . Sie delegieren die Verantwortung für das Finden von Freunden an ein anderes Objekt, und das ist in Ordnung .Das ist nicht per se schlecht, hat aber einen Nachteil: den „Helper“ mit einer Initialisierung
user
Grenzen der Möglichkeiten zu , dass manuser
.Was Sie brauchen, ist ein Objekt , mit dem Sie jedem Benutzer Freunde finden können . So eine generische Methode würde Sinn machen:
userMatcher.findFriendsFor(user)
die Rückkehr eine liefert Sammlung von möglichen Freunden (user
).Ihr Problem besteht nicht darin, "Hilfsklassen" zu schreiben, sondern die richtigen Namen zu finden . ;)
Das ist ein falsches Design . Nehmen Sie sich zum Beispiel: Fügt Ihre Mutter Ihrem Leben Freunde hinzu oder fügen Sie sie selbst hinzu?
Natürlich ist die Sammlung von Freunden eine Eigenschaft von sich
user
selbst, ebenso wie die Methodeuser.addFriend(user)
oderuser.removeFriend(user)
Wie gesagt: Sie haben nur ein Namensproblem und Ihre "Helfer" sind in Ordnung . Sie müssen jedoch genauer über die Verantwortlichkeiten der einzelnen Objekte nachdenken .
Nein. Dies sind zwei Jobs, für die Sie ein separates Objekt benötigen , wie im wirklichen Leben, wo Sie Menschen und eine Partnervermittlung haben .
quelle
Ich würde vorschlagen, dass Sie eine
FriendshipService
Klasse haben, die eine (nicht statische)GetSuggestedFriends(User)
Methode hat. Vermeiden Sie statische Methoden, da Sie keine Schnittstelle implementieren können, die das Testen erschwert. Vermeiden Sie das Hinzufügen des Benutzerobjekts zum Konstruktor, da Sie Ihren FriendshipService möglicherweise um Methoden erweitern möchten, die sich nicht speziell auf einen einzelnen Benutzer beziehen. (Zum Beispiel möchten Sie möglicherweise einer Gruppe von Benutzern Freunde vorschlagen oder Freunde vorschlagen, die auf etwas anderem basieren.)Ein Benutzer sollte sich des
FriendshipService
(aufgrund des Einzelverantwortungsmusters) höchstwahrscheinlich nicht bewusst sein.quelle