翻蚳è ãã
ããŸã人æ°ã®ãªãããã°ã©ãã³ã°ç°å¢ã®ããã«20幎åã«éçºããããã¬ãŒã ã¯ãŒã¯ã®ããã€ãã®è³æã翻蚳ããããšã«ããã®ã«ã¯ã2ã€ã®çç±ããããŸãã
1.æ°å¹Žåã.Netãã©ãããã©ãŒã ã®ORMãšããŠEntity Frameworkã䜿çšããåã³ã®å€ããåŠãã ã®ã§ãLazarusç°å¢ã®ã¢ããã°ããããŠäžè¬çã«ã¯freepascalã®é¡äŒŒç©ãç¡é§ã«æ€çŽ¢ããŸããã
é©ãã¹ãããšã«ã圌女ã«ãšã£ãŠè¯ãORMã¯ãããŸããã ãã®æã«èŠã€ãã£ãã®ã¯ã tiOPFãšåŒã°ãããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã ã㧠ã90幎代åŸåã«ãã«ãã¡ã€ã®ããã«éçºãããåŸã«freepascalã«ç§»æ€ãããŸããã ãã ãããã®ãã¬ãŒã ã¯ãŒã¯ã¯ã倧ãããŠåãORMã®éåžžã®å€èŠ³ãšã¯æ ¹æ¬çã«ç°ãªããŸãã
ãªããžã§ã¯ããèšèšããèŠèŠçãªæ¹æ³ã¯ãªãïŒãšã³ãã£ãã£-ã¢ãã«ãæåïŒãtiOPFã®ãªããžã§ã¯ãããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ããŒãã«ã®ãã£ãŒã«ãã«ãããã³ã°ããïŒãšã³ãã£ãã£-ããŒã¿ããŒã¹ãæåïŒã éçºè èªèº«ããã®äºå®ããããžã§ã¯ãã®æ¬ ç¹ã®1ã€ãšããŠäœçœ®ä»ããŠããŸãããã¡ãªãããšããŠã圌ã¯ç¹ã«ãªããžã§ã¯ãããžãã¹ã¢ãã«ã«é¢ããŠå®å šãªãªãªãšã³ããŒã·ã§ã³ãæäŸããŠããŸãã
ææ¡ãããããŒãã³ãŒãã£ã³ã°ã®ã¬ãã«ã§åé¡ãçºçããŸããã åœæãç§ã¯ãã¬ãŒã ã¯ãŒã¯éçºè ãå®å šã«äœ¿çšãããã©ã°ã©ãããšã«ããã¥ã¡ã³ãã§äœåºŠãèšåãããã©ãã€ã ãšæ¹æ³ã«ç²ŸéããŠããŸããã§ããïŒããžã¿ãŒããªã³ã«ãŒããªãã¶ãŒããŒã®èšèšãã¿ãŒã³ãDBMSç¬ç«ã®ããã®ããã€ãã®æœè±¡åã¬ãã«ãªã©ïŒ ãïŒã åœæã®ç§ã®ããŒã¿ããŒã¹ã§ã®å€§èŠæš¡ãªãããžã§ã¯ãã¯ãLazarusã®èŠèŠã³ã³ããŒãã³ããšèŠèŠç°å¢ãæäŸããããŒã¿ããŒã¹ã®æäœæ¹æ³ã«å®å šã«çŠç¹ãåœãŠãŠããŸããããã®çµæãåãã³ãŒãã倧éã«ãããŸããããŒã¿ããŒã¹èªäœã«ã»ãŒåãæ§é ãšåçš®ã®ããŒã¿ãæã€3ã€ã®ããŒãã«ã衚瀺çšã®3ã€ã®åäžã®ãã©ãŒã ãç·šéçšã®3ã€ã®åäžã®ãã©ãŒã ãã¬ããŒãçšã®3ã€ã®åäžã®ãã©ãŒã ãããã³ããœãããŠã§ã¢ã®èšèšæ¹æ³ãã®èŠåºãã®ãã®ä»ãã¹ãŠã
ãã³ãã¬ãŒãã®ç 究ãå«ããããŒã¿ããŒã¹ãšæ å ±ã·ã¹ãã ã®æ£ããèšèšã®ååã«é¢ããååãªæç®ãèªã¿ãEntity Frameworkã«ç²ŸéããŠãããŒã¿ããŒã¹èªäœãšã¢ããªã±ãŒã·ã§ã³ã®äž¡æ¹ãå®å šã«ãªãã¡ã¯ã¿ãªã³ã°ããããšã«ããŸããã ãããŠãç§ãæåã®ã¿ã¹ã¯ã«å®å šã«å¯ŸåŠããå Žåã2çªç®ã®ã¿ã¹ã¯ã®å®è£ ã§ã¯ãç°ãªãæ¹åã«é²ã2ã€ã®éããããŸãããå®å šã«.netãCïŒãããã³ãšã³ãã£ãã£ãã¬ãŒã ã¯ãŒã¯ã調æ»ããããããªãã¿ã®Lazarusã·ã¹ãã ã«é©åãªORMãèŠã€ãããã§ãã ãŸããç®ç«ããªã3çªç®ã®ç®ç«ããªãèªè»¢è»éããããŸãããèªåã®ããŒãºã«åãããŠORMãäœæããããšã§ãããããã¯ä»ã®ãã€ã³ãã§ã¯ãããŸããã
ãã¬ãŒã ã¯ãŒã¯ã®ãœãŒã¹ã³ãŒãã¯ããŸãã³ã¡ã³ããããŠããŸããããããã§ãéçºè ã¯ïŒæããã«éçºã®åæ段éã§ïŒäžå®éã®ããã¥ã¡ã³ããæºåããŸããã ãã¡ããããã¹ãŠãè±èªã話ãã®ã§ãçµéšäžãã³ãŒããå³è¡šããã³ãã¬ãŒãããã°ã©ãã³ã°ãã¬ãŒãºãè±å¯ã«ããã«ãããããããå€ãã®ãã·ã¢èªã話ãããã°ã©ããŒã¯äŸç¶ãšããŠè±èªã®ããã¥ã¡ã³ãã«ããŸãåããŸããã å¿ ããããã¹ãŠã®äººããè±èªã®æè¡çãªããã¹ãããã·ã¢èªã«ç¿»èš³ããå¿ãå¿ èŠãšããã«ç解ããèœåãèšç·Žããããšæãã§ããããã§ã¯ãããŸããã
ããã«ã翻蚳çšã®ããã¹ããç¹°ãè¿ãæ ¡æ£ããããšã§ãããã¥ã¡ã³ãã«åããŠäŒã£ããšãã«èŠèœãšããŠãããã®ã確èªã§ããŸãããå®å šã«ãŸãã¯æ£ããç解ã§ããŸããã§ããã ã€ãŸããããã¯èªåã«ãšã£ãŠãç 究äžã®ãã¬ãŒã ã¯ãŒã¯ãããããåŠã¶æ©äŒã§ãã
2.ææžã§ã¯ãèè ã¯ãããããèªåã®æèŠã§æãããªããã€ãã®ã³ãŒããæå³çã«ã¹ããããããã¹ãããããŸããã èšè¿°ã®å¶éã«ãããããã¥ã¡ã³ãã§ã¯ããã¬ãŒã ã¯ãŒã¯ã®æ°ããããŒãžã§ã³ã§åé€ãããããŸãã¯äœ¿çšãããªããªã£ãå€ãã¡ã«ããºã ãšãªããžã§ã¯ããäŸãšããŠäœ¿çšããŠããŸãïŒããããããèªäœã¯éçºãç¶ããŠãããšã¯èšããŸããã§ãããïŒïŒ ãŸããéçºããäŸãèªåã§ç¹°ãè¿ãããšãã«ãä¿®æ£ãã¹ããšã©ãŒãããã€ãèŠã€ãããŸããã ãã®ãããããã¹ãã翻蚳ããã ãã§ãªããé¢é£æ§ãç¶æããããã«ããã¹ããè£è¶³ãŸãã¯ä¿®æ£ããããšãèªåã«èš±å¯ããäŸã¯æ©èœããŠããŸããã
ãã¬ãŒã ã¯ãŒã¯å šäœãç«ã£ãŠããæåã®ãã¯ãžã©ãã«ã€ããŠã®ããŒã¿ãŒã»ãã³ãªã¯ãœã³ã®èšäºããã®è³æã®ç¿»èš³ãéå§ããã-蚪åè ãã³ãã¬ãŒãã å ã®ããã¹ãã¯ããã«æçš¿ãããŸãã ã
蚪åè ããã³tiOPFãã³ãã¬ãŒã
ãã®èšäºã®ç®çã¯ãtiOPFïŒTechInsite Object Persistence FrameworkïŒãã¬ãŒã ã¯ãŒã¯ã®äž»èŠãªæŠå¿µã®1ã€ã§ããããžã¿ãŒãã³ãã¬ãŒãã玹ä»ããããšã§ãã ããžã¿ãŒã䜿çšããåã«ä»£æ¿ãœãªã¥ãŒã·ã§ã³ãåæããåŸãåé¡ã詳现ã«æ€èšããŸãã ç¬èªã®ããžã¿ãŒã³ã³ã»ãããéçºããããã»ã¹ã§ã¯ãã³ã¬ã¯ã·ã§ã³å ã®ãã¹ãŠã®ãªããžã§ã¯ããå埩åŠçããå¿ èŠããããšããå¥ã®èª²é¡ã«çŽé¢ããŸãã ãã®åé¡ã調æ»ãããŸãã
äž»ãªã¿ã¹ã¯ã¯ãã³ã¬ã¯ã·ã§ã³å ã®ããã€ãã®ãªããžã§ã¯ãã«å¯ŸããŠäžé£ã®é¢é£ã¡ãœãããå®è¡ããäžè¬çãªæ¹æ³ãèæ¡ããããšã§ãã å®è¡ãããã¡ãœããã¯ããªããžã§ã¯ãã®å éšç¶æ ã«ãã£ãŠç°ãªãå ŽåããããŸãã ã¡ãœãããå®è¡ããããšã¯ãŸã£ããã§ããŸããããåããªããžã§ã¯ãã«å¯ŸããŠè€æ°ã®ã¡ãœãããå®è¡ã§ããŸãã
å¿ èŠãªãã¬ãŒãã³ã°ã¬ãã«
èªè ã¯ãªããžã§ã¯ããã¹ã«ã«ã«ç²Ÿéãããªããžã§ã¯ãæåããã°ã©ãã³ã°ã®åºæ¬ååãç¿åŸããå¿ èŠããããŸãã
ãã®èšäºã®ãµã³ãã«ããžãã¹ã¿ã¹ã¯
äŸãšããŠã人ãšãã®é£çµ¡å æ å ±ã®èšé²ãäœæã§ããã¢ãã¬ã¹åž³ãéçºããŸãã 人ãšäººãšã®ã³ãã¥ãã±ãŒã·ã§ã³ã®å¯èœæ§ã®ããæ¹æ³ã®å¢å ã«äŒŽããã¢ããªã±ãŒã·ã§ã³ã¯ãå€§å¹ ãªã³ãŒãåŠçãªãã§ãã®ãããªã¡ãœãããæè»ã«è¿œå ã§ããããã«ããå¿ èŠããããŸãïŒé»è©±çªå·ãè¿œå ããããã®ã³ãŒãã®åŠçãå®äºããããããã«å床åŠçããŠã¡ãŒã«ãè¿œå ããå¿ èŠããããŸããïŒã äœæã«ã¯ãèªå® ã®äœæãéµäŸ¿ãè·å Žãé»åãªã©ã®2ã€ã®ã«ããŽãªã®äœæãæäŸããå¿ èŠããããŸããåºå®é»è©±ããã¡ãã¯ã¹ãã¢ãã€ã«ãã¡ãŒã«ããŠã§ããµã€ãã§ãã
ãã¬ãŒã³ããŒã·ã§ã³ã¬ãã«ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã¯Explorer / Outlookã®ããã«èŠããã¯ãã§ããã€ãŸããTreeViewãListViewãªã©ã®æšæºã³ã³ããŒãã³ãã䜿çšããããšã«ãªã£ãŠããŸãã ã¢ããªã±ãŒã·ã§ã³ã¯è¿ éã«åäœããé¢åãªã¯ã©ã€ã¢ã³ã/ãµãŒããŒãœãããŠã§ã¢ã®å°è±¡ãäžããªãã¯ãã§ãã
ã¢ããªã±ãŒã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã

