
åå ãã代ããã«
ã¿ãªããããã«ã¡ã¯ïŒ ä»æ¥ã¯ããã¹ãã³ãŒããç°¡åã«ããããŠåãã§æžãæ¹æ³ã«ã€ããŠã話ããããšæããŸãã äºå®ãåœç€Ÿã§ã¯è£œåã®åââ質ãåžžã«ç£èŠããé«ãè©äŸ¡ããŠããŸãã å®éãæ¯æ¥äœçŸäžäººãã®äººã ã圌ããšäžç·ã«åããŠããããŠãŒã¶ãŒã倱æãããããšã¯å®¹èªã§ããŸããã å ±åæéãæ¥ããšæ³åããŠãã ãã.VLSIã®æ éã«èšèšããããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã䜿çšããŠãæ éãã€åãã§ææžãæºåããåæ¡ãå床ãã§ãã¯ããŠãè¿ãå°æ¥ã«çšå眲ã®ç€Œåæ£ãã人ã ãšã®äŒåããªãããšã確èªããŸããã ãããŠä»ãããŠã¹ã軜ãã¯ãªãã¯ããŠãåæãããŠãããéä¿¡ããã¿ã³ãã¯ãªãã¯ããŠãã ããã ã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããããã¥ã¡ã³ããç Žå£ãããã¢ãã¿ãŒãç±ãçã§çããå¶æãçã人ã ããã§ã«ãã€ãããã¢ãããããå ±åãæ±ããŠããããã§ãã ãããã©ã®ããã«çºçãããã次ã«ç€ºããŸãã

ãµãŒ...ãŸããç§ã¯åæããŸããããããç§ã¯ã¢ãã¿ãŒã«è奮ããŸãã;ïŒããã§ããçºçããç¶æ³ã¯ãç§ãã¡ã®è£œåã®ãŠãŒã¶ãŒãæã奜ãŸããå¿ã®ç¶æ ã§ã¯ãªãå¯èœæ§ããããŸãã
ãã®ãããTensorã§ã客æ§ã®é埳çç¶æ ãè©äŸ¡ãããããéçºãã補åãå æ¬çã«ãã¹ãããããšãéåžžã«éèŠã§ã-åœç€Ÿã§ã¯ãããã¯ãã»ãŒ300人ã®ãã¹ã¿ãŒã補åã®å質ãç£èŠããããšã«ãã£ãŠä¿èšŒãããŠããŸãã ãã ããéçºã®ãã¹ãŠã®æ®µéã§å質ã管çãããããã«ããŸãã ãã®ãããéçºããã»ã¹ã§ã¯ãçµ±åãè² è·ãåãå ¥ããã¹ãã¯èšããŸã§ããªããèªååãããåäœãã¹ãã®äœ¿çšãè©Šã¿ãŸãã
ãã ãããããŸã§ã®ãšãããã€ã³ã¿ãã¥ãŒã®çµéšããã誰ãããã¹ãå¯èœãªã³ãŒããäœæããã¹ãã«ãæã£ãŠããããã§ã¯ãªãããšã«æ³šæããŠãã ããã ãããã£ãŠããã¹ããããã³ãŒãã®äœæã®ååã«ã€ããŠãæã§ã話ãããŸããã¡ã³ããã³ã¹ãšã¢ããã°ã¬ãŒããç°¡åãªåäœãã¹ããäœæããæ¹æ³ã瀺ããããšæããŸãã
以äžã«ç€ºãè³æã®å€§éšåã¯C ++ãã·ã¢äŒè°ã§çºè¡šãããã®ã§ãèªã¿ãèããŠãèŠãããšããã§ããŸãã
åªããåäœãã¹ãã®ç¹åŸŽ
èªåå®è¡ããããã¹ããèšè¿°ããéã«æåã«å¯ŸåŠããªããã°ãªããªãã¿ã¹ã¯ã®1ã€ã¯ãå€éšäŸåé¢ä¿ã®åŠçã§ãã å€éšäŸåãšã¯ããã¹ããããã³ãŒããçžäºäœçšãããããããå®å šã«å¶åŸ¡ã§ããªããšã³ãã£ãã£ãæå³ããŸãã ãã®ãããªå¶åŸ¡ãããŠããªãå€éšäŸåé¢ä¿ã«ã¯ãããŒããã©ã€ããããŒã¿ããŒã¹ããããã¯ãŒã¯æ¥ç¶ãä¹±æ°ãžã§ãã¬ãŒã¿ãŒãªã©ãšã®å¯Ÿè©±ãå¿ èŠãšããæäœãå«ãŸããŸãã
ã·ã¹ãã ã®ããŸããŸãªã¬ãã«ã§èªåãã¹ããå®è¡ã§ãããšèšããªããã°ãªããŸããããç¹ã«åäœãã¹ãã«é¢é£ããåé¡ãæ€èšããŸãã
以äžã®äŸã®æ ¹åºã«ããååãããæ確ã«ç解ããããã«ãã³ãŒããç°¡ç¥åãããŠããŸãïŒããšãã°ã const修食åã¯çç¥ãããŠããŸãïŒã ãã¹ãäŸèªäœã¯ã GoogleTestã©ã€ãã©ãªã䜿çšããŠå®è£ ãããŸãã
çµ±åãã¹ããšåäœãã¹ãã®æãéèŠãªéãã®1ã€ã¯ãåäœãã¹ãããã¹ãŠã®å€éšäŸåé¢ä¿ãå®å šã«å¶åŸ¡ã§ããããšã§ãã ããã«ãããåäžã®åäœãã¹ãã«æ¬¡ã®ããããã£ãããããšãå®çŸã§ããŸãã
- ç¹°ãè¿ããŸã-ãã¹ããéå§ããçµæãåºåã¯åžžã«åãå€ãè¿ããŸãïŒåžžã«ã·ã¹ãã ãåãç¶æ ã«ããŸãïŒã
- å®å®-æŒå€ãåããããã¹ãã®éå§æå»ã«é¢ä¿ãªããåžžã«åæ ŒãŸãã¯äžåæ Œã
- åé¢-䜿çšå¯èœãªãã¹ãŠã®åäœãã¹ãã®éå§é åºãããã³ãã¹ãå ã§å®è¡ãããã¢ã¯ã·ã§ã³ã¯ãåäžã®åäœãã¹ãã®çµæã«åœ±é¿ããŸããã
ããã¯ãã¹ãŠã説æãããããããã£ã䜿çšããå€ãã®åäœãã¹ãã®èµ·åãèªååããå®éã«ã¯åäžã®ãã¿ã³ãæŒãã ãã§å®è¡ã§ãããšããäºå®ã«ã€ãªãããŸãã
åªããåäœãã¹ãã¯é«éã§ãã ãããžã§ã¯ãã«å€æ°ã®ãã¹ãããããããããã®å®è¡ãé·ãå Žåããã¹ãŠã®ãã¹ãã®å®è¡ã«ããªãã®æéããããããã§ãã ããã«ããããŠãããã³ãŒããå®è¡ããããšããã¹ãŠã®ãŠããããã¹ããå®è¡ãããåæ°ãæžããšããäºå®ã«ã€ãªããå¯èœæ§ããããŸããããã«ãããã·ã¹ãã ãå€æŽã«å¿çããã®ã«ãããæéãé·ããªããå°å ¥ããããšã©ãŒãæ€åºããæéãé·ããªããŸãã
圌ãã¯ããã¹ãã¢ããªã±ãŒã·ã§ã³ã䜿çšãã人ã«ãšã£ãŠã¯ãã¹ãŠãã¯ããã«ç°¡åã§ãããšèšããŸãããç§ãã¡ã«ãšã£ãŠããã®ãããªé«éã®ã¿ãŒã³ããŒãã«ãæã£ãŠããªãåãªã人éã«ãšã£ãŠã¯ãããã»ã©çããªãã§ãã ãããã£ãŠãããã«ç解ããŸãã

