Ich habe eine Frage bezüglich Code-Duplikation und Refactoring, hoffe, es ist nicht zu allgemein. Angenommen, Sie haben ein ziemlich kleines Stück Code (~ 5 Zeilen), das ist eine Folge von Funktionsaufrufen das ist - nicht ein sehr niedriges Niveau. Dieser Code wird an mehreren Stellen wiederholt, daher wäre es wahrscheinlich eine gute Idee, hier eine Methode zu extrahieren. In diesem speziellen Beispiel würde diese neue Funktion jedoch unter einer geringen Kohäsion leiden (was sich unter anderem darin äußert, dass es schwierig ist, einen guten Namen für die Funktion zu finden). Der Grund dafür ist wahrscheinlich, dass dieser wiederholte Code nur ein Teil eines größeren Algorithmus ist - und es ist schwierig, ihn in gut benannte Schritte zu unterteilen.Um zu trocknen oder nicht zu trocknen? Auf Vermeidung von Code-Duplizierung und Zusammenhalt erhalten
Was würden Sie in einem solchen Szenario vorschlagen?
Edit:
Ich wollte die Frage auf einer allgemeinen Ebene zu halten, so dass mehr Menschen potenziell es nützlich finden, aber natürlich wäre es am besten, es mit einiger Code Probe zu sichern. Das Beispiel ist vielleicht nicht die beste sein, je (es riecht in ganz wenigen Möglichkeiten), aber ich hoffe, es macht seinen Job:
class SocketAction {
private static class AlwaysCreateSessionLoginHandler extends LoginHandler {
@Override
protected void onLoginCorrect(SocketAction socketAction) throws IllegalAccessException, IOException {
Server.checkAllowedDeviceCount(socketAction._sess.getDeviceID());
socketAction.registerSession();
socketAction._sess.runApplication();
}
}
private static class AutoConnectAnyDeviceLoginHandler extends LoginHandler {
@Override
protected void onLoginCorrect(SocketAction socketAction) throws IllegalAccessException, IOException {
if (Server.isUserRegistered(socketAction._sess.getUserLogin())) {
Log.logSysInfo("Session autoconnect - acquiring list of action threads...");
String[] sa = Server.getSessionList(socketAction._sess.getUserID());
Log.logSysInfo("Session autoconnect - list of action threads acquired.");
for (int i = 0; i < sa.length; i += 7) {
socketAction.abandonCommThreads();
Server.attachSocketToSession(sa[i + 1], socketAction._commSendThread.getSock());
return;
}
}
Server.checkAllowedDeviceCount(socketAction._sess.getDeviceID());
socketAction.registerSession();
socketAction._sess.runApplication();
}
}
private static class OnlyNewSessionLoginHandler extends LoginHandler {
@Override
protected void onLoginCorrect(SocketAction socketAction) throws IllegalAccessException, IOException {
socketAction.killOldSessionsForUser();
Server.checkAllowedDeviceCount(socketAction._sess.getDeviceID());
socketAction.registerSession();
socketAction._sess.runApplication();
}
}
}
Ich versuche wirklich, ein kompaktes Stück Code zu finden, um meine Frage zu unterstützen, aber die Code-Basis, die ich mich selbst herausgefordert habe, zu refaktorieren, scheint so durcheinander zu sein, dass es schwierig ist, das Problem zu isolieren Es wäre wahrscheinlich schwierig, etwas einzufügen, ohne in eine lange und langweilige Beschreibung zu gehen. Ich denke, Sie haben es mit dem Vorschlag "Es sollte eine brauchbare Abstraktion da irgendwo geben" genagelt. Es ist so ein starkes Gefühl, dass ich immer noch den Code anstarre und mich weigere, loszulassen. Weil ich einfach weiß * gibt es einen besseren Weg, die ganze Idee auszudrücken als dieses Spaghetti-Zeug! – lukem00
Ich habe einige Codebeispiele hinzugefügt - möchten Sie die Beschreibung des allgemeinen Ansatzes mit einigen spezifischen Tipps und Vorschlägen ergänzen - zur besseren Veranschaulichung? – lukem00
@ lukem00: Ich weiß nicht, vielleicht könnten diese 3 gemeinsamen Linien in eine Methode von 'SocketAction' umgewandelt werden, auch 'onLoginCorrect' genannt? Das heißt, jeder 'LoginHandler' soll sein Ding machen und dann an die' SocketAction' delegieren, die diese Session-Sachen erledigt. –