refactoring to patterns replace state sltering conditionals with state - andstudy/forge GitHub Wiki
Replace State-Altering Conditionals with State
ํ์ค์์ฝ
- ์ํ๋ณ๊ฒฝ ์กฐ๊ฑด๋ฌธ๋ค์ state ํจํด์ผ๋ก ๊ณ ์ณ๋ณด์
- ์ฆ, ๋ณต์กํ if else ๋ฅผ ์ ๊ฑฐํ๋ค๋ ์๋ฆฌ
์ํ๋? ์ํ๋ณ๊ฒฝ์ด๋?
-
๊ทธ๋ฆผ์ ๋ณด์

-
์ํ
-
requested - ์ฌ์ฉ์์ ๊ถํ์์ฒญ ์ค
-
claimed - ๊ด๋ฆฌ์ ์ฌ์ฌ ์ค
-
granted - ํ๊ฐ๋จ
-
denied - ๊ฑฐ๋ถ๋จ
-
์ํ๋ณ๊ฒฝ
-
public void claimedBy(SystemAdmin admin) 1. requested -> claimed
-
public void grantedBy(SystemAdmin admin) 1. 1. claimed -> granted
-
public void deniedBy(SystemAdmin admin) 1. claimed -> denied
-
์ํ๋ณ๊ฒฝ์ ์ฌ์ ์กฐ๊ฑด
-
granted ๊ฐ ๋๋ ค๋ฉด claimed ์ด์ด์ผ ํจ
-
๋ชจ๋ ์ํ ๋ณ๊ฒฝ์ ๊ด๋ฆฌ์๊ฐ ๋์ผํด์ผ ํจ (์ฌ์ฌ์ค์ธ ๊ด๋ฆฌ์๋ง ํ๊ฐ์ํ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ)
state ํจํด
- ๊ทธ๋ฆผ์ ๋ณด์

- strategy ํจํด๊ณผ ๋น๊ต
- ๊ทธ๋ฆผ์ ๋ณด์

