refactoring to patterns replace state sltering conditionals with state - andstudy/forge GitHub Wiki

Replace State-Altering Conditionals with State

ํ•œ์ค„์š”์•ฝ

  1. ์ƒํƒœ๋ณ€๊ฒฝ ์กฐ๊ฑด๋ฌธ๋“ค์„ state ํŒจํ„ด์œผ๋กœ ๊ณ ์ณ๋ณด์ž
  2. ์ฆ‰, ๋ณต์žกํ•œ if else ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ์†Œ๋ฆฌ

์ƒํƒœ๋ž€? ์ƒํƒœ๋ณ€๊ฒฝ์ด๋ž€?

  1. ๊ทธ๋ฆผ์„ ๋ณด์ž 1

  2. ์ƒํƒœ

  3. requested - ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์š”์ฒญ ์ค‘

  4. claimed - ๊ด€๋ฆฌ์ž ์‹ฌ์‚ฌ ์ค‘

  5. granted - ํ—ˆ๊ฐ€๋จ

  6. denied - ๊ฑฐ๋ถ€๋จ

  7. ์ƒํƒœ๋ณ€๊ฒฝ

  8. public void claimedBy(SystemAdmin admin) 1. requested -> claimed

  9. public void grantedBy(SystemAdmin admin) 1. 1. claimed -> granted

  10. public void deniedBy(SystemAdmin admin) 1. claimed -> denied

  11. ์ƒํƒœ๋ณ€๊ฒฝ์‹œ ์‚ฌ์ „์กฐ๊ฑด

  12. granted ๊ฐ€ ๋˜๋ ค๋ฉด claimed ์ด์–ด์•ผ ํ•จ

  13. ๋ชจ๋“  ์ƒํƒœ ๋ณ€๊ฒฝ์˜ ๊ด€๋ฆฌ์ž๊ฐ€ ๋™์ผํ•ด์•ผ ํ•จ (์‹ฌ์‚ฌ์ค‘์ธ ๊ด€๋ฆฌ์ž๋งŒ ํ—ˆ๊ฐ€์ƒํƒœ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)

state ํŒจํ„ด

  1. ๊ทธ๋ฆผ์„ ๋ณด์ž

2

  1. strategy ํŒจํ„ด๊ณผ ๋น„๊ต
  2. ๊ทธ๋ฆผ์„ ๋ณด์ž

3

  1. ๋ชจ์–‘์€ ๋น„์Šทํ•ด๋„ ๋™๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋‹ค - ์ƒํƒœ์ „์ด, ์ƒํ™ฉ์— ๋งž๋Š” ๋กœ์ง ์„ ํƒ
  2. ์ ˆ์ฐจ๋„ ๋‹ค๋ฅด๋‹ค

๋ณต์žกํ•œ ์˜ˆ์ œ

  1. ๊ทธ๋ฆผ์„ ๋ณด์ž
  2. ์œ ๋‹‰์Šค ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋จ - if else ๊ฐ€ ์ฐธ๊ธฐ ํž˜๋“ค ์ •๋„๋กœ ๋งŽ์•„์กŒ๋‹ค

4

  1. ๋ณต์žกํ•ด์ง„ ์ฝ”๋“œ

    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();
    

    }

  2. ์‚ฌ์ „์กฐ๊ฑด์— UNIX_CLAIMED ์ถ”๊ฐ€

  3. ๋ณ€๊ฒฝ ์ƒํƒœ์— UNIX_REQUESTED ์ถ”๊ฐ€

๋ฆฌํŒฉํ„ฐ๋ง

  1. ์ƒํƒœ ํด๋ž˜์Šค ๋งŒ๋“ค์ž - 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;
     	}
     }
    
  2. ๋ฌธ์ž์—ด์ด์—ˆ๋˜ state์˜ ํƒ€์žŽ์„ ์ƒํƒœํด๋ž˜์Šค PermissionState ๋กœ ๋ณ€๊ฒฝ

  3. get, set ์ถ”๊ฐ€

  4. PermissionState getState()

  5. void setState(PermissionState state)

  6. ๊ฐ ์„ธ๋ถ€ ์ƒํƒœ๋ณ„๋กœ subclass ์ž‘์„ฑ

  7. ๊ทธ๋ฆผ์„ ๋ณด์ž

  8. PermissionState๋Š” abstracte๋กœ

  9. ์ƒ์„ฑ ์ฝ”๋“œ ๋ณ€๊ฒฝ

    //public final static PermissionState REQUESTED = new PermissionState("REQUESTED"); public final static PermissionState REQUESTED = new PermissionRequested(); // super("REQUESTED");

์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜๋ฅผ ์ด๋™ ์‹œํ‚จ๋‹ค

  1. SystemPermission ์— ์žˆ๋Š” ์ƒํƒœ๋ณ€๊ฒฝ ํ•จ์ˆ˜

  2. claimedBy(), deniedBy(), grantedBy()

  3. ์„ธ๋ถ€ ์ƒํƒœ ํด๋ž˜์Šค๋กœ ์ด๋™

  4. ์กฐ๊ฑด๋ฌธ ์‚ฌ๋ผ์ง

    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); }

  5. ์‚ฌ์ „์กฐ๊ฑด์ด ์ด๋ฏธ ์ถฉ์กฑ ๋˜์—ˆ์Œ - claimedBy() ๋Š” PermissionRequested ์—๋งŒ ์กด์žฌ

  6. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 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 ์ถ”์ƒํด๋ž˜์Šค๋กœ

  1. ์ถ”์ƒํด๋ž˜์Šค, ์•„๋ฌด์ผ๋„ ํ•˜์ง€์•Š๋Š” ์ƒํƒœ๋ณ€๊ฒฝํ•จ์ˆ˜๋ฅผ ์ธํ„ฐํŽ˜์ด์Šค์šฉ์œผ๋กœ ๊ฐ€์ง

     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) {}
     }