åäœãã¹ãã ãã¹ãŠã¯ã©ãããå§ãŸããŸãã
åäœãã¹ãã®èšè¿°ã¯ãååã®éžæããå§ãŸããŸãã åäœãã¹ãåã«å¯Ÿããæšå¥šãããã¢ãããŒãã®1ã€ã¯ã3ã€ã®éšåã§ååã圢æããããšã§ãã
-ãã¹ãã¯ãŒã¯ãŠãããã®åå
-ãã¹ãã¹ã¯ãªãã
-æåŸ ãããçµæ
ãããã£ãŠãããšãã°ã Sum_ByDefault_ReturnsZero ã Sum_WhenCalled_CallsTheLoggerãªã©ã®ååãååŸã§ããŸãã ãããã¯å®å šãªæãšããŠèªãŸããã®ã§ããã¹ãã§ã®äœæ¥ãç°¡åã«ãªããŸãã ãã¹ã察象ãç解ããã«ã¯ãã³ãŒãã®ããžãã¯ãç解ããã«ããã¹ãã®ååãèªãã ãã§ååã§ãã
ãã ããå Žåã«ãã£ãŠã¯ããã¹ãã³ãŒãã®ããžãã¯ãç解ããå¿ èŠããããŸãã ãã®äœæ¥ãç°¡çŽ åããããã«ããŠããããã¹ãæ§é ã¯3ã€ã®éšåã§æ§æã§ããŸãã
- ã¢ã¬ã³ãžã®äžéš-ããã§ã¯ããã¹ãã«å¿ èŠãªãªããžã§ã¯ããäœæããã³åæåããŸã
- æ³ã®äžéš-å®éã«ãã¹ãã¢ã¯ã·ã§ã³ãå®æœ
- ã¢ãµãŒãã®äžéš-ããã§ååŸããçµæãšåç §ã®æ¯èŒ
ãã¹ãã®èªã¿ããããé«ããããã«ããããã®éšåã¯ç©ºã®æååã§äºãã«åé¢ããããšããå§ãããŸãã ããã«ãããã³ãŒããèªãã§ãã人ã®æ¹åã決ãŸãããã¹ãã§æãé¢å¿ã®ããéšåããã°ããèŠã€ããããšãã§ããŸãã
ã³ãŒãã®ããžãã¯ãåäœãã¹ãã§ã«ããŒããå Žåããã¹ããããã³ãŒãã®åã¢ãžã¥ãŒã«ã¯æ¬¡ã®ããããã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿ èŠããããŸãã ã ãããããªãã¯ãã¹ãããããšãã§ããŸãïŒ
-çµæãè¿ã
-ã·ã¹ãã ç¶æ ã®å€æŽ
-ãªããžã§ã¯ãéã®çžäºäœçš
æåã®2ã€ã®ã±ãŒã¹ã§ã¯ãåé¢ã®ã¿ã¹ã¯ã«çŽé¢ããŠããŸã ã ããã¯ããã¹ãããŒã«ã«ã³ãŒããå°å ¥ããªãããšã§æ§æãããŠãããã³ãŒããå®å šã«å¶åŸ¡ããããšã¯ã§ããŸããã åŸè ã®å Žåã èªèåé¡ã解決ããå¿ èŠããããŸã ã ãã¹ããããã³ãŒãã§ã¯äœ¿çšã§ããªãå€ã«ã¢ã¯ã»ã¹ããããšã§æ§æãããŸããããšãã°ããªã¢ãŒãWebãµãŒããŒã«ãããã°ã®åä¿¡ãå¶åŸ¡ããå¿ èŠãããå Žåã§ãã
ãã¹ãå¯èœãªã³ãŒããäœæããã«ã¯ãæå³ããç®çã§åœãªããžã§ã¯ããå®è£ ããã³äœ¿çšã§ããå¿ èŠããããŸãã
åœãªããžã§ã¯ãã®åé¡ã«ã¯ããã€ãã®ã¢ãããŒãããããŸããããã¹ãæžã¿ã³ãŒãã®äœæããã»ã¹ã§è§£æ±ºãããã¿ã¹ã¯ã«å¯Ÿå¿ããåºæ¬çãªãã®ã®1ã€ãæ€èšããŸãã
圌女ã¯ã ã¹ã¿ããªããžã§ã¯ããšã¢ãã¯ãªããžã§ã¯ããšãã2ã€ã®ã¯ã©ã¹ã®åœãªããžã§ã¯ããåºå¥ããŠããŸã ã ãããã¯ãããŸããŸãªåé¡ã解決ããããã«èšèšãããŠããŸããåé¢åé¡ã解決ããã¹ã¿ããªããžã§ã¯ããšãèªèåé¡ã解決ããã¢ãã¯ãªããžã§ã¯ãã§ãã æ倧ã®éãã¯ãã¹ã¿ããªããžã§ã¯ãã¢ãµãŒã ïŒååŸããçµæãåç §ãšæ¯èŒããæäœïŒã䜿çšãããšããã¹ããšãã¹ããããã³ãŒãã®éã§å®è¡ãããã¢ãã¯ãªããžã§ã¯ãã®äœ¿çšã¯åæãåæãšãããã¹ããåæ Œãããã©ããã瀺ãããšã§ãã
æ»ãå€ã®åæãŸãã¯ã·ã¹ãã ã®ç¶æ ã®å€åã«åºã¥ããŠäœæ¥ã®ããžãã¯ããã¹ãã§ããå Žåã¯ãããããŸãã å®è·µã瀺ãããã«ãã¢ãã¯ãªããžã§ã¯ãã䜿çšããåäœãã¹ãã¯ãã¹ã¿ããªããžã§ã¯ãã䜿çšãããã¹ããããäœæããã³ä¿å®ãå°é£ã§ãã
åŸæ¥ã®ã³ãŒãã䜿çšããäœæ¥ã®äŸã«ã€ããŠãäžããããååãèããŠã¿ãŸãããã å³3ã«ç€ºãEntryAnalyzerã¯ã©ã¹ããããšããŸãã 1ãããã³ç§ãã¡ã¯ãŠããããã¹ãã§åœŒã®ãããªãã¯ã¡ãœããAnalyzeãã«ããŒãããã§ãã ããã¯ããã®ã¯ã©ã¹ãå€æŽãããããã®æ¹æ³ã§ãã®åäœãææžåããããšããäºå®ã«ãããã®ã§ãã
ã³ãŒãããã¹ãã§ã«ããŒããããã«ãå€éšäŸåé¢ä¿ãå®çŸ©ããŸãã ç§ãã¡ã®å Žåããããã®äŸåé¢ä¿ã®2ã€ããããŸããããŒã¿ããŒã¹ã®æäœãšãããã¯ãŒã¯æ¥ç¶ã®æäœã§ããããããã WebServiceã¯ã©ã¹ãšDatabaseManagerã¯ã©ã¹ã§å®è¡ãããŸã ã
class EntryAnalyzer { public: bool Analyze( std::stringename ) { if( ename.size() < 2 ) { webService.LogError( "Error: "+ ename ); return false; } if( false== dbManager.IsValid( ename ) ) return false; return true; } private: DatabaseManager dbManager; WebService webService; };
å³1 ãŠããããã¹ãã®ã«ãã¬ããžã«é©ããªããã¹ãã¯ã©ã¹ã³ãŒã
ãããã£ãŠã EntryAnalyzerã¯ã©ã¹ã®å Žåããããã¯å€éšäŸåé¢ä¿ã§ãã æœåšçã«ã dbManager.IsValidãã§ãã¯ãšæçµçãªtrueã®æ»ãæã®éã«ã¯ããã¹ããå¿ èŠãªã³ãŒããååšããå¯èœæ§ããããŸãã ãã¹ããèšè¿°ãããšããæ¢åã®å€éšäŸåé¢ä¿ãåãé€ããåŸã«ã®ã¿ã¢ã¯ã»ã¹ã§ããŸãã 衚瀺ãç°¡çŽ åããããã«ããã®ãããªè¿œå ã®ã³ãŒãã¯æäŸãããŠããŸããã
次ã«ãå€éšã®äŸåé¢ä¿ã解æ¶ããæ¹æ³ãèŠãŠã¿ãŸãããã ãããã®ã¯ã©ã¹ã®æ§é ãå³ã«ç€ºããŸãã 2ã
class WebService { public: void LogError( std::string msg ) { /* , */ } }; class DatabaseManager { public: bool IsValid( std::string ename ) { /* , */ } };
å³2ã ãããã¯ãŒã¯æ¥ç¶ãšããŒã¿ããŒã¹ãæäœããããã®ã¯ã©ã¹æ§é
ãã¹ãæžã¿ã®ã³ãŒããäœæããã«ã¯ãç¹å®ã®å®è£ ã§ã¯ãªããå¥çŽã«åºã¥ããŠéçºã§ããããšãéåžžã«éèŠã§ãã ç§ãã¡ã®å ŽåããœãŒã¹ã¯ã©ã¹ã®å¥çŽã¯ãã»ã«ã®ååïŒ entry ïŒãæå¹ãã©ãããå€æããããšã§ãã
C ++ã§ã¯ããã®ã³ã³ãã©ã¯ãã¯IsValidä»®æ³ã¡ãœãããå«ãæœè±¡ã¯ã©ã¹ãšããŠææžåã§ãããã®æ¬äœã¯å®çŸ©ããå¿ èŠã¯ãããŸããã ããã§ããã®ã³ã³ãã©ã¯ããå®è£ ãã2ã€ã®ã¯ã©ã¹ãäœæã§ããŸãã1ã€ç®ã¯ããŒã¿ããŒã¹ãšå¯Ÿè©±ããŠããã°ã©ã ã®ãæ¬çªãããŒãžã§ã³ã§äœ¿çšããã2ã€ç®ã¯å¶åŸ¡ãããªãäŸåé¢ä¿ããåé¢ããããã¹ãã«çŽæ¥äœ¿çšãããŸãã 説æãããåè·¯ã¯å³ã«ç€ºãããŠããŸãã 3ã

