コードの複製とリファクタリングに関する質問があります。一般的すぎないことを願っています。非常に低いレベルではない一連の関数呼び出しであるかなり小さなコード (〜 5 行) があるとします。このコードはいくつかの場所で繰り返されているため、ここでメソッドを抽出することをお勧めします。ただし、この特定の例では、この新しい関数は凝集度が低いという問題があります (これは、特に、関数の適切な名前を見つけるのに苦労することによって明らかになります)。その理由はおそらく、この繰り返されるコードがより大きなアルゴリズムの一部に過ぎず、適切な名前のステップに分割するのが難しいためです。
そのようなシナリオであなたは何を提案しますか?
編集:
より多くの人が役立つ可能性があるように、質問を一般的なレベルに保ちたかったのですが、コードサンプルでバックアップするのが最善であることは明らかです. この例はこれまでで最高のものではないかもしれません (かなり多くの点でにおいがします) が、うまくいくことを願っています。
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();
}
}
}