ããªãŒã®ã³ã³ããã¹ãã¡ãã¥ãŒã§ãå人ãŸãã¯äŒç€Ÿã®é£çµ¡å ã®è¿œå /åé€ãéžæããé£çµ¡å ããŒã¿ã®ãªã¹ããå³ã¯ãªãã¯ããŠãããŒã¿ãç·šéãåé€ããŸãã¯è¿œå ããããã®ãã€ã¢ãã°ãåŒã³åºããŸãã
ããŒã¿ã¯ããŸããŸãªåœ¢åŒã§ä¿åã§ããŸããä»åŸããã®ãã³ãã¬ãŒãã䜿çšããŠãã®æ©èœãå®è£ ããæ¹æ³ãæ€èšããŸãã
å§ããåã«
ãªããžã§ã¯ãã®åçŽãªã³ã¬ã¯ã·ã§ã³ãã€ãŸãååïŒååïŒãšã¢ãã¬ã¹ïŒEmailAdrsïŒã®2ã€ã®ããããã£ãæã€ãŠãŒã¶ãŒã®ãªã¹ãã§äœæ¥ãéå§ããŸãã ãŸãããªã¹ãã«ã³ã³ã¹ãã©ã¯ã¿ãŒã®ããŒã¿ãå ¥åããããã®åŸãã¡ã€ã«ãŸãã¯ããŒã¿ããŒã¹ããããŒããããŸãã ãã¡ãããããã¯éåžžã«åçŽåãããäŸã§ãããVisitorãã³ãã¬ãŒããå®å šã«å®è£ ããã«ã¯ååã§ãã
æ°ããã¢ããªã±ãŒã·ã§ã³ãäœæããã¡ã€ã³ã¢ãžã¥ãŒã«ã®ã€ã³ã¿ãŒãã§ã€ã¹ã»ã¯ã·ã§ã³ã®2ã€ã®ã¯ã©ã¹ãè¿œå ããŸããTPersonListïŒTObjectListããç¶æ¿ãããusesã¢ãžã¥ãŒã«contnrsã§æ¥ç¶ãå¿ èŠïŒãšTPersonïŒTObjectããç¶æ¿ïŒïŒ
TPersonList = class(TObjectList) public constructor Create; end; TPerson = class(TObject) private FEMailAdrs: string; FName: string; public property Name: string read FName write FName; property EMailAdrs: string read FEMailAdrs write FEMailAdrs; end;
TPersonListã³ã³ã¹ãã©ã¯ã¿ãŒã§ã3ã€ã®TPersonãªããžã§ã¯ããäœæãããªã¹ãã«è¿œå ããŸãã
constructor TPersonList.Create; var lData: TPerson; begin inherited; lData := TPerson.Create; lData.Name := 'Malcolm Groves'; lData.EMailAdrs := 'malcolm@dontspamme.com'; // (ADUG Vice President) Add(lData); lData := TPerson.Create; lData.Name := 'Don MacRae'; // (ADUG President) lData.EMailAdrs := 'don@dontspamme.com'; Add(lData); lData := TPerson.Create; lData.Name := 'Peter Hinrichsen'; // (Yours truly) lData.EMailAdrs := 'peter_hinrichsen@dontspamme.com'; Add(lData); end;
ãŸãããªã¹ãã調ã¹ãŠããªã¹ãã®åèŠçŽ ã«å¯ŸããŠ2ã€ã®æäœãå®è¡ããŸãã æäœã¯äŒŒãŠããŸãããåãã§ã¯ãããŸãããTPersonãªããžã§ã¯ãã®Nameããããã£ãšEmailAdrsããããã£ã®å 容ã衚瀺ããåçŽãªShowMessageåŒã³åºãã§ãã ãã©ãŒã ã«2ã€ã®ãã¿ã³ãè¿œå ãã次ã®ããã«ååãä»ããŸãã