å³3 ããŒã¿ããŒã¹ãšã®çžäºäœçšãžã®äŸåã解æ¶ããããã®ã€ã³ã¿ãŒãã§ãŒã¹ã®å°å ¥
ããŒã¿ããŒã¹ã®äŸåé¢ä¿ãå£ãããšãã§ãããµã³ãã«ã³ãŒããå³ã«ç€ºããŸãã 4ã

å³4 ããŒã¿ããŒã¹ã®äŸåé¢ä¿ã解æ¶ããããã®ã¯ã©ã¹ã®äŸ
äžèšã®ã³ãŒãã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã§æå®ãããæ©èœãå®è£ ããã¡ãœããã®ãªãŒããŒã©ã€ãæå®åã«æ³šæããå¿ èŠããããŸãã ããã«ãããçæãããã³ãŒãã®ä¿¡é Œæ§ãåäžããŸããããã¯ããããã®2ã€ã®é¢æ°ã®çœ²åãäžèŽããå¿ èŠãããããšãã³ã³ãã€ã©ãŒã«æ瀺çã«éç¥ããããã§ãã
ãŸããæœè±¡ã¯ã©ã¹ãã¹ãã©ã¯ã¿ãŒvirtualã®å®£èšã«ã泚æãæãå¿ èŠããããŸãã ãããæå€ã§äºæ³å€ã®å Žåã¯ã SãMyersã®èæžãEffective Use of C ++ããèªã¿ãç±å¿ã«èªãã§ãã ãããç¹ã«ã«ãŒã«7ã«æ³šæããŠèªãã§ãã ãã ã
æããã£ãã¡ãªäººã®ããã®ãã¿ãã¬
ããã¯ãåºæ¬ã¯ã©ã¹ãžã®ãã€ã³ã¿ãä»ããŠæŽŸçã¯ã©ã¹ã®ãªããžã§ã¯ããç Žæ£ããéã®ã¡ã¢ãªãªãŒã¯ãåé¿ããããã«å¿
èŠã§ãã
ã¹ã¿ããªããžã§ã¯ãã䜿çšããäŸåé¢ä¿ã®è§£é€
EntryAnalyzerã¯ã©ã¹ããã¹ãããããã«å¿ èŠãªæé ãæ€èšããŠãã ããã åè¿°ã®ããã«ãã¹ã¿ããªããžã§ã¯ãã䜿çšãããã¹ãã®å®è£ ã¯ãã¢ãã¯ãªããžã§ã¯ãã䜿çšãããããããããç°¡åã§ãã ãããã£ãŠããŸãããŒã¿ããŒã¹ãžã®äŸåã解æ¶ããæ¹æ³ãæ€èšããŸãã
æ¹æ³1.ãã¶ã€ããŒã®ãã©ã¡ãŒã¿ãŒå
ãŸãã DatabaseManagerã¯ã©ã¹ã®ããŒãã³ãŒãããã䜿çšãåãé€ããŸãã ãããè¡ãããã«ã IDatabaseManagerãªã©ã®ãã€ã³ã¿ãŒã®æäœã«ç§»ããŸãããã ã¯ã©ã¹ã®åäœãç¶æããã«ã¯ãããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ãå®çŸ©ããå¿ èŠããããŸãããã®ã³ã³ã¹ãã©ã¯ã¿ã§ã¯ããæŠéãå®è£ ã䜿çšããå¿ èŠãããããšã瀺ããŸãã å°å ¥ãããå€æŽãšçµæã®å€æŽãããã¯ã©ã¹ãå³ã«ç€ºããŸãã 5ã

