ãå
ã« ã¢ã¯ã¿ã¼ã¨ã¦ã¼ã¹ã±ã¼ã¹ï¼æ¨©éï¼ã®å®è£
ããã¦ã¿ã¾ããã
ã¾ã ãµã¼ãã¹ãã³ã³ããã¼ã©ã¼ã¸ã®é©ç¨ã¯ãã¦ãã¾ããã
æ³å®ããè¦ä»¶
ã¢ã¯ã¿ã¼ãè¤æ°ãã£ã¦ãããããã«æ¨©éããããããªãã®ã¨ãããã¨ã§ãç³è«ããã¼ããé¡æã«ãã¾ããã
ç¶æ é·ç§»å³
ã¦ã¼ã¹ã±ã¼ã¹å³
ãç·¨éãã«ã¤ãã¦ã¯ãç¶æ å¤æ´ãä¼´ããªãã¨ãããã¨ããã é¤å¤ãã¦ããã以å¤ã® ç¶æ é·ç§»ã®ããªã¬ã¼ã¨ãªãæ¯ãèãã åºæ¬çã« ãã®ã¾ã¾ã¦ã¼ã¹ã±ã¼ã¹ã¨ãã¦æ¡ç¨ãã¾ããã
ããã³ãã©ãããè£è¶³ãªã©
ç³è«è ã¨æ¿èªè ãç¶æ¿é¢ä¿ã«ãã¦ãã¾ãããæ£ç´ èªåèªèº«ããã¼ããã¨æã£ã¦ãã¾ãã è¦ä»¶ã¨ãã¦ã®å½¹å²ã ããç¶æ¿é¢ä¿ã«ããªãæ¹ãæ£ããæ´çã ã¨æããã§ãããã ç¶æ¿ãã¹ããã®ãããã¨ãããã社å¡ãã¿ãããªã¢ã¯ã¿ã¼ã®ãããªæ°ããããã§ããã©ãä»åã¯ã¢ã¯ã¿ã¼ã®ç¶æ¿ãå«ãã å®è£ ä¾ã試ãããã£ãã¨ãããã¨ã§ç®ãã¤ã¶ã£ã¦ãã ããã
ç¶æ ãçµäºãããã¨ã¯ç¡ãã®ï¼ã¨ããç¶æ é·ç§»ã«ãªã£ã¦ãã¾ãããããã¯ä¸å¿ãæå³çãªãã®ã§ãã ã¤ãã¥ã¼ã¿ãã«ãã¼ã¿ã¢ãã«çãªãã¨ãæ³å®ãã¦ãã¦ããã¹ã¦ã®ç¶æ ãå±¥æ´ã¨ãã¦ç®¡çãããã¨ããæå³ã§ãã
å®è£ ï¼ã¤ã³ã¿ã¼ãã§ã¼ã¹ï¼
ã¢ã¯ã¿ã¼
public interface ActorType { public Set<UsecaseType> usecases(); public default ActorType parentActor() { return null; } public default Set<UsecaseType> recursiveScan(ActorType actor, Set<UsecaseType> usecases) { if (actor == null) { return usecases; } usecases.addAll(actor.usecases()); return recursiveScan(actor.parentActor(), usecases); } public default boolean hasUsecase(UsecaseType usecase) { return this.usecases().contains(usecase); } public default boolean anyMatch(Set<UsecaseType> usecases) { return this.usecases().stream().anyMatch(usecase -> usecases.contains(usecase)); } }
ã¦ã¼ã¹ã±ã¼ã¹
ã¦ã¼ã¹ã±ã¼ã¹ã¯ãã¢ã¯ã¿ã¼ã¨éã£ã¦ æ°¸ç¶å±¤ãªã©ã®å¤ãã ã¦ã¼ã¹ã±ã¼ã¹Enumã¸ã®å¤æãå¿ è¦ã ã¨ããã¨ããã§ãã ã¨ãããã¨ã§ãå¤æç¨ã®ã¦ã¼ãã£ãªãã£ã¨ãã¦ã æ¬ã¤ã³ã¿ã¼ãã§ã¼ã¹ã使ãã¾ã*1ã
public interface UsecaseType { public Object code(); public static <E extends Enum<E> & UsecaseType> Optional<E> codeOf(Class<E> enumType, Object code) { return Arrays.stream(enumType.getEnumConstants()) .filter(e -> e.code().equals(code)) .findFirst(); } }
å®è£ ï¼å ·è±¡ã¯ã©ã¹ï¼
å®è£ ä¾ã¨ãããã¨ã§ãåãããããéè¦ã§ ä¸è¿°ã® ã¦ã¼ã¹ã±ã¼ã¹å³ãç¶æ é·ç§»å³ã®æ¥æ¬èªè¡¨ç¾ã ãã®ã¾ã¾ä½¿ã£ã¦ãã¾ãã å®éã®ä½æã®é çªã¨ãã¦ã¯ãã¦ã¼ã¹ã±ã¼ã¹ã®Enumãã¤ãã£ã¦ãã¢ã¯ã¿ã¼ã®Enumãå®è£ ãã¾ãã
ã¢ã¯ã¿ã¼
public enum Actor implements ActorType { 起票è (起票, ç³è«, åä¸), æ¿èªè (å·®æ», æ¿èª) { @Override public Actor parentActor() { return 起票è ; } }; private final Set<UsecaseType> usecaces; @Override public Set<UsecaseType> usecases() { return this.usecaces; } private Actor(UsecaseType... usecases) { Set<UsecaseType> _usecases = (usecases == null || usecases.length == 0) ? Collections.emptySet() : new HashSet<>(Arrays.asList(usecases)); this.usecaces = this.recursiveScan(this.parentActor(), _usecases); } }
æ¿èªè
ã¯ã起票è
ãæ¡å¼µããã¢ã¯ã¿ã¼ã§ãããã¨ã parentActor
ã§è¡¨ç¾ãã¦ãã¾ãã
ãã¨ã¯åã¢ã¯ã¿ã¼ã«é¢é£ããã¦ã¼ã¹ã±ã¼ã¹ãè¨è¿°ããã ãã§ãã
å帰çã«ã¢ã¯ã¿ã¼ã«ç´ã¥ãã¦ã¼ã¹ã±ã¼ã¹ãåå¾ããããã«ã³ã³ã¹ãã©ã¯ã¿ã§this
åç
§ããã¦ããã¨ããããã¡ãã£ã¨æ°ã«ã¯ãªã£ã¦ãã¾ãã
ã¤ã³ã¹ã¿ã³ã¹ãã£ã¼ã«ããåç
§ãã¦ããããã§ã¯ãªãã®ã§ã大ä¸å¤«ããªãã¨æã£ã¦ãã¾ãããããåé¡ããããããªããã¢ã¯ã¿ã¼ã«é¢é£ä»ãããã¦ããã¦ã¼ã¹ã¼ã±ã¼ã¹ãåå¾ããã¡ã½ããï¼hasUsecase
ï¼ã§é½åº¦ é層æ
å ±ãããã®ã¼ã£ã¦ ã¦ã¼ã¹ã±ã¼ã¹æ
å ±ãåç
§ããããã«ããªãã¨ãããªãããããã¾ãããä¸å¿ãã¦ããããã¹ãã§ã¯ æ³å®éãã®æåããã¦ãã¾ãã
ã¦ã¼ã¹ã±ã¼ã¹
public enum Usecase implements UsecaseType { 起票, ç³è«, åä¸, å·®æ», æ¿èª; @Override public Object code() { return this.name(); } public static Optional<Usecase> codeOf(Object code) { return UsecaseType.codeOf(Usecase.class, code); } }
æ°¸ç¶å±¤ãªã©ã§ä¿æãã¦ããã³ã¼ãå¤ã¯Usecaseã®Enumåæåã¨åå¤ã¨ããåæã§ã*2ã
Enumã¯ã©ã¹ã® valueOf
ã® ã³ã¼ãå¤çã¨ãã¦ãstatic 㪠codeOf
ã¡ã½ãããæºåãã¾ã*3ã
使ãæ¹ã®ä¾ï¼ãã¹ãã³ã¼ãï¼
public class ActorTest { @Test public void hasUsecasesAt起票è () { Set<UsecaseType> usecases = Actor.起票è .usecases(); Set<UsecaseType> expects = new HashSet<>(Arrays.asList(起票, ç³è«, åä¸)); Assert.assertTrue(usecases.containsAll(expects)); } @Test public void hasUsecasesAtæ¿èªè () { Set<UsecaseType> usecases = Actor.æ¿èªè .usecases(); Set<UsecaseType> expects = new HashSet<>(Arrays.asList(起票, ç³è«, åä¸, å·®æ», æ¿èª)); Assert.assertTrue(usecases.containsAll(expects)); } @Test public void hasUsecase() { Assert.assertTrue(Actor.起票è .hasUsecase(åä¸)); Assert.assertTrue(Actor.æ¿èªè .hasUsecase(åä¸)); Assert.assertFalse(Actor.起票è .hasUsecase(å·®æ»)); } @Test public void anyMatch() { Set<UsecaseType> items = new HashSet<>(Arrays.asList(å·®æ», æ¿èª)); Assert.assertFalse(Actor.起票è .anyMatch(items)); Assert.assertTrue(Actor.æ¿èªè .anyMatch(Actor.起票è .usecases())); } @Test public void convertUsecaseEnum() { Assert.assertEquals(Usecase.codeOf("åä¸").get(), Usecase.åä¸); } }
ãããã«
Actorã¨ã¦ã¼ã¹ã±ã¼ã¹ã®å®è£
ã«ã¤ãã¦ã¯ãã ããããããªæãã§è¯ãã㪠ã¨æãã¾ãã
次㯠ãããã®Enumãå®éã« ãµã¼ãã¹ãã³ã³ããã¼ã©ã¼ã§ä½¿ã£ã¦ã¿ã¦ã使ãåæãæ¤è¨¼ãã¦ããããã¨æãã¾ãã
*1:EnumのInterfaceに共通処理を実装する - システム開発で思うところ ã« å°ãStreamã§ã¢ã¬ã³ã¸ãå ãã¦å®è£ ãã¾ããã
*2:ææãã§ããæå³ã¯ä¼ããã¨æãã¾ã
*3:å®éã®å®è£ ã«è¿ã¥ãããã®ã§ ãã¡ãã¯ææãããã¾ãã