ãã©ãŒã ã®åªå ã¹ã³ãŒãã§ã¯ãTPersonListåã®ããããã£ïŒãŸãã¯ãã£ãŒã«ãïŒFPersonListïŒåããã©ãŒã ã®äžã§å®£èšãããŠããå Žåãé åºãå€æŽããããäºåã®å宣èšãè¡ãïŒãè¿œå ããonCreateã€ãã³ããã³ãã©ãŒã§ã³ã³ã¹ãã©ã¯ã¿ãŒãåŒã³åºãå¿ èŠããããŸãïŒ
FPersonList := TPersonList.Create;
ãã©ãŒã ã®onCloseã€ãã³ããã³ãã©ã§ã¡ã¢ãªãé©åã«è§£æŸããã«ã¯ããã®ãªããžã§ã¯ããç Žæ£ããå¿ èŠããããŸãã
FPersonList.Free.
æé 1.ããŒãã³ãŒãã®å埩
TPersonãªããžã§ã¯ãã®ååã衚瀺ããã«ã¯ãæåã®ãã¿ã³ã®onClickã€ãã³ããã³ãã©ãŒã«æ¬¡ã®ã³ãŒããè¿œå ããŸãã
procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin for i := 0 to FPersonList.Count - 1 do ShowMessage(TPerson(FPersonList.Items[i]).Name); end;
2çªç®ã®ãã¿ã³ã®å Žåããã³ãã©ãŒã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãã
procedure TForm1.Button2Click(Sender: TObject); var i: integer; begin for i := 0 to FPersonList.Count - 1 do ShowMessage(TPerson(FPersonList.Items[i]).EMailAdrs); end;
ãã®ã³ãŒãã®æãããªéšåã¯æ¬¡ã®ãšããã§ãã
- ã»ãšãã©åãããšãè¡ã2ã€ã®ã¡ãœããã ãã¹ãŠã®éãã¯ã衚瀺ããããªããžã§ã¯ãã®ããããã£ã®ååã®ã¿ã§ãã
- ç¹ã«ã³ãŒãã®100ç®æã«åæ§ã®ã«ãŒããæžãããšãäœåãªããããå Žåãå埩ã¯éå±ã«ãªããŸãã
- TPersonãžã®ããŒããã£ã¹ãã«ã¯äŸå€çãªç¶æ³ã䌎ããŸãã ã¢ãã¬ã¹ããããã£ã®ãªããªã¹ãã«TAnimalã®ã€ã³ã¹ã¿ã³ã¹ãããå Žåã¯ã©ããªããŸããïŒ ãã®ã³ãŒãã§ã¯ããšã©ãŒãåæ¢ããŠé²åŸ¡ããã¡ã«ããºã ã¯ãããŸããã
æœè±¡åãå°å ¥ããŠã³ãŒããæ¹åããæ¹æ³ãèããŠã¿ãŸããããå埩åã³ãŒãã芪ã¯ã©ã¹ã«æž¡ããŸãã
ã¹ããã2.ã€ãã¬ãŒã¿ãŒã®æœè±¡å
ãããã£ãŠãã€ãã¬ãŒã¿ããžãã¯ãåºæ¬ã¯ã©ã¹ã«ç§»åããŸãã ãªã¹ãã€ãã¬ãŒã¿èªäœã¯éåžžã«åçŽã§ãã
for i := 0 to FList.Count - 1 do // - âŠ
Iteratorãã³ãã¬ãŒãã®äœ¿çšãèšç»ããŠããããã§ãã Gang-of-Fourã®èšèšãã¿ãŒã³ã®æ¬ã«é¢ããæ¬ãããIteratorã¯å€éšãšå éšã®äž¡æ¹ã«ãªãåŸãããšãç¥ãããŠããŸãã å€éšã€ãã¬ãŒã¿ã䜿çšããå Žåãã¯ã©ã€ã¢ã³ãã¯Nextã¡ãœãããåŒã³åºãããšã«ããããã©ããŒãµã«ãæ瀺çã«å¶åŸ¡ããŸãïŒããšãã°ãTCollectionèŠçŽ ã®åæã¯ãFirstãNextãLastã¡ãœããã«ãã£ãŠå¶åŸ¡ãããŸãïŒã ããã§å éšã€ãã¬ãŒã¿ã䜿çšããŸããããã¯ãç®çã§ããããªãŒãã«ãã䜿çšããŠããªãŒãã©ããŒãµã«ãå®è£ ããæ¹ãç°¡åã ããã§ãã ãªã¹ãã¯ã©ã¹ã«Iterateã¡ãœãããè¿œå ããããã«ã³ãŒã«ããã¯ã¡ãœãããæž¡ããŸããããã¯ãªã¹ãã®åèŠçŽ ã§å®è¡ããå¿ èŠããããŸãã ãªããžã§ã¯ããã¹ã«ã«ã®ã³ãŒã«ããã¯ã¯æç¶ãåãšããŠå®£èšãããŸããããšãã°ãTDoSomethingToAPersonããããŸãã
ãããã£ãŠãTPersonåã®ãã©ã¡ãŒã¿ãŒã1ã€åãæç¶ãåTDoSomethingToAPersonã宣èšããŸãã æç¶ãåã䜿çšãããšãã¡ãœãããå¥ã®ã¡ãœããã®ãã©ã¡ãŒã¿ãŒãšããŠäœ¿çšã§ããŸããã€ãŸããã³ãŒã«ããã¯ãå®è£ ã§ããŸãã ãã®æ¹æ³ã§ã2ã€ã®ã¡ãœãããäœæããŸãã1ã€ã¯ãªããžã§ã¯ãã®Nameããããã£ã衚瀺ãããã1ã€ã¯EmailAdrsããããã£ã衚瀺ããŸãããããã®ã¡ãœããèªäœã¯ããã©ã¡ãŒã¿ãšããŠäžè¬çãªã€ãã¬ãŒã¿ã«æž¡ãããŸãã æåŸã«ãå宣èšã»ã¯ã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
{ TPerson } TPerson = class(TObject) private FEMailAdrs: string; FName: string; public property Name: string read FName write FName; property EMailAdrs: string read FEMailAdrs write FEMailAdrs; end; TDoSomethingToAPerson = procedure(const pData: TPerson) of object; { TPersonList } TPersonList = class(TObjectList) public constructor Create; procedure DoSomething(pMethod: TDoSomethingToAPerson); end; DoSomething: procedure TPersonList.DoSomething(pMethod: TDoSomethingToAPerson); var i: integer; begin for i := 0 to Count - 1 do pMethod(TPerson(Items[i])); end;
ããã§ããªã¹ãã¢ã€ãã ã«å¯ŸããŠå¿ èŠãªã¢ã¯ã·ã§ã³ãå®è¡ããã«ã¯ã2ã€ã®ããšãè¡ãå¿ èŠããããŸãã ãŸããTDoSomethingToAPersonã§æå®ãããã·ã°ããã£ãæã€ã¡ãœããã䜿çšããŠå¿ èŠãªæäœã決å®ãã次ã«ããããã®ã¡ãœãããžã®ãã€ã³ã¿ãŒããã©ã¡ãŒã¿ãŒãšããŠæž¡ããŠDoSomethingåŒã³åºããèšè¿°ããŸãã ãã©ãŒã ã®èª¬æã»ã¯ã·ã§ã³ã§ã2ã€ã®å®£èšãè¿œå ããŸãã
private FPersonList: TPersonList; procedure DoShowName(const pData: TPerson); procedure DoShowEmail(const pData: TPerson);
ãããã®ã¡ãœããã®å®è£ ã§ã¯ã次ã®ããšã瀺ããŸãã
procedure TForm1.DoShowName(const pData: TPerson); begin ShowMessage(pData.Name); end; procedure TForm1.DoShowEmail(const pData: TPerson); begin ShowMessage(pData.EMailAdrs); end;
ãã¿ã³ãã³ãã©ãŒã®ã³ãŒãã¯æ¬¡ã®ããã«å€æŽãããŸãã
procedure TForm1.Button1Click(Sender: TObject); begin FPersonList.DoSomething(@DoShowName); end; procedure TForm1.Button2Click(Sender: TObject); begin FPersonList.DoSomething(@DoShowEmail); end;
ãã§ã«è¯ãã çŸåšãã³ãŒãã«ã¯3ã€ã®ã¬ãã«ã®æœè±¡åããããŸãã äžè¬çãªã€ãã¬ãŒã¿ã¯ããªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãå®è£ ããã¯ã©ã¹ã¡ãœããã§ãã ããžãã¹ããžãã¯ïŒãããŸã§ã®ãšãããShowMessageã«ããç¡éã®ã¡ãã»ãŒãžåºåïŒã¯åå¥ã«é 眮ãããŸãã ãã¬ãŒã³ããŒã·ã§ã³ïŒã°ã©ãã£ã«ã«ã€ã³ã¿ãŒãã§ã€ã¹ïŒã¬ãã«ã§ã¯ãããžãã¹ããžãã¯ã¯1è¡ã§åŒã³åºãããŸãã
ShowMessageã®åŒã³åºãããTQueryãªããžã§ã¯ãã®SQLã¯ãšãªã䜿çšããŠTPersonããã®ããŒã¿ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã«ä¿åããã³ãŒãã«çœ®ãæããæ¹æ³ãæ³åããã®ã¯ç°¡åã§ãã ããšãã°ã次ã®ããã«ïŒ
procedure TForm1.SavePerson(const pData: TPerson); var lQuery: TQuery; begin lQuery := TQuery.Create(nil); try lQuery.SQL.Text := 'insert into people values (:Name, :EMailAdrs)'; lQuery.ParamByName('Name').AsString := pData.Name; lQuery.ParamByName('EMailAdrs').AsString := pData.EMailAdrs; lQuery.Datababase := gAppDatabase; lQuery.ExecSQL; finally lQuery.Free; end; end;
ãšããã§ãããã¯ããŒã¿ããŒã¹ãžã®æ¥ç¶ãç¶æãããšããæ°ããåé¡ããããããŸãã ãªã¯ãšã¹ãã§ã¯ãããŒã¿ããŒã¹ãžã®æ¥ç¶ã¯ã°ããŒãã«ãªgAppDatabaseãªããžã§ã¯ããä»ããŠå®è¡ãããŸãã ããããããã¯ã©ãã«ãããã©ã®ããã«åäœããã®ã§ããããïŒ ããã«ãã€ãã¬ãŒã¿ã®åã¹ãããã§èŠåŽããŠTQueryãªããžã§ã¯ããäœæããæ¥ç¶ãæ§æããã¯ãšãªãå®è¡ããã¡ã¢ãªã解æŸããããšãå¿ããªãã§ãã ããã SQLã¯ãšãªã®äœæãšå®è¡ãããã³ããŒã¿ããŒã¹ãžã®æ¥ç¶ã®èšå®ãšç¶æã®ããžãã¯ãã«ãã»ã«åããã¯ã©ã¹ã§ãã®ã³ãŒããã©ããããæ¹ãé©åã§ãã
ã¹ããã3.ã³ãŒã«ããã¯ãžã®ãã€ã³ã¿ãŒãæž¡ã代ããã«ãªããžã§ã¯ããæž¡ã
ãªããžã§ã¯ããåºæ¬ã¯ã©ã¹ã®å埩åã¡ãœããã«æž¡ããšãç¶æ ç¶æã®åé¡ã解決ããŸãã åäžã®Executeã¡ãœããã§æœè±¡Visitorã¯ã©ã¹TPersonVisitorãäœæãããªããžã§ã¯ãããã©ã¡ãŒã¿ãŒãšããŠãã®ã¡ââãœããã«æž¡ããŸãã æœè±¡ããžã¿ãŒã€ã³ã¿ãŒãã§ãŒã¹ã以äžã«ç€ºããŸãã
TPersonVisitor = class(TObject) public procedure Execute(pPerson: TPerson); virtual; abstract; end;
次ã«ãTPersonListã¯ã©ã¹ã«Iterateã¡ãœãããè¿œå ããŸãã
TPersonList = class(TObjectList) public constructor Create; procedure Iterate(pVisitor: TPersonVisitor); end;
ãã®ã¡ãœããã®å®è£ ã¯æ¬¡ã®ãšããã§ãã
procedure TPersonList.Iterate(pVisitor: TPersonVisitor); var i: integer; begin for i := 0 to Count - 1 do pVisitor.Execute(TPerson(Items[i])); end;
TPersonVisitorã¯ã©ã¹ã®å®è£ ãããVisitorã®ãªããžã§ã¯ãã¯Iterateã¡ãœããã«æž¡ãããããããã®ãªã¹ãé ç®ãå埩åŠçãããšãã«ãæå®ãããVisitorïŒãã®executeã¡ãœããïŒãTPersonã€ã³ã¹ã¿ã³ã¹ããã©ã¡ãŒã¿ãŒãšããŠåŒã³åºãããŸãã
Visitorã®2ã€ã®å®è£ ãTShowNameVisitorãšTShowEmailVistorãäœæããŸãããããããã¯å¿ èŠãªäœæ¥ãå®è¡ããŸãã ã¢ãžã¥ãŒã«ã€ã³ã¿ãŒãã§ã€ã¹ã»ã¯ã·ã§ã³ãè£å ããæ¹æ³ã¯æ¬¡ã®ãšããã§ãã
{ TShowNameVisitor } TShowNameVisitor = class(TPersonVisitor) public procedure Execute(pPerson: TPerson); override; end; { TShowEmailVisitor } TShowEmailVisitor = class(TPersonVisitor) public procedure Execute(pPerson: TPerson); override; end;
ç°¡åã«ããããã«ããããã«å¯Ÿããexecuteã¡ãœããã®å®è£ ã¯ãShowMessageïŒpPerson.NameïŒãšShowMessageïŒpPerson.EMailAdrsïŒã®1è¡ã®ãŸãŸã§ãã
ãããŠããã¿ã³ã¯ãªãã¯ãã³ãã©ãŒã®ã³ãŒããå€æŽããŸãã
procedure TForm1.Button1Click(Sender: TObject); var lVis: TPersonVisitor; begin lVis := TShowNameVisitor.Create; try FPersonList.Iterate(lVis); finally lVis.Free; end; end; procedure TForm1.Button2Click(Sender: TObject); var lVis: TPersonVisitor; begin lVis := TShowEmailVisitor.Create; try FPersonList.Iterate(lVis); finally lVis.Free; end; end;
ããŠã1ã€ã®åé¡ã解決ããã®ã§ãèªåçšã«å¥ã®åé¡ãäœæããŸããã ã€ãã¬ãŒã¿ããžãã¯ã¯å¥ã®ã¯ã©ã¹ã«ã«ãã»ã«åãããŸãã å埩äžã«å®è¡ãããæäœã¯ãªããžã§ã¯ãã«ã©ããããããããç¶æ ã«é¢ããæ å ±ãä¿åã§ããŸãããã³ãŒãã®ãµã€ãºã¯1è¡ïŒFPersonList.DoSomethingïŒ@DoShowNameïŒïŒããåãã¿ã³ãã³ãã©ãŒã®9è¡ã«æ¡å€§ããŸããããããç§ãã¡ãå©ããŸã-ããã¯ã³ããŒã®äœæãšè§£æŸãæ åœãã蚪åè ã®ãããŒãžã£ãŒã§ããæœåšçã«ãå埩äžã«ãªããžã§ã¯ãã䜿çšããŠããã€ãã®æäœãæäŸã§ããŸããããã«ããã蚪åè ã®ãããŒãžã£ãŒã¯ãªã¹ããä¿åãããã¹ãŠã®ã¹ãããã§ãããééããŸãã ãOlnyayaã®ã¿éžæããæäœæ¬¡ã¯æããã«æäœãä¿åããåçŽãªããŒã¿ã¯ã3ã€ã®ç°ãªãæŒç®åSQLã«ããè¡ãããšãã§ãããããæã ã¯ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã®ããŒã¿ãä¿åããããã«èšªåè ã䜿çšããŸããããã®ã¢ãããŒãã®å©ç¹ãå®èšŒããŸãïŒCREATEãDELETEããã³UPDATEã
ã¹ããã4.蚪åè ã®ãããªãã«ãã»ã«å
å ã«é²ãåã«ãVisitorã®äœæ¥ã®ããžãã¯ãã«ãã»ã«åããã¢ããªã±ãŒã·ã§ã³ã®ããžãã¹ããžãã¯ããåé¢ããŠãã¢ããªã±ãŒã·ã§ã³ã«æ»ããªãããã«ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã3ã€ã®ã¹ããããå¿ èŠã§ããåºæ¬ã¯ã©ã¹TVisitedããã³TVisitorãäœæãã次ã«ããžãã¹ãªããžã§ã¯ãããã³ããžãã¹ãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ã®åºæ¬ã¯ã©ã¹ãäœæããç¹å®ã®ã¯ã©ã¹TPersonããã³TPersonListïŒãŸãã¯TPeopleïŒããããã«èª¿æŽããŠãäœæãããããŒã¹ã®ç¶æ¿è ã«ããŸãã¯ã©ã¹ã äžè¬çã«ãã¯ã©ã¹ã®æ§é ã¯æ¬¡ã®å³ã«å¯Ÿå¿ããŸãã