å³5 ããŒã¿ããŒã¹ã®äŸåé¢ä¿ã解é€ã§ãããªãã¡ã¯ã¿ãªã³ã°åŸã®ã¯ã©ã¹
äŸåé¢ä¿ãå®è£ ããã«ã¯ããã1ã€ã®ã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãŒãè¿œå ããå¿ èŠããããŸãããããã§ã¯åŒæ°ãå¿ èŠã§ãã ãã®åŒæ°ã¯ã䜿çšããã€ã³ã¿ãŒãã§ã€ã¹å®è£ ãæ£ç¢ºã«æ±ºå®ããŸãã ã¯ã©ã¹ã®ãã¹ãã«äœ¿çšãããã³ã³ã¹ãã©ã¯ã¿ãŒãå³ã«ç€ºããŸãã 6ã

å³6 äŸåé¢ä¿ãæ³šå ¥ããããã«äœ¿çšãããã³ã³ã¹ãã©ã¯ã¿ãŒ
ããã§ãã¯ã©ã¹ã¯æ¬¡ã®ããã«ãªããŸãïŒã¯ã©ã¹ã®ãã¹ãã«äœ¿çšãããã³ã³ã¹ãã©ã¯ã¿ãŒã¯ç·è²ã®äžžã§å²ãŸããŠããŸãïŒã

