ããã°ã©ããŒã®äžã«ã¯ç±ççãªäººãããããããŸãã ããªãã®ä»äºã«å¿ããã®é¢å¿ã瀺ãããã®ç°å¢ã§ã®èªç±æéã§ãã£ãŠãç¹å¥ãªæ¬ããã©ãŒã©ã ãèªãã§ãã ãããããã§ãªããã°ãäŸå€ã§ã¯ãããŸããã ã§ã¯ããªãçµæãããã»ã©äœå質ã®ãœãããŠã§ã¢ãªã®ã§ããããïŒ ããã°ã©ãã³ã°èšèªå
šäœã®æ¬ ç¹ã«ã€ããŠè°è«ããå°ãªããšã12åã®ãã¶ã€ã³ãã¿ãŒã³ãç¥ã£ãŠããåŠçããçªç¶ãäœå質ã®ã·ã¹ãã ã®äœæã«ç©æ¥µçã«åå ããã®ã¯ã©ãã§ããã 圌ã®ãã£ãªã¢ã®å§ãŸãã§ã¯ãªãã幎ã
ã
ã¯ããããªãã¯çµŠäžãæžãããã³ãŒãã®è¡æ°ãŸãã¯ãŸã°ããããã«é·æéã¢ãã¿ãŒãèŠãèœåã«äŸåããŠããå€æ°ã®äœã¹ãã«ã®äººãåç
§ã§ããŸãã ããããã»ãŒãã¹ãŠã®éšéã«ãã®ãããªåŸæ¥å¡ãããŸãã 建ç¯æ¥è
ã¯å»ºç¯å®¶ãããäœãè³æ Œãæã£ãŠããŸãããããã¯å»ºç©ãè¿œå ã®ããããããªãã§å®å
šã«äœ¿çšããã®ã«æãé©ããŠããããšã劚ããŸããã
ç§ã®æèŠã§ã¯ã2ã€ã®äž»ãªçç±ããããŸãã æåã«ã€ããŠã¯äœãããå¿
èŠã¯ãããŸããã ããã¯æéããŸãã¯ã圌ããããé »ç¹ã«èšãããã«ã絶ãéãªãå€åã§ãã ãœãããŠã§ã¢è£œåãéçºãããšããããšãããã顧客ã®ãã¹ãŠã®èŠä»¶ãæºãããŠãããšããŠããè«è² æ¥è
ã«ãšã£ãŠäºæããªãããšãå€ãããããªãæ¹åãå¿
èŠã«ãªããŸãã ãããã¯ã»ãšãã©é¿ããããªããã®ã§ãããå¿
ãããã·ã¹ãã ã¢ãŒããã¯ãã£ã«é©åãããšã¯éããŸããã æéãçµã€ã«ã€ããŠããœãããŠã§ã¢è€åäœã¯äœ¿çšã§ããªããªããŸãã ããããæéã¯ããã«å€§ããªãã®ãç Žå£ããŸãã-é©ãã¹ãããšã¯äœããããŸããã
2çªç®ã®çç±ã¯ã¯ããã«å¹³å¡ã§ãã ããããªããšãžã®äžæ³šæã ç¹ã«ãããžã§ã¯ãã®éå§æã ãããŠãããŒã ãè¥ãã»ã©ãå£æ»
çãªåœ±é¿ããããããŸãã ãã¡ãããæŒç®åãã¹ããŒã¹ã§åºåãããŠããããšã確èªãããããããã«ãã¡ãœããã䜿çšããå¯èœæ§ã«ã€ããŠè°è«ããã»ããã¯ããã«èå³æ·±ãã§ã[1]ã ãããŠããã®ãããªäºçŽ°ãªããšã¯ã究極ã®æ©èœãšç¹å¥ãªé¢ä¿ã¯ãããŸããã ãããžã§ã¯ãã®æéãšäºç®ãéãããŠãããããæåã«äž»èŠãªèŠä»¶ã«éäžããããšããå§ãããŸã...
ããã¯ããã«è¯ãããšã«ãªããŸãã ããã¯åå°ã®ãªã家ã®ãããªãã®ã§ãã 顧客ã¯ãåºã
ãšããéšå±ããšã¬ããŒã¿ãŒãåéã®ãã¹ã«ãŒã ãèŠæ±ããŸãã-圌ã¯ããããåºç€ã«ã€ããŠç¥ããªãã§ãããã ããããæ§é å
šäœã«èããããå質åºç€ãå¿
èŠã§ãã ãããŠã建ç¯å®¶ãã建ç¯å®¶ãŸã§ãããã©ãŒããŒã¯ããããäžè©±ãããå¿
èŠããããŸãã
æ ¹æ ã®ãªãããšãç¶ããªãããã«ãç§ã¯åœ±ã®ããããããåºæ¬çã§ãã°ãã°å¿
èŠãªãµãã·ã¹ãã ã®äŸãæããŸãã ããã¯ãã®ã³ã°ã§ãã å€ãã®ã·ã¹ãã ã«ã¯ã蚺æã¡ãã»ãŒãžã衚瀺ããæ©èœãå«ãŸããŠããŸãã ãã ããéåžžã¯äž»ãªæ©èœã§ã¯ãªããããååãªæ³šæã¯å¿
èŠãããŸããã
åæã«ãé©åã«èšèšããããã®ã³ã°ãµãã·ã¹ãã ã¯ããããžã§ã¯ãã®æåããå€ãã®è¿·æãªãšã©ãŒãåé¿ããã®ã«åœ¹ç«ã¡ãæ¬ é¥ãçºçããŠããæ€åºããããŸã§ã®æéã倧å¹
ã«ççž®ããŸãã çµå±ã®ãšããããããžã§ã¯ãã®å®äºãŸã§ã«äœæ¥ã®æåã«èŠéããããã¹ãŠã®ãã¹ã¯ã巚倧ãªéªã ããŸåŒã«å€ãããã·ã¹ãã ãšãã®ãã¹ãŠã®äœæè
ããã®äžã«åããããšããŸãã
ãŸãã泚æãæããªã蚺æã¡ãã»ãŒãžã衚瀺ããããã®ã¢ãžã¥ãŒã«ã®è¡šç€ºæ¹æ³ãå®åŒåããŸãã
- å®å
šãªã€ã³ã¿ãŒãã§ãŒã¹
- ã¯ãã¹ãã©ãããã©ãŒã
- IDEã³ã³ãœãŒã«ã§ã®ã¡ãã»ãŒãžã®è¡šç€º
- å©äŸ¿æ§ãšäœ¿ãããã
- éçºè
ããŒã«
å®å
šãªã€ã³ã¿ãŒãã§ãŒã¹ ãã®ã³ã°ã¢ãžã¥ãŒã«ã¯ãéçºã®æåããå®å
šãªæäœã»ãããæäŸããå¿
èŠããããŸãã ã€ã³ã¿ãŒãã§ã€ã¹ã¯å®å
šã«å®è£
ãããŠããªãå ŽåããããŸãããå®è£
ããå¿
èŠããããŸãã ãã®ãããé倧床ïŒãšã©ãŒãèŠåãæ
å ±ïŒã«å¿ããŠèšºæã¡ãã»ãŒãžãåé¢ã§ãããšéåžžã«äŸ¿å©ã§ãã æåã«ããçš®ã®ã¡ãã»ãŒãžãäœæããŠããåé¢ãå°å
¥ããããšã¯äžå¯èœã§ã-ã·ã¹ãã ã®äžéšã¯ããã®äžè¬åãããçµè«ã§æ¢ã«éçºãããŠããŸããããšã人ã
ãè¡ããããã¹ãŠãæãäžããããšãäœåãªãããããšããŠããéçºè
ãããã«ããããããã«ãã®äœæ¥ãæ£ããè¡ãããšã¯ãŸããããŸããã
å€ãã®å Žåã1é±éåŸã«èªåã®ã³ãŒããä»ã®äººã®ãã®ã§ãããã®ããã«èŠãŸãã æ°ãæåŸãå®è£
ã®å€ãã®ãã¥ã¢ã³ã¹ïŒç¹ã«ãé倧ãªåé¡ãããã³ããããªå¶çºäºè±¡ïŒãæ°žä¹
ã«å€±ãããããšã¯æããã§ãã
ã¯ãã¹ãã©ãããã©ãŒã ã ãã®ã³ã°ãµãã·ã¹ãã ã¯ãæåã«äœ¿çšãããã¹ãŠã®ãã©ãããã©ãŒã ããµããŒãããå¿
èŠããããŸãã ããã¯ããã¹ãŠã®ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã§ã¢ããªã±ãŒã·ã§ã³ãå®å
šãã€ç¶ç¶çã«ãã¹ãã§ããªãå Žåã«ç¹ã«éèŠã§ãã iOSã§ããŸãæ©èœãããã®ã¯ãAndroidããã€ã¹ã§ã¯å¥åŠãªåäœãããå¯èœæ§ããããŸãã ãã¡ãããã¡ãã»ãŒãžåºåã·ã¹ãã ã¯èªåãã¹ãã«ä»£ãããã®ã§ã¯ãããŸããã ãããããããã¯éåžžã«è€éã§ãããå®è£
ãšãµããŒãã«ã¯å€å€§ãªäººä»¶è²»ãå¿
èŠã§ãããé埳çã§ããããšãªããããšããã¹ããå®å
šã«å¿ããããšããããããŸãã ãããã£ãŠãç§ã¯çæ³ã倢èŠãŠãäœãããªããããå®å
šã«æ©èœããæå°éããå§ããæ¹ãè¯ããšä¿¡ããŠããŸãã ãããã«ãããçæ³çã«ã¯ããã°èšé²ã®ããã®ãã¹ããšäŸ¿å©ãªãµãã·ã¹ãã ãããã¯ãã§ãã
IDEã³ã³ãœãŒã«ã«ã¡ãã»ãŒãžãåºåããŸãã åºæ¬èŠä»¶ã®ãªã¹ãã«ã¯ããæ°žç¶ã¹ãã¬ãŒãžïŒãã¡ã€ã«ãŸãã¯ããŒã¿ããŒã¹ïŒãžã®ã¡ãã»ãŒãžã®åºåããå«ãŸããŠããªãããšã«æ³šæããŠãã ããã éåžžãããã¯å€ãã®äººããã°ããæåŸ
ãããã®ã§ãã å°æ¥ã®ãŠãŒã¶ãŒãŸãã¯ç¹å¥ãªéšéã«ãã¹ãããããã«ãå°ãªããšãäœããã®åœ¢ã§çšŒåäžã®ã·ã¹ãã ãæäŸãããå Žåããã°ãã¡ã€ã«ã«å¿
èŠããããŸãã ããããåæ段éã§ã¯ããã¹ã¿ãŒãããããã°ã©ããŒã«åé¡ãç¥ãããæ¹ãã¯ããã«äŸ¿å©ã§ãã
ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ãŒã¹ã®æ©èœãéåžžã«é
ããå¯èœæ§ããããããéçºè
ã¯ãã®ãã³ãã¹ãŠãèªåã®åã§èª¿çãããããšã«ãªããŸãã 倧ããªéãããããŸããåé¡ãäœæããŠããæ°ç§ãŸãã¯æ°é±éåŸã«èŠãŸããã
å©äŸ¿æ§ãšäœ¿ããããã ããã°ã©ããŒã¯æ ãè
ã§ãã åé¡ãå ±åããããšããŸãïŒãµã€ãº100 x 120ã®ç»åãååŸãããçŸåšã®ã¢ããªã±ãŒã·ã§ã³èšå®ã¯128 x 128ã®æå°ãµã€ãºã®å¶éãèšå®ããŸããåçŽãªè¡ããå°å·ã§ããªãå Žåãéçºè
ã¯é©åãªåºåãè¡ãå¿
èŠããããŸã
- 4ã€ã®æ°å€ãæåååã«ãã£ã¹ãããŸã
- åãåã£ãããŒãããã©ã€ã³ãäœããŸã
- ãã°ã«è¡ãæž¡ã
èšèªããã©ãŒããããããæååïŒããšãã°ãsprintf [2]ããã³stringstream [3]ïŒã«åºåããæ段ãæäŸããå Žåã§ããããŸããŸãªäžéå€æ°ãäœæããæéã浪費ããã¡ã€ã³ããžãã¯ã䟵é£ããå¿
èŠããããŸã...äžè¬ã«ãçµæãšããŠäœãããã°ã«æžã蟌ãŸããŠãé©ããªããç¡å¹ãªç»åãµã€ãºãã®ãããªãã®ã§ãã ãåãå
¥ããããªãããšããèšèã®æå³ã¯ãä»ã§ã¯ç解ãããããã®ã§ãããæ°é±éã§ã»ãŒå®å
šã«å€±ãããŸãã çµæãšããŠãèšèšè
ã¯åé¡ã®ããç»åãä¿®æ£ãã代ããã«ãæ確åã®ããã«ããã°ã©ããŒã«é£çµ¡ããå¿
èŠããããŸãã
ãããã£ãŠããã®ã³ã°ãµãã·ã¹ãã ã¯ãéçºè
ãæåã§å°ãªããšãåºæ¬çãªã¿ã€ãã®æååãäœæããããšã匷å¶ããã«ãåºåæååã®äŸ¿å©ãªæžåŒèšå®ã®ããã®ããŒã«ãæäŸããå¿
èŠããããŸãã ããã§C ++ã§ã¯2ã€ã®æ¹åãå¯èœã§ãã
1ã€ç®ã¯ãCã®ã¬ã¬ã·ãŒã§ãããã¿ãŒã³ã§æååããã©ãŒãããããŸãã ã€ãŸã ãã°åºåé¢æ°ã«ã¯ãsprintfãšåæ§ã®ã€ã³ã¿ãŒãã§ãŒã¹ãšæ©èœãå¿
èŠã§ãã ããã¯è¶£å³ã®åé¡ã§ãããå人çã«ã¯ãã®ãªãã·ã§ã³ã¯éåžžã«åæ
çã§ãã äœããããŸããå¯å€æ°ã®ç°çš®é¢æ°ãã©ã¡ãŒã¿ãŒã䜿çšããå¿
èŠããããŸããã ã€ãŸã å
¥åããŒã¿ãæ€èšŒããæ©èœã¯å®è³ªçã«ååšããŸããã ããã«ãåçŽåãããŠããŸãããæåã§åãå€æããå¿
èŠããããŸãã ããšãã°ã笊å·ãªãã®æ°å€ãåºåããã«ã¯ãïŒ
iã®ä»£ããã«ïŒ
uãã©ãŒãããã³ãŒãã䜿çšããå¿
èŠãããããšãèŠããŠããå¿
èŠããããŸãã ããã«ãã³ã³ãã€ã«æ®µéã§ã¯ããã©ãŒãããã³ãŒãã®æ°ïŒé åºãã¿ã€ãïŒãšå®éã«è»¢éããããã©ã¡ãŒã¿ãŒãäžèŽããªãå Žåããšããã©ããã®ãªãåé¡ãçºçããå¯èœæ§ããããŸãã
2çªç®ã®ãªãã·ã§ã³ã¯åºåã¹ããªãŒã ã§ãã åã®ãœãªã¥ãŒã·ã§ã³ã®ãã¹ãŠã®æ¬ ç¹ã奪ãããŠããŸãïŒåºåæŒç®åããµããŒãããªããªããžã§ã¯ãã転éãããå Žåããã©ã¡ãŒã¿ãŒã®äŸåé¢ä¿ã¯ãããŸãã-ã³ã³ãã€ã«ãšã©ãŒãããããã¹ãŠã®çš®é¡ã®é©ãã§ã¯ãªããæåã§ãããã¡ãŒããã£ã¹ãã¿ã€ããªã©ãéžæããå¿
èŠã¯ãããŸãã ãããŠæãéèŠãªããšã¯ãç°ãªãã¿ã€ãã®å€æ°ãå«ãã¡ãã»ãŒãžè¡ã®åºåãå®éã«1è¡ã§æžãããšãã§ããããšã§ãã ã¯ããç¹å¥ãªå°é£ã®å®è£
ã¯æåŸ
ãããŠããŸãã-æšæºã©ã€ãã©ãªã«ã¯æ¢ã«ã¹ããªãŒã streamstream [3]ãå«ãŸããŠããŸããããã¯ãæååãžã®åºåãã¹ããªãŒãã³ã°ããããã®æ¢æã®ã¢ã«ãŽãªãºã ãããããšã瀺åããŠããŸãã
éçºè
ã®æ³šç®ãéããæ段ã ããã°ã©ãã¯å¿ããã§ãã IDEåºåã³ã³ãœãŒã«ã§ããšã©ãŒã«æ°ä»ããªãå ŽåããããŸãã åé¡ã¯ãæ
å ±ã¡ãã»ãŒãžã®é²ã®éã§ç°¡åã«è¿·åã«ãªããŸãã ãããã£ãŠãæåã«ããã°ã¯åºåã¬ãã«èšå®ããµããŒãããå¿
èŠããããŸãã ããšãã°ãããšã©ãŒãšèŠåã®ã¿ã衚瀺ããŸããã ããã¯å¿
èŠã§ãããããã§ã¯ååã§ã¯ãããŸãã-å®è¡ããã«ã¯æã
調æŽãå¿
èŠã§ãã ãããŠããã°ã©ããŒã¯å¿ããã§ãã
ããã«ç¹å¥ãªassertãã¯ã[4]ããããŸãã åé¡ã®ããå Žæã§ããã°ã©ã ã®å®è¡ãäžæã§ããŸãã çµæã¯ç°ãªããŸã-Visual Studioã§ã¯ããŠã£ã³ããŠã衚瀺ãããåŸã«å®è¡ãç¶ç¶ããããšãã§ããŸããXcodeã¯ãµãŠã³ãã§ãµãŠã³ããæããããŸããããå®è¡ãç¶ç¶ããããšãã§ããŸããã äžè¬ã«ã泚æãä¿èšŒãããŸãã ãã®å Žåã蚺æã¡ãã»ãŒãžèªäœã¯IDEåºåã³ã³ãœãŒã«ã®æåŸã«ããã³ã³ãœãŒã«ã®æåŸã«è¡šç€ºãããå€ãã®å Žåãåæ¢ã®çç±ãæ¢ãããã«åŒã³åºãã¹ã¿ãã¯ã調ã¹ãå¿
èŠããªããªããŸãã
å³1.èŠåã«ããããã°ã©ã ã®äžæ
èšäºã®æåŸã«ãå®è£
ã®äŸã瀺ããŸãã ç¹å¥ãªåªåãå¿
èŠãšãããå¹æãé倧è©äŸ¡ã§ããªãããšã瀺ãããã«ãçµæãšããŠãéçºè
ãåºæ¿ããŠåé¡ã«é¢ãã詳现ãªã¡ãã»ãŒãžãäœæããã ãã§ãªããåé¡ãšãã®æ€åºã®éã®æéééã倧å¹
ã«ççž®ãããµãã·ã¹ãã ãååŸãããŸãã
æåã«ããã®ã³ã°ã¯ã©ã¹ã®åºæ¬çãªã€ã³ã¿ãŒãã§ãŒã¹ãèŠãŠã¿ãŸãããã
class Log { public:
ãŸãããã°ã®è©³çŽ°ã®4ã€ã®ã¬ãã«ãïŒå®£èšã®é ã«ïŒçŽ¹ä»ããŸãã
- ãã°ã®å®å
šã·ã£ããããŠã³
- ãšã©ãŒã®ã¿ãåºå
- èŠåãšãšã©ãŒã衚瀺ãã
- ãã¹ãŠã®ã¿ã€ãã®ã¡ãã»ãŒãžãåºåãã
enum DebugLevel { DEBUG_LEVEL_DISABLED = 0, DEBUG_LEVEL_ERROR = 1, DEBUG_LEVEL_WARNING = 2, DEBUG_LEVEL_MESSAGE = 3, };
ãããã£ãŠãæå¹ãªã¿ã€ãã®ã¡ãã»ãŒãžã®3ã€ã®èå¥åãè¿œå ããŸããæ
å ±ã¡ãã»ãŒãžãèŠåããšã©ãŒã§ãã
enum MessageType { MESSAGE_INFO, MESSAGE_WARNING, MESSAGE_ERROR, };
次ã®ã¡ãœããã¯ãã¯ã©ã¹ãã€ã³ã¹ã¿ã³ã¹åããããã®ãã®ã§ãã ã³ã³ã¹ãã©ã¯ã¿ãŒãä¿è·é åã«é
眮ããããšã«ãããçŽæ¥äœæããããšã¯çŠæ¢ãããŠããŸãã
static void createInstance();
å©çšå¯èœãªæåŸã®ãããªãã¯ã¡ãœããã¯ããã°ã®è©³çŽ°ã¬ãã«ãèšå®ããããã«èšèšãããŠããŸãã ä»ã¯ãã¹ãŠéããããŠããŸãã ããã¯äºåã®ãã°ã€ã³ã¿ãŒãã§ãŒã¹ã§ã-å°æ¥ãå®éã«ã¡ãã»ãŒãžã衚瀺ããæ¹æ³ã瀺ãããŸãã
void setDebugLevel(DebugLevel level); protected:
ä¿è·ãããé åã¯ãçŽæããããã©ã€ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒã«ãã£ãŠéãããŸãã
Log();
å¯äžã®çŽç²ä»®æ³ã¡ãœããã¯ããã©ãããã©ãŒã ã«äŸåããæ
å ±ãIDEã³ã³ãœãŒã«ã«åºåããããã«èšèšãããŠããŸã
virtual void writeIDEDebugString(const std::string& message, MessageType type) = 0; private:
次ã®3ã€ã®æ¹æ³ã¯ãåã¿ã€ãã®ã¢ã©ãŒããçŽæ¥åºåããã®ã«åœ¹ç«ã¡ãŸãã ããã°ã©ãã誀ã£ãŠãããã䜿çšããªãããã«ãã¯ã©ã¹ã®ãã©ã€ããŒããšãªã¢ã«é ãããŠããŸãã
void writeMessage(const std::string& message); void writeWarning(const std::string& message); void writeError(const std::string& message);
ãã¡ã€ã«ãžã®åºåæ¹æ³ã ããã§ã¯ãèšäºã®ãããã¯ãšçŽæ¥é¢ä¿ããªãããããã®å®è£
ã¯ç€ºããŸããã
void appendToFile(const std::string& message);
ãããã°ã¡ãã»ãŒãžãçæããã«ã¯ããŠãŒãã£ãªãã£é¢æ°ãå¿
èŠã§ãã éåžžãã¿ã€ã ã¹ã¿ã³ããšè¡ã®éèŠåºŠã®ãµã€ã³ãåã¡ãã»ãŒãžã«è¿œå ãããŸãã
void writeMessage(const std::string& message, MessageType type);
ã¯ã©ã¹ããŒã¿ããããã°ã®è©³çŽ°ã¬ãã«ãšãã®ã€ã³ã¹ã¿ã³ã¹ãä¿åããå¿
èŠããããŸãã
DebugLevel mDebugLevel; static Log* sInstance; };
ããã€ãã®ã¡ãœããã®å®è£
ãæ€èšãã
ã¡ãã»ãŒãžåºåé¢æ°ã¯åãã¿ã€ãã§ããããããšã©ãŒã¡ãã»ãŒãžã®ãœãŒã¹ã³ãŒããæãå®å
šãªãã®ãšèŠãªãããšã«å¶éããŠããŸãã
void Log::writeError(const std::string& message) { if (mDebugLevel >= DEBUG_LEVEL_ERROR) { writeMessage(getLogString(message, "error"), MESSAGE_ERROR); } #ifdef _DEBUG assert(0); #endif exit(EXIT_FAILURE); }
ãã®ããããŸãæåã«ã詳现ã¬ãã«ã§ãšã©ãŒåºåãèš±å¯ãããŠããããšã確èªããŠãããã¡ãã»ãŒãžãšã¡ãã»ãŒãžã¿ã€ããéä¿¡ãããwriteMessageãŠãŒãã£ãªãã£ã¡ãœãããåŒã³åºããŸãã çµæã¯æ¬¡ã®ããã«ãªããŸã
ãšã©ãŒïŒ[ã¡ãã»ãŒãž]éçºè
ã®æ³šæãåŒãããã«ããšã©ãŒåºåãç¡å¹ã«ãªã£ãŠããå Žåã§ããassertãã¯ããåŒã³åºãããŸãã ããã«ãã¢ããªã±ãŒã·ã§ã³ã¯ãµãã«ãŒãã³ã®çµããã§çµäºããŸãã ãã®ãããªè§£æ±ºçããŠãããŒãµã«ãšåŒã¶ããšã¯ã»ãšãã©ãããŸãããããã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ããšã©ãŒã¯ä»åŸã®äœæ¥ãšäºææ§ã®ãªãåé¡ã瀺ããŸãã
èŠååºåãåæ§ã«å®è£
ãããŸãããã¢ããªã±ãŒã·ã§ã³ãç°åžžçµäºããããšã¯ãããŸããã æ
å ±ã¡ãã»ãŒãžã¡ãœããã«ã¯ã¢ãµãŒãå²ã蟌ã¿ãå«ãŸããŠããŸããã
次ã«ãwriteMessageã¯æ¬¡ã®ãšããã§ãã
void Log::writeMessage(const std::string& message, MessageType type) { std::string text(message); std::replace(text.begin(), text.end(), '\n', ' '); appendToFile(text); #ifdef _DEBUG writeIDEDebugString(text, type); #endif }
ãã®åœ¹å²ã¯ãåãã°ã¡ãã»ãŒãžãåäžè¡ã§ããããšãä¿èšŒãããããã«ã¡ãã»ãŒãžããæ¹è¡ãåé€ãããã¡ã€ã«ãžã®æžã蟌ã¿ã¡ãœãããåŒã³åºãããããã°ã¢ãŒããæå¹ãªå Žåã¯IDEã³ã³ãœãŒã«ã«åºåããããšã§ãã
ãããã°ã¢ãŒãã¯ã_DEBUGãã¯ãã«ãã£ãŠæ±ºå®ãããŸããããã¯éåžžãVisual Studioã§èªåçã«æ€åºãããŸãã ä»ã®éçºç°å¢ã§ã¯ãã»ãšãã©ã®å Žåãæåã§è¿œå ããå¿
èŠããããŸãã ãããã«ãããããã¯ç¹å®ã®å°é£ãåŒãèµ·ãããŸããã
å³2. Xcodeã®ãããã°ãã¯ãå±æ§å®çŸ©
ããã«ããã©ãããã©ãŒã ããšã«ãwriteIDEDebugStringã¡ãœããããªãŒããŒã©ã€ãããŠãããŒã¹ã¯ã©ã¹ããç¶æ¿ããç¬èªã®ãã°ã¯ã©ã¹ãå®çŸ©ããå¿
èŠããããŸãã äžéšã®ãã©ãããã©ãŒã ã§ã®å®è£
äŸã瀺ããŸãã
WindowsïŒVisual StudioïŒ
void Log_Windows::writeIDEDebugString(const std::string& message, MessageType type) { OutputDebugStringA(message.c_str()); OutputDebugStringA("\n"); }
AndroidïŒEclipseïŒ
void Log_Android :: writeIDEDEDugugStringïŒå®æ°æååãšã¡ãã»ãŒãžãMessageTypeã¿ã€ãïŒ
{ switch(type){ case MESSAGE_INFO: __android_log_print(ANDROID_LOG_INFO, "", message.c_str()); break; case MESSAGE_WARNING: __android_log_print(ANDROID_LOG_WARN, "", message.c_str()); break; case MESSAGE_ERROR: __android_log_print(ANDROID_LOG_ERROR, "", message.c_str()); break; } }
ã芧ã®ãšãããAndroidã®å Žåãããã«æ確ã«ãªããŸããã¡ãã»ãŒãžãããŸããŸãªè²ã§è¡šç€ºã§ããŸãã èµ€ã§è¡šç€ºãããåé¡ã¯ãæèšããªããŠãã泚æãéããå¯èœæ§ã¯ã»ãšãã©ãããŸããã
å³3. Eclipseã®ã¿ã€ãã«åºã¥ããã¡ãã»ãŒãžã®è²ä»ã
MacOSããã³iOSïŒXcodeïŒ
void Log_Mac::writeIDEDebugString(const std::string& message, MessageType type) { NSLog(@"%s", message.c_str()); }
çŽæ¥çãªçµè«ãå°ãåºããŸããããçåã¯æ®ãããããã¹ããªãŒã ã«é©åã«ããã¯ããæ¹æ³ã§ãã çµå±ã®ãšããããã¹ãŠã®åŒãåºãã¡ãœãããéããŸããã
ãŸããç®çã®ãšã³ããªã決å®ããŸãããã C ++ã¹ããªãŒã ã¯ãããŒã¿ãæž¡ãããã®ãšåãæ¹æ³ã§åºåãã©ã¡ãŒã¿ãŒãåãåãããšãã§ããŸãã ããšãã°ãã¡ãã»ãŒãžã¯å€§æåã§è¡šç€ºãããŸãã
std::cout << std::uppercase << "test" << '\n';
ãã¡ãããããã«ã¯ãã®ãããªäººãããŸãããå人çã«ã¯ã衚瀺ãããæ
å ±ãšåºåãã©ã¡ãŒã¿ãŒã®æ··åãåãå
¥ããããšãã§ããŸããã§ããã ãããã£ãŠããã®äŸã§ã¯ãåºåã¯æ¬¡ã®ããã«å®è£
ãããŸã
Log::error<<"text"<<std::endl; Log::warning<<"text"<<std::endl; Log::message<<"text"<<std::endl;
ã€ãŸã ã¡ãã»ãŒãžã®ã¿ã€ãã«é¢ããæ
å ±ã«ã¯ãã¹ããªãŒã ãªããžã§ã¯ãèªäœãå«ãŸããŸãã ãã¡ãããstd :: uppercaseã®ãããªæšæºã¹ããªãŒã ãã©ã¡ãŒã¿ã¯åŒãç¶ã䜿çšã§ããŸãã ãã¹ãŠã®ã¹ããªãŒã æ©èœã¯ãæšæºã©ã€ãã©ãªã¯ã©ã¹ããç¶æ¿ãããŸãã
class Streamer : public std::ostream { public: Streamer(MessageType messageType); ~Streamer(); private: class StringBuffer : public std::stringbuf { public: Buffer(MessageType messageType); ~Buffer(); virtual int sync(); private: MessageType mMessageType; }; };
ã¹ããªãŒã ã®åã¿ã€ãã«ã¯ç¬èªã®ãªããžã§ã¯ãããããããã³ã³ã¹ãã©ã¯ã¿ãŒã¯MessageTypeãã©ã¡ãŒã¿ãŒãåãå
¥ããŸãã std :: ostream [5]ããç¶æ¿ããåºåã¯ã©ã¹èªäœããã¹ããããã¯ã©ã¹StringBufferã¯æååã®åœ¢æãæ
åœããæååã¯std :: stringbuf [6]ããç¶æ¿ãããŸãã ãŠãŒã¶ãŒãã¡ãã»ãŒãžã®åœ¢æã®å®äºãçºè¡šãããã³ã«ã
syncã¡ãœãããèªåçã«åŒã³åºãããããã§çŽæ¥åºåãå®è¡ãããŸãã ãããã¡ãªã³ã°ãããã¹ããªãŒã ã®æšæºã¡ãœããã䜿çšããŠãåºåã®å®äºãå ±åã§ããŸãïŒ
flushã¡ãœãããåŒã³åºããŠ
Log::message<<"text"; Log::message.flush();
ãŸãã¯åã«ã¹ããªãŒã ã«
std :: endlãè¿œå ãã
Log::message<<"text"<<std::endl;
ãŸããåºåã¹ããªãŒã ãæååãããã¡ãŒã«é¢é£ä»ããå¿
èŠããããŸãã ããã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã§è¡ãããŸãã
Log::Streamer::Streamer(Log::MessageType messageType) : std::ostream(new StringBuffer(messageType)) { }
ãããã£ãŠãç Žæ£æã«ã¯ããããã¡ãåç¬ã§ç Žæ£ããå¿
èŠããããŸãã
Log::Streamer::~Streamer() { delete rdbuf(); }
ãããã¡ãŒã³ã³ã¹ãã©ã¯ã¿ãŒã§ã¯ã衚瀺ãããã¡ãã»ãŒãžã®çš®é¡ãèŠããŠããã°ååã§ãã
Log::Streamer::StringBuffer:: StringBuffer(Log::MessageType messageType) : mMessageType(messageType) { }
ç Žå£ãããå Žåã念ã®ãããåæãè¡ããŸããããã«ãããããã°ã©ããflushãŸãã¯endlã®åŒã³åºããå¿ããå Žåã«ã¡ãã»ãŒãžããæ¶å€±ãããã®ãé²ããŸãã
Log::Streamer::Buffer::~Buffer() { pubsync(); }
ã¹ããªãŒã ãLogã¯ã©ã¹ã®ã¡ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ã«ã¢ã¯ã»ã¹ã§ããããã«ããŸããLogã¯ã©ã¹ã¯å€éšã«éããããŠãããããå
éšã«é
眮ããŸã
class Log { public: ... class Streamer : public std::ostream { ... }; static Streamer message; static Streamer warning; static Streamer error; ...
ã¡ãã»ãŒãžã®èŠåãšãšã©ãŒã¯ãåã¿ã€ãã®ã¡ãã»ãŒãžã®ã¹ã¬ããã€ã³ã¹ã¿ã³ã¹ã§ãã ã³ã³ã¹ãã©ã¯ã¿ãŒã§æž¡ãããã¡ãã»ãŒãžã®ã¿ã€ã
Log::Streamer Log::message(Log::MESSAGE_INFO); Log::Streamer Log::warning(Log::MESSAGE_WARNING); Log::Streamer Log::error(Log::MESSAGE_ERROR);
ãããŠæåŸã«ãã¹ããªãŒã æååãããã¡ãŒåæé¢æ°ã®å®è£
ãæ€èšããŸãã
int Log::Streamer::StringBuffer::sync() { if (Log::sInstance == NULL) { return 0; } std::string text(str()); if (text.empty()) { return 0; } str(""); switch (mMessageType) { case MESSAGE_INFO: Log::sInstance->writeMessage(text); break; case MESSAGE_WARNING: Log::sInstance->writeWarning(text); break; case MESSAGE_ERROR: Log::sInstance->writeError(text); break; } return 0; }
ãã¹ããããã¯ã©ã¹ãšããŠã
Log :: Streamer :: Bufferã¯
Logã®ãã©ã€ããŒãïŒãã©ã€ããŒãïŒãšãªã¢ã«ã¢ã¯ã»ã¹ã§ããŸãã æ確ã«ããå¿
èŠãããã®
ã¯strïŒïŒé¢æ°
ã®ã¿ã§ãã ããã¯std :: stringbufã¯ã©ã¹ã®ããªãå¥åŠãªã¡ãœããã§ãããåæã«ãããã¡ãŒå€ãååŸããã³èšå®ã§ããŸãã ã©ã¡ãã®åœ¢åŒã§ã䜿çšãããŸãããŸãããã®é¢æ°ã䜿çšããŠãããã¡ãŒããæååãååŸãã次ã«
strïŒ ""ïŒãåŒã³åºããŠãããã¡ãŒ
ãã¯ãªã¢ããŸãã
ããã§ã
Streamerã¯ã©ã¹ã¯
Logã® ãå
¬åŒãã€ã³ã¿ãŒãã§ãŒã¹ã«ãªããŸããã è€åã¡ãã»ãŒãžãiïŒ6ïŒã¯ç¯å²[1..5]ã§ããå¿
èŠããããŸããã衚瀺ããã«ã¯ãããã°ã©ãã次ã®ããã«èšè¿°ããã°ååã§ãã
Log::warning << "i (" << i << ") should be in range [" << I_MIN << ".." << I_MAX << "]" << std::endl;
ãããŸããªãééã£ãããååŸããã®ãšåããããç°¡åã§ã
ãããã£ãŠãéåžžã«åçŽãªã€ãã³ããã®ã³ã°ã¯ã©ã¹ã®äŸã瀺ãããŸãããããã¯ãæãæéã®å¶çŽã®ãããããžã§ã¯ãã®æåã§ãç°¡åã«å®è£
ã§ããŸãïŒãã¹ããæžããããããã°ã©ããŒã説åŸããããå¹æçã«å¶åŸ¡ããããåŒåžããããç ã£ããããæéããªãå ŽåïŒããã®å質ã倧å¹
ã«æ¹åããŸãã
[1]
en.wikipedia.org/wiki/Multiple_dispatch[2]
www.cplusplus.com/reference/cstdio/sprintf[3]
www.cplusplus.com/reference/sstream/stringstream[4]
www.cplusplus.com/reference/cassert/assert[5]
www.cplusplus.com/reference/ostream/ostream[6]
www.cplusplus.com/reference/sstream/stringbuf