TVisitorãªããžã§ã¯ãã¯ãAcceptVisitoré¢æ°ãšTVisitedåã®ãªããžã§ã¯ããæž¡ãããExecuteããã·ãŒãžã£ã®2ã€ã®ã¡ãœãããå®è£ ããŸãã TVisitedãªããžã§ã¯ãã¯ãTVisitoråã®ãã©ã¡ãŒã¿ãŒã§Iterateã¡ãœãããå®è£ ããŸãã ã€ãŸããTVisited.Iterateã¯ã転éãããTVisitorãªããžã§ã¯ãã§Executeã¡ãœãããåŒã³åºããŠããã©ã¡ãŒã¿ãŒãšããŠç¬èªã®ã€ã³ã¹ã¿ã³ã¹ãžã®ãªã³ã¯ãéä¿¡ããã€ã³ã¹ã¿ã³ã¹ãã³ã¬ã¯ã·ã§ã³ã®å Žåãã³ã¬ã¯ã·ã§ã³å ã®åèŠçŽ ã«å¯ŸããŠExecuteã¡ãœãããåŒã³åºãããŸãã æ±çšã·ã¹ãã ãéçºããŠãããããAcceptVisitoré¢æ°ãå¿ èŠã§ãã TPersonåãããšãã°TDogã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ã®ã¿åäœãã蚪åè ã«æž¡ãããšãã§ããåã®äžäžèŽã«ããäŸå€ãšã¢ã¯ã»ã¹ãšã©ãŒãé²ãã¡ã«ããºã ãå¿ èŠã§ãã TVisitedã¯ã©ã¹ã¯TPersistentã¯ã©ã¹ã®åå«ã§ããå°ãåŸã§RTTIã®äœ¿çšã«é¢é£ããé¢æ°ãå®è£ ããå¿ èŠãããããã§ãã
ã¢ãžã¥ãŒã«ã®ã€ã³ã¿ãŒãã§ãŒã¹éšåã¯æ¬¡ã®ããã«ãªããŸãã
TVisited = class; { TVisitor } TVisitor = class(TObject) protected function AcceptVisitor(pVisited: TVisited): boolean; virtual; abstract; public procedure Execute(pVisited: TVisited); virtual; abstract; end; { TVisited } TVisited = class(TPersistent) public procedure Iterate(pVisitor: TVisitor); virtual; end;
TVisitoræœè±¡ã¯ã©ã¹ã®ã¡ãœããã¯çžç¶äººã«ãã£ãŠå®è£ ãããTVisitedã®Iterateã¡ãœããã®äžè¬çãªå®è£ ã¯ä»¥äžã®ãšããã§ãã
procedure TVisited.Iterate(pVisitor: TVisitor); begin pVisitor.Execute(self); end;
ããã«ããã®ã¡ãœããã¯ãç¶æ¿è ã§ãªãŒããŒã©ã€ããããå¯èœæ§ããããããä»®æ³ãšå®£èšãããŠããŸãã
ã¹ããã5.å ±æããžãã¹ãªããžã§ã¯ããšã³ã¬ã¯ã·ã§ã³ãäœæãã
ãã®ãã¬ãŒã ã¯ãŒã¯ã«ã¯ãããžãã¹ãªããžã§ã¯ããšãã®ãããªãªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãå®çŸ©ããããã«ãããã«2ã€ã®åºæ¬ã¯ã©ã¹ãå¿ èŠã§ãã ããããTtiObjectããã³TtiObjectListãšåŒã³ãŸãã ãããã®æåã®ã€ã³ã¿ãŒãã§ãŒã¹ïŒ
TtiObject = class(TVisited) public constructor Create; virtual; end;
éçºããã»ã¹ã®åŸåã§ããã®ã¯ã©ã¹ãè€éã«ããŸãããçŸåšã®ã¿ã¹ã¯ã§ã¯ãç¶æ¿è ã§ãªãŒããŒã©ã€ãã§ããå¯èœæ§ã®ããä»®æ³ã³ã³ã¹ãã©ã¯ã¿ãŒã1ã€ããã°ååã§ãã
ç¥å ã«ãã£ãŠæ¢ã«å®è£ ãããŠããã¡ãœããã§åäœã䜿çšããããã«ãTVisitedããTtiObjectListã¯ã©ã¹ãçæããäºå®ã§ãïŒãã®ç¶æ¿ã«ã¯ã代ããã«èª¬æããä»ã®çç±ããããŸãïŒã ããã«ãæœè±¡ã¯ã©ã¹ã®ä»£ããã«ã€ã³ã¿ãŒãã§ã€ã¹ ïŒã€ã³ã¿ãŒãã§ã€ã¹ïŒã®äœ¿çšãçŠæ¢ãããã®ã¯ãããŸããã
TtiObjectListã¯ã©ã¹ã®ã€ã³ã¿ãŒãã§ã€ã¹éšåã¯æ¬¡ã®ãšããã§ãã
TtiObjectList = class(TtiObject) private FList: TObjectList; public constructor Create; override; destructor Destroy; override; procedure Clear; procedure Iterate(pVisitor: TVisitor); override; procedure Add(pData: TObject); end;
ã芧ã®ãšããããªããžã§ã¯ãèŠçŽ ãå«ãã³ã³ããèªäœã¯ä¿è·ãããã»ã¯ã·ã§ã³ã«ããããã®ã¯ã©ã¹ã®é¡§å®¢ã¯å©çšã§ããŸããã ã¯ã©ã¹ã®æãéèŠãªéšåã¯ããªãŒããŒã©ã€ããããIterateã¡ãœããã®å®è£ ã§ãã åºæ¬ã¯ã©ã¹ã§ã¡ãœãããåã«pVisitor.ExecuteïŒselfïŒãåŒã³åºããå Žåãå®è£ ã¯ãªã¹ãã®åæã«é¢é£ä»ããããŸãïŒ
procedure TtiObjectList.Iterate(pVisitor: TVisitor); var i: integer; begin inherited Iterate(pVisitor); for i := 0 to FList.Count - 1 do (FList.Items[i] as TVisited).Iterate(pVisitor); end;
ä»ã®ã¯ã©ã¹ã¡ãœããã®å®è£ ã§ã¯ãèªåçã«é 眮ãããç¶æ¿åŒãèæ ®ããã«1è¡ã®ã³ãŒãã䜿çšããŸãã
Create: FList := TObjectList.Create; Destroy: FList.Free; Clear: if Assigned(FList) then FList.Clear; Add: if Assigned(FList) then FList.Add(pData);
ããã¯ã·ã¹ãã å šäœã®éèŠãªéšåã§ãã ããžãã¹ããžãã¯ã«ã¯ãTtiObjectãšTtiObjectListã®2ã€ã®åºæ¬ã¯ã©ã¹ããããŸãã ã©ã¡ãã«ããTVisitedã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãæž¡ãããIterateã¡ãœããããããŸãã å埩åèªäœã¯ãTVisitorã¯ã©ã¹ã®Executeã¡ãœãããåŒã³åºãããªããžã§ã¯ãèªäœãžã®åç §ãæž¡ããŸãã ãã®åŒã³åºãã¯ãç¶æ¿ã®æäžäœã®ã¯ã©ã¹åäœã§äºåå®çŸ©ãããŠããŸãã ã³ã³ãããŒã¯ã©ã¹ã®å Žåããªã¹ãã«æ ŒçŽãããŠããåãªããžã§ã¯ãã«ã¯ãTVisitoråã®ãã©ã¡ãŒã¿ãŒã§åŒã³åºãããIterateã¡ãœããããããŸããã€ãŸããç¹å®ã®å蚪åè ãããªã¹ãã«æ ŒçŽãããŠãããã¹ãŠã®ãªããžã§ã¯ããšã³ã³ãããŒãªããžã§ã¯ããšããŠã®ãªã¹ãèªäœããã€ãã¹ããããšãä¿èšŒãããŸãã
ã¹ããã6.ããžã¿ãŒãããŒãžã£ãŒãäœæãã
ããã§ãç§ãã¡èªèº«ã第äžæ®µéã§æããåé¡ã«æ»ããŸãããã ããžã¿ãŒã®ã³ããŒãæ¯åäœæããã³ç Žæ£ããããªãããã解決çã¯ãããŒãžã£ãŒãéçºããããšã§ãã 2ã€ã®äž»ãªã¿ã¹ã¯ãå®è¡ããå¿ èŠããããŸãã蚪åè ã®ãªã¹ãïŒåã ã®ã¢ãžã¥ãŒã«ã®åæåã»ã¯ã·ã§ã³ã«ç»é²ãããŠããïŒã管çããã¯ã©ã€ã¢ã³ãããé©åãªã³ãã³ããåãåã£ããšãã«å®è¡ããŸãã
ãããŒãžã£ãŒãå®è£ ããããã«ãTVisClassRefãTVisMappingãTtiVisitorManagerã®3ã€ã®è¿œå ã¯ã©ã¹ã§ã¢ãžã¥ãŒã«ãè£å®ããŸãã
TVisClassRef = class of TVisitor;
TVisClassRefã¯åç §åã§ãããç¹å®ã®ã¯ã©ã¹ïŒTVisitorã®åå«ïŒã®ååã瀺ããŸãã åç §åã䜿çšããæå³ã¯æ¬¡ã®ãšããã§ããããŒã¹ã®Executeã¡ãœããã眲åä»ãã§ãã€åŒã³åºãããã
procedure Execute(const pData: TVisited; const pVisClass: TVisClassRef),
å éšçã«ã¯ããã®ã¡ãœããã¯lVisitorïŒ= pVisClass.Createã®ãããªåŒã䜿çšããŠãç¹å®ã®èšªåè ã®ã€ã³ã¹ã¿ã³ã¹ãäœæã§ããŸãããã®ã¿ã€ããæåã«ç¥ãå¿ èŠã¯ãããŸããã ã€ãŸããã¯ã©ã¹-TVisitorã®åå«ã¯ãã¯ã©ã¹ã®ååããã©ã¡ãŒã¿ãŒãšããŠæž¡ããšãã«ãåãExecuteã¡ãœããå ã§åçã«äœæã§ããŸãã
2çªç®ã®ã¯ã©ã¹TVisMappingã¯ãTVisClassRefåãžã®åç §ãšCommandããããã£ãšãã2ã€ã®ããããã£ãæã€åçŽãªããŒã¿æ§é ã§ãã ã¯ã©ã¹ã¯ãååïŒã³ãã³ããããšãã°ãsaveãïŒãšãããã®ã³ãã³ããå®è¡ããVisitorã¯ã©ã¹ã«ãã£ãŠå®è¡ãããæäœãæ¯èŒããããã«å¿ èŠã§ãã ãã®ã³ãŒãããããžã§ã¯ãã«è¿œå ããŸãã
TVisMapping = class(TObject) private FCommand: string; FVisitorClass: TVisClassRef; public property VisitorClass: TVisClassRef read FVisitorClass write FVisitorClass; property Command: string read FCommand write FCommand; end;
æåŸã®ã¯ã©ã¹ã¯TtiVisitorManagerã§ãã Managerã䜿çšããŠèšªåè ãç»é²ãããšãTVisMappingã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ãäœæãããManagerãªã¹ãã«å ¥åãããŸãã
ãããã£ãŠãManagerã§ã¯ã蚪åè ã®ãªã¹ããäœæãããæååã³ãã³ããäžèŽãããããåä¿¡ãããšå®è¡ãããŸãã ã¯ã©ã¹ã€ã³ã¿ãŒãã§ã€ã¹ãã¢ãžã¥ãŒã«ã«è¿œå ãããŸãã
TtiVisitorManager = class(TObject) private FList: TObjectList; public constructor Create; destructor Destroy; override; procedure RegisterVisitor(const pCommand: string; pVisitorClass: TVisClassRef); procedure Execute(const pCommand: string; pData: TVisited); end;
ãã®äž»èŠãªã¡ãœããã¯RegisterVisitorãšExecuteã§ãã æåã®ãã®ã¯éåžžãã¢ãžã¥ãŒã«ã®åæåã»ã¯ã·ã§ã³ã§åŒã³åºãããVisitorã¯ã©ã¹ãèšè¿°ãã次ã®ããã«ãªããŸãã
initialization gTIOPFManager.VisitorManager.RegisterVisitor('show', TShowNameVisitor); gTIOPFManager.VisitorManager.RegisterVisitor('show', TShowEMailAdrsVisitor);
ã¡ãœããèªäœã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
procedure TtiVisitorManager.RegisterVisitor(const pCommand: string; pVisitorClass: TVisClassRef); var lData: TVisMapping; begin lData := TVisMapping.Create; lData.Command := pCommand; lData.VisitorClass := pVisitorClass; FList.Add(lData); end;
ãã®ã³ãŒããFactoryãã³ãã¬ãŒãã®Pascalå®è£ ã«éåžžã«äŒŒãŠããããšã«æ°ä»ãã®ã¯é£ãããããŸããã
ãã1ã€ã®éèŠãªExecuteã¡ãœããã¯2ã€ã®ãã©ã¡ãŒã¿ãŒãåããŸããããžã¿ãŒãŸãã¯ãããã®ã°ã«ãŒããèå¥ããã³ãã³ããšãIterateã¡ãœãããç®çã®ããžã¿ãŒã®ã€ã³ã¹ã¿ã³ã¹ãžã®ãªã³ã¯ã§åŒã³åºãããããŒã¿ãªããžã§ã¯ãã§ãã Executeã¡ãœããã®å®å šãªã³ãŒãã¯æ¬¡ã®ãšããã§ãã
procedure TtiVisitorManager.Execute(const pCommand: string; pData: TVisited); var i: integer; lVisitor: TVisitor; begin for i := 0 to FList.Count - 1 do if SameText(pCommand, TVisMapping(FList.Items[i]).Command) then begin lVisitor := TVisMapping(FList.Items[i]).VisitorClass.Create; try pData.Iterate(lVisitor); finally lVisitor.Free; end; end; end;
ãããã£ãŠã1ã€ã®ããŒã ã§ä»¥åã«ç»é²ãã2ã€ã®èšªåè ãå®è¡ããã«ã¯ã1è¡ã®ã³ãŒãã®ã¿ãå¿ èŠã§ãã
gTIOPFManager.VisitorManager.Execute('show', FPeople);
次ã«ãåæ§ã®ã³ãã³ããåŒã³åºãããšãã§ããããã«ããããžã§ã¯ããè£è¶³ããŸãã
// gTIOPFManager.VisitorManager.Execute('read', FPeople); // gTIOPFManager.VisitorManager.Execute('save', FPeople).
ã¹ããã7.ããžãã¹ããžãã¯ã¯ã©ã¹ã®èª¿æŽ
TPersonããã³TPeopleããžãã¹ãªããžã§ã¯ãã®TtiObjectã¯ã©ã¹ãšTtiObjectListã¯ã©ã¹ã®ç¥å ãè¿œå ãããšãã€ãã¬ãŒã¿ããžãã¯ãåºæ¬ã¯ã©ã¹ã«ã«ãã»ã«åã§ãããããå€æŽããå¿ èŠããªããªããŸããããã«ãããŒã¿ãå«ããªããžã§ã¯ãã蚪åè ãããŒãžã£ã«è»¢éã§ããããã«ãªããŸãã
æ°ããã³ã³ããã¯ã©ã¹å®£èšã¯æ¬¡ã®ããã«ãªããŸãã
TPeople = class(TtiObjectList);
å®éãTPeopleã¯ã©ã¹ã¯äœãå®è£ ããå¿ èŠãããããŸããã çè«çã«ã¯ãTPeople宣èšããŸã£ããè¡ããã«ãªããžã§ã¯ããTtiObjectListã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã«æ ŒçŽã§ããŸãããTPeopleã€ã³ã¹ã¿ã³ã¹ã®ã¿ãåŠçããVisitorãèšè¿°ããäºå®ãªã®ã§ããã®ã¯ã©ã¹ãå¿ èŠã§ãã AcceptVisitoré¢æ°ã§ã¯ã次ã®ãã§ãã¯ãå®è¡ãããŸãã
Result := pVisited is TPeople.
TPersonã¯ã©ã¹ã®å ŽåãTtiObjectã®ç¥å ãè¿œå ãã2ã€ã®äœ¿çšå¯èœãªããããã£ãå ¬éãããã¹ã³ãŒãã«ç§»åããŸããå°æ¥ãããã®ããããã£ã§RTTIãæäœããå¿ èŠãããããã§ãã ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹å ã®ãªããžã§ã¯ããšã¬ã³ãŒãã®ãããã³ã°ã«é¢é£ããã³ãŒããå€§å¹ ã«åæžããã®ã¯ããã®åŸã®ããšã§ãã
TPerson = class(TtiObject) private FEMailAdrs: string; FName: string; published property Name: string read FName write FName; property EMailAdrs: string read FEMailAdrs write FEMailAdrs; end;
ã¹ããã8.ãããã¿ã€ããã¥ãŒãäœæãã
åè å ã®èšäºã§ã¯ãGUIã¯ããã«ãã¡ã€ã§ãã¬ãŒã ã¯ãŒã¯ãæäœããããã«tiOPFã®äœæè ãäœæããã³ã³ããŒãã³ãã«åºã¥ããŠããŸããã ãããã¯ãã©ãã«ãå ¥åãã£ãŒã«ãããã§ãã¯ããã¯ã¹ããªã¹ããªã©ã®æšæºã³ã³ãããŒã«ã§ããDB Awareã³ã³ããŒãã³ãã«é¡äŒŒããŠããŸãããããŒã¿è¡šç€ºã³ã³ããŒãã³ããããŒã¿ããŒã¹ããŒãã«ã®ãã£ãŒã«ãã«é¢é£ä»ããããŠããã®ãšåãæ¹æ³ã§ãtiObjectãªããžã§ã¯ãã®ç¹å®ã®ããããã£ã«é¢é£ä»ããããŠããŸãã æéãçµã€ã«ã€ããŠããã¬ãŒã ã¯ãŒã¯ã®äœæè ã¯ããããã®èŠèŠã³ã³ããŒãã³ããå«ãããã±ãŒãžãæ代é ãã§æãŸãããªããšããŒã¯ããŸããã ãã®èŠè¿ãã«ã圌ã¯Mediatorãã¶ã€ã³ãã¿ãŒã³ã䜿çšããŠèŠèŠã³ã³ããŒãã³ããšã¯ã©ã¹ããããã£ã®é¢ä¿ãäœæããããšãææ¡ããŸãããã®ãã³ãã¬ãŒãã¯ããã¬ãŒã ã¯ãŒã¯ã®ã¢ãŒããã¯ãã£å šäœã§2çªç®ã«éèŠã§ãã仲ä»è ã«é¢ããèè ã®èª¬æã¯ããã®ããã¥ã¢ã«ãšåçšåºŠã®éã®å¥ã®èšäºã§ã«ããŒãããŠãããããããã§ã¯ç°¡æçãGUIãšããŠæäŸããŸãã
ãããžã§ã¯ããã©ãŒã ã®ãã¿ã³1ã®ååããshow commandãã«å€æŽãããã¿ã³2ãä»ã¯ãã³ãã©ãªãã§ãã®ãŸãŸã«ããããããã«ãsave commandããšååãä»ããŸãããã©ãŒã ã«ã¡ã¢ã³ã³ããŒãã³ããã¹ããŒãããã¹ãŠã®èŠçŽ ã奜ã¿ã«åãããŠé 眮ããŸãã
showã³ãã³ããå®è£ ããVisitorã¯ã©ã¹ãè¿œå ããŸãã
ã€ã³ã¿ãŒãã§ãŒã¹-
TShowVisitor = class(TVisitor) protected function AcceptVisitor(pVisited: TVisited): boolean; override; public procedure Execute(pVisited: TVisited); override; end;
ãããŠãå®è£ ã¯-
function TShowVisitor.AcceptVisitor(pVisited: TVisited): boolean; begin Result := (pVisited is TPerson); end; procedure TShowVisitor.Execute(pVisited: TVisited); begin if not AcceptVisitor(pVisited) then exit; Form1.Memo1.Lines.Add(TPerson(pVisited).Name + ': ' + TPerson(pVisited).EMailAdrs); end;
AcceptVisitorã¯ã転éããããªããžã§ã¯ããTPersonã®ã€ã³ã¹ã¿ã³ã¹ã§ããããšã確èªããŸããããã¯ãVisitorã¯ãã®ãããªãªããžã§ã¯ãã§ã®ã¿ã³ãã³ããå®è¡ããå¿ èŠãããããã§ããã¿ã€ããäžèŽããå Žåãã³ãã³ããå®è¡ããããªããžã§ã¯ãããããã£ãå«ãè¡ãããã¹ããã£ãŒã«ãã«è¿œå ãããŸãã
ã³ãŒãã®æ£åžžæ§ããµããŒãããã¢ã¯ã·ã§ã³ã¯æ¬¡ã®ãšããã§ãã privateã»ã¯ã·ã§ã³ã®ãã©ãŒã èªäœã®èª¬æã«ãTPeopleåã®FPeopleãšTtiVisitorManageråã®VMã®2ã€ã®ããããã£ãè¿œå ããŸãããã©ãŒã äœæã€ãã³ããã³ãã©ãŒã§ããããã®ããããã£ãéå§ãããshowãã³ãã³ãã§èšªåè ãç»é²ããå¿ èŠããããŸãã
FPeople := TPeople.Create; FillPeople; VM := TtiVisitorManager.Create; VM.RegisterVisitor('show',TShowVisitor);
FilPeopleã¯ã3ã€ã®ãªããžã§ã¯ãã§ãªã¹ããåããè£å©ããã·ãŒãžã£ã§ãããããã®ã³ãŒãã¯åã®ãªã¹ãã³ã³ã¹ãã©ã¯ã¿ãŒããååŸãããŸããäœæããããã¹ãŠã®ãªããžã§ã¯ããç Žæ£ããããšãå¿ããªãã§ãã ããããã®å ŽåãFPeople.FreeãšVM.Freeããã©ãŒã ã¯ããŒãºãã³ãã©ãŒã«èšè¿°ããŸãã
ãããŠä»-ãã ïŒ-æåã®ãã¿ã³ã®ãã³ãã©ãŒïŒ
Memo1.Clear; VM.Execute('show',FPeople);
åæããŠããã£ãšãã£ãšæ¥œããããããŠã1ã€ã®ã¢ãžã¥ãŒã«å ã®ãã¹ãŠã®ã¯ã©ã¹ã®ããã·ã¥ãèªããªãã§ãã ãããããã¥ã¢ã«ã®æåŸã§ããããã®çŠãããéããŸãã
ã¹ããã9.ããã¹ããã¡ã€ã«ãæäœãã蚪åè ã®åºæ¬ã¯ã©ã¹
ãã®æ®µéã§ãããã¹ããã¡ã€ã«ã®æäœæ¹æ³ãç¥ã£ãŠãã蚪åè ã®åºæ¬ã¯ã©ã¹ãäœæããŸãããªããžã§ã¯ãpascalã§ãã¡ã€ã«ãæäœããã«ã¯ã3ã€ã®æ¹æ³ããããŸããæåã®pascalã®æç¹ããã®å€ãæé ïŒAssignFileãReadLnãªã©ïŒãã¹ããªãŒã ïŒTStringStreamãŸãã¯TFileStreamïŒã®æäœãTStringListãªããžã§ã¯ãã®äœ¿çšã§ãã
æåã®æ¹æ³ãéåžžã«æ代é ãã§ããå Žåã2çªç®ãš3çªç®ã¯OOPã«åºã¥ãé©åãªä»£æ¿æ段ã§ããåæã«ãã¹ããªãŒã ã®æäœã«ã¯ãããŒã¿ã®å§çž®ããã³æå·åãªã©ã®å©ç¹ããããŸããããã®äŸã§ã¯ã1è¡ããšã®ã¹ããªãŒã ã®èªã¿åããšæžã蟌ã¿ã¯äžçš®ã®åé·æ§ã§ããç°¡åã«ããããã«ãLoadFromFileãšSaveToFileã®2ã€ã®åçŽãªã¡ãœãããæã€TStringListãéžæããŸãããã ãã倧ããªãã¡ã€ã«ã®å Žåããããã®æ¹æ³ã¯å€§å¹ ã«é ããªããããã¹ããªãŒã ãæé©ãªéžæã«ãªãããšã«æ³šæããŠãã ããã
TVisFileåºæ¬ã¯ã©ã¹ã€ã³ã¿ãŒãã§ã€ã¹ïŒ
TVisFile = class(TVisitor) protected FList: TStringList; FFileName: TFileName; public constructor Create; virtual; destructor Destroy; override; end;
ãããŠãã³ã³ã¹ãã©ã¯ã¿ãšãã¹ãã©ã¯ã¿ã®å®è£ ïŒ
constructor TVisFile.Create; begin inherited Create; FList := TStringList.Create; if FileExists(FFileName) then FList.LoadFromFile(FFileName); end; destructor TVisFile.Destroy; begin FList.SaveToFile(FFileName); FList.Free; inherited; end;
FFileNameããããã£ã®å€ã¯ããã®åºæ¬ã¯ã©ã¹ã®åå«ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§å²ãåœãŠãããŸãïŒããŒãã³ãŒãã£ã³ã°ã¯äœ¿çšããªãã§ãã ãããããã¯ãåŸã®ã¡ã€ã³ããã°ã©ãã³ã°ã¹ã¿ã€ã«ãšããŠããã§èª¬æããŸãïŒïŒããã¡ã€ã«ãæäœããVisitorã¯ã©ã¹ã®å³ã¯æ¬¡ã®ãšããã§ãã次