å³7 ããŒã¿ããŒã¹ã®äŸåé¢ä¿ã解æ¶ããã¯ã©ã¹ãªãã¡ã¯ã¿ãªã³ã°
ããã§ãæå¹ãªã»ã«åã®åŠççµæã瀺ã次ã®ãã¹ããäœæã§ããŸãïŒå³8ãåç §ïŒã
TEST_F( EntryAnalyzerTest, Analyze_ValidEntryName_ReturnsTrue ) { EntryAnalyzer ea( std::make_unique<FakeDatabaseManager>( true ) ); bool result = ea.Analyze( "valid_entry_name" ); ASSERT_EQ( result, true ); } class FakeDatabaseManager : public IDatabaseManager { public: bool WillBeValid; FakeDatabaseManager( bool will_be_valid ) : WillBeValid( will_be_valid ) { } bool IsValid( std::string ename ) override { return WillBeValid; } };
å³8 å®éã®ããŒã¿ããŒã¹ãšçžäºäœçšããªããã¹ãã®äŸ
åœãªããžã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã¡ãŒã¿ãŒã®å€ãå€æŽãããšã IsValidé¢æ°ã®å®è¡çµæã«åœ±é¿ããŸãã ããã«ãããã«ãããããŒã¿ããŒã¹ãžã®ã¢ã¯ã»ã¹ã®è¯å®çµæãšåŠå®çµæã®äž¡æ¹ãå¿ èŠãšãããã¹ãã§åœãªããžã§ã¯ããåå©çšã§ããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãŒããã©ã¡ãŒã¿ãŒåãã2çªç®ã®æ¹æ³ãæ€èšããŠãã ããã ãã®å Žåã ãã¡ã¯ããªãŒ ãã€ãŸãä»ã®ãªããžã§ã¯ãã®äœæãæ åœãããªããžã§ã¯ãã䜿çšããå¿ èŠããããŸãã
æåã«ãåãæé ã«åŸã£ãŠDatabaseManagerã¯ã©ã¹ã®ããŒãã³ãŒãããã䜿çšã眮ãæããŸããå¿ èŠãªã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããªããžã§ã¯ããžã®ãã€ã³ã¿ãŒã®äœ¿çšã«ç§»ããŸãããã ãã ããããã©ã«ãã®ã³ã³ã¹ãã©ã¯ã¿ã§ã¯ãå¿ èŠãªãªããžã§ã¯ããäœæãã責任ããã¡ã¯ããªã«å²ãåœãŠãŸãã
çµæã®å®è£ ãå³ã«ç€ºããŸãã 9ã

å³ 9.ã¯ã©ã¹ããªãã¡ã¯ã¿ãªã³ã°ããŠãã¡ã¯ããªã䜿çšããããŒã¿ããŒã¹ãšããåããããªããžã§ã¯ããäœæãã
å°å ¥ããããã¡ã¯ããªã¯ã©ã¹ãèãããšããã¹ãèªäœã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã
TEST_F( EntryAnalyzerTest, Analyze_ValidEntryName_ReturnsTrue ) { DbMngFactory::SetManager( std::make_unique<FakeDatabaseManager>( true ) ); EntryAnalyzer ea; bool result = ea.Analyze( "valid_entry_name" ); ASSERT_EQ( result, true ); } class DbMngFactory { public: static std::unique_ptr<IDatabaseManager> Create() { if( nullptr == pDbMng ) return std::make_unique<DatabaseManager>(); return std::move( pDbMng ); } static void SetManager( std::unique_ptr<IDatabaseManager> &&p_mng ) { pDbMng = std::move( p_mng ); } private: static std::unique_ptr<IDatabaseManager> pDbMng; };
å³10 ãã¹ããå®éã®ããŒã¿ããŒã¹ãšçžäºäœçšããªãå¥ã®äŸ
ãã®ã¢ãããŒããšä»¥åã«æ€èšãããã¢ãããŒããšã®éèŠãªéãã¯ãåãã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããŠãæŠéããšãã¹ãã³ãŒãã®äž¡æ¹ã®ãªããžã§ã¯ããäœæããããšã§ãã ãã¡ã¯ããªã¯ãå¿ èŠãªãªããžã§ã¯ããäœæããããã«çŽ°å¿ã®æ³šæãæã£ãŠããŸãã ããã«ãããã¯ã©ã¹ã®è²¬ä»»ç¯å²ãåºå¥ã§ããŸãã ãã¡ãããããªãã®ã³ãŒããæ±ã人ã¯ãããã®ã¯ã©ã¹ã®é¢ä¿ãç解ããã®ã«æéãå¿ èŠã§ãã ãã ããå°æ¥çã«ã¯ããã®ã¢ãããŒãã«ãããé·æãµããŒãã«é©åããããæè»ãªã³ãŒããå®çŸã§ããŸãã
æ¹æ³2.ãéžæããã³ãªãŒããŒã©ã€ãã
ããŒã¿ããŒã¹ãžã®äŸåã解æ¶ããå¥ã®ã¢ãããŒããšããŠããéžæãšäžæžããïŒæœåºãšäžæžãïŒãæ€èšããŠãã ããã ããããããã®ã¢ããªã±ãŒã·ã§ã³ã¯ããã·ã³ãã«ã«èŠãããã®ãããªææ ãåŒãèµ·ãããªãã§ãããïŒ

