Mam pytanie dotyczące powielania kodu i refaktoryzacji, mam nadzieję, że nie jest zbyt ogólny. Załóżmy, że masz dość mały fragment kodu (~ 5 linii), który jest sekwencją wywołań funkcji , która jest - nie jest bardzo niskim poziomem. Ten kod powtarza się w kilku miejscach, więc dobrym pomysłem byłoby wyodrębnienie metody tutaj. Jednak w tym konkretnym przykładzie ta nowa funkcja ucierpiałaby z powodu niskiej spójności (co przejawia się, między innymi, trudnością w znalezieniu dobrego imienia dla funkcji). Powodem tego jest prawdopodobnie to, że ten powtarzający się kod jest tylko częścią większego algorytmu - i trudno jest go podzielić na dobrze nazwane kroki.Aby suszyć lub nie suszyć? O unikaniu duplikacji kodu i zachowaniu spójności
Co proponujesz w takim scenariuszu?
Edit:
Chciałem zachować pytanie na poziomie ogólnym, tak aby więcej osób mogło potencjalnie znaleźć przydatne, ale oczywiście najlepiej byłoby jego kopię zapasową z jakiejś próbki kodu. Przykładem może być jednym z najlepszych w historii (pachnie w dość kilka sposobów), ale mam nadzieję, że spełni swoje zadanie:
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();
}
}
}
Próbuję bardzo ciężko znaleźć jakiś zwarty kawałek kodu, aby poprzeć moje pytanie, ale podstawa kodu, którą w pewnym sensie rzuciłam się na refaktor, wydaje się być takim bałaganem, że trudno jest wyizolować problem i prawdopodobnie trudno byłoby wkleić cokolwiek bez wchodzenia w długi i nudny opis. Myślę, że przybijałeś to z sugestią "tam gdzieś powinna istnieć realna abstrakcja gdzieś tam". To takie silne uczucie, że wciąż patrzę na kod, nie pozwalając mu odejść. Po prostu wiem, że istnieje lepszy sposób wyrażania całego pomysłu niż te spaghetti! – lukem00
Dodałem kilka próbek kodu - czy chciałbyś rozszerzyć opis ogólnego podejścia z kilkoma konkretnymi wskazówkami i sugestiami - dla lepszej ilustracji? – lukem00
@ lukem00: Nie wiem, może te 3 wspólne linie mogłyby zostać przekształcone w metodę 'SocketAction', zwaną również' onLoginCorrect'? Oznacza to, że każdy 'LoginHandler' powinien wykonać swoje zadanie, a następnie przekazać go do' SocketAction', która robi to z sesji. –