ã®å³ã«åŸã£ãŠãTVisFileåºæ¬ã¯ã©ã¹ã®2ã€ã®åå«ïŒTVisTXTFileãšTVisCSVFileãäœæããŸãã1ã€ã¯ãããŒã¿ãã£ãŒã«ããã·ã³ãã«ïŒã³ã³ãïŒã§åºåããã* .csvãã¡ã€ã«ã§åäœãã2ã€ç®ã¯ãåã ã®ããŒã¿ãã£ãŒã«ããè¡ã®åºå®é·ã«ãªãããã¹ããã¡ã€ã«ã§åäœããŸãããããã®ã¯ã©ã¹ã§ã¯ã次ã®ããã«ã³ã³ã¹ãã©ã¯ã¿ã®ã¿ãåå®çŸ©ããŸãã
constructor TVisCSVFile.Create; begin FFileName := 'contacts.csv'; inherited Create; end; constructor TVisTXTFile.Create; begin FFileName := 'contacts.txt'; inherited Create; end.
ã¹ããã10.ããã¹ããã¡ã€ã«ã®èšªåè ãã³ãã©ãè¿œå ãã
ããã§ã¯ã2ã€ã®ç¹å®ã®èšªåè ãè¿œå ããŸãã1ã€ã¯ããã¹ããã¡ã€ã«ãèªã¿åãããã1ã€ã¯æžã蟌ã¿ãŸããé²èŠ§ããžã¿ãŒã¯AcceptVisitorããã³Executeåºæ¬ã¯ã©ã¹ã¡ãœããããªãŒããŒã©ã€ãããå¿ èŠããããŸããAcceptVisitorã¯ãTPeopleã¯ã©ã¹ãªããžã§ã¯ãã蚪åè ã«æž¡ãããããšã確èªããŸãã
Result := pVisited is TPeople;
å®è¡ã®å®è£ ã¯æ¬¡ã®ãšããã§ãã
procedure TVisTXtRead.Execute(pVisited: TVisited); var i: integer; lData: TPerson; begin if not AcceptVisitor(pVisited) then Exit; //==> TPeople(pVisited).Clear; for i := 0 to FList.Count - 1 do begin lData := TPerson.Create; lData.Name := Trim(Copy(FList.Strings[i], 1, 20)); lData.EMailAdrs := Trim(Copy(FList.Strings[i], 21, 80)); TPeople(pVisited).Add(lData); end; end;
蚪åè ã¯æåã«ãã©ã¡ãŒã¿ãŒã«ãã£ãŠæž¡ãããTPeopleãªããžã§ã¯ãã®ãªã¹ããã¯ãªã¢ãã次ã«ãã¡ã€ã«ã®ã³ã³ãã³ããããŒããããTStringListãªããžã§ã¯ãããè¡ãèªã¿åããåè¡ã«TPersonãªããžã§ã¯ããäœæããŠãTPeopleã³ã³ãããŒãªã¹ãã«è¿œå ããŸããç°¡åã«ããããã«ãããã¹ããã¡ã€ã«ã®nameããããã£ãšemailadrsããããã£ã¯ã¹ããŒã¹ã§åºåãããŠããŸãã
ã¬ã³ãŒã蚪åè ã¯éã®æäœãå®è£ ããŸãããã®ã³ã³ã¹ãã©ã¯ã¿ãŒïŒãªãŒããŒã©ã€ãïŒã¯å éšTStringListãã¯ãªã¢ããŸãïŒã€ãŸããFList.Clearæäœãå®è¡ããŸããç¶æ¿åŸã¯å¿ é ã§ãïŒãAcceptVisitorã¯ãTPersonã¯ã©ã¹ãªããžã§ã¯ããæž¡ãããããšããã§ãã¯ããŸããåãæ¹æ³ã§èšé²ãå®è£ ããæ¹ãç°¡åã«æããŸã-ãã¹ãŠã®ã³ã³ãããªããžã§ã¯ããã¹ãã£ã³ããããããStringListã«è¿œå ããŠããããã¡ã€ã«ã«ä¿åããŸããããã¯ãã¹ãŠããã¡ã€ã«ãžã®ããŒã¿ã®æçµæžã蟌ã¿ã«ã€ããŠå®éã«è©±ããŠããããããŒã¿ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã«ãããããäºå®ãããå Žåã¯ãèŠããŠããå¿ èŠããããŸããããã®å Žåãå€æŽïŒäœæãåé€ããŸãã¯ç·šéïŒããããªããžã§ã¯ãã«å¯ŸããŠã®ã¿SQLã³ãŒããå®è¡ããå¿ èŠããããŸããããžã¿ãŒããªããžã§ã¯ãã«å¯ŸããŠæäœãå®è¡ããåã«ã圌ã¯èªåã®ã¿ã€ãã®éä¿¡ããã§ãã¯ããå¿ èŠããããŸãïŒ
Result := pVisited is Tperson;
executeã¡ãœããã¯ãæå®ãããã«ãŒã«ã§ãã©ãŒããããããæååãå éšStringListã«è¿œå ããŸããæåã«ãæž¡ããããªããžã§ã¯ãã®nameããããã£ã®å 容ãæ倧20æåã®ã¹ããŒã¹ãåã蟌ãŸãã次ã«emaiadrsããããã£ã®å 容ïŒ
procedure TVisTXTSave.Execute(pVisited: TVisited); begin if not AcceptVisitor(pVisited) then exit; FList.Add(PadRight(TPerson(pVisited).Name,20)+PadRight(TPerson(pVisited).EMailAdrs,60)); end;
ã¹ããã11. CSVãã¡ã€ã«ã®èšªåè ãã³ãã©ãŒãè¿œå ãã
ãã¡ã€ã«ã®æçµè¡ããã©ãŒãããããæ¹æ³ãé€ãã蚪åè ã®èªã¿åããšæžã蟌ã¿ã¯TXTã¯ã©ã¹ã®ã»ãšãã©ãã¹ãŠã®ååã§äŒŒãŠããŸããCSVæšæºã§ã¯ãããããã£å€ã¯ã³ã³ãã§åºåãããŠããŸããè¡ãèªã¿åã£ãŠããããã£ã«è§£æããã«ã¯ãstrutilsã¢ãžã¥ãŒã«ã®ExtractDelimitedé¢æ°ã䜿çšããè¡ãåçŽã«é£çµããŠæžã蟌ã¿ãå®è¡ããŸãã
procedure TVisCSVRead.Execute(pVisited: TVisited); var i: integer; lData: TPerson; begin if not AcceptVisitor(pVisited) then exit; TPeople(pVisited).Clear; for i := 0 to FList.Count - 1 do begin lData := TPerson.Create; lData.Name := ExtractDelimited(1, FList.Strings[i], [',']); lData.EMailAdrs := ExtractDelimited(2, FList.Strings[i], [',']); TPeople(pVisited).Add(lData); end; end; procedure TVisCSVSave.Execute(pVisited: TVisited); begin if not AcceptVisitor(pVisited) then exit; FList.Add(TPerson(pVisited).Name + ',' + TPerson(pVisited).EMailAdrs); end;
æ®ã£ãŠããã®ã¯ãæ°ãã蚪åè ãManagerã«ç»é²ããã¢ããªã±ãŒã·ã§ã³ã®åäœã確èªããããšã ãã§ãããã©ãŒã äœæãã³ãã©ãŒã§ã次ã®ã³ãŒããè¿œå ããŸãã
VM.RegisterVisitor('readTXT', TVisTXTRead); VM.RegisterVisitor('saveTXT',TVisTXTSave); VM.RegisterVisitor('readCSV',TVisCSVRead); VM.RegisterVisitor('saveCSV',TVisCSVSave);
ãã©ãŒã ã«å¿ èŠãªãã¿ã³ããããã³ã°ããé©åãªãã³ãã©ãŒãå²ãåœãŠãŸãã