ãã®äž»ãªã¢ã€ãã¢ã¯ã1ã€ä»¥äžã®é¢æ°ã§ããã¡ã€ãã£ã³ã°ãã¯ã©ã¹ã®äŸåé¢ä¿ãããŒã«ã©ã€ãºãããã®åŸç¶ã¯ã©ã¹ã§ããããåå®çŸ©ããããšã§ãã ãã®ã¢ãããŒããå®éã«èããŠã¿ãŸãããã
äŸåé¢ä¿ã®ããŒã«ã©ã€ãºããå§ããŸãããã ãã®å ŽåãäŸåé¢ä¿ã¯DatabaseManagerã¯ã©ã¹ã®IsValidã¡ãœãããåŒã³åºãããšã§ãã ãã®äŸåé¢ä¿ãåå¥ã®é¢æ°ã«åé¢ã§ããŸãã å€æŽã¯ã§ããã ãæ éã«è¡ãå¿ èŠãããããšã«æ³šæããŠãã ããã ãã®çç±ã¯ããããã®å€æŽãæ¢åã®äœæ¥ããžãã¯ãå£ããªãããšã確èªã§ãããã¹ãã®æ¬ åŠã§ãã ç§ãã¡ãè¡ã£ãå€æŽãæãå®å šãªãã®ã«ããããã«ãé¢æ°ã®ã·ã°ããã£ãå¯èœãªéãä¿æããããåªããå¿ èŠããããŸãã ãããã£ãŠãå€éšäŸåé¢ä¿ãå«ãã³ãŒããå¥ã®ã¡ãœããã«è»¢éããŸãïŒå³11ãåç §ïŒã

å³11 å¥ã®ã¡ãœããã§å€éšäŸåé¢ä¿ãå«ãã³ãŒããåé€ãã
ãã®å Žåãã¯ã©ã¹ãã©ã®ããã«ãã¹ãã§ããŸããïŒ ç°¡åã§ã-éžæããé¢æ°virtualã宣èšããå ã®ã¯ã©ã¹ããæ°ããã¯ã©ã¹ãç¶æ¿ããŸããããã§ãäŸåé¢ä¿ãå«ãåºæ¬ã¯ã©ã¹ã®é¢æ°ãåå®çŸ©ããŸãã ããã§ãå€éšã®äŸåé¢ä¿ã®ãªãã¯ã©ã¹ãååŸããŸãã-ãããŠããã¹ããã«ããŒããããã«ãã¹ãããŒã«ã«å®å šã«å ¥åã§ããããã«ãªããŸããã å³ å³ïŒïŒã¯ããã®ãããªãã¹ãã¯ã©ã¹ãå®è£ ããïŒã€ã®æ¹æ³ã瀺ããŠããã

å³12 äŸåé¢ä¿ã解é€ããããã®ãéžæãšãªãŒããŒã©ã€ããã¡ãœããã®å®è£
ãã¹ãèªäœã¯æ¬¡ã®ããã«èšè¿°ã§ããŸãã
TEST_F( EntryAnalyzerTest, Analyze_ValidEntryName_ReturnsTrue) { TestingEntryAnalyzer ea; ea.WillBeValid = true; bool result = ea.Analyze( "valid_entry_name" ); ASSERT_EQ( result, true ); } class TestingEntryAnalyzer : public EntryAnalyzer { public: bool WillBeValid; private: bool IsValid( std::string ename ) override { return WillBeValid; } };
å³13 ãããŠãå®éã®ããŒã¿ããŒã¹ãšçžäºäœçšããªããã¹ãã®å¥ã®äŸ
説æããã¢ãããŒãã¯å®è£ ãæãç°¡åãªæ¹æ³ã®1ã€ã§ãããã¹ãã«ã®èç©ã«åœ¹ç«ã€ãšäŸ¿å©ã§ãã
ã¢ãã¯ãªããžã§ã¯ãã䜿çšããŠäŸåé¢ä¿ã解é€ãã
ããã§ãã¹ã¿ããªããžã§ã¯ãã䜿çšããŠããŒã¿ããŒã¹ã®äŸåé¢ä¿ã解é€ã§ããŸãã ãã ãããªã¢ãŒãWebãµãŒããŒã«ã¯æªã äŸåé¢ä¿ããããŸãã ã¢ãã¯ãªããžã§ã¯ãã䜿çšãããšããã®äŸåé¢ä¿ã解æ¶ã§ããŸãã
ããã«ã¯äœãå¿ èŠã§ããïŒ ããã§ã¯ããã§ã«æ€èšãããŠããæ¹æ³ã®çµã¿åããã圹ç«ã¡ãŸãã ãŸããé¢æ°ã®1ã€ã«äŸåé¢ä¿ãããŒã«ã©ã€ãºãããããä»®æ³ãšããŠå®£èšããŸãã é¢æ°ã®çœ²åãä¿åããããšãå¿ããªãã§ãã ããïŒ ããã§ã WebServiceã¯ã©ã¹ã®ã³ã³ãã©ã¯ããå®çŸ©ããã€ã³ã¿ãŒãã§ã€ã¹ãéžæããã¯ã©ã¹ãæ瀺çã«äœ¿çšãã代ããã«ãå¿ èŠãªã¿ã€ãã®unique_ptrãã€ã³ã¿ãŒã䜿çšããŸãã ãããŠããã®ä»®æ³é¢æ°ãåå®çŸ©ãããç¶æ¿ã¯ã©ã¹ãäœæããŸãã ãªãã¡ã¯ã¿ãªã³ã°åŸã«åŸãããã¯ã©ã¹ãå³ã«ç€ºããŸã 14ã

