我有一個關於代碼重複和重構的問題,希望它不是太籠統。假設你有一段相當小的代碼(~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();
}
}
}
我努力尋找一些簡潔的代碼來備份我的問題,但是我有點質疑自己要重構的代碼庫似乎很混亂,以至於很難將問題隔離開來可能很難粘貼任何東西,而不會進入漫長而無聊的描述。我認爲你用「在某處應該有一個可行的抽象」的建議來釘住它。這是一種強烈的感覺,我仍然一直盯着代碼,拒絕放棄。因爲我只是*知道*有比這個意大利麪條更好的表達整個想法的方式! – lukem00 2010-11-15 00:41:05
我已經添加了一些代碼示例 - 您想用一些特定的提示和建議來增強對一般方法的描述 - 以獲得更好的插圖嗎? – lukem00 2010-11-17 20:56:22
@ lukem00:我不知道,也許這3條公共線可以變成'SocketAction'的一個方法,也叫做'onLoginCorrect'?也就是說,每個'LoginHandler'都可以完成它的任務,然後委託給'SocketAction',它執行會話。 – 2010-11-17 22:05:23