ããããã¹ã¯åšäœã®çããããæšæ¶ç³ãäžããŸããDaveCheneyããã°ã®èšåãããSOLID Go Designæçš¿ã®ç¿»èš³ïŒå人çãªæèŠã«ããïŒãã³ãã¥ããã£ãšé »ç¹ã«å
±æããããšã«ããŸããã ãããã誰ãã«ãšã£ãŠã¯åœ¹ã«ç«ã€ã§ãããã
SOLID Goãã¶ã€ã³
ãã®æçš¿ã¯ã2016幎8æ18æ¥ã®GolangUKã®ã¡ã€ã³ã¬ããŒãã®ããã¹ãã«åºã¥ããŠããŸãã
ããã©ãŒãã³ã¹ã®èšé²ã¯YouTubeã§å
¥æã§ããŸã ã
äžçäžã«äœäººã®å²programmerããã°ã©ããŒãããŸããïŒ
äžçäžã«äœäººã®å²programmerããã°ã©ããŒãããŸããïŒ æ°åãèããŠããããé ã«å
¥ããŠãããŸã
äŒè©±ã®æåŸã«ãã®è³ªåã«æ»ããŸãã
ã³ãŒãã¬ãã¥ãŒ
äœæ¥ã®äžç°ãšããŠã誰ãããã§ã³ãŒããã¬ãã¥ãŒããŸããïŒ ïŒèŽè¡ã®ã»ãšãã©ãæãæããŠãããããã¯å±ã¿ã«ãªããŸãïŒã ã§ã¯ããªãã³ãŒãã¬ãã¥ãŒãè¡ã£ãŠããã®ã§ããïŒ ïŒèª°ãããã³ãŒããæ¹åããããã«ããšå«ã¶ïŒ
æªãã³ãŒãããã£ããããããã«ã³ãŒãã¬ãã¥ãŒãå¿
èŠãªå Žåãã¬ãã¥ãŒããŠããã³ãŒããè¯ããæªãããã©ã®ããã«ããŠç¥ãã®ã§ããããïŒ
ããã®çµµç»ã¯çŸããããŸãã¯ããã®éšå±ã¯çŸããããšèšã£ãããã«ãããã®ã³ãŒãã¯ã²ã©ãããŸãã¯ããããŒããã®ã³ãŒãã¯çŸããããšèšã£ãŠãããã®ã§ããããããã¯äž»èŠ³çãªæŠå¿µã§ããã客芳çãªæ¹æ³ãæ¢ããŠããŸãè¯ãã³ãŒããŸãã¯æªãã³ãŒãã®ç¹æ§ã«ã€ããŠè©±ããŸãã
æªãã³ãŒã
ã¬ãã¥ãŒæã«äœ¿çšã§ããäžè¯ã³ãŒãã®ç¹æ§ã¯äœã§ããïŒ
- æè»æ§ããªã ã ã³ãŒãã«æè»æ§ã¯ãããŸãããïŒ ããã¯ãå€æŽãå°é£ã«ããã¿ã€ããšãã©ã¡ãŒã¿ãŒã®å³æ Œãªã»ãããå«ãã§ããŸããïŒ
- å£ãããã ã ã³ãŒãã¯å£ããããã§ããïŒ ã«ãªã¹ã¯ã³ãŒãããŒã¹ã®ããããªå€åãåŒãèµ·ãããŸããïŒ
- åããªã ã ã³ãŒãã®ãªãã¡ã¯ã¿ãªã³ã°ã¯é£ããã§ããïŒ ãµã€ã¯ãªãã¯ã€ã³ããŒãã®1åã®ããŒã¹ãããŒã¯ã§å®è¡ãããŸããïŒ
- è€é㪠ãã®ã³ãŒãã¯ãã³ãŒãã®ããã ãã«ååšããè€éãããªãã®ã§ããïŒ
- åé· ã ã³ãŒããé
·äœ¿ããŠããŸããïŒ ã³ãŒããèŠãŠãäœãããããšããŠããã®ããèšãããšãã§ããŸããïŒ
ãããã®èšèã¯ããžãã£ãã§ããïŒ ã³ãŒãã確èªããªãããããã®èšèãèããŠæ¥œããã§ããã ããŸããïŒ
ãããããªãã
è¯ããã¶ã€ã³
ããããããã¯æ¹åã§ããä»ã§ã¯ããå€æŽããã®ãé£ããããã®ã§æ°ã«å
¥ããªãããããã®ã³ãŒããäœãããããšããŠããã®ãããããªãã®ã§æ°ã«å
¥ããªãããªã©ãšèšãããšãã§ããŸãããç©æ¥µçãªè°è«ãããã«ã¯ïŒ
æªãã ãã§ãªã客芳çãªçšèªã§æšè«ã§ããããã«ãè¯ããã¶ã€ã³ã®ç¹æ§ã説æããæ¹æ³ãããã°çŽ æŽããããšæããŸãããïŒ
åºã
2002幎ãRobert Martinã¯èæžã ã¢ãžã£ã€ã«ãœãããŠã§ã¢éçºãååããã¿ãŒã³ãããã³å®è·µããåºçããŸããã ãã®äžã§ã圌ã¯åå©çšå¯èœãªãœãããŠã§ã¢èšèšã®5ã€ã®ååã説æããŸãããããã¯ãSOLIDååãšåŒã°ãããã®ååã®ç¥èªã§ãã
- åç¬è²¬ä»»ã®åå
- éæŸæ§/è¿æ¥æ§ã®åç
- ããŒãã©ã»ãªã¹ã³ãã®ä»£æ¿åç
- ã€ã³ã¿ãŒãã§ãŒã¹åé¢ã®åç
- äŸåé¢ä¿ã®é転ã®åç
ãã®æ¬ã¯å°ãæ代é
ãã§ãç§ãã¡ã話ããŠããèšèªã¯çŽ10幎åã«äœ¿çšãããŠããŸããã ããããSOLIDã®ååã«ã¯ãé©åã«èšèšãããGoããã°ã©ã ã«ã€ããŠè©±ãæ¹æ³ã®æããããæäŸã§ããããã€ãã®åŽé¢ããããããããŸããã
ããããŸãã«ä»æããªããšè©±ãããããšã§ãã
åç¬è²¬ä»»ã®åå
SOLIDã®æåã®ååãããã¯S-å
±æ責任ã®ååã§ãã
ã¯ã©ã¹ã«ã¯ãå€æŽã®çç±ã1ã€ã ãå¿
èŠã§ãã
-ãããŒãã»Sã»ããŒãã£ã³Goã«ã¯ã¯ã©ã¹ããŸã£ããå«ãŸããŠãããããããã®ä»£ããã«ããã匷åãªæ§æã®æŠå¿µããããŸãããã¯ã©ã¹ã®æŠå¿µã®äœ¿çšã®æŽå²ãèŠããšãããã«äœããã®æå³ããããšæããŸãã
1ã€ã®ã³ãŒãã«å€æŽã®çç±ã1ã€ãããªãããšããªãããã»ã©éèŠãªã®ã§ããïŒ ããŠãã³ãŒããå€æŽã§ãããšããèãã¯èŠçã§ãããã³ãŒããäŸåããã³ãŒããå€æŽã§ãããšããäºå®ãããã¯ããã«çã¿ãå°ãªãã§ãã ãŸããã³ãŒããå€æŽããå¿
èŠãããå Žåãç¹å®ã®èŠä»¶ã«åŸã£ãŠã³ãŒããå€æŽããå¿
èŠããããä»éçãªæ害ã®ç ç²è
ã«ãªãããšã¯ãããŸããã
ãããã£ãŠãå¯äžã®ã¿ã¹ã¯ãæ
åœããã³ãŒãã«ã¯ãå€æŽãè¡ãçç±ãå°ãªããªããŸãã
æ¥ç¶æ§ãšãŠããã£
ããã°ã©ã ãç°¡åã«å€æŽã§ããããšãè¡šã2ã€ã®èšèã¯ãã€ãªãããšçµ±äžæ§ã§ãã
æ¥ç¶æ§ãšã¯ãããå Žæã§ã®å€æŽãå¥ã®å Žæã§ã®åŒ·å¶çãªå€æŽãæå³ããå Žåã«ã2ã€ã®ã³ãŒãã®åæå€æŽãèšè¿°ããåçŽãªæŠå¿µã§ãã
é¢é£ãããå¥åã®æŠå¿µã§ãããã®çµ±äžã¯ãçžäºã«åŒãä»ããåã§ãã
ãœãããŠã§ã¢ã®ã³ã³ããã¹ãã§ã¯ããŠããã£ã¯ãã³ãŒãã®ã»ã¯ã·ã§ã³ãèªç¶ã«ã©ã®ããã«é¢é£ããããèšè¿°ããããããã£ã§ãã
Goã®ããã°ã©ã ã§ã®æ¥ç¶æ§ãšçµ±äžã®ååã®å®è£
ã説æããããã«ãSRPïŒå
±æ責任ã®ååïŒãè°è«ãããšãã«ããããããšã§ãããæ©èœãšæ¹æ³ã«ã€ããŠè©±ãããšãã§ããŸããããã¹ãŠã¯Goã®ããã±ãŒãžã·ã¹ãã ã§å§ãŸããšæããŸãã
ããã±ãŒãžå
Goã§ã¯ããã¹ãŠã®ã³ãŒãã¯ããã±ãŒãžå
ã«ååšããé©åãªããã±ãŒãžèšèšã¯ãã®ååããå§ãŸããŸãã ããã±ãŒãžåã¯ããã®ç®çã®èª¬æãšåå空éãã¬ãã£ãã¯ã¹ã®äž¡æ¹ã§ãã Goæšæºã©ã€ãã©ãªã®é©åãªããã±ãŒãžåã®äŸã¯æ¬¡ã®ãšããã§ãã
- net / httpãhttpã¯ã©ã€ã¢ã³ããšãµãŒããŒãæäŸããŸãã
- os / exec ãå€éšã³ãã³ããå®è¡ããŸãã
- encoding / jsonãJSONããã¥ã¡ã³ãã®ãšã³ã³ãŒããšãã³ãŒããå®è£
ããŸãã
ç¬èªã®ããã±ãŒãžå
ã§å¥ã®ããã±ãŒãžã®ã·ã³ãã«ã䜿çšããå Žåãããã¯2ã€ã®ããã±ãŒãžéã®ãœãŒã¹ã¬ãã«ã®æ¥ç¶ã確ç«ããimport
ããŒã¯ãŒãã䜿çšããŠè¡ãããŸãã ä»ã圌ãã¯ãäºãã®ååšã«ã€ããŠç¥ã£ãŠããŸãã
æªãããã±ãŒãžå
ããŒãã³ã°ãžã®ãã®ãããªçŠç¹ã¯ãåãªãæè²ã§ã¯ãããŸããã ååãäžé©åãªããã±ãŒãžã¯ãã¿ã¹ã¯ããã£ããšããŠããã¿ã¹ã¯ã説æããæ©äŒãéããŸãã
package server
ã¯ã©ã®ãããªæ©äŒãæäŸããŸããïŒ.. package server
ãããããŸããããã©ã®ãããã³ã«ã§å®è£
ããŸããïŒ
package private
ã¯ã©ã®ãããªæ©äŒãæäŸããŸããïŒ èŠãã¹ãã§ã¯ãªããã®ïŒ 圌ã¯å
Œ
±ã®ãã£ã©ã¯ã¿ãŒããæã£ãŠããã¹ãã§ããïŒ
ãããŠã package utils
ããŒãããŒã®ããã«ã package common
ãä»ã®æªæã®ãã䟵å
¥è
ã®é£ã«ãã°ãã°èŠãããŸãã
ãã®ãããªããã±ãŒãžãåŒãä»ãããšãå€ãã®è²¬ä»»ããããå€ãã®å Žåçç±ãªãå€æŽããããããã³ãŒãã¯ãã³ãã«å€ãããŸãã
Goã®Filisofia UNIX
ç§ã®èŠè§£ã§ã¯ããã°ã©ã¹ã»ããã¯ãã€ã®ãPhilisophy of UNIXãã®ä»äºã«èšåããã«ãåå¥ã®èšèšã®è°è«ãå®äºããããšã¯ã§ããŸããã å€ãã®å Žåãå
ã®äœè
ã«ãã£ãŠæäŸãããªãã£ãããã倧ããªåé¡ã解決ããããã«çµã¿åããããå°ããéãããŒã«ã Goããã±ãŒãžã¯UNIXå²åŠã®ç²Ÿç¥ãäœçŸããŠãããšæããŸãã å®éãåGoããã±ãŒãžèªäœã¯å°ããªGoããã°ã©ã ã§ãããåäžã®è²¬ä»»ã䌎ãåäžã®å€æŽç¹ã§ãã
éæŸæ§/è¿æ¥æ§ã®åç
2çªç®ã®ååOã¯ã1988幎ã«æ¬¡ã®ããã«æžããBertrand Meyerã®éæŸæ§/ééæ§ã®ååã§ãã
ããã°ã©ã ãªããžã§ã¯ãã¯ãå±éã®ããã«éãããå€æŽã®ããã«éããããå¿
èŠããããŸãã
-Bertrand Meyerããªããžã§ã¯ãæåãœãããŠã§ã¢ã®æ§ç¯ãã®ãã³ãã¯ã21幎åã«äœæãããèšèªã«ã©ã®ããã«é©çšãããŸãããïŒ
package main type A struct { year int } func (a A) Greet() { fmt.Println("Hello GolangUK", a.year) } type B struct { A } func (b B) Greet() { fmt.Println("Welcome to GolangUK", b.year) } func main() { var a A a.year = 2016 var b B b.year = 2016 a.Greet()
year
ãã£ãŒã«ããšGreet
ã¡ãœãããæã€ã¿ã€ãA
ãããŸãã A
ã¯B
ã®ãã£ãŒã«ããšããŠåã蟌ãŸãã B
ã¯ç¬èªã®Greet
ã¡ãœãããæäŸãã A
åãã¡ãœãããé衚瀺ã«A
ããã A
ãåã蟌ãŸãã2çªç®ã®ã¿ã€ãB
ã«ã¯ãã¡ãœããåŒã³åºãB
ãã¡ãœããåŒã³åºãA
ãªãŒããŒã©ã€ãããŸã
ãã ããã€ã³ã©ã€ã³åã¯ã¡ãœããã ãã§ãªããçµã¿èŸŒã¿åãã£ãŒã«ããžã®ã¢ã¯ã»ã¹ãæäŸããŸãã ã芧ã®ãšããã A
ãšB
äž¡æ¹ãšãåãããã±ãŒãžã§å®çŸ©ãããŠããããã B
ã¯A
ã®year
ã®ãã©ã€ããŒããã£ãŒã«ãã«ã¢ã¯ã»ã¹ã§ããŸãB
ãããã£ãŠãåã蟌ã¿ã¯ãGoã®åãæ¡åŒµã«éæŸã§ãã匷åãªããŒã«ã§ãã
package main type Cat struct { Name string } func (c Cat) Legs() int { return 4 } func (c Cat) PrintLegs() { fmt.Printf("I have %d legs\n", c.Legs()) } type OctoCat struct { Cat } func (o OctoCat) Legs() int { return 5 } func main() { var octo OctoCat fmt.Println(octo.Legs())
ãã®äŸã§ã¯ã Legs
ã¡ãœããã䜿çšããŠLegs
æ°ãã«ãŠã³ãã§ããCat
ã¿ã€ãããããŸãã ãã®ã¿ã€ãã®Cat
ãæ°ããã¿ã€ãã®OctoCat
ã OctocatS
ã¯5ã€ã®èãããããšã宣èšããŸãã ããããããšã§ã OctoCat
ã¯ç¬èªã®Legs
ã¡ãœãããå®çŸ©ãã PrintLegs
ã¡ãœãããPrintLegs
5ãè¿ãã4ãè¿ããŸãã
ããã¯ã PrintLegs
Cat
ã¿ã€ãå
PrintLegs
å®çŸ©ãããŠããããPrintLegs
ã ããã¯ã Cat
ãåä¿¡æ©ãšããŠåãå
¥ãã Cat
ã¿ã€ãã®Legs
ã¡ãœãããæããŸãã Cat
ã¯ããããåã蟌ãŸããåãç¥ãå¿
èŠããããããåã蟌ã¿ã«ãã£ãŠã¡ãœãããå€æŽããããšã¯ã§ããŸããã
ãããããGoã®åã¯æ¡åŒµçšã«éã ããå€æŽçšã«éããã㊠ãããšèšããŸãã
å®éãGoã®ã¡ãœããã¯ãå®çŸ©æžã¿ã®ä»®ãã©ã¡ãŒã¿ãŒã䜿çšããé¢æ°ã®æ§æç³è¡£ä»¥äžã®ãã®ã§ãããã¬ã·ãŒããŒã§ãã
func (c Cat) PrintLegs() { fmt.Printf("I have %d legs\n", c.Legs()) } func PrintLegs(c Cat) { fmt.Printf("I have %d legs\n", c.Legs()) }
ã¬ã·ãŒããŒã¯ãé¢æ°ã®æåã®ãã©ã¡ãŒã¿ãŒã§ããæž¡ããããã®ã§ãããGoã¯é¢æ°ã®ãªãŒããŒããŒãããµããŒãããŠããªãããã OctoCat
éåžžã®Cats
åãšäºæOctoCat
ãŸããã ããã¯æ¬¡ã®ååã«ç§ããããããŸãã
ããŒãã©ã»ãªã¹ã³ãã®ä»£æ¿åç
Barbara Liskovã«ãã£ãŠçºæãããLiskyã®çœ®æåçã§ã¯ãåŒã³åºãåŽãéããå€æã§ããªãåäœã瀺ãå Žåã2ã€ã®ã¿ã€ãã¯äºææ§ããããšãããŠããŸãã
ã¯ã©ã¹ããŒã¹ã®èšèªã§ã¯ãLiskã®çœ®æååã¯ãå€ãã®å ŽåãããŸããŸãªç¹å®ã®ãµãã¿ã€ããæã€æœè±¡ã¯ã©ã¹ã®ä»æ§ãšããŠè§£éãããŸãã ããããGoã«ã¯ã¯ã©ã¹ãç¶æ¿ããªããããæœè±¡ã¯ã©ã¹ã®éå±€ã®èŠ³ç¹ãã眮æãå®è£
ããããšã¯ã§ããŸããã
ã€ã³ã¿ãŒãã§ãŒã¹
代ããã«ã眮æã¯Goã®ã€ã³ã¿ãŒãã§ã€ã¹ã®èœåã§ãã Goã§ã¯ãç¹å®ã®ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£
ããããã«åã¯å¿
èŠãããŸãããããã®ä»£ããã«ãå®è£
ãããã¹ãŠã®åã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ãã·ã°ããã£ãã€ã³ã¿ãŒãã§ã€ã¹å®£èšãšäžèŽããã¡ãœãããå«ãã ãã§ãã
Goã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã¯æ瀺çãªäžèŽã§ã¯ãªãæé»çã«æºãããããããèšèªã§ã®äœ¿çšæ¹æ³ã«å€§ããªåœ±é¿ãäžãããšèšããŸãã
é©åã«èšèšãããã€ã³ã¿ãŒãã§ã€ã¹ã¯ãããããå°ããªã€ã³ã¿ãŒãã§ã€ã¹ã§ãã äž»ãªã€ãã£ãªã ã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã«å«ãŸããã¡ãœããã1ã€ã ãã§ããããšã§ãã ãã以å€ã®ããšãè¡ãã®ã¯é£ããã®ã§ãå°ããªã€ã³ã¿ãŒãã§ã€ã¹ã«åçŽãªå®è£
ãå«ãŸããããšã¯è«ççã§ãã ããã±ãŒãžãéåžžã®æ¯èãã«é¢é£ããŠããç°¡åãªå®è£
ãžã®åŠ¥åãœãªã¥ãŒã·ã§ã³ã§ãããšããããšããç¶ããŸãã
io.Reader
type Reader interface {
ããã«ããããæ°ã«å
¥ãã®Goã€ã³ã¿ãŒãã§ã€ã¹ã§ããio.Reader
ã§ããŸãã
io.Reader
ã€ã³ã¿ãŒãã§ãŒã¹io.Reader
éåžžã«ã·ã³ãã«ã§ãã Read
ã¯ãæå®ããããããã¡ãŒã«ããŒã¿Read
èªã¿åããèªã¿åããããã€ãæ°ãšèªã¿åãäžã«çºçããå¯èœæ§ã®ãããšã©ãŒãåŒã³åºãå
ã®ã³ãŒãã«è¿ããŸãã ã·ã³ãã«ã«èŠããŸãããéåžžã«åŒ·åã§ãã
io.Reader
ã¯ãã€ãã¹ããªãŒã ãšããŠè¡šçŸã§ãããã®ãæ±ããããæåéãäœã§ããªãŒããŒãªããžã§ã¯ããæ§ç¯ã§ããŸãã å®æ°æååããã€ãé
åãæšæºå
¥åã¹ããªãŒã ããããã¯ãŒã¯ã¹ããªãŒã ãgzip tarã¢ãŒã«ã€ããæšæºåºåã¹ããªãŒã ããŸãã¯sshãä»ããŠãªã¢ãŒãã§å®è¡ãããã³ãã³ãã
ãããŠããããã®å®è£
ã¯ãã¹ãŠã1ã€ã®åçŽãªå¥çŽãæºããããã亀æå¯èœã§ãã
ãããã£ãŠãLisk眮æã®ååã¯Goã«ãé©çšãããèšãããããšã¯ãæ
ãžã ã¯ã€ãªããã®çŽ æŽãããæ Œèšã«ãã£ãŠèŠçŽã§ããŸãã
ãã以äžèŠæ±ããããšã¯ãããŸããã
-ãžã ã»ã¯ã€ãªããããã¯ã第4ã®SOLIDååãžã®å€§ããªç§»è¡ã§ãã
ã€ã³ã¿ãŒãã§ãŒã¹åé¢ã®åç
4çªç®ã®ååã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®åé¢ã®ååã§ããã次ã®ããã«è§£éãããŸãã
ã¯ã©ã€ã¢ã³ãã¯ã䜿çšããªãã¡ãœããã«äŸåããããšã匷å¶ãããã¹ãã§ã¯ãããŸããã
-ãããŒãã»Sã»ããŒãã£ã³Goã§ã¯ãã€ã³ã¿ãŒãã§ã€ã¹åé¢ã®ååã®é©çšã¯ããã®æ©èœãå®è¡ããããã«å¿
èŠãªæ©èœã®åäœãåé¢ããããã»ã¹ãšããŠç解ã§ããŸãã å
·äœçãªäŸãšããŠã Document
æ§é ããã£ã¹ã¯ã«ä¿åããé¢æ°ãäœæããã¿ã¹ã¯ããããšããŸãã
ãã®ãããªé¢æ°ãå®çŸ©ã§ããŸãã Save
ãšåŒã³ãŸããããæäŸãããDocument
ãæžã蟌ãããã®ãœãŒã¹ãšããŠ*os.File
ãåãSave
ã ããããããã«ã¯ããã€ãã®åé¡ããããŸãã
Save
眲åã«ããããããã¯ãŒã¯äžã®ã©ã®ã¢ãã¬ã¹ã«ããŒã¿ãæžã蟌ãããšãã§ããªããªããŸãã ãããã¯ãŒã¯ã¹ãã¬ãŒãžãå°æ¥å¿
èŠã«ãªãå¯èœæ§ãããããã®é¢æ°ã®ã·ã°ããã£ãå€æŽãããå¯èœæ§ããããããããããåŒã³åºããã¹ãŠã®äººã«åœ±é¿ãããšä»®å®ããŸãã
Save
ã¯ãã£ã¹ã¯äžã®ãã¡ã€ã«ãçŽæ¥æäœããããããã¹ãã¯ããªãäžå¿«ã§ãã æäœãæ€èšŒããã«ã¯ããã¹ãã¯æžã蟌ã¿åŸã«ãã¡ã€ã«ã®å
容ãèªã¿åãå¿
èŠããããŸãã ããã«ããã¹ãã§ã¯ã f
äžæã¹ãã¬ãŒãžã«æžã蟌ãŸãããã®åŸã¯åžžã«åé€ãããããšã確èªããå¿
èŠf
ãŸãã
*os.File
ã¯ããã£ã¬ã¯ããªã®èªã¿åãããã¹ãã·ã³ããªãã¯ãªã³ã¯ã§ãããã©ããã®ç¢ºèªãªã©ã Save
ã«é¢é£ããªãå€ãã®ã¡ãœãããå®çŸ©ãSave
ã Save
é¢æ°ã®çœ²åããã¿ã¹ã¯ã«é¢é£ãã*os.File
éšåã«ãã£ãŠã®ã¿èšè¿°ãããŠããå Žåã«*os.File
ãŸãã
ãããã®åé¡ã§äœãã§ããŸããïŒ
io.ReadWriteCloser
ã䜿çšãããšãã€ã³ã¿ãŒãã§ã€ã¹ã®åé¢ã®ååãé©çšããŠSave
ããªãŒããŒã©ã€ãããããäžè¬çãªãã¡ã€ã«æäœãèšè¿°ããã€ã³ã¿ãŒãã§ã€ã¹ãåãå
¥ããããšãã§ããŸãã
ãããã®å€æŽã«ããã io.ReadWriteCloser
ã€ã³ã¿ãŒãã§ãŒã¹ãå®è£
ããã¿ã€ãã¯ã以åã®*os.File
眮ãæããããšãã§ããŸãã ããã«ããã Save
ã®ã¢ããªã±ãŒã·ã§ã³ã®å¹
ãåºããã Save
*os.File
åŒã³åºãåŽã«ãã¿ã€ã*os.File
ã¡ãœãããå¿
èŠãªæäœã«é¢é£ãããã説æãSave
ã
Save
ã®äœæè
ãšããŠã io.ReadWriteCloser
ã€ã³ã¿ãŒãã§ã€ã¹ã®èåŸã«é ãããŠããããã *os.File
ãããã¹ãŠã®ç¡é¢ä¿ãªã¡ãœãããåŒã³åºãããšã¯ã§ããŸããã ããããã€ã³ã¿ãŒãã§ã€ã¹åå²ã¡ãœããã䜿çšããŠããå°ãå
ã«é²ãããšãã§ããŸãã
ãŸãã Save
ãåç¬ã®è²¬ä»»ã®ååã«åŸãå¯èœæ§ã¯äœããã³ã³ãã³ãããã§ãã¯ããããã«æžã蟌ãã ãã¡ã€ã«ãèªã¿åããŸããããã¯ã³ãŒãã®å¥ã®éšåã®è²¬ä»»ã§ãã ãã®ããããã¡ã€ã«ãéãããéãããããåã«ã Save
æä»çã«æž¡ãã€ã³ã¿ãŒãã§ã€ã¹ã®ä»æ§ãçµã蟌ãããšãã§ããŸãã
第äºã«ã Save
ãéåžžã®ãã¡ã€ã«ã¡ã«ããºã ã®ããã«èŠããããã«ç¶æ¿ããã¹ããªãŒã ã¯ããŒãºã¡ã«ããºã ãæäŸããããšã«ããã wc
ãã©ã®ãããªç¶æ³ã§ã¯ããŒãºãããããšããçåãçããŸãã ããããã Save
ã¯æ¡ä»¶ãªãã§Close
ãåŒã³åºãããæåãããšClose
ãåŒã³åºãClose
ã
ææžãæ¢ã«èšé²ãããåŸã«ã¹ããªãŒã ã«è¿œå æ
å ±ãè¿œå ãããå Žåããããããããã¯ãã¹ãŠãåŒã³åºãSave
ã«ãšã£ãŠèª²é¡ã§ãã
type NopCloser struct { io.Writer }
倧ãŸããªè§£æ±ºçã¯ã io.Writer
ãåã蟌ã¿ã Close
ã¡ãœããããªãŒããŒã©ã€ãããæ°ããåãå®çŸ©ããŠãéããã¡ã€ã³ã¹ã¬ããããSave
ãåŒã³åºãããªãããã«ããããšã§ãã
ãããã NopCloser
ã¯å®éã«ã¯äœãã«ããŒããŠããªããããããã¯Barbara Liskovã®ä»£æ¿ååã«éåããå¯èœæ§ããããŸãã
ããè¯ã解決çã¯ã Save
ããªãŒããŒã©ã€ãããŠio.Writer
ã®ã¿ãio.Writer
ãããŒã¿ãã¹ããªãŒã ã«æžã蟌ã以å€ã®æ©èœãå®å
šã«å¥ªãããšã§ãã
ãã ãã Save
é¢æ°ã«ã€ã³ã¿ãŒãã§ã€ã¹ãåå²ãããšããååãé©çšãããšãçµæã¯åæã«èŠä»¶ã®æ¡ä»¶ã«æãåºæã®é¢æ°ã«ãªããŸããå¿
èŠãªã®ã¯æžã蟌ããã®ã ãã§ããã®é¢æ°ã§æãéèŠãªã®ã¯Save
toã䜿çšã§ããããšã§ãio.Writer
ã€ã³ã¿ãŒãã§ãŒã¹ãio.Writer
ããå Žæã«ããŒã¿ãä¿åããŸãã
Goã®éèŠãªçµéšåã¯ãã€ã³ã¿ãŒãã§ã€ã¹ãåãå
¥ããŠæ§é ãè¿ãããšã§ãã
-ãžã£ãã¯ã»ãªã³ãã ãŒãäžèšã®åŒçšã¯ãããæ°å¹Žã§Goã®ç²Ÿç¥ã«æŒã蟌ãã§ããèå³æ·±ãããŒã ã§ãã
ãã®ããŒãžã§ã³ã§ã¯ãæšæºãã€ãŒãã®äžéšãšããŠã1ã€ã®ãã¥ã¢ã³ã¹ãæ¬ èœããŠãããããã¯Jackã®ããã§ã¯ãããŸããããGoèšèªãã¶ã€ã³ãç»å Žããäž»ãªçç±ã®1ã€ã ãšæããŸãã
äŸåé¢ä¿ã®é転ã®åå
æåŸã®SOLIDååã¯ãäŸåé¢ä¿ã®é転ã®ååã§ãã
æäžäœã¢ãžã¥ãŒã«ã¯ãäžäœã¢ãžã¥ãŒã«ã«äŸåããã¹ãã§ã¯ãããŸããã äž¡æ¹ã®ã¬ãã«ã¯æœè±¡åã«äŸåããå¿
èŠããããŸãã
æœè±¡åã¯ãã®è©³çŽ°ã«äŸåããã¹ãã§ã¯ãããŸããã 詳现ã¯æœè±¡åã«äŸåããå¿
èŠããããŸãã
-ãããŒãã»Sã»ããŒãã£ã³ããããGoããã°ã©ãã«ãšã£ãŠãäŸåé¢ä¿ã®å転ã¯å®éã«ã¯äœãæå³ããã®ã§ããããïŒ
ãããŸã§ã«èª¬æãããã¹ãŠã®ååãé©çšããå Žåãã³ãŒãã¯ããããããåäžã®æ確ã«å®çŸ©ãããäŸåé¢ä¿ãŸãã¯ç®çãæã€åå¥ã®ããã±ãŒãžã«æ¢ã«é
眮ãããŠããå¿
èŠããããŸãã ã³ãŒãã¯ãã€ã³ã¿ãŒãã§ã€ã¹ã®èŠ³ç¹ããäŸåé¢ä¿ãèšè¿°ãããããã®ã€ã³ã¿ãŒãã§ã€ã¹ã¯ããããã®é¢æ°ãå¿
èŠãšããåäœã®ã¿ãèšè¿°ããããšãç®çãšããå¿
èŠããããŸãã ã€ãŸããå€ãã®äœæ¥ãæ®ã£ãŠã¯ãããŸããã
ç§ãæ³åããããã«ãããã§ããŒãã£ã³ã話ããŠããã®ã¯ãäž»ã«Goã®ã³ã³ããã¹ãã§ãã€ã³ããŒãã°ã©ãã®æ§é ã§ãã
Goã§ã¯ãã€ã³ããŒãã°ã©ãã¯éåšæçã§ããå¿
èŠããããŸãã éåšææ§ãç¡èŠããããšãããšãã³ã³ãã€ã«ãšã©ãŒãçºçããŸãããã¢ãŒããã¯ãã£ã§ããã«æ·±å»ãªãšã©ãŒãçºçããå ŽåããããŸãã ä»ã®ãã¹ãŠãçããå Žåãé©åã«èšèšãããGoããã°ã©ã ã®ã€ã³ããŒãã°ã©ãã¯ãé«ããŠçããªãã®ã§ã¯ãªããåºããŠæ¯èŒçå¹³ãã§ãªããã°ãªããŸããã å¥ã®ããã±ãŒãžã®æ¯æŽãªãã§ã¯æ©èœãå®è¡ã§ããªãããã±ãŒãžãããå Žåãããã¯ããã±ãŒãžã®å¢çãæ確ã«å®çŸ©ãããŠããªãããšã瀺ãä¿¡å·ã§ããå¯èœæ§ããããŸãã
äŸåé¢ä¿ã®å転ã®ååã«ãããã€ã³ããŒãåã§ç¹å®ã®è²¬ä»»ãå¯èœãªéãé«ãã¬ãã«ã§main
ããã±ãŒãžãŸãã¯ããã»ããµã®äžäœã¬ãã«ã«ç§»ããäžäœã¬ãã«ã®ã³ãŒããæœè±¡åããã³ã€ã³ã¿ãŒãã§ã€ã¹ã§åäœãããããšãã§ããŸãã
SOLID Goãã¶ã€ã³
èŠçŽãããšãSOLIDã®åååãGoã«é©çšãããå Žåããããã¯åŒ·åãªèšèšããŒã«ã§ãããäžç·ã«äœ¿çšããããšãäž»èŠãªããŒãã«ãªããŸãã
å
±æ責任ã®ååã«ãããé¢æ°ãåãããã³ã¡ãœãããèªç¶ã«é¢é£ããããã±ãŒãžã«æ§é åããããšã奚å±ãããŸãã ã¿ã€ããšæ©èœã¯äžç·ã«åäžã®ç®çãæãããŸãã
éæŸæ§/ééæ§ã®ååã¯ãã·ã§ã€ã¯ã䜿çšããŠåçŽãªã¿ã€ããšããè€éãªã¿ã€ãã劥åããããšã奚å±ããŸãã
Barbara Liskovã®ä»£æ¿ååã¯ãç¹å®ã®ã¿ã€ãã§ã¯ãªããã€ã³ã¿ãŒãã§ãŒã¹ã®èŠ³ç¹ããããã±ãŒãžéã®äŸåé¢ä¿ãè¡šçŸããããšã奚å±ããŠããŸãã å°ããªã€ã³ã¿ãŒãã§ã€ã¹ãå®çŸ©ããããšã§ãå®è£
ãå¥çŽãæºããããšç¢ºä¿¡ã§ããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ã®åé¢ã®ååã¯ãã®èããç¶ç¶ããå¿
èŠãªåäœã®ã¿ã«äŸåããé¢æ°ãšã¡ãœãããå®çŸ©ããããšããå§ãããŸãã é¢æ°ãåäžã®ã¡ãœãããæã€ã€ã³ã¿ãŒãã§ãŒã¹åãã©ã¡ãŒã¿ãŒã®ã¿ãå¿
èŠãšããå Žåããããã®é¢æ°ã¯åäžã®è²¬ä»»ãæã£ãŠããå¯èœæ§ãé«ãã§ãã
ã¯ã¬ãžããã®å転ã®ååã¯ãã³ã³ãã€ã«æ®µéããããã±ãŒãžã®äŸåé¢ä¿ã«é¢ããç¥èã転éããããšããå§ãããŸããGoã§ã¯ãç¹å®ã®ããã±ãŒãžã§äœ¿çšãããã€ã³ããŒãã®æ°ãã³ãŒãå®è¡ã®æ®µéã«æžããããšã§ããã芳å¯ããŸãã
ãã®äŒè©±ãèŠçŽãããå Žåãæãå¯èœæ§ã®é«ããã®ã¯æ¬¡ã®ãšããã§ãã ã€ã³ã¿ãŒãã§ã€ã¹ã«ãããGoããã°ã©ã ã§SOLIDã®ååãé©çšã§ããŸã ã
ã€ã³ã¿ãŒãã§ã€ã¹ã«ãããGoããã°ã©ãã¯ç¹å®ã®å®è£
ã§ã¯ãªããããã±ãŒãžã®æ©èœã説æã§ããŸãã ççµåãããã³ãŒãã¯å€æŽã容æã§ããããããããã¯ãã¹ãŠãåæããšèšãå¥ã®æ¹æ³ã§ãããããç®æšã§ãã
ãµã³ãã£ã»ã¡ãããè¿°ã¹ãããã«ïŒ
ãã¶ã€ã³ãšã¯ã ä»æ¥æ©èœã ã åžžã«ç°¡åã«å€æŽã§ããã³ãŒããæŽçããæè¡ã§ãã
ãµã³ãã£ã¡ããGoãé·æçã«äŒæ¥ãæè³ããèšèªã«ãªãããšãèšç»ããŠããå Žåããã®æ±ºå®ã®éèŠãªèŠçŽ ã¯ãGoã³ãŒãã®ä¿å®ã®å®¹æããšå€æŽã®å®¹æãã§ããããã§ãã
ãããã«
çµè«ãšããŠããã®äŒè©±ãéãã質åã«æ»ããŸãããã äžçäžã«äœäººã®å²programmerããã°ã©ããŒãããŸããïŒ ç§ã®æšæž¬ã¯æ¬¡ã®ãšããã§ãã
2020幎ã«ã¯ãGoã«500,000人ã®éçºè
ãããŸãã
-ãã€ãã»ãã§ã€ããŒ50äžäººã®Goããã°ã©ããæéããããŠäœãããŸããïŒ ãŸããæããã«ã圌ãã¯Goã§å€ãã®ã³ãŒããæžãã§ãããããããŠæ£çŽãªãšããããã¹ãŠã®ã³ãŒããè¯ãããã§ã¯ãªããã³ãŒãã®äžéšãæªãã§ãããã
ç§ãæ®é
·ã«ãªãããšããŠããããã§ã¯ãªãããšãç解ããŠãã ããããããããã®éšå±ã«ããçããã¯ãä»ã®èšèªãããªããGoã«æ¥ãèšèªã§éçºããçµéšããããŸãã
C ++ã«ã¯ãã¯ããã«ã¯ãªãŒã³ã§é²åããèšèªãç»å ŽããããšããŠããŸãã
-BjörnStraustrupãDesign and Evolution C ++ç§ãã¡ã®èšèªããã¹ãŠã®ããã°ã©ããŒã®ããã«æåããã®ãæ¯æŽããèœåã¯ãä»æ¥C ++ã«ã€ããŠåè«ãèšããšãã«äººã
ã話ãå§ãããããªæ··ä¹±ãäœæããªãããšã§ãã
ä»ã®èšèªãè¥å€§åããŠãããåé·ã§ããã€éè² è·ã§ããããã«ä»ã®èšèªãããããã¹ããŒãªãŒã¯Goã«é©çšã§ããŸããããããçºçããããªãã®ã§ããªã¯ãšã¹ãããããŸãã
Goããã°ã©ããŒã¯ããã¬ãŒã ã¯ãŒã¯ã«ã€ããŠè©±ãã®ããããèšèšã«ã€ããŠãã£ãšè©±ãå§ããå¿
èŠããããŸãã ãã¹ãŠã®ã³ã¹ãã§çç£æ§ã«éäžããã®ãããã代ããã«ãã¹ãŠã®ã³ã¹ãã§åå©çšããªãããšã«éäžããå¿
èŠããããŸãã
ä»æ¥ã¯ãéžæè¢ãå¶éã«é¢ä¿ãªãã人ã
ãç§ãã¡ãæã£ãŠããèšèªãã©ã®ããã«äœ¿çšããŠãœãªã¥ãŒã·ã§ã³ãäœæããå®éã®åé¡ã解決ãããã«ã€ããŠã©ã®ããã«è©±ãããèŠãŠã¿ãããšæããŸãã
ä»æ¥ã¯ãããèšèšãããåæãããåå©çšãããå€åã«å¯Ÿå¿ããããã«Goããã°ã©ã ãèšèšããããšã«ã€ããŠäººã
ãã©ã®ããã«è©±ããŠããã®ããèããããšæããŸãã
...ããã³å¥ã®è©³çŽ°
çŸåšãéåžžã«å€ãã®äººã
ããã®ãããªåªããã¹ããŒã«ãŒã®æ§æãèãããã«ãªã£ãã®ã¯çŽ æŽãããããšã§ãããçŸå®ã¯ããã®äŒè°ãã©ãã ãæé·ããŠãã圌ã®ç涯ãéããŠGoã䜿çšãã人ã®ç·æ°ã«æ¯ã¹ãŠãç§ãã¡ã¯ã»ãã®ãããã§ãäžéšã
ãããã£ãŠãç§ãã¡ã®ä»äºã¯ãä»ã®ã©ã®åœã«è¯ããœãããŠã§ã¢ãæžãã¹ãããäŒããããšã§ãã åªãããœãããŠã§ã¢ã§ãäºææ§ããããå€æŽå¯èœã§ãGoã䜿çšããŠãããè¡ãæ¹æ³ã瀺ããŸãã ãããŠãããã¯ããªãããå§ãŸããŸãã
ãã¶ã€ã³ã«ã€ããŠè©±ãå§ããŠãã ãããããã§çŽ¹ä»ããã¢ã€ãã¢ã䜿çšããŠãã ãããç¬èªã®ç 究ãè¡ãããããã®ã¢ã€ãã¢ããããžã§ã¯ãã«é©çšããŠãã ããã ããããç§ã¯ããªãã«ãããïŒ
-ããã«ã€ããŠã®ããã°æçš¿ãæžããŸããã
-ã»ãããŒã§è¡ã£ãããšãæããŠãã ããã
-åŠãã ããšã«é¢ããæ¬ãæžãã
ãããŠæ¥å¹Žãã®äŒè°ã«æ»ã£ãŠãããªããéæããããšã«ã€ããŠæããŠãã ããã
ããããã¹ãŠãå®è¡ããããšã«ãããGoã®éçºè
ã®ãšã³ã·ã¹ãã ãäœæããäœæ¥ãç¶ç¶ããããã«èšèšãããããã°ã©ã ã管çã§ããŸãã
ããããšã
Dave Cheneyã«ãããªãªãžãã«æçš¿