å³14 ãªãã¡ã¯ã¿ãªã³ã°åŸã®ã¯ã©ã¹ããããã¯ãŒã¯çžäºäœçšãžã®äŸåã解æ¶ããæºå
shared_ptrãã€ã³ã¿ãŒãã掟çã¯ã©ã¹ã§éžæããã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ãããªããžã§ã¯ãã«å°å ¥ããŸãã ããšã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã©ã¡ãŒã¿ãŒåã¡ãœããã䜿çšããŠäŸåé¢ä¿ãå®è£ ããã ãã§ãã ããã§ããã¹ãã§ããã¯ã©ã¹ã次ã®ããã«ãªããŸãã

å³15 ãããã¯ãŒã¯çžäºäœçšãžã®äŸåã解æ¶ãããã¹ãã¯ã©ã¹
ãããŠä»ã次ã®ãã¹ããæžãããšãã§ããŸãïŒ
TEST_F( EntryAnalyzerTest, Analyze_TooShortEntryName_LogsErrorToWebServer ) { std::shared_ptr<FakeWebService> p_web_service = std::make_shared<FakeWebService>(); TestingEntryAnalyzer ea( p_web_service ); bool result = ea.Analyze( "e" ); ASSERT_EQ( p_web_service->lastError, "Error: e" ); } class TestingEntryAnalyzer : public EntryAnalyzer { public: TestingEntryAnalyzer( std::shared_ptr<IWebService> p_service ) : pWebService( p_service ) { } private: void LogError( std::string err ) override { pWebService->LogError( err ); } std::shared_ptr<IWebService> pWebService; }; class FakeWebService : public IWebService { public: void LogError( std::string error ) override { lastError = error; } std::string lastError; };
å³16ã ãããã¯ãŒã¯æ¥ç¶ãšçžäºäœçšããªããã¹ãã®äŸ
ãããã£ãŠãã¢ãã¯ãªããžã§ã¯ãã®ç¶æ ã®åæã«åºã¥ããŠãã³ã³ã¹ãã©ã¯ã¿ãŒã®ãã©ã¡ãŒã¿ãŒåã䜿çšããŠäŸåé¢ä¿ãå®è£ ãããšããªã¢ãŒãWebãµãŒãã¹ãåä¿¡ããã¡ãã»ãŒãžãèŠã€ããããšãã§ããŸãã
ãã¹ãã®ä¿å®ãšã¢ããã°ã¬ãŒããç°¡åã«ããããã®æšå¥šäºé
ã¡ã³ããã³ã¹ãšã¢ããã°ã¬ãŒããç°¡åãªåäœãã¹ããæ§ç¯ããæ¹æ³ãèããŠã¿ãŸãããã ããããå€ãã®ç¹ã§ãããã¯èªåèªèº«ã«å¯Ÿããäžä¿¡ã«ãããã®ã§ãã

