2016-05-14 14 views
1

Wie kann man eine große "monolithische" Klasse in kleinere zerlegen?Zerlegen einer großen "monolithischen" Klasse in kleinere

Ich habe ein einfaches Chat-System entwickelt, das User Objekte und Channel Objekte hat, wo ein Benutzer sein kann und in einer Reihe von Kanälen sprechen. Hier

ist ein Diagramm mein Design:

UML chat design diagram

Das primäre Problem, das ich mit diesem Entwurf ist, dass die ChatManager Klasse ein wenig monolithisch ist, das heißt, es tut zu viele Dinge. In einer früheren Inkarnation wurde auch die Channel-Mitgliedschaft behandelt, die nun in ChannelMembershipManager unterteilt wurde.

Was ist der beste Weg zur "Vereinfachung" meiner ChatManager Klasse? Gibt es noch andere Probleme mit meinem Design, die ich nicht sehe?

+0

scheint vernünftig. Top-Level-Manager-Klassen neigen dazu, ein bisschen hässlich zu sein. –

+0

Ja, ich fragte auf Reddit und bekam leider die gleiche Antwort. Ich hoffte nur, dass ich etwas tun konnte, um es aufzuräumen. –

+2

nichts ist offensichtlich falsch mit den Diagrammen. code es auf und suche nach Möglichkeiten zur Umgestaltung. –

Antwort

2

Der beste Weg, diesen monolithischen Manager aufzubrechen, besteht darin, den Klassen gemäß OO-Prinzipien Verantwortlichkeiten zuzuweisen. Hier sind einige Vorschläge, die Ihnen sofort einfallen. Erwarte keine Perfektion, das ist nur von meinem Kopf.

Ich sehe keine Notwendigkeit für einen „Manager“ Klasse, obwohl ich es für notwendig, tun alle Instanzen der Channel Klasse und alle Instanzen der User Klasse zu verfolgen. Vielleicht Dies könnte mit Klassenstatik innerhalb jeder Klasse getan werden. (Diese Indizes können in UML Qualifikations modelliert werden, die wie Hash-Karten Art von Arbeit. Die Channels und Users wirklich nicht gerade Zahlen müssen! Diese Zahlen sind nur eine von vielen Möglichkeiten, dies zu codieren.

Jeder Instanz der Klasse User kann einen Befehlskanal verwenden, um mit einer Person zu kommunizieren.Wenn eine Person die Instanz User anfordert, einem Kanal beizutreten, kann sie eine Instanz einer Private Channel erstellen, die einen Kanal pro Kanal verwaltet, der privat ist eine Person, dann fragen Sie eine Instanz der angeforderten Channel für die Erlaubnis, es zu akzeptieren.Das Private Channel könnte Methoden zu poll(), read() undhaben.

Eine Instanz einer Channel Klasse könnte für die Ankündigung von Dingen verantwortlich sein, wenn ein User beitritt oder verlässt. Jede Instanz einer Channel-Klasse sollte für das Abrufen der verbundenen Instanzen, das Lesen von Nachrichten/Befehlen und das Ergreifen von Maßnahmen verantwortlich sein, z. B. das Wiederholen einer Nachricht an alle anderen Private Channels.

Das ist nur von der Spitze meines Kopfes. Wenn ich mir etwas Zeit nehmen würde, um darüber nachzudenken, könnte ich einige potenzielle Probleme oder Optimierungen sehen, die ich machen könnte, aber hoffentlich gibt das Ihnen einige Ideen, wie man einen "Manager" -Monolith nach OO-Prinzipien aufteilt.

Verwandte Themen