ãã®èšäºã§ã¯ããªããžã§ã¯ãæåéçºç°å¢ã§ã€ã³ã¿ã©ã¯ãã£ããªããã©ãã°å¯èœãªãèŠçŽ ã䜿çšããŠããŒããããã³ã³ããŒãã³ããäœæããæ¹æ³ã詳ãã調ã¹ãŸãã äŸãšããŠããããã¿ã€ãUMLãšãã£ã¿ãŒãäœæããŸãã
åé¡ã®å£°æ
åºæ¬çãªãœãªã¥ãŒã·ã§ã³èŠä»¶
ã€ã³ã¿ã©ã¯ãã£ããªã°ã©ãã£ãã¯ã¹ã®å®è£ ãå¿ èŠãšããã¿ã¹ã¯ã®ãªã¹ãã¯éåžžã«åºç¯å²ã§ãã ãããããªã
- ããŒãã®ã¹ããŒã¿ã¹ã衚瀺ãããæ©åšã®æ¡ä»¶å³ïŒèšçœ®ãã³ã³ãã€ã茞éã·ã¹ãã ïŒããããŠã¹ã®ã¯ãªãã¯ãã§ããŠãŒã¶ãŒã¯è¿œå æ å ±ã®åä¿¡ãŸãã¯å¶åŸ¡ã³ãã³ãã®å ¥åãåžæ
- åæã°ã©ãïŒãã¹ãã°ã©ã ãããã«ãã€ã¢ã°ã©ã ïŒããŠãŒã¶ãŒãæ å ±ãåãåãããèŠçŽ ã®ãããŠã¹ã¯ãªãã¯ãããŸãã¯ãŠãŒã¶ãŒãããŠã¹ã§èŠçŽ ãçŽæ¥ããã©ãã°ãããé©åãªæ¹åã«ç»åãå€æŽããŠå¿ èŠãªæ°å€ã€ã³ãžã±ãŒã¿ãŒãèŠã€ããŸãã
- ã°ã©ã圢åŒã§è¡šç€ºãããããŒã¿ã®èŠèŠçåæïŒããšãã°ãããŒã¿ããŒã¹å ã®æ³äººéã®é¢ä¿ïŒããŠãŒã¶ãŒã¯æçµçã«çµæã®ç»åãå°å·ã¬ããŒãã«æ¿å ¥ããããã«ãã°ã©ãèŠçŽ ãæåã§ããã©ãã°ãããã
- ãã¹ãŠã®ãããã¯ãç¹ã«ãã¹ãŠã®CASEããŒã«ã®èŠèŠçã¢ããªã³ã°/èšèšã®ãã¹ãŠã®æ段ã
-ãªã©ãªã©ã ããããã¹ãŠã®å³ã®å€èŠ³ã¯ç°ãªããŸããããã¹ãŠã®å Žåãããã€ãã®äžè¬çãªèŠä»¶ãå®è£ ããå¿ èŠããããŸãã ããã«ãããŸãïŒ
- ç»åã¯ãããŸããŸãªã°ã©ãã£ãã¯ã®è€éãã®åå¥ã®èŠçŽ ã§æ§æããå¿ èŠããããŸãã
- ç»åã¯ã¹ã±ãŒã©ãã«ã§ã¹ã¯ããŒã«å¯èœã§ããå¿
èŠããããŸããã€ãŸãããŠãŒã¶ãŒã¯ãã¹ã±ãŒã«ãšã¹ã¯ããŒã«ããŒã®å€æŽã䜿çšããŠããã€ã¢ã°ã©ã ã®ãã©ã°ã¡ã³ãããã詳ããèŠãããšãã§ããå¿
èŠããããŸãã
- ç»åã®äžéšã®èŠçŽ ã¯ãã¯ãªãã¯å¯èœãã§ããå¿
èŠããããŸããã€ãŸããã·ã¹ãã ã¯åžžã«ãããŠã¹ãã€ã³ã¿ãŒãæããŠããèŠçŽ ãæ£ç¢ºã«ãç解ãããããŒã«ãããã衚瀺ã§ããå¿
èŠããããŸãã
- äžéšã®ãã¯ãªãã¯å¯èœãªãèŠçŽ ã¯ãéžæå¯èœãã§ããå¿ èŠããããŸããã€ãŸãããŠãŒã¶ãŒã¯ããŠã¹ã¯ãªãã¯ã§èŠçŽ ããéžæãã§ããªããã°ãªããŸãããShiftããŒã§èŠçŽ ã°ã«ãŒããéžæãããé·æ¹åœ¢æãçžãã䜿çšã§ããå¿ èŠããããŸãã éžæãããªããžã§ã¯ãã䜿çšããŠãã¿ã¹ã¯ã«å¿ããŠãããããã£ã®äžéšã®ã¢ã¯ã·ã§ã³ãŸãã¯å€æŽãå®è¡ã§ããŸãã
- äžéšã®ãã¯ãªãã¯å¯èœãªãèŠçŽ ã¯ããã©ãã°å¯èœãã§ããå¿
èŠããããŸããã€ãŸãããŠãŒã¶ãŒã¯ããŠã¹ã§1ã€ã®èŠçŽ ãŸãã¯éžæããèŠçŽ ã®ã°ã«ãŒãããã©ãã°ã§ããå¿
èŠããããŸãã
èŠçŽ ãããã©ãã°ã¢ã³ããããããããæ©èœã®éèŠæ§ã匷調ããå¿ èŠããããŸãã ã¿ã¹ã¯ã«ã°ã©ããèŠèŠåããå¿ èŠãããå Žåã¯ãèŠããŠããå¿ èŠããããŸãïŒå¹³é¢äžã«ã°ã©ãããŒããèªåçã«é 眮ããããã®å€ãã®ã¢ã«ãŽãªãºã ã®ããããããã¹ãŠã®å Žåã«å®å šã«æºè¶³ã§ãããœãªã¥ãŒã·ã§ã³ãæäŸããããšã¯ã§ããŸããã
ãã®ãæçããæºåããã«ã¯ãã©ã®ãæåããå¿ èŠã§ããïŒ ãã®èšäºã§ã¯ã 4ã€ã®äž»èŠãªæ¡ä»¶ããã¹ãŠæºããããå Žåã«ãããããéçºç°å¢ã«é©çšã§ããäžè¬çãªååã瀺ããŸã ã
- ãªããžã§ã¯ãæåããã°ã©ãã³ã°èšèªã
- ã°ã©ãã£ãã¯ããªããã£ãïŒç·ãå匧ãå€è§åœ¢ãªã©ïŒãæç»ããæ©èœãåããããã£ã³ãã¹ããªããžã§ã¯ãïŒãã£ã³ãã¹ïŒã®ã¢ã¯ã»ã·ããªãã£ã
- å¶åŸ¡ãããã¹ã¯ããŒã«ããŒãå®è£ ããã³ã³ããŒãã³ãã
- ããŠã¹ã€ãã³ãåŠçã®ã¢ã¯ã»ã·ããªãã£ã
説æã«åœ¹ç«ã€äŸã¯ãUMLãŠãŒã¹ã±ãŒã¹å³ãšãã£ã¿ã®ãããã¿ã€ãã§ã; ãã®ã¬ã€ãã®çŸããå³ã䜿çšããŸã ã ãã®äŸã®ãœãŒã¹ã³ãŒãã¯https://github.com/inponomarev/graphexampleã§å ¥æã§ããMavenã䜿çšããŠã³ã³ãã€ã«ã§ããŸãã èšäºã«èšèŒãããŠããååãããããç解ãããå Žåã¯ããããã®ãœãŒã¹ãããŠã³ããŒãããŠãèšäºã§åŠç¿ããããšã匷ããå§ãããŸãã
ãã®äŸã¯ãæšæºã®Swingã©ã€ãã©ãªã䜿çšããŠJava 8ã§æ§ç¯ãããŠããŸãã ãã ããèšèŒãããŠããååã«ã¯Javaåºæã®ãã®ã¯ãããŸããã æåã«ããã§æŠèª¬ããååãDelphiïŒWindowsã¢ããªã±ãŒã·ã§ã³ïŒã§å®è£ ãã次ã«Google Web ToolkitïŒHTML Canvasãžã®ã°ã©ãã£ãã¯ã¹åºåãåããWebã¢ããªã±ãŒã·ã§ã³ïŒã§å®è£ ããŸããã äžèšã®4ã€ã®æ¡ä»¶ãæºãããããšãææ¡ãããäŸãå¥ã®éçºç°å¢ã«å€æã§ããŸãã
ãåçŽãªãã¢ãããŒãã®é£ãã
äžè¬ã«ãã°ã©ãã£ãã¯ããªããã£ãã衚瀺ããæ¹æ³ã䜿çšããŠãäœããã®çš®é¡ã®å³ãç»é¢ã«æç»ããããšã¯å°é£ãªäœæ¥ã§ãã ã¹ãã£ãã¯ã¹ãã£ãã¯ãã¥ãŠãª
canvas.drawOval(10, 0, 10, 10); canvas.drawLine(15, 10, 15, 25); canvas.drawLine(5, 15, 25, 15); canvas.drawLine(5, 35, 15, 25); canvas.drawLine(25, 35, 15, 25);
ãããããããŸã§ã®ãšãããç§ãã¡ã®ãå°ããªç·ãã¯ãçãè¿ããããã§ã¯ãããŸãããå²ãåœãŠãããæ¡å€§çž®å°ãããããã£ã³ãã¹äžã移åãããããããšã¯ã§ããŸããã ãããã£ãŠãããããã¹ãŠã®æäœãæ åœããã³ãŒããèšè¿°ããå¿ èŠããããŸãã åçŽãªå³ã§ã¯ãããã¯è€éã§ã¯ãªãããã«èŠããŸãããååŸããããã®ã®è€éãã«ãããåé¡ãåŸ ã£ãŠããŸãã
- çµµãããè€éã«ãªããšããæç»æé ãã®é·ããé·ããªããŸãã è€éãªã¹ããŒã ã®å Žåãæé ã¯éåžžã«é·ããªããæ··ä¹±ãæããŸãã
- ãéæ³ã§ãç»åèªäœãæç»ããã³ãŒãã¯ãããŠã¹ã«ãŒãœã«ã«ãã£ãŠçŸåšéžæãããŠãããªããžã§ã¯ããå€å¥ã§ããåºæºãæå®ããŠããŸããã ããŠã¹ã«ãŒãœã«ãäžã«ãããªããžã§ã¯ããå®çŸ©ããå¥ã®ããã·ãŒãžã£ãäœæããå¿ èŠããããåæã«ãªããžã§ã¯ãã®ã¬ã³ããªã³ã°ããã·ãŒãžã£ãšèªèããã·ãŒãžã£ã®ã³ãŒããåžžã«åæããå¿ èŠããããŸãã
- ã¬ã³ããªã³ã°æé ã®è€éããšãšãã«ãèªèæé ã®è€éããå¢ããŠããŸãã
æé ãè€éã«ããããšã§åé¡ããæ£é¢ããã解決ããããšãããšããœãŒã¹ã³ãŒããããã«è€éã«ãªãããã€ã¢ã°ã©ã ãè€éã«ãªãã«ã€ããŠéªåŽ©ã®ããã«å€§ãããªãããã倱æã«çµãããŸãã ãã ãããªããžã§ã¯ãæåéçºããåå²çµ±æ²»ãã®æ®éçãªååãããã³èšèšãã¿ãŒã³ã䜿çšãããšããããã®åé¡ãé©åã«åŠçããå¿ èŠãªæ©èœãå®è£ ãã匷åãªããŒã«ãåŸãããŸãã
ã ãããç§ãã¡ã¯æ±ºå®ãå§ããŠããŸãã
ã¿ã¹ã¯ã®å解ã ã¯ã©ã¹æ§é
ãŸããæç»ããå¿ èŠããããã®ã®éå±€ãªã¹ããäœæããŠãã¿ã¹ã¯ãå°ããªéšåã«åå²ããŸãã
ãŸããããŒããŸãã¯çŽã«æãããçµµãæããŸãã
ãããŠã次ã®éå±€ãæ§ç¯ããŸãã
- å
šäœãã£ãŒã
- 圹å²ïŒä¿³åªïŒ
- ããŒã«çœ²å
- ãŠãŒã¹ã±ãŒã¹
- ç¶æ¿ïŒäžè¬åïŒ
- åäŒ
- äŸåé¢ä¿
- äŸåã¹ãã¬ãªã¿ã€ãã®çœ²å
- 圹å²ïŒä¿³åªïŒ
ç§ãã¡ã®äŸã¯ãå®éã«ã¯éåžžã«åçŽãªã®ã§ãéå±€ã¯æµ ãããšãããããŸããã ç»åãè€éã«ãªãã»ã©ãéå±€ãåºãæ·±ããªããŸãã
äžéšã®é ç®ã¯æäœã§ããããšã«æ³šæããŠãã ããã ãããã¯ãããŠã¹ã«ãŒãœã«ã§éžæå¯èœããã³ç§»åå¯èœã«ãããã€ã¢ã°ã©ã äžã®ãªããžã§ã¯ãã§ãã
ãã®éå±€å ã®åã¢ã€ãã ã¯æç»ã¯ã©ã¹ã«é¢é£ä»ãããããããã®éã®éå±€é¢ä¿ã«ããã è€åãã¿ãŒã³-ãã¬ã€ã¢ãŠãããé©çšã§ããŸãïŒ ããã¶ã€ã³ãã¿ãŒã³ããšããæ¬ãåŒçšããŸãïŒãéšåå šäœã®éå±€ãè¡šãããªãŒæ§é ã«ãªããžã§ã¯ããæ§æããåäžã«...åã ã®ãªããžã§ã¯ãããã³è€åãªããžã§ã¯ãã解éããŸããã ã€ãŸãããŸãã«å¿ èŠãªããšãè¡ããŸãã
ã¯ã©ã¹å³ã§ã¯ãã·ã¹ãã ã®åœ¢åŒã¯æ¬¡ã®ãšããã§ãã
ã¯ã©ã¹å³ã®äžéšã«ã¯ãæç»ããããã£ãŒãã®è©³çŽ°ã«ã€ããŠãäœãç¥ããªãã2ã€ã®ã¯ã©ã¹ïŒDiagramPanelãšDiagramObjectïŒããããããŸããŸãªçš®é¡ã®å³ãäœæã§ãããã¬ãŒã ã¯ãŒã¯ã圢æããŸãã DiagramPanelïŒãã®å Žåãããã¯javax.swing.JPanelã¯ã©ã¹ã®çžç¶äººã§ãïŒã¯ããã€ã¢ã°ã©ã ã衚瀺ãããŠãŒã¶ãŒãšã®å¯Ÿè©±ãè¡ãããžã¥ã¢ã«ã€ã³ã¿ãŒãã§ã€ã¹ã³ã³ããŒãã³ãã§ãã DiagramPanelãªããžã§ã¯ãã«ã¯ãã¬ã³ããªã³ã°éå±€ã®æäžäœã¬ãã«ã«å¯Ÿå¿ããã«ãŒãæç»ãªããžã§ã¯ãã§ããDiagramObjectãžã®ãªã³ã¯ãå«ãŸããŠããŸãïŒãã®å Žåãããã¯UseCaseDiagramã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«ãªããŸãïŒã
DiagramObjectã¯ãCompositeãã¿ãŒã³ãªã©ãä»ããŠéå±€ãå®è£ ãããã¹ãŠã®æç»ãªããžã§ã¯ãã®åºæ¬ã¯ã©ã¹ã§ããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
äžéšã«ã¯ããã¬ãŒã ã¯ãŒã¯ã®äœ¿çšäŸããããŸãã Exampleã¯ã©ã¹ïŒjavax.swing.JFrameã®åŸç¶ïŒã¯ã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ãŠã£ã³ããŠã§ããããã®äŸã§ã¯ãDiagramPanelã®ã€ã³ã¹ã¿ã³ã¹ã1ã€ã®ã³ã³ããŒãã³ããšããŠå«ãã§ããŸãã ä»ã®ãã¹ãŠã®ã¯ã©ã¹ã¯ãDiagramObjectã®åå«ã§ãã ãããã¯ãã¬ã³ããªã³ã°ã®éå±€ãªã¹ãã®ã¿ã¹ã¯ã«å¯Ÿå¿ããŠããŸãã ãããã®ã¯ã©ã¹ã®ç¶æ¿éå±€ãšã¬ã³ããªã³ã°éå±€ã¯ç°ãªãéå±€ã§ããããšã«æ³šæããŠãã ããïŒ
äžèšã®ã¬ã³ããªã³ã°éå±€ã¯æ¬¡ã®ããã«ãªããŸãã
- UseCaseDiagram-ãã€ã¢ã°ã©ã å
šäœã
- DiagramActor-ããŒã«ã
- ã©ãã«-ããŒã«çœ²å
- DiagramUseCase-ãŠãŒã¹ã±ãŒã¹ã
- DiagramGeneralization-ç¶æ¿ã
- DiagramAssociation-ã³ãã¥ãã±ãŒã·ã§ã³ã
- DiagramDependency-äŸåé¢ä¿ã
- ã©ãã«ã¯ãäŸåã¹ãã¬ãªã¿ã€ãã®çœ²åã§ãã
- DiagramActor-ããŒã«ã
次ã«ãDiagramObjectã¯ã©ã¹ãšDiagramPanelã¯ã©ã¹ã®æ§é ãšãããã®äœ¿çšæ¹æ³ã«ã€ããŠè©³ãã説æããŸãã
DiagramObjectã¯ã©ã¹ãšãã®åå«
ããŒã¿æ§é
DiagramObjectã¯ã©ã¹ã¯ãåã€ã³ã¹ã¿ã³ã¹å ã«åŸå±ã¬ã³ãã©ãŒã®äºéãªã³ã¯ãªã¹ããååšããããã«èšèšãããŠããŸãã ããã¯ãå€æ°previousãnextãfirstãããã³lastã䜿çšããŠå®çŸãããŸããããã«ããããªã¹ãããã³éå±€å ã®é£æ¥ããèŠçŽ ãåç §ã§ããŸãã ãªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åããããšã次ã®ãããªãã®ãåŸãããŸãã
ãã®ããŒã¿æ§é ã¯ãåçŽãªäºéãªã³ã¯ãªã¹ãã«äŒŒãŠããŸãããOïŒNïŒæéã«å¿ èŠãªéå±€ãåéããå¿ èŠã«å¿ããŠOïŒ1ïŒæéã«éå±€ãåéããç¹å®ã®èŠçŽ ãåé€ãããããªã¹ãã«æ°ããèŠçŽ ãæ¿å ¥ããããšã§å€æŽã§ããŸãä»»æã®ã¢ã€ãã ã ãã®æ§é ã®èŠçŽ ãžã®ã¢ã¯ã»ã¹ã¯ããªã³ã¯ãã¯ãªãã¯ããããšã§éæããããæ·±ãã®ããªãŒãã©ããŒãµã«ã«å¯Ÿå¿ããã·ãŒã±ã³ã·ã£ã«ã«ã®ã¿èå³ããããŸãã èµ€ãç¢å°ã«æ²¿ã£ã移åã¯ãçŽç·ã§ã®ç§»åã«å¯Ÿå¿ããéãç¢å°ã«æ²¿ã£ã移åã¯ãå察æ¹åãžã®ç§»åã«å¯Ÿå¿ããŸãã
å éšã®DiagramObjectãªã¹ãã«æ°ãããªããžã§ã¯ããè¿œå ããã«ã¯ãaddToQueueïŒDiagramObject subObjïŒã¡ãœããã䜿çšããŸãã
if (last!=null)) { last.next = subObj; subObj.previous = last; } else { first = subObj; subObj.previous = null; } subObj.next = null; subObj.parent = this; last = subObj;
ç®çã®ç»åãåéããã«ã¯ãé©åãªæ°ã®é©åãªåŒãåºããã€ã³ã¹ã¿ã³ã¹åããããããé©åãªé åºã§ãã¥ãŒã«çµåããã ãã§ãã ãã®äŸã§ã¯ããã®äœæ¥ã®ã»ãšãã©ã¯UseCaseDiagramã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§çºçããŸãã
DiagramActor a1 = new DiagramActor(70, 150, "Customer"); addToQueue(a1); DiagramActor a2 = new DiagramActor(50, 350, "NFRC Customer"); addToQueue(a2); DiagramActor a3 = new DiagramActor(600, 50, "Bank Employee"); addToQueue(a3); ⊠DiagramUseCase uc1 = new DiagramUseCase(250, 50, "Open account"); addToQueue(uc1); DiagramUseCase uc2 = new DiagramUseCase(250, 150, "Deposit funds"); addToQueue(uc2); ⊠addToQueue(new DiagramAssociation(a1, uc1)); addToQueue(new DiagramAssociation(a1, uc2)); ⊠addToQueue(new DiagramDependency(uc2, uc5, DependencyStereotype.EXTEND)); addToQueue(new DiagramDependency(uc2, uc6, DependencyStereotype.INCLUDE)); ⊠addToQueue(new DiagramGeneralization(a2, a1));
ãã¡ãããå®éã«ã¯ãããè¡ãã¹ãã§ã¯ãããŸãããæç»ãªããžã§ã¯ããäœæããããã»ã¹ããã³ãŒãã«ã¹ãããããã代ããã«ãã·ã¹ãã ã®ããŒã¿ã¢ãã«ãã«ãŒãã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãå¿ èŠããããŸãã æ¢ã«ãµã€ã¯ã«ã§ãã®ã¢ãã«ã®ãªããžã§ã¯ãããã€ãã¹ããŠãåŒãåºããäœæããŸãã ããšãã°ãçŸåšã®ãã€ã¢ã°ã©ã ïŒãUMLããã¥ã¡ã³ãã¢ãã«ãã®ãããŒã«ãã«å¯Ÿå¿ïŒã«é¢é£ä»ããããActorã¯ã©ã¹ã®åã€ã³ã¹ã¿ã³ã¹ã«å¯ŸããŠãDiagramActorã¬ã³ããªã³ã°ã¯ã©ã¹ã®ãªããžã§ã¯ããã€ã³ã¹ã¿ã³ã¹åããå¿ èŠããããŸãã
åŒãåºãã«å¯Ÿå¿ããã¢ãã«ãªããžã§ã¯ããžã®ãªã³ã¯ãä¿åãããšäŸ¿å©ã§ãã ãããã®ãªã³ã¯ãã¬ã³ãã©ãŒã®ãã¶ã€ããŒã®ãã©ã¡ãŒã¿ãŒã®åœ¢åŒã§çŽæ¥æž¡ãã®ãæã䟿å©ã§ãã ãã®äŸã§ã¯ããªããžã§ã¯ãã®äžç座æšãšãååãã¹ãã¬ãªã¿ã€ããªã©ã®ãã©ã¡ãŒã¿ãŒãããªããžã§ã¯ãã®ä»£ããã«éä¿¡ãããŸãã
äžç座æšãšç»é¢åº§æš
ãäžç座æšããšããçšèªã䜿çšããããããã«ãããäœã§ããããæ確ã«ããå¿ èŠããããŸãã ç§ãã¡ã®åœã®ãäžç座æšãã¯ãå³å šäœãåãŸããæ³åäžã®ããªã¡ãŒãã«çŽãäžã®å³ã®ãªããžã§ã¯ãã®åº§æšã§ãããå·Šäžé ã«åç¹ããããã¹ã±ãŒãªã³ã°ã¯è¡ãããŸããã ç»åã®çž®å°ºã1ïŒ1ã§ãã¹ã¯ããŒã«ããŒãæå°äœçœ®ã«ããå Žåãäžç座æšã¯ç»é¢äžã®åº§æšãšäžèŽããŸãã ç»é¢ãšã¯ç°ãªããã¯ãŒã«ã座æšã¯æŽæ°åã§ã¯ãããŸããããæµ®åå°æ°ç¹å€ãåããŸãã ããã¯ãç»åã®ãã¯ã»ã«åãã¹ã±ãŒã«ã®å¢å ãšãšãã«çºçããªãããã«ããããã«å¿ èŠã§ãã ããšãã°ã1ïŒ1ã®ã¹ã±ãŒã«ã§ã¯ãäžç座æš0.3ã®å€ã¯ãŒãã®ã¹ã¯ãªãŒã³ãã¯ã»ã«ãšåºå¥ã§ããŸãããã100ïŒ1ã®ã¹ã±ãŒã«ã§ã¯30ã¹ã¯ãªãŒã³ãã¯ã»ã«ã«ãªããŸãã
ãã£ãŒãã¢ãã«ã¯ãºãŒã ãã¹ã¯ããŒã«ãªã©ã®ç¬éçãªãŠãŒã¶ãŒã¢ã¯ã·ã§ã³ã«äŸåããªããããäžç座æšã§ãã£ãŒãã¢ãã«ãæ£ç¢ºã«èšç®ããŠä¿åãããšäŸ¿å©ã§ãã
äžç座æšãç»é¢ã«å€æããããã«ãDiagramObjectã¯ã©ã¹ã«ã¯éèŠãªã¡ãœããscaleXïŒ...ïŒãscaleYïŒ...ïŒãããã³åã«scaleïŒ...ïŒãå«ãŸããŠããŸãã æåã®2ã€ã¯ãã¹ã±ãŒã«ä¿æ°ãã¯ãŒã«ã座æšã«é©çšããæ°Žå¹³ã¹ã¯ããŒã«ããŒãšåçŽã¹ã¯ããŒã«ããŒã®ã·ãããããããèæ ®ããŸãã æåŸã®æ¹æ³ã§ããã¹ã±ãŒã«ïŒ...ïŒã¯ãã¹ã±ãŒã«ä¿æ°ã䜿çšããŸãããã·ããã¯èæ ®ããŸããïŒäœçœ®ã§ã¯ãªããµã€ãºïŒããšãã°ãé·æ¹åœ¢ã®å¹ ãåã®ååŸïŒãèšç®ããããã«å¿ èŠã§ãã
DiagramObjectã®èŠ³ç¹ãããã£ãŒããæç»ããŸãã ç¬ç«ãåç¬ç«ãäŸåãªããžã§ã¯ã
ãã£ãŒããæç»ããã«ã¯ãã«ãŒãDiagramObjectã®drawïŒã°ã©ãã£ãã¯ã¹ãã£ã³ãã¹ãããã«aDXãããã«aDYãããã«ã¹ã±ãŒã«ïŒã¡ãœãããåŒã³åºãããŸãã ãã®ãã©ã¡ãŒã¿ãŒã¯æ¬¡ã®ãšããã§ãã
- ãã£ã³ãã¹-æç»ã³ã³ããã¹ã
- aDXãaDY-ã¹ã¯ããŒã«ããŒã®äœçœ®
- scale-ã¹ã±ãŒã«ïŒ1.0-1ã®ã¹ã±ãŒã«ã®å ŽåïŒ1ãmore / less-å¢å /æžå°ïŒã
ãã®ã¡ãœããã¯ã ãã³ãã¬ãŒãã¡ãœããã®ãã¶ã€ã³ãã¿ãŒã³ãå®è£ ãã次ã®ããã«ãªããŸãã
this.canvas = canvas; this.scale = scale; dX = aDX; dY = aDY; saveCanvasSetup(); internalDraw(canvas); restoreCanvasSetup(); DiagramObject curObj = first; while (assigned(curObj)) { curObj.draw(canvas, aDX, aDY, scale); curObj = curObj.next; }
ã€ãŸããæç»ïŒ...ïŒã¡ãœããïŒ
- ãªããžã§ã¯ãã®ãã£ãŒã«ãå ã®ãã©ã¡ãŒã¿ãŒãèšæ¶ããŸãïŒãããã¯ããŸããŸãªã¡ãœããã§ç¹°ãè¿ã䜿çšãããŸãïŒã
- saveCanvasSetupïŒïŒã§ã¬ã³ããªã³ã°ã³ã³ããã¹ãã®ãã¹ãŠã®èšå®ïŒè²ããŒããããã©ã³ããµã€ãºãªã©ïŒã
- diagramObjectã¬ãã«ã§ã¯äœãè¡ããããªããžã§ã¯ãã®ã¬ã³ããªã³ã°ããã·ãŒãžã£ã«ãã£ãŠãã®åå«ã§ãªãŒããŒã©ã€ããããinternalDrawïŒïŒã¡ãœãããåŒã³åºããŸãã
- internalDrawã®å®è¡åŸã«ç Žæããå¯èœæ§ãããrestoreCanvasSetupïŒïŒèšå®ã䜿çšããŠåŸ©å ããŸãã
- ãã¹ãŠã®ãµããªããžã§ã¯ããé çªã«å®è¡ããåãµããªããžã§ã¯ãã«å¯ŸããŠdrawã¡ãœãããåŒã³åºããŸãã
ãããã£ãŠãã¢ã«ãŽãªãºã ã®äžå€éšåã¯drawïŒ...ïŒã¡ãœããã§å®è£ ãããå¯å€éšåïŒå®éã®æç»ïŒã¯åŸç¶ã¯ã©ã¹ã§å®è£ ãããŸãããããTemplate Methodãã¿ãŒã³ã®æ¬è³ªã§ãã
saveCanvasSetupïŒïŒããã³restoreCanvasSetupïŒïŒã¡ãœããã®ç®çã¯ãæç»ã³ã³ããã¹ãã®ç¶æ ãä¿åããŠãåæç»ãªããžã§ã¯ãããå ã®ã圢åŒã§ååŸã§ããããã«ããããšã§ãã ãããã®æ¹æ³ã䜿çšãããŠããããæç»çžç¶äººã®1ã€ã§ãã€ã³ã¯ã®è²ãèµ€ã«å€æŽãããå ŽåãåŸã§æç»ããããã®ã¯ãã¹ãŠèµ€ã§æç»ãããŸãã ãããã®ã¡ãœããã®å®è£ ã¯ãéçºç°å¢ãšæç»ãšã³ãžã³ãæäŸããæ©èœã«äŸåããŸãã ããšãã°ãDelphiãšJava Swingã§ã¯ãå€ãã®ã³ã³ããã¹ããã©ã¡ãŒã¿ãŒãä¿åããå¿ èŠããããŸãããŸããHTML Canvas2Dã«ã¯ãã³ã³ããã¹ãã®ãã¹ãŠã®ç¶æ ãç¹å¥ãªã¹ã¿ãã¯ã«ããã«ä¿åããããã®æ¢è£œã®saveïŒïŒããã³restoreïŒïŒã¡ãœããããããŸãã
DiagramActorã¯ã©ã¹ã§internalDrawã¡ãœãããã©ã®ããã«èŠãããã瀺ããŸãïŒæåã®ãåçŽãªäŸããšæ¯èŒããŠãã ããïŒïŒ
static final double ACTOR_WIDTH = 25.0; static final double ACTOR_HEIGHT = 35.0; @Override protected void internalDraw(Graphics canvas) { double mX = getmX(); double mY = getmY(); canvas.drawOval(scaleX(mX + 10 - ACTOR_WIDTH / 2), scaleY(mY + 0 - ACTOR_HEIGHT / 2), scale(10), scale(10)); canvas.drawLine(scaleX(mX + 15 - ACTOR_WIDTH / 2), scaleY(mY + 10 - ACTOR_HEIGHT / 2), scaleX(mX + 15 - ACTOR_WIDTH / 2), scaleY(mY + 25 - ACTOR_HEIGHT / 2)); canvas.drawLine(scaleX(mX + 5 - ACTOR_WIDTH / 2), scaleY(mY + 15 - ACTOR_HEIGHT / 2), scaleX(mX + 25 - ACTOR_WIDTH / 2), scaleY(mY + 15 - ACTOR_HEIGHT / 2)); canvas.drawLine(scaleX(mX + 5 - ACTOR_WIDTH / 2), scaleY(mY + 35 - ACTOR_HEIGHT / 2), scaleX(mX + 15 - ACTOR_WIDTH / 2), scaleY(mY + 25 - ACTOR_HEIGHT / 2)); canvas.drawLine(scaleX(mX + 25 - ACTOR_WIDTH / 2), scaleY(mY + 35 - ACTOR_HEIGHT / 2), scaleX(mX + 15 - ACTOR_WIDTH / 2), scaleY(mY + 25 - ACTOR_HEIGHT / 2)); }
ãã€ã³ãïŒmXãmYïŒã¯ããªããžã§ã¯ãã®äžå€®ã§ãã ãåçŽãªäŸãã®åç¹ã¯å·Šäžé ã«ããããããªããžã§ã¯ãã®å¹ ãšé«ãã®ååã ãã·ããããå¿ èŠããããŸãã ãåçŽãªäŸãã§ã¯ãç»åã®ã¹ã±ãŒãªã³ã°ãšã·ããã®å¿ èŠæ§ãèæ ®ããŠããŸããã§ããããã¡ãœããscaleXïŒ...ïŒãscaleYïŒ...ïŒãscaleïŒ...ïŒã䜿çšããŠäžç座æšãç»é¢ã«å€æãããšãããããèæ ®ããŸãã
DiagramActorããã³DiagramUseCaseãªããžã§ã¯ãã¯å®å šã«ãç¬ç«ãããŠããããããã®äœçœ®ã¯mXããã³mYãã£ãŒã«ãã«æ ŒçŽãããŠããå éšç¶æ ã«ãã£ãŠå®å šã«æ±ºå®ãããŸãã åæã«ããã¹ãŠã®çš®é¡ã®æ¥ç¶ç¢å°ã«ã¯ç¬èªã®ç¶æ ããããŸãããç»é¢äžã®äœçœ®ã¯ãæ¥ç¶ãããªããžã§ã¯ãã®äœçœ®ã«ãã£ãŠå®å šã«æ±ºå®ãããå®å šã«ãç¬ç«ãã§ã¯ãªãããªããžã§ã¯ãã®äžå¿ãçµã¶çŽç·ã«æ²¿ã£ãŠç§»åããŸãïŒ
ãŸããåå¥ã«ãªããžã§ã¯ãã®çœ²åã«æ³šæããå¿ èŠããããŸãã å éšç¶æ ã§ã¯ã絶察座æšã§ã¯ãªãã芪ã®æç»ãªããžã§ã¯ãã«å¯Ÿãããªãã»ãããä¿åãããããããåç¬ç«ãã«åäœããŸãã
ããŠã¹ã«ãŒãœã«ã®äžã®ãªããžã§ã¯ãã®å®çŸ©
å³é¢ãæ±ã£ãåŸãã©ã®ãªããžã§ã¯ããã¯ãªãã¯ããããããã£ãŒããã©ã®ããã«ãç解ãããããšãã質åã«ç§»ããŸãã ããŠã¹ã«ãŒãœã«ã®äžã®ãªããžã§ã¯ãã決å®ããã¿ã¹ã¯ã¯ãã¬ã³ããªã³ã°ã¿ã¹ã¯ãšéåžžã«ãã䌌ãŠãããããæå³ã§ã¯å¯Ÿç§°çã§ãã
ãŸããç¹å®ã®ãã£ãŒããªããžã§ã¯ãããšã«ãã«ãŒãœã«ããã®ãªããžã§ã¯ãäžã«ãããã©ãããããŠã¹ã«ãŒãœã«ã®åº§æšã«ãã£ãŠæ±ºå®ããã¡ãœãããèšè¿°ããããšã¯é£ãããããŸããã
ããšãã°ãDiagramActorã®å Žåãé·æ¹åœ¢ã®é åã«å ¥ãããšã«ã€ããŠè©±ããŸãïŒ
protected boolean internalTestHit(double x, double y) { double dX = x - getmX(); double dY = y - getmY(); return dY > -ACTOR_HEIGHT / 2 && dY < ACTOR_HEIGHT / 2 && dX > -ACTOR_WIDTH / 2 && dX < ACTOR_WIDTH / 2; }
DiagramUseCaseã«ã€ããŠã¯ãæ¥åã®ããã«èŠããé åã«å ¥ãããšã«ã€ããŠè©±ããŠããŸãïŒ
protected boolean internalTestHit(double x, double y) { double dX = 2 * getScale() * (x - getmX()) / (width + 2 * MARGIN / getScale()); double dY = 2 * (y - getmY()) / HEIGHT; return dX * dX + dY * dY <= 1; }
ããã§ãã«ãŒãœã«ã眮ãããŠãããªããžã§ã¯ããç¹å®ãããå Žåãã·ãŒã±ã³ã·ã£ã«æ€çŽ¢ã«ãã£ãŠåãã£ãŒããªããžã§ã¯ãã®internalTestHitãåŒã³åºãããšãã§ããtrueãè¿ãæåã®ãªããžã§ã¯ããç®çã®ãªããžã§ã¯ãã«ãªããŸãã ããã¯ãã¬ã³ããªã³ã°ã®éã®é åºã§ã®ã¿è¡ãå¿ èŠããããŸãïŒããŒã¿æ§é ã瀺ãå³ã®éãç¢å°ã«æ²¿ã£ã移åïŒïŒ ããŠã¹ã«ãŒãœã«ãè€æ°ã®ãªããžã§ã¯ãã亀差ããé åã«ããå Žåãã«ãŒãœã«ãä»ã®ãªããžã§ã¯ããããé ãæç»ããããªããžã§ã¯ããã€ãŸãèŠèŠçã«ãä»ã®ãªããžã§ã¯ãã®äžãã«ãããããã®ã¯éé ã®æ€çŽ¢ã§ãã
å¥ã®DiagramObjectãã³ãã¬ãŒãã¡ãœããã§ã®å®è£ æ¹æ³ã¯æ¬¡ã®ãšããã§ãã
public final DiagramObject testHit(int x, int y) { DiagramObject result; DiagramObject curObj = last; while (assigned(curObj)) { result = curObj.testHit(x, y); if (assigned(result)) return result; curObj = curObj.previous; } if (internalTestHit(x / scale + dX, y / scale + dY)) result = this; else { result = null; } return result; }
DiagramPanelãªããžã§ã¯ãã¯ãã«ãŒãã¬ã³ããªã³ã°ãªããžã§ã¯ãã®testHitã¡ãœãããåŒã³åºããŸãã å®è¡äžã«ãæç»æ¹åãšã¯å察ã®æ¹åã«æ·±ãã§ã¬ã³ããªã³ã°ããªãŒã暪æããååž°ãè¡ãããŸãã æåã«èŠã€ãã£ããªããžã§ã¯ããè¿ãããŸããããã¯ãããŠã¹ã«ãŒãœã«ã®äžã«ããããŠãŒã¶ãŒã®èŠç¹ããèŠãããããããªããžã§ã¯ãã«ãªããŸãã
ããŠã¹ã«ãŒãœã«ã®äžã®çŸåšã®ã³ã³ããã¹ãã®å®çŸ©
ããŠã¹ã«ãŒãœã«ã®äžã®ãªããžã§ã¯ãã¯ããã倧ããªãªããžã§ã¯ãã®äžå¯æ¬ ãªéšåã«ãããªãããç¬ç«ããæå³ãæã€ããšã¯ã§ããŸããã ãªããžã§ã¯ãã«å¯ŸããŠäœããã®æäœãå®è¡ãããã®éšåãããŠã¹ã§ã¯ãªãã¯ããå Žåã¯ã芪ãªããžã§ã¯ãã«å¯ŸããŠæäœãå®è¡ããå¿ èŠããããŸãã è€åãã¿ãŒã³ã®äœ¿çšã«é¢é£ããææ³ã§ããå§ä»»ã®å©ããåããŠãã³ã³ããã¹ããæ£ãã衚瀺ããããšãã§ããŸãïŒãã®ããŒãã«é¢ããæ¬ãã¶ã€ã³ãã¿ãŒã³ãåç §ããŠãã ããïŒã ãã®äŸã§ã¯ãå§ä»»ã䜿çšããŠãªããžã§ã¯ãã®ããŒã«ããããååŸããŸããããšãã°ããŠãŒã¶ãŒãã¢ã¯ã¿ãŒã®çœ²åã®äžã«ããŠã¹ã«ãŒãœã«ã移åãããšãã«ãŒãœã«ãã¢ã¯ã¿ãŒèªäœã«çœ®ããããšããšåããã³ããååŸããŸãã
èãæ¹ã¯éåžžã«åçŽã§ããDiagramObjectã¯ã©ã¹ã®getHintïŒïŒã¡ãœããã¯æ¬¡ã®ããšãè¡ããŸããinternalGetHintïŒïŒã¡ãœããã®ç¬èªã®å®è£ ãããã³ããæååãè¿ãããšãã§ããå Žåãæ»ããŸãã ãããã§ããªãå ŽåãïŒã¬ã³ããªã³ã°éå±€å ã®ïŒèŠªã«ã¢ã¯ã»ã¹ããŠãgetHintïŒïŒã¡ãœãããå®è¡ã§ãããã©ããã確èªããŸãã ããããè¡ãããªããå Žåãã責任ã®ç§»è»¢ãã¯ãéåžžã«æ ¹æ¬çãªãªããžã§ã¯ãåŒãåºããŸã§ç¶ããŸãã å§ä»»ã¡ã«ããºã ã«å ããŠã ãã³ãã¬ãŒãã¡ãœãããã¿ãŒã³ãå床é©çšããŸãã
public String getHint() { StringBuilder hintStr = new StringBuilder(); if (internalGetHint(hintStr)) return hintStr.toString(); else if (assigned(parent)) return parent.getHint(); else { return ""; } } protected boolean internalGetHint(StringBuilder hintStr) { return false; }
ãã«ããŒã¡ãœããDiagramObject
DiagramObjectã®çžç¶äººã¯ã次ã®ã¡ãœããããªãŒããŒã©ã€ãã§ããŸããDiagramPanelã¯ã©ã¹ã§ã®ãããã®äœ¿çšã¯ã以äžããæããã«ãªããŸãã
- boolean isCollectableïŒïŒ-ãæãçžãïŒé·æ¹åœ¢ã®éžæïŒã䜿çšããŠãªããžã§ã¯ãããã£ããã£ã§ãããã©ããã DiagramPanelã¡ã«ããºã ã§äœ¿çšãããŸããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
- boolean isMoveableïŒïŒ-ãªããžã§ã¯ãããã©ãã°ã¢ã³ãããããã䜿çšããŠç§»åå¯èœãã©ããã ãã®äŸã§ã¯ããã€ã¢ã°ã©ã ã®ããŒãïŒActorããã³UseCaseïŒã¯ç§»åå¯èœã§ãããæãçžã䜿çšããŠãã£ããã£ãããŸãããæ¥ç¶ç·ïŒAssociationãGeneralizationãDependencyïŒã¯ç§»åã§ããŸããã
- double getMinXïŒïŒãgetMinYïŒïŒãgetMaxXïŒïŒãgetMaxYïŒïŒ-ãªããžã§ã¯ãã®å·Šç«¯ãæé«ç¹ãå³ç«¯ãããã³æäœç¹ã®äžç座æšã 1ã€ç®ã¯ãé·æ¹åœ¢ã®éžæãæ£ããæ©èœããããã«å¿ èŠã§ãïŒãªããžã§ã¯ããéžæããã«ã¯ãå šäœãšããŠãã£ããã£ããå¿ èŠããããŸãïŒã2ã€ç®ã¯ããã®è§ã«ãªããžã§ã¯ãã®éžæãæç»ããinternalDrawSelectionïŒïŒã¡ãœããã®ããã©ã«ãã®å®è£ ã§äœ¿çšãããŸãã
- final int minXïŒïŒãminYïŒïŒãmaxXïŒïŒãmaxYïŒïŒ-åãã§ããããã§ã«ç»é¢åº§æšã«å€æãããŠããŸãïŒåå®çŸ©ãããã¡ãœããã§ã¯ãããŸããïŒã
å³é¢ã®éžæ
æåŸã«ãDiagramObjectã¬ãã«ã§å®è£ ãããå¥ã®éèŠãªæ©èœã¯ããã®åå«ã§åå®çŸ©ã§ããŸãããéžæãã€ãŸãã°ã©ãã£ãã¯ã©ãã«ãæç»ããŸããããã«ããããŠãŒã¶ãŒã¯ãªããžã§ã¯ããéžæãããç¶æ ã«ããããšãç解ã§ããŸãã ããã©ã«ãã§ã¯ããããã¯ãªããžã§ã¯ãã®è§ã«ãã4ã€ã®éãæ£æ¹åœ¢ã®ãããã§ãã
private static final int L = 4; protected void internalDrawSelection(Graphics canvas, int dX, int dY) { canvas.setColor(Color.BLUE); canvas.setXORMode(Color.WHITE); canvas.fillRect(minX() + dX - L, minY() + dY - L, L, L); canvas.fillRect(maxX() + dX, minY() + dY - L, L, L); canvas.fillRect(minX() + dX - L, maxY() + dY, L, L); canvas.fillRect(maxX() + dX, maxY() + dY, L, L); canvas.setPaintMode(); }
æŽæ°ïŒãããã£ãŠç»é¢åº§æšïŒãã©ã¡ãŒã¿ãŒdXãdYãããã³setXORModeïŒïŒã®åŒã³åºãã«æ³šæããŠãã ãããããã¯ãã¬ã³ããªã³ã°ã³ã³ããã¹ãããXORã¢ãŒããã«åãæ¿ããŸãããã®ã¢ãŒãã§ã¯ã以åã«æç»ããç»åãæ¶å»ããã«ã¯ãåæç»ããã ãã§ååã§ããããã¯ããã£ãŒããªããžã§ã¯ãã«ãã©ãã°ã¢ã³ããããããå®è£ ããããã«å¿ èŠã§ããç°¡åã«ããããã«ãç»åèªäœã§ã¯ãªããããŠã¹ã§ããã©ãã°ãããŠãç»åãæ°ããå Žæã«è»¢éããŸããç»é¢å ã®ãªããžã§ã¯ãã®ãªãã»ããã¯ãdXãdYãã©ã¡ãŒã¿éå§äœçœ®ãåºæºãšãã座æšïŒ
ã·ã¹ãã ã®ãã®åäœãé©åã§ãªãå ŽåãDiagramObjectã¯ã©ã¹ã®ç¶æ¿è ã®internalDrawSelectionã¡ãœããããªãŒããŒã©ã€ãããŠãéžæãšããŠããè€éãªãã®ãæç»ããŸãïŒãããŠãã©ãã°ã¢ã³ãããããã§ç§»åããŸãïŒã
* * *
DrawObjectã¯ã©ã¹ã«ã€ããŠã¯ä»¥äžã§ãããã®èšäºã®ç¬¬2éšã§ã¯ãDiagramPanelã¯ã©ã¹ã®æ§ç¯ã«ã€ããŠèª¬æããŸãããã®ã¯ã©ã¹ã¯ãããŠã¹ã€ãã³ãã®åŠçãã¹ã±ãŒãªã³ã°ããã³ããªããžã§ã¯ãã®éžæãããã³ãã©ãã°ã¢ã³ããããããæ åœããŸãããã®äŸã®å®å šãªãœãŒã¹ã³ãŒãã¯ãhttpsïŒ//github.com/inponomarev/graphexampleããå ¥æã§ããMavenã䜿çšããŠã³ã³ãã€ã«ã§ããŸãã