æåã®æšå¥šäºé ã¯ã1ã€ã®ãã¹ãã§1ã€ã®äœæ¥çµæã®ã¿ããã¹ãããããšã§ãã ãã®å Žåããã¹ãã倱æãããšããæŠéãã³ãŒãã®ããžãã¯ã®ã©ã®éšåããã¹ãã«åæ Œããªãã£ãããããã«æ確ã«äŒããããšãã§ããŸãã 1ã€ã®ãã¹ãã«è€æ°ã®ã¢ãµãŒããããå Žåããã¹ããç¹°ãè¿ãå®è¡ãããã®åŸã®è¿œå ã®åæãè¡ããªããã°ãããžãã¯ãéåãããå Žæãæ確ã«æ£ç¢ºã«èšãããšã¯å°é£ã§ãã
2çªç®ã®æšå¥šäºé ã¯ããããªãã¯ã¯ã©ã¹ã¡ãœããã®ã¿ããã¹ãããããšã§ãã ããã¯ãå®éã«ã¯ããããªãã¯ã¡ãœãããã¯ã©ã¹ã³ã³ãã©ã¯ãïŒã€ãŸããå®è¡ããããã«åŒãåããæ©èœïŒã決å®ãããšããäºå®ã«ãããã®ã§ãã ãã ãããã®å®è£ ã®ç¹å®ã®å®è£ ã¯ãã®è£éã«çãŸããŸãã ãããã£ãŠããããžã§ã¯ãã®éçºäžã«ããã®ã¢ã¯ã·ã§ã³ãŸãã¯ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããæ¹æ³ãå€æŽã§ããŸããããã«ã¯ãã¯ã©ã¹ã®ãã©ã€ããŒãã¡ãœããã®ããžãã¯ã®å€æŽãå¿ èŠã«ãªãå ŽåããããŸãã ãã®çµæããããªãã¯ã¯ã©ã¹ã³ã³ãã©ã¯ãèªäœã«ã¯éåããŠããŸãããããã©ã€ããŒãã¡ãœããçšã«èšè¿°ãããå€æ°ã®ãã¹ãã倱æããå¯èœæ§ããããŸãã ããã§ããã©ã€ããŒãã¡ãœããã®ãã¹ããå¿ èŠãªå Žåã¯ãããã䜿çšããã¯ã©ã¹ã§ãããªãã¯ã¡ãœãããèŠã€ããŠãããã«é¢ãããã¹ããäœæããããšããå§ãããŸãã
ãã ãããã¹ãã倱æããå ŽåããããäœãããŸããããªãã£ãããææ¡ããå¿ èŠããããŸãã ãã®å Žåããã¹ãèªäœã«ãšã©ãŒãå«ãŸããŠãããšãããªãäžå¿«ãªç¶æ³ãçºçããå¯èœæ§ããããŸãã ååãšããŠãæåã«ããã¹ãèªäœã§ã¯ãªãããã¹ãããããæŠéãã³ãŒãã®ããžãã¯ã§å€±æã®çç±ãæ£ç¢ºã«æ¢ãå§ããŸãã ãã®å Žåãé害ã®åå ã®æ€çŽ¢ã«å€ãã®æéãè²»ããããå¯èœæ§ããããŸãã ãããåé¿ããããã«ããã¹ãã³ãŒãèªäœãã§ããéãã·ã³ãã«ã«ãªãããã«åªåããå¿ èŠããããŸãããã¹ãã§ã¯åå²æŒç®åïŒ switch ã if ã for ã whileãªã©ïŒã䜿çšããªãã§ãã ããã ãæŠéãã³ãŒãã§åå²ããã¹ãããå¿ èŠãããå Žåã¯ãåå²ããšã«2ã€ã®åå¥ã®ãã¹ããäœæããããšããå§ãããŸãã ãããã£ãŠãå žåçãªåäœãã¹ãã¯ãããã«ã¢ãµãŒãããã¡ãœããåŒã³åºãã®ã·ãŒã±ã³ã¹ãšããŠè¡šãããšãã§ããŸãã
ããã§ã次ã®ç¶æ³ãèããŠã¿ãŸããããããšãã°ã100ãªã©ã®å€æ°ã®ãã¹ããèšè¿°ãããã¯ã©ã¹ããããŸããåã¯ã©ã¹å ã§ã¯ããã¹ããªããžã§ã¯ãã®äœæãå¿ èŠã§ããã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«ã¯1ã€ã®åŒæ°ãå¿ èŠã§ãã ãã ãããããžã§ã¯ãã®éçºã«äŒŽããç¶æ³ã¯å€åããŸãããçŸåšã1ã€ã®åŒæ°ã§ã¯äžååã§ããã2ã€ã®åŒæ°ãå¿ èŠã§ãã ã³ã³ã¹ãã©ã¯ã¿ãŒãã©ã¡ãŒã¿ãŒã®æ°ãå€æŽãããšã100åãã¹ãŠã®ãã¹ããæ£åžžã«ã³ã³ãã€ã«ãããªããšããäºå®ã«ã€ãªãããããããæŽé ããã«ã¯ã100åãã¹ãŠã®å Žæãå€æŽããå¿ èŠããããŸãã
ãã®ç¶æ³ãåé¿ããããã«ãç§ãã¡å šå¡ã«ããç¥ãããŠããã«ãŒã«ãã³ãŒãã®éè€ãé¿ãããã«åŸã£ãŠãã ããã ããã¯ããã¹ããªããžã§ã¯ããäœæããããã®ãã¹ãã§ãã¡ã¯ããªã¡ãœããã䜿çšããããšã§å®çŸã§ããŸãã ãã®å Žåããã¹ã察象ãªããžã§ã¯ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã·ã°ããã£ãå€æŽãããšãã¯ããã¹ããããžã§ã¯ãã®1ãæã®ã¿ã§å¯Ÿå¿ããç·šéãè¡ãã ãã§ååã§ãã
ããã«ãããæ¢åã®ãã¹ããå¥å šãªç¶æ ã«ç¶æããã®ã«ãããæéãå€§å¹ ã«ççž®ã§ããŸãã ãããŠãããã¯ãã¹ãŠã®é¢ã§åã³æéã䜿ãæããç¶æ³ã§ç¹ã«éèŠã§ããããšãå€æãããããããŸããã

é¢çœãã§ããïŒ ãã£ãšæ·±ãæœãããšãã§ããŸãã
ãŠããããã¹ãã®ãããã¯ã«ããã«è©³çŽ°ã«æ²¡é ããã«ã¯ã Roy Osheroveã®æ¬ãThe art of unit testingãããå§ãããŸãã ããã«ããã¹ãã§ã«ããŒãããŠããªãæ¢åã®ã³ãŒããå€æŽããå¿ èŠãããå Žåã«ããéåžžã«é »ç¹ã«ç¶æ³ãçºçããŸãã æãå®å šãªã¢ãããŒãã®1ã€ã¯ãæåã«äžçš®ã®ãã»ãŒããã£ãããããäœæããããšã§ãããã¹ãã§ãããèŠããå¿ èŠãªå€æŽãå ããŸãã ãã®ã¢ãããŒãã¯ã MãFishersã®èæžãã¬ã¬ã·ãŒã³ãŒãã䜿çšããå¹æçãªäœæ¥ãã§éåžžã«è©³ãã説æãããŠããŸã ã ãããã£ãŠãèè ã«ãã£ãŠèšè¿°ãããã¢ãããŒããç¿åŸããããšã¯ãéçºè ãšããŠãéåžžã«éèŠã§æçšãªã¹ãã«ã®å®åº«ãããããããšãã§ããŸãã
ãæéãããã ãããããšãããããŸãïŒ äžèšã®ãããããæçšãã€ã¿ã€ã ãªãŒã§ããå Žåãç§ã¯ããããã§ãã 質åã«å¯Ÿããã³ã¡ã³ããããå Žåã¯ãåãã§ãçãããŸãã
æçš¿è ïŒViktor Yastrebov vyastrebov