procedure TForm1.ReadCSVbtnClick(Sender: TObject); begin VM.Execute('readCSV', FPeople); end; procedure TForm1.ReadTXTbtnClick(Sender: TObject); begin VM.Execute('readTXT', FPeople); end; procedure TForm1.SaveCSVbtnClick(Sender: TObject); begin VM.Execute('saveCSV', FPeople); end; procedure TForm1.SaveTXTbtnClick(Sender: TObject); begin VM.Execute('saveTXT', FPeople); end;
ããŒã¿ãä¿åããããã®è¿œå ã®ãã¡ã€ã«åœ¢åŒã¯ãé©åãªèšªåè ãè¿œå ããããããManagerã«ç»é²ããã ãã§å®è£ ãããŸãããããŠã次ã®ããšã«æ³šæããŠãã ãããã³ãã³ãã«æ æã«ç°ãªãååãä»ããŸãããã€ãŸããsaveTXTãšsaveCSVã§ããäž¡æ¹ã®èšªåè ã1ã€ã®ä¿åã³ãã³ãã«äžèŽããå Žåãäž¡æ¹ã®èšªåè ãåãã³ãã³ãã§éå§ãããããèªåã§ç¢ºèªããŠãã ããã
ã¹ããã12.æçµçãªã³ãŒãã®ã¯ãªãŒã³ã¢ãã
ã³ãŒãã®çŸãããšçŽåºŠãé«ããDBMSãšã®å¯Ÿè©±ãããã«çºå±ãããããã®ãããžã§ã¯ããæºåããããã«ãããžãã¯ãšãã®ç®çã«å¿ããŠã¯ã©ã¹ãç°ãªãã¢ãžã¥ãŒã«ã«åé¡ããŸããæåŸã«ããããžã§ã¯ããã©ã«ããŒå ã«æ¬¡ã®ã¢ãžã¥ãŒã«æ§é ãå¿ èŠã§ããããã«ãããã¢ãžã¥ãŒã«éã®åŸªç°é¢ä¿ãªãã§å®è¡ã§ããŸãïŒèªåèªèº«ãçµã¿ç«ãŠããšãã«ãusesã»ã¯ã·ã§ã³ã«å¿ èŠãªã¢ãžã¥ãŒã«ãé 眮ããŸãïŒã
ã¢ãžã¥ãŒã«
| æ©èœ
| ã¯ã©ã¹
|
tivisitor.pas
| Visitorããã³Managerãã³ãã¬ãŒãã®åºæ¬ã¯ã©ã¹
| TVisitor
TVisited TVisMapping TtiVisitorManager |
tiobject.pas
| åºæ¬ããžãã¹ããžãã¯ã¯ã©ã¹
| TtiObject
TtiObjectList |
people_BOM.pas
| ç¹å®ã®ããžãã¹ããžãã¯ã¯ã©ã¹
| TPerson
TPeople |
people_SRV.pas
| çžäºäœçšãæ
åœããå
·è±¡ã¯ã©ã¹
| TVisFile
TVisTXTFile TVisCSVFile TVisCSVSave TVisCSVRead TVisTXTSave TVisTXTRead |
ãããã«
ãã®èšäºã§ã¯ãç°ãªãã¿ã€ããæã€ããšãã§ãããªããžã§ã¯ãã®ã³ã¬ã¯ã·ã§ã³ãŸãã¯ãªã¹ããå埩åŠçããåé¡ã調ã¹ãŸãããGoFãææ¡ããVisitorãã³ãã¬ãŒãã䜿çšããŠããªããžã§ã¯ãããç°ãªã圢åŒã®ãã¡ã€ã«ã«ããŒã¿ããããã³ã°ãã2ã€ã®ç°ãªãæ¹æ³ãæé©ã«å®è£ ããŸãããåæã«ãVisitor Managerã®äœæã«ããã1ã€ã®ããŒã ãç°ãªãæ¹æ³ãå®è¡ã§ããŸããæçµçã«ããã®èšäºã§èª¬æããåçŽã§å®äŸãšãªãäŸã¯ããªããžã§ã¯ãããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ã«ãããã³ã°ããããã®åæ§ã®ã·ã¹ãã ãããã«éçºããã®ã«åœ¹ç«ã¡ãŸãã
ãµã³ãã«ã®ãœãŒã¹ã³ãŒããã¢ãŒã«ã€ã-ããã«