- ๋ชจ์์ ๋น์ทํด๋ ๋๊ธฐ๊ฐ ๋ค๋ฅด๋ค - ์ํ์ ์ด, ์ํฉ์ ๋ง๋ ๋ก์ง ์ ํ
- ์ ์ฐจ๋ ๋ค๋ฅด๋ค
๋ณต์กํ ์์
- ๊ทธ๋ฆผ์ ๋ณด์
- ์ ๋์ค ์กฐ๊ฑด์ด ์ถ๊ฐ๋จ - if else ๊ฐ ์ฐธ๊ธฐ ํ๋ค ์ ๋๋ก ๋ง์์ก๋ค
-
๋ณต์กํด์ง ์ฝ๋
public void grantedBy(SystemAdmin admin) { if (!state.equals(CLAIMED) && !state.equals(UNIX_CLAIMED)) return; if (!this.admin.equals(admin)) return;
if (profile.isUnixPermissionRequired() && state.equals(UNIX_CLAIMED)) isUnixPermissionGranted = true; else if (profile.isUnixPermissionRequired() && !isUnixPermissionGranted()) { state = UNIX_REQUESTED; notifyUnixAdminsOfPermissionRequest(); return; } state = GRANTED; isGranted = true; notifyUserOfPermissionRequestResult();}
-
์ฌ์ ์กฐ๊ฑด์ UNIX_CLAIMED ์ถ๊ฐ
-
๋ณ๊ฒฝ ์ํ์ UNIX_REQUESTED ์ถ๊ฐ
๋ฆฌํฉํฐ๋ง
-
์ํ ํด๋์ค ๋ง๋ค์ - Replace Type Code with Class ์ฐธ๊ณ
public class PermissionState { private String name; private PermissionState(String name) { this.name = name; } public final static PermissionState REQUESTED = new PermissionState("REQUESTED"); public final static PermissionState CLAIMED = new PermissionState("CLAIMED"); public final static PermissionState GRANTED = new PermissionState("GRANTED"); public final static PermissionState DENIED = new PermissionState("DENIED"); public final static PermissionState UNIX_REQUESTED = new PermissionState("UNIX_REQUESTED"); public final static PermissionState UNIX_CLAIMED = new PermissionState("UNIX_CLAIMED"); public String toString() { return name; } } -
๋ฌธ์์ด์ด์๋ state์ ํ์์ ์ํํด๋์ค PermissionState ๋ก ๋ณ๊ฒฝ
-
get, set ์ถ๊ฐ
-
PermissionState getState()
-
void setState(PermissionState state)
-
๊ฐ ์ธ๋ถ ์ํ๋ณ๋ก subclass ์์ฑ
-
๊ทธ๋ฆผ์ ๋ณด์
-
PermissionState๋ abstracte๋ก
-
์์ฑ ์ฝ๋ ๋ณ๊ฒฝ
//public final static PermissionState REQUESTED = new PermissionState("REQUESTED"); public final static PermissionState REQUESTED = new PermissionRequested(); // super("REQUESTED");
์ํ ๋ณ๊ฒฝ ํจ์๋ฅผ ์ด๋ ์ํจ๋ค
-
SystemPermission ์ ์๋ ์ํ๋ณ๊ฒฝ ํจ์
-
claimedBy(), deniedBy(), grantedBy()
-
์ธ๋ถ ์ํ ํด๋์ค๋ก ์ด๋
-
์กฐ๊ฑด๋ฌธ ์ฌ๋ผ์ง
class PermissionRequested extends PermissionState... public void claimedBy(SystemAdmin admin, SystemPermission permission) { if (!permission.getState().equals(REQUESTED) && !permission.getState().equals(UNIX_REQUESTED)) return;
permission.willBeHandledBy(admin); if (permission.getState().equals(REQUESTED)) permission.setState(CLAIMED); else if (permission.getState().equals(UNIX_REQUESTED)) permission.setState(UNIX_CLAIMED); }class PermissionRequested extends Permission... public void claimedBy(SystemAdmin admin, SystemPermission permission) { permission.willBeHandledBy(admin); permission.setState(CLAIMED); }
-
์ฌ์ ์กฐ๊ฑด์ด ์ด๋ฏธ ์ถฉ์กฑ ๋์์ - claimedBy() ๋ PermissionRequested ์๋ง ์กด์ฌ
-
๋ง์ฐฌ๊ฐ์ง๋ก deniedBy(), grantedBy() ๋ PermissionClaimed ์๋ง ์กด์ฌ
class PermissionClaimed extends PermissionState ... public void deniedBy(SystemAdmin admin, SystemPermission permission) { if (!permission.getAdmin().equals(admin)) return; permission.setIsGranted(false); permission.setIsUnixPermissionGranted(false); permission.setState(DENIED); permission.notifyUserOfPermissionRequestResult(); } public void grantedBy(SystemAdmin admin, SystemPermission permission) { if (permission.getProfile().isUnixPermissionRequired() && !permission.isUnixPermissionGranted()) { permission.setState(UNIX_REQUESTED); permission.notifyUnixAdminsOfPermissionRequest(); return; } permission.setState(GRANTED); permission.setIsGranted(true); permission.notifyUserOfPermissionRequestResult(); }
PermissionState ์ถ์ํด๋์ค๋ก
-
์ถ์ํด๋์ค, ์๋ฌด์ผ๋ ํ์ง์๋ ์ํ๋ณ๊ฒฝํจ์๋ฅผ ์ธํฐํ์ด์ค์ฉ์ผ๋ก ๊ฐ์ง
abstract class PermissionState { public String toString(); public void claimedBy(SystemAdmin admin, SystemPermission permission) {} public void deniedBy(SystemAdmin admin, SystemPermission permission) {} public void grantedBy(SystemAdmin admin, SystemPermission permission) {} }