В СУШУ или не СУШИТЬ? Об избежании дублирования кода и сохранении целостности

I ' У меня есть вопрос по поводу дублирования кода и рефакторинга, надеюсь, он не слишком общий. Скажем, у вас есть довольно небольшой фрагмент кода (~ 5 строк), который представляет собой последовательность вызовов функций , то есть - не очень низкий уровень . Этот код повторяется в нескольких местах, поэтому, вероятно, было бы неплохо извлечь метод здесь. Однако в этом конкретном примере эта новая функция будет страдать от низкой согласованности (которая проявляется, среди прочего, в том, что ей трудно найти хорошее имя для функции). Причина этого, вероятно, в том, что этот повторяющийся код является всего лишь частью более крупного алгоритма - и его трудно разделить на хорошо названные шаги.

Что бы вы предложили в таком сценарии?

Изменить:

I хотел оставить вопрос на общем уровне, чтобы больше людей могли найти его полезным, но, очевидно, было бы лучше подкрепить его некоторым образцом кода. Пример, возможно, не самый лучший (он пахнет по-разному), но я надеюсь, что он справится со своей задачей:

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();
        }
    }
}
7
задан lukem00 17 November 2010 в 20:38
поделиться