@k2works/claude-code-booster 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/lib/assets/docs/article/functional-desgin-ppp/all/01-immutability-and-data-transformation.md +475 -0
  2. package/lib/assets/docs/article/functional-desgin-ppp/all/02-function-composition.md +519 -0
  3. package/lib/assets/docs/article/functional-desgin-ppp/all/03-polymorphism.md +537 -0
  4. package/lib/assets/docs/article/functional-desgin-ppp/all/04-data-validation.md +300 -0
  5. package/lib/assets/docs/article/functional-desgin-ppp/all/05-property-based-testing.md +320 -0
  6. package/lib/assets/docs/article/functional-desgin-ppp/all/06-tdd-and-functional.md +498 -0
  7. package/lib/assets/docs/article/functional-desgin-ppp/all/07-composite-pattern.md +298 -0
  8. package/lib/assets/docs/article/functional-desgin-ppp/all/08-decorator-pattern.md +291 -0
  9. package/lib/assets/docs/article/functional-desgin-ppp/all/09-adapter-pattern.md +336 -0
  10. package/lib/assets/docs/article/functional-desgin-ppp/all/10-strategy-pattern.md +303 -0
  11. package/lib/assets/docs/article/functional-desgin-ppp/all/11-command-pattern.md +286 -0
  12. package/lib/assets/docs/article/functional-desgin-ppp/all/12-visitor-pattern.md +322 -0
  13. package/lib/assets/docs/article/functional-desgin-ppp/all/13-abstract-factory-pattern.md +319 -0
  14. package/lib/assets/docs/article/functional-desgin-ppp/all/14-abstract-server-pattern.md +365 -0
  15. package/lib/assets/docs/article/functional-desgin-ppp/all/15-gossiping-bus-drivers.md +156 -0
  16. package/lib/assets/docs/article/functional-desgin-ppp/all/16-payroll-system.md +178 -0
  17. package/lib/assets/docs/article/functional-desgin-ppp/all/17-video-rental-system.md +312 -0
  18. package/lib/assets/docs/article/functional-desgin-ppp/all/18-concurrency-system.md +287 -0
  19. package/lib/assets/docs/article/functional-desgin-ppp/all/19-wa-tor-simulation.md +286 -0
  20. package/lib/assets/docs/article/functional-desgin-ppp/all/20-pattern-interactions.md +274 -0
  21. package/lib/assets/docs/article/functional-desgin-ppp/all/21-best-practices.md +294 -0
  22. package/lib/assets/docs/article/functional-desgin-ppp/all/22-oo-to-fp-migration.md +337 -0
  23. package/lib/assets/docs/article/functional-desgin-ppp/all/index.md +388 -0
  24. package/lib/assets/docs/article/functional-desgin-ppp/clojure/01-immutability-and-data-transformation.md +271 -0
  25. package/lib/assets/docs/article/functional-desgin-ppp/clojure/02-function-composition.md +380 -0
  26. package/lib/assets/docs/article/functional-desgin-ppp/clojure/03-polymorphism.md +384 -0
  27. package/lib/assets/docs/article/functional-desgin-ppp/clojure/04-clojure-spec.md +350 -0
  28. package/lib/assets/docs/article/functional-desgin-ppp/clojure/05-property-based-testing.md +352 -0
  29. package/lib/assets/docs/article/functional-desgin-ppp/clojure/06-tdd-in-functional.md +383 -0
  30. package/lib/assets/docs/article/functional-desgin-ppp/clojure/07-composite-pattern.md +529 -0
  31. package/lib/assets/docs/article/functional-desgin-ppp/clojure/08-decorator-pattern.md +395 -0
  32. package/lib/assets/docs/article/functional-desgin-ppp/clojure/09-adapter-pattern.md +399 -0
  33. package/lib/assets/docs/article/functional-desgin-ppp/clojure/10-strategy-pattern.md +485 -0
  34. package/lib/assets/docs/article/functional-desgin-ppp/clojure/11-command-pattern.md +566 -0
  35. package/lib/assets/docs/article/functional-desgin-ppp/clojure/12-visitor-pattern.md +567 -0
  36. package/lib/assets/docs/article/functional-desgin-ppp/clojure/13-abstract-factory-pattern.md +475 -0
  37. package/lib/assets/docs/article/functional-desgin-ppp/clojure/14-abstract-server-pattern.md +462 -0
  38. package/lib/assets/docs/article/functional-desgin-ppp/clojure/15-gossiping-bus-drivers.md +323 -0
  39. package/lib/assets/docs/article/functional-desgin-ppp/clojure/16-payroll-system.md +401 -0
  40. package/lib/assets/docs/article/functional-desgin-ppp/clojure/17-video-rental-system.md +450 -0
  41. package/lib/assets/docs/article/functional-desgin-ppp/clojure/18-concurrency-system.md +475 -0
  42. package/lib/assets/docs/article/functional-desgin-ppp/clojure/19-wator-simulation.md +739 -0
  43. package/lib/assets/docs/article/functional-desgin-ppp/clojure/20-pattern-interactions.md +562 -0
  44. package/lib/assets/docs/article/functional-desgin-ppp/clojure/21-best-practices.md +506 -0
  45. package/lib/assets/docs/article/functional-desgin-ppp/clojure/22-oo-to-fp-migration.md +526 -0
  46. package/lib/assets/docs/article/functional-desgin-ppp/clojure/index.md +197 -0
  47. package/lib/assets/docs/article/functional-desgin-ppp/elixir/01-immutability-and-data-transformation.md +381 -0
  48. package/lib/assets/docs/article/functional-desgin-ppp/elixir/02-function-composition.md +374 -0
  49. package/lib/assets/docs/article/functional-desgin-ppp/elixir/03-polymorphism.md +375 -0
  50. package/lib/assets/docs/article/functional-desgin-ppp/elixir/04-data-validation.md +195 -0
  51. package/lib/assets/docs/article/functional-desgin-ppp/elixir/05-property-based-testing.md +268 -0
  52. package/lib/assets/docs/article/functional-desgin-ppp/elixir/06-tdd-and-fp.md +294 -0
  53. package/lib/assets/docs/article/functional-desgin-ppp/elixir/07-effects-and-pure-functions.md +164 -0
  54. package/lib/assets/docs/article/functional-desgin-ppp/elixir/08-error-handling-strategies.md +168 -0
  55. package/lib/assets/docs/article/functional-desgin-ppp/elixir/09-io-and-external-systems.md +254 -0
  56. package/lib/assets/docs/article/functional-desgin-ppp/elixir/10-concurrency-patterns.md +269 -0
  57. package/lib/assets/docs/article/functional-desgin-ppp/elixir/11-command-pattern.md +148 -0
  58. package/lib/assets/docs/article/functional-desgin-ppp/elixir/12-visitor-pattern.md +176 -0
  59. package/lib/assets/docs/article/functional-desgin-ppp/elixir/13-abstract-factory-pattern.md +604 -0
  60. package/lib/assets/docs/article/functional-desgin-ppp/elixir/14-abstract-server-pattern.md +729 -0
  61. package/lib/assets/docs/article/functional-desgin-ppp/elixir/15-gossiping-bus-drivers.md +291 -0
  62. package/lib/assets/docs/article/functional-desgin-ppp/elixir/16-payroll-system.md +420 -0
  63. package/lib/assets/docs/article/functional-desgin-ppp/elixir/17-video-rental-system.md +319 -0
  64. package/lib/assets/docs/article/functional-desgin-ppp/elixir/18-concurrency-system.md +466 -0
  65. package/lib/assets/docs/article/functional-desgin-ppp/elixir/19-wator-simulation.md +523 -0
  66. package/lib/assets/docs/article/functional-desgin-ppp/elixir/20-pattern-interactions.md +287 -0
  67. package/lib/assets/docs/article/functional-desgin-ppp/elixir/21-best-practices.md +340 -0
  68. package/lib/assets/docs/article/functional-desgin-ppp/elixir/22-oo-to-fp-migration.md +395 -0
  69. package/lib/assets/docs/article/functional-desgin-ppp/elixir/index.md +204 -0
  70. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/01-immutability-and-data-transformation.md +382 -0
  71. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/02-function-composition.md +452 -0
  72. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/03-polymorphism.md +495 -0
  73. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/04-data-validation.md +416 -0
  74. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/05-property-based-testing.md +382 -0
  75. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/06-tdd-functional.md +687 -0
  76. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/07-composite-pattern.md +442 -0
  77. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/08-decorator-pattern.md +479 -0
  78. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/09-adapter-pattern.md +479 -0
  79. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/10-strategy-pattern.md +427 -0
  80. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/11-command-pattern.md +428 -0
  81. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/12-visitor-pattern.md +339 -0
  82. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/13-abstract-factory-pattern.md +309 -0
  83. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/14-abstract-server-pattern.md +596 -0
  84. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/15-gossiping-bus-drivers.md +353 -0
  85. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/16-payroll-system.md +350 -0
  86. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/17-video-rental-system.md +412 -0
  87. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/18-concurrency-system.md +367 -0
  88. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/19-wator-simulation.md +401 -0
  89. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/20-pattern-interactions.md +291 -0
  90. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/21-best-practices.md +320 -0
  91. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/22-oo-to-fp-migration.md +322 -0
  92. package/lib/assets/docs/article/functional-desgin-ppp/fsharp/index.md +230 -0
  93. package/lib/assets/docs/article/functional-desgin-ppp/haskell/01-immutability-and-data-transformation.md +298 -0
  94. package/lib/assets/docs/article/functional-desgin-ppp/haskell/02-function-composition.md +304 -0
  95. package/lib/assets/docs/article/functional-desgin-ppp/haskell/03-polymorphism.md +362 -0
  96. package/lib/assets/docs/article/functional-desgin-ppp/haskell/04-data-validation.md +257 -0
  97. package/lib/assets/docs/article/functional-desgin-ppp/haskell/05-property-based-testing.md +254 -0
  98. package/lib/assets/docs/article/functional-desgin-ppp/haskell/06-tdd-functional.md +283 -0
  99. package/lib/assets/docs/article/functional-desgin-ppp/haskell/07-composite-pattern.md +395 -0
  100. package/lib/assets/docs/article/functional-desgin-ppp/haskell/08-decorator-pattern.md +319 -0
  101. package/lib/assets/docs/article/functional-desgin-ppp/haskell/09-adapter-pattern.md +382 -0
  102. package/lib/assets/docs/article/functional-desgin-ppp/haskell/10-strategy-pattern.md +287 -0
  103. package/lib/assets/docs/article/functional-desgin-ppp/haskell/11-command-pattern.md +303 -0
  104. package/lib/assets/docs/article/functional-desgin-ppp/haskell/12-visitor-pattern.md +326 -0
  105. package/lib/assets/docs/article/functional-desgin-ppp/haskell/13-abstract-factory-pattern.md +332 -0
  106. package/lib/assets/docs/article/functional-desgin-ppp/haskell/14-abstract-server-pattern.md +379 -0
  107. package/lib/assets/docs/article/functional-desgin-ppp/haskell/15-gossiping-bus-drivers.md +175 -0
  108. package/lib/assets/docs/article/functional-desgin-ppp/haskell/16-payroll-system.md +219 -0
  109. package/lib/assets/docs/article/functional-desgin-ppp/haskell/17-video-rental-system.md +244 -0
  110. package/lib/assets/docs/article/functional-desgin-ppp/haskell/18-concurrency-system.md +363 -0
  111. package/lib/assets/docs/article/functional-desgin-ppp/haskell/19-wator-simulation.md +438 -0
  112. package/lib/assets/docs/article/functional-desgin-ppp/haskell/20-pattern-interactions.md +323 -0
  113. package/lib/assets/docs/article/functional-desgin-ppp/haskell/21-best-practices.md +403 -0
  114. package/lib/assets/docs/article/functional-desgin-ppp/haskell/22-oo-to-fp-migration.md +469 -0
  115. package/lib/assets/docs/article/functional-desgin-ppp/haskell/index.md +174 -0
  116. package/lib/assets/docs/article/functional-desgin-ppp/index.md +90 -0
  117. package/lib/assets/docs/article/functional-desgin-ppp/rust/01-immutability-and-data-transformation.md +448 -0
  118. package/lib/assets/docs/article/functional-desgin-ppp/rust/02-function-composition.md +463 -0
  119. package/lib/assets/docs/article/functional-desgin-ppp/rust/03-polymorphism.md +425 -0
  120. package/lib/assets/docs/article/functional-desgin-ppp/rust/04-data-validation.md +273 -0
  121. package/lib/assets/docs/article/functional-desgin-ppp/rust/05-property-based-testing.md +247 -0
  122. package/lib/assets/docs/article/functional-desgin-ppp/rust/06-tdd-and-functional.md +841 -0
  123. package/lib/assets/docs/article/functional-desgin-ppp/rust/07-composite-pattern.md +384 -0
  124. package/lib/assets/docs/article/functional-desgin-ppp/rust/08-decorator-pattern.md +383 -0
  125. package/lib/assets/docs/article/functional-desgin-ppp/rust/09-adapter-pattern.md +339 -0
  126. package/lib/assets/docs/article/functional-desgin-ppp/rust/10-strategy-pattern.md +331 -0
  127. package/lib/assets/docs/article/functional-desgin-ppp/rust/11-command-pattern.md +356 -0
  128. package/lib/assets/docs/article/functional-desgin-ppp/rust/12-visitor-pattern.md +379 -0
  129. package/lib/assets/docs/article/functional-desgin-ppp/rust/13-abstract-factory-pattern.md +361 -0
  130. package/lib/assets/docs/article/functional-desgin-ppp/rust/14-abstract-server-pattern.md +392 -0
  131. package/lib/assets/docs/article/functional-desgin-ppp/rust/15-gossiping-bus-drivers.md +300 -0
  132. package/lib/assets/docs/article/functional-desgin-ppp/rust/16-payroll-system.md +297 -0
  133. package/lib/assets/docs/article/functional-desgin-ppp/rust/17-video-rental-system.md +304 -0
  134. package/lib/assets/docs/article/functional-desgin-ppp/rust/18-concurrency-system.md +315 -0
  135. package/lib/assets/docs/article/functional-desgin-ppp/rust/19-wator-simulation.md +311 -0
  136. package/lib/assets/docs/article/functional-desgin-ppp/rust/20-pattern-interactions.md +304 -0
  137. package/lib/assets/docs/article/functional-desgin-ppp/rust/21-best-practices.md +336 -0
  138. package/lib/assets/docs/article/functional-desgin-ppp/rust/22-oo-to-fp-migration.md +349 -0
  139. package/lib/assets/docs/article/functional-desgin-ppp/rust/index.md +199 -0
  140. package/lib/assets/docs/article/functional-desgin-ppp/scala/01-immutability-and-data-transformation.md +326 -0
  141. package/lib/assets/docs/article/functional-desgin-ppp/scala/02-function-composition.md +348 -0
  142. package/lib/assets/docs/article/functional-desgin-ppp/scala/03-polymorphism.md +357 -0
  143. package/lib/assets/docs/article/functional-desgin-ppp/scala/04-data-validation.md +364 -0
  144. package/lib/assets/docs/article/functional-desgin-ppp/scala/05-property-based-testing.md +515 -0
  145. package/lib/assets/docs/article/functional-desgin-ppp/scala/06-tdd-functional.md +557 -0
  146. package/lib/assets/docs/article/functional-desgin-ppp/scala/07-composite-pattern.md +363 -0
  147. package/lib/assets/docs/article/functional-desgin-ppp/scala/08-decorator-pattern.md +327 -0
  148. package/lib/assets/docs/article/functional-desgin-ppp/scala/09-adapter-pattern.md +517 -0
  149. package/lib/assets/docs/article/functional-desgin-ppp/scala/10-strategy-pattern.md +441 -0
  150. package/lib/assets/docs/article/functional-desgin-ppp/scala/11-command-pattern.md +407 -0
  151. package/lib/assets/docs/article/functional-desgin-ppp/scala/12-visitor-pattern.md +379 -0
  152. package/lib/assets/docs/article/functional-desgin-ppp/scala/13-abstract-factory-pattern.md +398 -0
  153. package/lib/assets/docs/article/functional-desgin-ppp/scala/14-abstract-server-pattern.md +476 -0
  154. package/lib/assets/docs/article/functional-desgin-ppp/scala/15-gossiping-bus-drivers.md +389 -0
  155. package/lib/assets/docs/article/functional-desgin-ppp/scala/16-payroll-system.md +342 -0
  156. package/lib/assets/docs/article/functional-desgin-ppp/scala/17-video-rental-system.md +324 -0
  157. package/lib/assets/docs/article/functional-desgin-ppp/scala/18-concurrency-system.md +730 -0
  158. package/lib/assets/docs/article/functional-desgin-ppp/scala/19-wator-simulation.md +624 -0
  159. package/lib/assets/docs/article/functional-desgin-ppp/scala/20-pattern-interactions.md +512 -0
  160. package/lib/assets/docs/article/functional-desgin-ppp/scala/21-best-practices.md +427 -0
  161. package/lib/assets/docs/article/functional-desgin-ppp/scala/22-oo-to-fp-migration.md +682 -0
  162. package/lib/assets/docs/article/functional-desgin-ppp/scala/index.md +199 -0
  163. package/lib/assets/docs/article/getting-start-tdd/clojure/01-todo-list-and-first-test.md +166 -0
  164. package/lib/assets/docs/article/getting-start-tdd/clojure/02-fake-it-and-triangulation.md +162 -0
  165. package/lib/assets/docs/article/getting-start-tdd/clojure/03-obvious-implementation-and-refactoring.md +135 -0
  166. package/lib/assets/docs/article/getting-start-tdd/clojure/04-version-control-and-conventional-commits.md +88 -0
  167. package/lib/assets/docs/article/getting-start-tdd/clojure/05-package-management-and-static-analysis.md +299 -0
  168. package/lib/assets/docs/article/getting-start-tdd/clojure/06-task-runner-and-ci-cd.md +241 -0
  169. package/lib/assets/docs/article/getting-start-tdd/clojure/07-protocols-and-records.md +131 -0
  170. package/lib/assets/docs/article/getting-start-tdd/clojure/08-multimethods-and-design-patterns.md +130 -0
  171. package/lib/assets/docs/article/getting-start-tdd/clojure/09-namespaces-and-module-design.md +127 -0
  172. package/lib/assets/docs/article/getting-start-tdd/clojure/10-higher-order-functions-and-composition.md +114 -0
  173. package/lib/assets/docs/article/getting-start-tdd/clojure/11-persistent-data-and-pipeline.md +138 -0
  174. package/lib/assets/docs/article/getting-start-tdd/clojure/12-error-handling-and-spec.md +161 -0
  175. package/lib/assets/docs/article/getting-start-tdd/clojure/index.md +65 -0
  176. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter01.md +232 -0
  177. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter02.md +244 -0
  178. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter03.md +202 -0
  179. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter04.md +92 -0
  180. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter05.md +256 -0
  181. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter06.md +195 -0
  182. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter07.md +214 -0
  183. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter08.md +249 -0
  184. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter09.md +174 -0
  185. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter10.md +166 -0
  186. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter11.md +192 -0
  187. package/lib/assets/docs/article/getting-start-tdd/csharp/chapter12.md +211 -0
  188. package/lib/assets/docs/article/getting-start-tdd/csharp/index.md +83 -0
  189. package/lib/assets/docs/article/getting-start-tdd/elixir/01-todo-list-and-first-test.md +87 -0
  190. package/lib/assets/docs/article/getting-start-tdd/elixir/02-fake-it-and-triangulation.md +95 -0
  191. package/lib/assets/docs/article/getting-start-tdd/elixir/03-obvious-implementation-and-refactoring.md +109 -0
  192. package/lib/assets/docs/article/getting-start-tdd/elixir/04-version-control-and-conventional-commits.md +96 -0
  193. package/lib/assets/docs/article/getting-start-tdd/elixir/05-package-management-and-static-analysis.md +88 -0
  194. package/lib/assets/docs/article/getting-start-tdd/elixir/06-task-runner-and-ci-cd.md +71 -0
  195. package/lib/assets/docs/article/getting-start-tdd/elixir/07-structs-and-protocols.md +110 -0
  196. package/lib/assets/docs/article/getting-start-tdd/elixir/08-pattern-matching-and-guards.md +108 -0
  197. package/lib/assets/docs/article/getting-start-tdd/elixir/09-module-design-and-behaviours.md +104 -0
  198. package/lib/assets/docs/article/getting-start-tdd/elixir/10-higher-order-functions-and-pipeline.md +178 -0
  199. package/lib/assets/docs/article/getting-start-tdd/elixir/11-stream-and-lazy-evaluation.md +142 -0
  200. package/lib/assets/docs/article/getting-start-tdd/elixir/12-error-handling-and-with.md +145 -0
  201. package/lib/assets/docs/article/getting-start-tdd/elixir/index.md +35 -0
  202. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter01.md +202 -0
  203. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter02.md +246 -0
  204. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter03.md +218 -0
  205. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter04.md +179 -0
  206. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter05.md +267 -0
  207. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter06.md +190 -0
  208. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter07.md +161 -0
  209. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter08.md +175 -0
  210. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter09.md +222 -0
  211. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter10.md +189 -0
  212. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter11.md +212 -0
  213. package/lib/assets/docs/article/getting-start-tdd/fsharp/chapter12.md +215 -0
  214. package/lib/assets/docs/article/getting-start-tdd/fsharp/index.md +71 -0
  215. package/lib/assets/docs/article/getting-start-tdd/go/01-todo-list-and-first-test.md +213 -0
  216. package/lib/assets/docs/article/getting-start-tdd/go/02-fake-it-and-triangulation.md +302 -0
  217. package/lib/assets/docs/article/getting-start-tdd/go/03-obvious-implementation-and-refactoring.md +339 -0
  218. package/lib/assets/docs/article/getting-start-tdd/go/04-version-control-and-conventional-commits.md +112 -0
  219. package/lib/assets/docs/article/getting-start-tdd/go/05-package-management-and-static-analysis.md +272 -0
  220. package/lib/assets/docs/article/getting-start-tdd/go/06-task-runner-and-ci-cd.md +233 -0
  221. package/lib/assets/docs/article/getting-start-tdd/go/07-encapsulation-and-polymorphism.md +394 -0
  222. package/lib/assets/docs/article/getting-start-tdd/go/08-design-patterns.md +422 -0
  223. package/lib/assets/docs/article/getting-start-tdd/go/09-solid-principles-and-module-design.md +400 -0
  224. package/lib/assets/docs/article/getting-start-tdd/go/10-higher-order-functions-and-composition.md +226 -0
  225. package/lib/assets/docs/article/getting-start-tdd/go/11-immutable-data-and-pipeline.md +296 -0
  226. package/lib/assets/docs/article/getting-start-tdd/go/12-error-handling-and-type-safety.md +411 -0
  227. package/lib/assets/docs/article/getting-start-tdd/go/index.md +83 -0
  228. package/lib/assets/docs/article/getting-start-tdd/haskell/01-todo-list-and-first-test.md +279 -0
  229. package/lib/assets/docs/article/getting-start-tdd/haskell/02-fake-it-and-triangulation.md +337 -0
  230. package/lib/assets/docs/article/getting-start-tdd/haskell/03-obvious-implementation-and-refactoring.md +257 -0
  231. package/lib/assets/docs/article/getting-start-tdd/haskell/04-version-control-and-conventional-commits.md +182 -0
  232. package/lib/assets/docs/article/getting-start-tdd/haskell/05-package-management-and-static-analysis.md +313 -0
  233. package/lib/assets/docs/article/getting-start-tdd/haskell/06-task-runner-and-ci-cd.md +309 -0
  234. package/lib/assets/docs/article/getting-start-tdd/haskell/07-algebraic-data-types-and-type-classes.md +412 -0
  235. package/lib/assets/docs/article/getting-start-tdd/haskell/08-pattern-matching-and-guards.md +390 -0
  236. package/lib/assets/docs/article/getting-start-tdd/haskell/09-module-design-and-smart-constructors.md +461 -0
  237. package/lib/assets/docs/article/getting-start-tdd/haskell/10-higher-order-functions-and-currying.md +434 -0
  238. package/lib/assets/docs/article/getting-start-tdd/haskell/11-function-composition-and-point-free.md +392 -0
  239. package/lib/assets/docs/article/getting-start-tdd/haskell/12-monad-and-error-handling.md +631 -0
  240. package/lib/assets/docs/article/getting-start-tdd/haskell/index.md +49 -0
  241. package/lib/assets/docs/article/getting-start-tdd/index.md +93 -0
  242. package/lib/assets/docs/article/getting-start-tdd/integration/01-language-overview.md +375 -0
  243. package/lib/assets/docs/article/getting-start-tdd/integration/02-test-framework-comparison.md +349 -0
  244. package/lib/assets/docs/article/getting-start-tdd/integration/03-tdd-pattern-comparison.md +445 -0
  245. package/lib/assets/docs/article/getting-start-tdd/integration/04-type-system-comparison.md +405 -0
  246. package/lib/assets/docs/article/getting-start-tdd/integration/05-dev-environment-comparison.md +330 -0
  247. package/lib/assets/docs/article/getting-start-tdd/integration/06-learning-roadmap.md +274 -0
  248. package/lib/assets/docs/article/getting-start-tdd/integration/index.md +69 -0
  249. package/lib/assets/docs/article/getting-start-tdd/java/01-todo-list-and-first-test.md +234 -0
  250. package/lib/assets/docs/article/getting-start-tdd/java/02-fake-it-and-triangulation.md +261 -0
  251. package/lib/assets/docs/article/getting-start-tdd/java/03-obvious-implementation-and-refactoring.md +185 -0
  252. package/lib/assets/docs/article/getting-start-tdd/java/04-version-control-and-conventional-commits.md +115 -0
  253. package/lib/assets/docs/article/getting-start-tdd/java/05-package-management-and-static-analysis.md +382 -0
  254. package/lib/assets/docs/article/getting-start-tdd/java/06-task-runner-and-ci-cd.md +272 -0
  255. package/lib/assets/docs/article/getting-start-tdd/java/07-encapsulation-and-polymorphism.md +626 -0
  256. package/lib/assets/docs/article/getting-start-tdd/java/08-design-patterns.md +393 -0
  257. package/lib/assets/docs/article/getting-start-tdd/java/09-solid-principles-and-module-design.md +310 -0
  258. package/lib/assets/docs/article/getting-start-tdd/java/10-higher-order-functions-and-composition.md +188 -0
  259. package/lib/assets/docs/article/getting-start-tdd/java/11-immutable-data-and-pipeline.md +167 -0
  260. package/lib/assets/docs/article/getting-start-tdd/java/12-error-handling-and-type-safety.md +205 -0
  261. package/lib/assets/docs/article/getting-start-tdd/java/index.md +61 -0
  262. package/lib/assets/docs/article/getting-start-tdd/node/01-todo-list-and-first-test.md +244 -0
  263. package/lib/assets/docs/article/getting-start-tdd/node/02-fake-it-and-triangulation.md +262 -0
  264. package/lib/assets/docs/article/getting-start-tdd/node/03-obvious-implementation-and-refactoring.md +169 -0
  265. package/lib/assets/docs/article/getting-start-tdd/node/04-version-control-and-conventional-commits.md +112 -0
  266. package/lib/assets/docs/article/getting-start-tdd/node/05-package-management-and-static-analysis.md +314 -0
  267. package/lib/assets/docs/article/getting-start-tdd/node/06-task-runner-and-ci-cd.md +235 -0
  268. package/lib/assets/docs/article/getting-start-tdd/node/07-encapsulation-and-polymorphism.md +327 -0
  269. package/lib/assets/docs/article/getting-start-tdd/node/08-design-patterns.md +322 -0
  270. package/lib/assets/docs/article/getting-start-tdd/node/09-solid-principles-and-module-design.md +285 -0
  271. package/lib/assets/docs/article/getting-start-tdd/node/10-higher-order-functions-and-composition.md +199 -0
  272. package/lib/assets/docs/article/getting-start-tdd/node/11-immutable-data-and-pipeline.md +207 -0
  273. package/lib/assets/docs/article/getting-start-tdd/node/12-error-handling-and-type-safety.md +295 -0
  274. package/lib/assets/docs/article/getting-start-tdd/node/index.md +56 -0
  275. package/lib/assets/docs/article/getting-start-tdd/php/01-todo-list-and-first-test.md +259 -0
  276. package/lib/assets/docs/article/getting-start-tdd/php/02-fake-it-and-triangulation.md +200 -0
  277. package/lib/assets/docs/article/getting-start-tdd/php/03-obvious-implementation-and-refactoring.md +248 -0
  278. package/lib/assets/docs/article/getting-start-tdd/php/04-version-control-and-conventional-commits.md +141 -0
  279. package/lib/assets/docs/article/getting-start-tdd/php/05-package-management-and-static-analysis.md +410 -0
  280. package/lib/assets/docs/article/getting-start-tdd/php/06-task-runner-and-ci-cd.md +321 -0
  281. package/lib/assets/docs/article/getting-start-tdd/php/07-encapsulation-and-polymorphism.md +372 -0
  282. package/lib/assets/docs/article/getting-start-tdd/php/08-design-patterns.md +453 -0
  283. package/lib/assets/docs/article/getting-start-tdd/php/09-solid-principles-and-module-design.md +460 -0
  284. package/lib/assets/docs/article/getting-start-tdd/php/10-higher-order-functions-and-composition.md +182 -0
  285. package/lib/assets/docs/article/getting-start-tdd/php/11-immutable-data-and-pipeline.md +266 -0
  286. package/lib/assets/docs/article/getting-start-tdd/php/12-error-handling-and-type-safety.md +308 -0
  287. package/lib/assets/docs/article/getting-start-tdd/php/index.md +84 -0
  288. package/lib/assets/docs/article/getting-start-tdd/python/01-todo-list-and-first-test.md +201 -0
  289. package/lib/assets/docs/article/getting-start-tdd/python/02-fake-it-and-triangulation.md +247 -0
  290. package/lib/assets/docs/article/getting-start-tdd/python/03-obvious-implementation-and-refactoring.md +199 -0
  291. package/lib/assets/docs/article/getting-start-tdd/python/04-version-control-and-conventional-commits.md +87 -0
  292. package/lib/assets/docs/article/getting-start-tdd/python/05-package-management-and-static-analysis.md +274 -0
  293. package/lib/assets/docs/article/getting-start-tdd/python/06-task-runner-and-ci-cd.md +190 -0
  294. package/lib/assets/docs/article/getting-start-tdd/python/07-encapsulation-and-polymorphism.md +208 -0
  295. package/lib/assets/docs/article/getting-start-tdd/python/08-design-patterns.md +172 -0
  296. package/lib/assets/docs/article/getting-start-tdd/python/09-solid-principles-and-module-design.md +130 -0
  297. package/lib/assets/docs/article/getting-start-tdd/python/10-higher-order-functions-and-composition.md +122 -0
  298. package/lib/assets/docs/article/getting-start-tdd/python/11-immutable-data-and-pipeline.md +116 -0
  299. package/lib/assets/docs/article/getting-start-tdd/python/12-error-handling-and-type-safety.md +126 -0
  300. package/lib/assets/docs/article/getting-start-tdd/python/index.md +55 -0
  301. package/lib/assets/docs/article/getting-start-tdd/ruby/01-todo-list-and-first-test.md +231 -0
  302. package/lib/assets/docs/article/getting-start-tdd/ruby/02-fake-it-and-triangulation.md +238 -0
  303. package/lib/assets/docs/article/getting-start-tdd/ruby/03-obvious-implementation-and-refactoring.md +228 -0
  304. package/lib/assets/docs/article/getting-start-tdd/ruby/04-version-control-and-conventional-commits.md +112 -0
  305. package/lib/assets/docs/article/getting-start-tdd/ruby/05-package-management-and-static-analysis.md +287 -0
  306. package/lib/assets/docs/article/getting-start-tdd/ruby/06-task-runner-and-ci-cd.md +248 -0
  307. package/lib/assets/docs/article/getting-start-tdd/ruby/07-encapsulation-and-polymorphism.md +279 -0
  308. package/lib/assets/docs/article/getting-start-tdd/ruby/08-design-patterns.md +329 -0
  309. package/lib/assets/docs/article/getting-start-tdd/ruby/09-solid-principles-and-module-design.md +196 -0
  310. package/lib/assets/docs/article/getting-start-tdd/ruby/10-higher-order-functions-and-composition.md +175 -0
  311. package/lib/assets/docs/article/getting-start-tdd/ruby/11-immutable-data-and-pipeline.md +233 -0
  312. package/lib/assets/docs/article/getting-start-tdd/ruby/12-error-handling-and-type-safety.md +398 -0
  313. package/lib/assets/docs/article/getting-start-tdd/ruby/index.md +83 -0
  314. package/lib/assets/docs/article/getting-start-tdd/rust/01-todo-list-and-first-test.md +211 -0
  315. package/lib/assets/docs/article/getting-start-tdd/rust/02-fake-it-and-triangulation.md +264 -0
  316. package/lib/assets/docs/article/getting-start-tdd/rust/03-obvious-implementation-and-refactoring.md +233 -0
  317. package/lib/assets/docs/article/getting-start-tdd/rust/04-version-control-and-conventional-commits.md +92 -0
  318. package/lib/assets/docs/article/getting-start-tdd/rust/05-package-management-and-static-analysis.md +212 -0
  319. package/lib/assets/docs/article/getting-start-tdd/rust/06-task-runner-and-ci-cd.md +164 -0
  320. package/lib/assets/docs/article/getting-start-tdd/rust/07-encapsulation-and-polymorphism.md +142 -0
  321. package/lib/assets/docs/article/getting-start-tdd/rust/08-design-patterns.md +145 -0
  322. package/lib/assets/docs/article/getting-start-tdd/rust/09-solid-principles-and-module-design.md +110 -0
  323. package/lib/assets/docs/article/getting-start-tdd/rust/10-higher-order-functions-and-composition.md +94 -0
  324. package/lib/assets/docs/article/getting-start-tdd/rust/11-immutable-data-and-pipeline.md +105 -0
  325. package/lib/assets/docs/article/getting-start-tdd/rust/12-error-handling-and-type-safety.md +112 -0
  326. package/lib/assets/docs/article/getting-start-tdd/rust/index.md +83 -0
  327. package/lib/assets/docs/article/getting-start-tdd/scala/01-todo-list-and-first-test.md +111 -0
  328. package/lib/assets/docs/article/getting-start-tdd/scala/02-fake-it-and-triangulation.md +107 -0
  329. package/lib/assets/docs/article/getting-start-tdd/scala/03-obvious-implementation-and-refactoring.md +99 -0
  330. package/lib/assets/docs/article/getting-start-tdd/scala/04-version-control-and-conventional-commits.md +123 -0
  331. package/lib/assets/docs/article/getting-start-tdd/scala/05-package-management-and-static-analysis.md +196 -0
  332. package/lib/assets/docs/article/getting-start-tdd/scala/06-task-runner-and-ci-cd.md +186 -0
  333. package/lib/assets/docs/article/getting-start-tdd/scala/07-case-classes-and-traits.md +139 -0
  334. package/lib/assets/docs/article/getting-start-tdd/scala/08-pattern-matching-and-sealed-traits.md +106 -0
  335. package/lib/assets/docs/article/getting-start-tdd/scala/09-packages-and-module-design.md +75 -0
  336. package/lib/assets/docs/article/getting-start-tdd/scala/10-higher-order-functions-and-composition.md +104 -0
  337. package/lib/assets/docs/article/getting-start-tdd/scala/11-collections-and-lazy-evaluation.md +94 -0
  338. package/lib/assets/docs/article/getting-start-tdd/scala/12-error-handling-and-type-safety.md +92 -0
  339. package/lib/assets/docs/article/getting-start-tdd/scala/index.md +65 -0
  340. package/lib/assets/docs/article/grokking-concurrency/all/index.md +404 -0
  341. package/lib/assets/docs/article/grokking-concurrency/all/part-1-ch02-sequential.md +554 -0
  342. package/lib/assets/docs/article/grokking-concurrency/all/part-2-ch04-05-threads.md +469 -0
  343. package/lib/assets/docs/article/grokking-concurrency/all/part-3-ch06-multitasking.md +520 -0
  344. package/lib/assets/docs/article/grokking-concurrency/all/part-4-ch07-parallel-patterns.md +420 -0
  345. package/lib/assets/docs/article/grokking-concurrency/all/part-5-ch08-09-synchronization.md +510 -0
  346. package/lib/assets/docs/article/grokking-concurrency/all/part-6-ch10-11-nonblocking-io.md +435 -0
  347. package/lib/assets/docs/article/grokking-concurrency/all/part-7-ch12-async.md +465 -0
  348. package/lib/assets/docs/article/grokking-concurrency/all/part-8-ch13-mapreduce.md +377 -0
  349. package/lib/assets/docs/article/grokking-concurrency/clojure/index.md +116 -0
  350. package/lib/assets/docs/article/grokking-concurrency/clojure/part-1.md +108 -0
  351. package/lib/assets/docs/article/grokking-concurrency/clojure/part-2.md +101 -0
  352. package/lib/assets/docs/article/grokking-concurrency/clojure/part-3.md +122 -0
  353. package/lib/assets/docs/article/grokking-concurrency/clojure/part-4.md +123 -0
  354. package/lib/assets/docs/article/grokking-concurrency/clojure/part-5.md +118 -0
  355. package/lib/assets/docs/article/grokking-concurrency/clojure/part-6.md +89 -0
  356. package/lib/assets/docs/article/grokking-concurrency/clojure/part-7.md +100 -0
  357. package/lib/assets/docs/article/grokking-concurrency/clojure/part-8.md +120 -0
  358. package/lib/assets/docs/article/grokking-concurrency/csharp/index.md +101 -0
  359. package/lib/assets/docs/article/grokking-concurrency/csharp/part-1.md +97 -0
  360. package/lib/assets/docs/article/grokking-concurrency/csharp/part-2.md +123 -0
  361. package/lib/assets/docs/article/grokking-concurrency/csharp/part-3.md +101 -0
  362. package/lib/assets/docs/article/grokking-concurrency/csharp/part-4.md +112 -0
  363. package/lib/assets/docs/article/grokking-concurrency/csharp/part-5.md +99 -0
  364. package/lib/assets/docs/article/grokking-concurrency/csharp/part-6.md +61 -0
  365. package/lib/assets/docs/article/grokking-concurrency/csharp/part-7.md +84 -0
  366. package/lib/assets/docs/article/grokking-concurrency/csharp/part-8.md +92 -0
  367. package/lib/assets/docs/article/grokking-concurrency/fsharp/index.md +65 -0
  368. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-1.md +80 -0
  369. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-2.md +103 -0
  370. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-3.md +94 -0
  371. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-4.md +110 -0
  372. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-5.md +104 -0
  373. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-6.md +93 -0
  374. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-7.md +121 -0
  375. package/lib/assets/docs/article/grokking-concurrency/fsharp/part-8.md +107 -0
  376. package/lib/assets/docs/article/grokking-concurrency/haskell/index.md +248 -0
  377. package/lib/assets/docs/article/grokking-concurrency/haskell/part-1.md +96 -0
  378. package/lib/assets/docs/article/grokking-concurrency/haskell/part-2.md +96 -0
  379. package/lib/assets/docs/article/grokking-concurrency/haskell/part-3.md +91 -0
  380. package/lib/assets/docs/article/grokking-concurrency/haskell/part-4.md +106 -0
  381. package/lib/assets/docs/article/grokking-concurrency/haskell/part-5.md +99 -0
  382. package/lib/assets/docs/article/grokking-concurrency/haskell/part-6.md +95 -0
  383. package/lib/assets/docs/article/grokking-concurrency/haskell/part-7.md +111 -0
  384. package/lib/assets/docs/article/grokking-concurrency/haskell/part-8.md +118 -0
  385. package/lib/assets/docs/article/grokking-concurrency/index.md +66 -0
  386. package/lib/assets/docs/article/grokking-concurrency/java/index.md +102 -0
  387. package/lib/assets/docs/article/grokking-concurrency/java/part-1.md +308 -0
  388. package/lib/assets/docs/article/grokking-concurrency/java/part-2.md +334 -0
  389. package/lib/assets/docs/article/grokking-concurrency/java/part-3.md +221 -0
  390. package/lib/assets/docs/article/grokking-concurrency/java/part-4.md +213 -0
  391. package/lib/assets/docs/article/grokking-concurrency/java/part-5.md +112 -0
  392. package/lib/assets/docs/article/grokking-concurrency/java/part-6.md +69 -0
  393. package/lib/assets/docs/article/grokking-concurrency/java/part-7.md +101 -0
  394. package/lib/assets/docs/article/grokking-concurrency/java/part-8.md +101 -0
  395. package/lib/assets/docs/article/grokking-concurrency/python/index.md +313 -0
  396. package/lib/assets/docs/article/grokking-concurrency/python/part-1.md +239 -0
  397. package/lib/assets/docs/article/grokking-concurrency/python/part-2.md +418 -0
  398. package/lib/assets/docs/article/grokking-concurrency/python/part-3.md +227 -0
  399. package/lib/assets/docs/article/grokking-concurrency/python/part-4.md +299 -0
  400. package/lib/assets/docs/article/grokking-concurrency/python/part-5.md +315 -0
  401. package/lib/assets/docs/article/grokking-concurrency/python/part-6.md +297 -0
  402. package/lib/assets/docs/article/grokking-concurrency/python/part-7.md +314 -0
  403. package/lib/assets/docs/article/grokking-concurrency/python/part-8.md +360 -0
  404. package/lib/assets/docs/article/grokking-concurrency/rust/index.md +270 -0
  405. package/lib/assets/docs/article/grokking-concurrency/rust/part-1.md +108 -0
  406. package/lib/assets/docs/article/grokking-concurrency/rust/part-2.md +120 -0
  407. package/lib/assets/docs/article/grokking-concurrency/rust/part-3.md +126 -0
  408. package/lib/assets/docs/article/grokking-concurrency/rust/part-4.md +175 -0
  409. package/lib/assets/docs/article/grokking-concurrency/rust/part-5.md +158 -0
  410. package/lib/assets/docs/article/grokking-concurrency/rust/part-6.md +94 -0
  411. package/lib/assets/docs/article/grokking-concurrency/rust/part-7.md +133 -0
  412. package/lib/assets/docs/article/grokking-concurrency/rust/part-8.md +155 -0
  413. package/lib/assets/docs/article/grokking-concurrency/scala/index.md +69 -0
  414. package/lib/assets/docs/article/grokking-concurrency/scala/part-1.md +78 -0
  415. package/lib/assets/docs/article/grokking-concurrency/scala/part-2.md +112 -0
  416. package/lib/assets/docs/article/grokking-concurrency/scala/part-3.md +93 -0
  417. package/lib/assets/docs/article/grokking-concurrency/scala/part-4.md +110 -0
  418. package/lib/assets/docs/article/grokking-concurrency/scala/part-5.md +119 -0
  419. package/lib/assets/docs/article/grokking-concurrency/scala/part-6.md +83 -0
  420. package/lib/assets/docs/article/grokking-concurrency/scala/part-7.md +131 -0
  421. package/lib/assets/docs/article/grokking-concurrency/scala/part-8.md +129 -0
  422. package/lib/assets/docs/article/grokkingfp/all/index.md +368 -0
  423. package/lib/assets/docs/article/grokkingfp/all/part-1-ch01-fp-introduction.md +530 -0
  424. package/lib/assets/docs/article/grokkingfp/all/part-1-ch02-pure-functions.md +923 -0
  425. package/lib/assets/docs/article/grokkingfp/all/part-2-ch03-immutable-data.md +1122 -0
  426. package/lib/assets/docs/article/grokkingfp/all/part-2-ch04-higher-order-functions.md +1104 -0
  427. package/lib/assets/docs/article/grokkingfp/all/part-2-ch05-flatmap.md +1026 -0
  428. package/lib/assets/docs/article/grokkingfp/all/part-3-ch06-option.md +777 -0
  429. package/lib/assets/docs/article/grokkingfp/all/part-3-ch07-either-adt.md +871 -0
  430. package/lib/assets/docs/article/grokkingfp/all/part-4-ch08-io-monad.md +972 -0
  431. package/lib/assets/docs/article/grokkingfp/all/part-4-ch09-streams.md +926 -0
  432. package/lib/assets/docs/article/grokkingfp/all/part-5-ch10-concurrency.md +870 -0
  433. package/lib/assets/docs/article/grokkingfp/all/part-6-ch11-application.md +715 -0
  434. package/lib/assets/docs/article/grokkingfp/all/part-6-ch12-testing.md +626 -0
  435. package/lib/assets/docs/article/grokkingfp/all/writing-plan.md +696 -0
  436. package/lib/assets/docs/article/grokkingfp/clojure/index.md +276 -0
  437. package/lib/assets/docs/article/grokkingfp/clojure/part-1.md +667 -0
  438. package/lib/assets/docs/article/grokkingfp/clojure/part-2.md +643 -0
  439. package/lib/assets/docs/article/grokkingfp/clojure/part-3.md +620 -0
  440. package/lib/assets/docs/article/grokkingfp/clojure/part-4.md +697 -0
  441. package/lib/assets/docs/article/grokkingfp/clojure/part-5.md +751 -0
  442. package/lib/assets/docs/article/grokkingfp/clojure/part-6.md +721 -0
  443. package/lib/assets/docs/article/grokkingfp/csharp/index.md +246 -0
  444. package/lib/assets/docs/article/grokkingfp/csharp/part-1.md +811 -0
  445. package/lib/assets/docs/article/grokkingfp/csharp/part-2.md +971 -0
  446. package/lib/assets/docs/article/grokkingfp/csharp/part-3.md +981 -0
  447. package/lib/assets/docs/article/grokkingfp/csharp/part-4.md +949 -0
  448. package/lib/assets/docs/article/grokkingfp/csharp/part-5.md +947 -0
  449. package/lib/assets/docs/article/grokkingfp/csharp/part-6.md +739 -0
  450. package/lib/assets/docs/article/grokkingfp/elixir/index.md +203 -0
  451. package/lib/assets/docs/article/grokkingfp/elixir/part-1.md +710 -0
  452. package/lib/assets/docs/article/grokkingfp/elixir/part-2.md +838 -0
  453. package/lib/assets/docs/article/grokkingfp/elixir/part-3.md +985 -0
  454. package/lib/assets/docs/article/grokkingfp/elixir/part-4.md +974 -0
  455. package/lib/assets/docs/article/grokkingfp/elixir/part-5.md +1284 -0
  456. package/lib/assets/docs/article/grokkingfp/elixir/part-6.md +1047 -0
  457. package/lib/assets/docs/article/grokkingfp/fsharp/index.md +210 -0
  458. package/lib/assets/docs/article/grokkingfp/fsharp/part-1.md +714 -0
  459. package/lib/assets/docs/article/grokkingfp/fsharp/part-2.md +961 -0
  460. package/lib/assets/docs/article/grokkingfp/fsharp/part-3.md +972 -0
  461. package/lib/assets/docs/article/grokkingfp/fsharp/part-4.md +832 -0
  462. package/lib/assets/docs/article/grokkingfp/fsharp/part-5.md +911 -0
  463. package/lib/assets/docs/article/grokkingfp/fsharp/part-6.md +920 -0
  464. package/lib/assets/docs/article/grokkingfp/haskell/index.md +234 -0
  465. package/lib/assets/docs/article/grokkingfp/haskell/part-1.md +591 -0
  466. package/lib/assets/docs/article/grokkingfp/haskell/part-2.md +866 -0
  467. package/lib/assets/docs/article/grokkingfp/haskell/part-3.md +915 -0
  468. package/lib/assets/docs/article/grokkingfp/haskell/part-4.md +876 -0
  469. package/lib/assets/docs/article/grokkingfp/haskell/part-5.md +845 -0
  470. package/lib/assets/docs/article/grokkingfp/haskell/part-6.md +842 -0
  471. package/lib/assets/docs/article/grokkingfp/index.md +143 -0
  472. package/lib/assets/docs/article/grokkingfp/java/index.md +211 -0
  473. package/lib/assets/docs/article/grokkingfp/java/part-1.md +646 -0
  474. package/lib/assets/docs/article/grokkingfp/java/part-2.md +667 -0
  475. package/lib/assets/docs/article/grokkingfp/java/part-3.md +672 -0
  476. package/lib/assets/docs/article/grokkingfp/java/part-4.md +771 -0
  477. package/lib/assets/docs/article/grokkingfp/java/part-5.md +959 -0
  478. package/lib/assets/docs/article/grokkingfp/java/part-6.md +1324 -0
  479. package/lib/assets/docs/article/grokkingfp/python/index.md +258 -0
  480. package/lib/assets/docs/article/grokkingfp/python/part-1.md +437 -0
  481. package/lib/assets/docs/article/grokkingfp/python/part-2.md +958 -0
  482. package/lib/assets/docs/article/grokkingfp/python/part-3.md +1004 -0
  483. package/lib/assets/docs/article/grokkingfp/python/part-4.md +765 -0
  484. package/lib/assets/docs/article/grokkingfp/python/part-5.md +747 -0
  485. package/lib/assets/docs/article/grokkingfp/python/part-6.md +861 -0
  486. package/lib/assets/docs/article/grokkingfp/ruby/index.md +330 -0
  487. package/lib/assets/docs/article/grokkingfp/ruby/part-1.md +753 -0
  488. package/lib/assets/docs/article/grokkingfp/ruby/part-2.md +938 -0
  489. package/lib/assets/docs/article/grokkingfp/ruby/part-3.md +946 -0
  490. package/lib/assets/docs/article/grokkingfp/ruby/part-4.md +921 -0
  491. package/lib/assets/docs/article/grokkingfp/ruby/part-5.md +908 -0
  492. package/lib/assets/docs/article/grokkingfp/ruby/part-6.md +1410 -0
  493. package/lib/assets/docs/article/grokkingfp/rust/index.md +242 -0
  494. package/lib/assets/docs/article/grokkingfp/rust/part-1.md +634 -0
  495. package/lib/assets/docs/article/grokkingfp/rust/part-2.md +1060 -0
  496. package/lib/assets/docs/article/grokkingfp/rust/part-3.md +994 -0
  497. package/lib/assets/docs/article/grokkingfp/rust/part-4.md +571 -0
  498. package/lib/assets/docs/article/grokkingfp/rust/part-5.md +705 -0
  499. package/lib/assets/docs/article/grokkingfp/rust/part-6.md +508 -0
  500. package/lib/assets/docs/article/grokkingfp/scala/index.md +171 -0
  501. package/lib/assets/docs/article/grokkingfp/scala/part-1.md +541 -0
  502. package/lib/assets/docs/article/grokkingfp/scala/part-2.md +946 -0
  503. package/lib/assets/docs/article/grokkingfp/scala/part-3.md +917 -0
  504. package/lib/assets/docs/article/grokkingfp/scala/part-4.md +742 -0
  505. package/lib/assets/docs/article/grokkingfp/scala/part-5.md +722 -0
  506. package/lib/assets/docs/article/grokkingfp/scala/part-6.md +865 -0
  507. package/lib/assets/docs/article/grokkingfp/typescript/index.md +273 -0
  508. package/lib/assets/docs/article/grokkingfp/typescript/part-1.md +559 -0
  509. package/lib/assets/docs/article/grokkingfp/typescript/part-2.md +1129 -0
  510. package/lib/assets/docs/article/grokkingfp/typescript/part-3.md +842 -0
  511. package/lib/assets/docs/article/grokkingfp/typescript/part-4.md +1085 -0
  512. package/lib/assets/docs/article/grokkingfp/typescript/part-5.md +717 -0
  513. package/lib/assets/docs/article/grokkingfp/typescript/part-6.md +980 -0
  514. package/lib/assets/docs/article/index.md +36 -0
  515. package/lib/assets/docs/design/index.md +39 -27
  516. package/lib/assets/docs/development/index.md +11 -1
  517. package/lib/assets/docs/index.md +33 -106
  518. package/lib/assets/docs/operation/index.md +16 -6
  519. package/lib/assets/docs/reference/index.md +5 -4
  520. package/lib/assets/docs/requirements/index.md +13 -6
  521. package/lib/assets/docs/strategy/index.md +11 -4
  522. package/lib/assets/docs/template/index.md +9 -5
  523. package/lib/assets/mkdocs.yml +29 -17
  524. package/package.json +1 -1
@@ -0,0 +1,212 @@
1
+ # 第 5 章: パッケージ管理と静的解析
2
+
3
+ ## 5.1 はじめに
4
+
5
+ 前章では Conventional Commits によるコミットメッセージの規約を学びました。この章では、**パッケージ管理** と **静的コード解析** を導入し、コードの品質を自動でチェックできるようにします。
6
+
7
+ ## 5.2 Cargo によるパッケージ管理
8
+
9
+ ### Cargo とは
10
+
11
+ > Cargo は Rust のパッケージマネージャ兼ビルドシステムです。プロジェクトの作成、ビルド、テスト、依存関係の管理、パッケージの公開まで、Rust 開発のあらゆる面をサポートします。
12
+
13
+ Java の Gradle、Node の npm(package.json)、Python の uv、Ruby の Bundler(Gemfile)、Go の Go Modules に相当するのが Cargo です。
14
+
15
+ ### Cargo.toml の構成
16
+
17
+ 本プロジェクトの `Cargo.toml` は以下のようになっています。
18
+
19
+ ```toml
20
+ [package]
21
+ name = "fizzbuzz"
22
+ version = "0.1.0"
23
+ edition = "2021"
24
+ ```
25
+
26
+ Rust の標準ライブラリ(`std::io`、`std::fmt` など)はインポートの `use` 宣言だけで利用でき、`Cargo.toml` への追加は不要です。
27
+
28
+ ### 主要なコマンド
29
+
30
+ | コマンド | 説明 |
31
+ |---------|------|
32
+ | `cargo new <name>` | 新しいプロジェクトを作成 |
33
+ | `cargo build` | プロジェクトをビルド |
34
+ | `cargo test` | テストを実行 |
35
+ | `cargo run` | バイナリを実行 |
36
+ | `cargo add <crate>` | 依存クレートを追加 |
37
+ | `cargo update` | 依存クレートを更新 |
38
+
39
+ ### Cargo の特徴
40
+
41
+ - **`Cargo.lock` による再現性** — 依存クレートのバージョンを固定し、チーム全員が同じ環境で開発できる
42
+ - **ワークスペース** — 複数クレートを 1 つのプロジェクトで管理
43
+ - **`target/` ディレクトリ** — Node の `node_modules/`、Python の `.venv/` に相当(`.gitignore` に追加)
44
+
45
+ ## 5.3 Clippy による静的解析
46
+
47
+ ### Clippy とは
48
+
49
+ > Clippy は Rust の公式リンターです。コードの品質を向上させるための数百のルール(lint)を提供し、一般的なミスやアンチパターンを検出します。
50
+
51
+ Ruby の RuboCop、Java の Checkstyle + PMD、TypeScript の ESLint、Python の Ruff、Go の golangci-lint に相当するツールです。
52
+
53
+ ### 実行してみる
54
+
55
+ ```bash
56
+ $ cargo clippy -- -D warnings
57
+ ```
58
+
59
+ `-D warnings` オプションを付けることで、警告をエラーとして扱い、CI で確実にチェックできます。
60
+
61
+ ### Clippy のカテゴリ
62
+
63
+ | カテゴリ | 説明 |
64
+ |---------|------|
65
+ | `clippy::correctness` | バグになりうるコード(デフォルト有効) |
66
+ | `clippy::style` | 慣用的でないコードスタイル |
67
+ | `clippy::complexity` | 不必要に複雑なコード |
68
+ | `clippy::perf` | パフォーマンスに影響するコード |
69
+ | `clippy::pedantic` | より厳密なチェック(オプトイン) |
70
+
71
+ ## 5.4 rustfmt によるコードフォーマット
72
+
73
+ ### rustfmt とは
74
+
75
+ > rustfmt は Rust の公式コードフォーマッターです。コードスタイルを統一し、チーム内のスタイル議論を排除します。
76
+
77
+ Go の gofmt、Python の Ruff format、TypeScript の Prettier、Ruby の RuboCop --auto-correct に相当します。
78
+
79
+ ### 実行してみる
80
+
81
+ ```bash
82
+ # フォーマットチェック(CI 向け)
83
+ $ cargo fmt --check
84
+
85
+ # 自動フォーマット
86
+ $ cargo fmt
87
+ ```
88
+
89
+ ### コードスタイル例
90
+
91
+ rustfmt はデフォルトで以下のスタイルを適用します。
92
+
93
+ ```rust
94
+ // Before(手動フォーマット)
95
+ fn generate(number:i32)->String{
96
+ match(number%3,number%5){(0,0)=>"FizzBuzz".to_string(),(0,_)=>"Fizz".to_string(),(_, 0)=>"Buzz".to_string(),_=>number.to_string(),}
97
+ }
98
+
99
+ // After(rustfmt 適用後)
100
+ fn generate(number: i32) -> String {
101
+ match (number % 3, number % 5) {
102
+ (0, 0) => "FizzBuzz".to_string(),
103
+ (0, _) => "Fizz".to_string(),
104
+ (_, 0) => "Buzz".to_string(),
105
+ _ => number.to_string(),
106
+ }
107
+ }
108
+ ```
109
+
110
+ ## 5.5 Clippy によるコード複雑度チェック
111
+
112
+ ### 認知的複雑度(Cognitive Complexity)
113
+
114
+ Clippy には `cognitive_complexity` lint が内蔵されており、関数の複雑度を計測できます。
115
+
116
+ > 認知的複雑度とは、コードがどれだけ理解しにくいかを数値化した指標です。循環的複雑度(Cyclomatic Complexity)と異なり、ネストの深さやフロー制御の読みにくさも考慮します。
117
+
118
+ | 複雑度の範囲 | 意味 |
119
+ |-------------|------|
120
+ | 1〜7 | 低複雑度: 管理しやすく、問題なし |
121
+ | 8〜15 | 中程度の複雑度: リファクタリングを検討 |
122
+ | 16〜25 | 高複雑度: リファクタリングが強く推奨される |
123
+ | 26 以上 | 非常に高い複雑度: 関数を分割する必要がある |
124
+
125
+ ### clippy.toml による閾値設定
126
+
127
+ プロジェクトルートに `clippy.toml` を作成し、閾値を設定します。
128
+
129
+ ```toml
130
+ cognitive-complexity-threshold = 7
131
+ ```
132
+
133
+ 他言語の複雑度チェック(PHP の PHPMD `reportLevel: 7`、Python の Ruff `max-complexity = 7`、TypeScript の ESLint `complexity: ["error", { max: 7 }]`)と同じ基準値 **7** を設定します。
134
+
135
+ ### lib.rs での有効化
136
+
137
+ `lib.rs` にアトリビュートを追加して、プロジェクト全体で複雑度チェックを有効化します。
138
+
139
+ ```rust
140
+ #![warn(clippy::cognitive_complexity)]
141
+
142
+ pub mod application;
143
+ pub mod domain;
144
+ pub mod fizz_buzz;
145
+ ```
146
+
147
+ ### 実行してみる
148
+
149
+ ```bash
150
+ # 複雑度チェック(警告をエラーとして扱う)
151
+ $ cargo clippy -- -D clippy::cognitive_complexity
152
+ ```
153
+
154
+ 現在の FizzBuzz 実装では、各メソッドが短く単純なため、閾値 7 を超える関数はありません。
155
+
156
+ ### justfile への追加
157
+
158
+ ```just
159
+ # 複雑度チェック
160
+ complexity:
161
+ cargo clippy -- -D clippy::cognitive_complexity
162
+
163
+ # 全チェック実行(フォーマット → 静的解析 → 複雑度 → テスト)
164
+ check: fmt-check lint complexity test
165
+ ```
166
+
167
+ `just complexity` で複雑度チェックを単独実行、`just check` で全品質チェックをまとめて実行できます。
168
+
169
+ ### 他言語との比較
170
+
171
+ | 言語 | 複雑度チェックツール | 設定 |
172
+ |------|---------------------|------|
173
+ | Rust | Clippy(cognitive_complexity) | `clippy.toml: cognitive-complexity-threshold = 7` |
174
+ | PHP | PHPMD | `reportLevel: 7` |
175
+ | Java | PMD | `CyclomaticComplexity` |
176
+ | Python | Ruff(McCabe) | `max-complexity = 7` |
177
+ | TypeScript | ESLint | `complexity: ["error", { max: 7 }]` |
178
+ | Ruby | RuboCop | `Metrics/CyclomaticComplexity` |
179
+ | Go | golangci-lint(gocyclo) | デフォルト設定 |
180
+
181
+ Rust の Clippy は PHP の PHPMD や Go の golangci-lint と異なり、**標準ツールチェーンに内蔵**されているため、追加インストールが不要です。
182
+
183
+ ## 5.6 コードカバレッジ
184
+
185
+ ### cargo-tarpaulin
186
+
187
+ Rust のカバレッジツールとして `cargo-tarpaulin` があります。
188
+
189
+ ```bash
190
+ # インストール(任意)
191
+ $ cargo install cargo-tarpaulin
192
+
193
+ # カバレッジ計測
194
+ $ cargo tarpaulin --out stdout
195
+ ```
196
+
197
+ !!! note "カバレッジの代替手段"
198
+ cargo-tarpaulin は Linux 環境向けです。macOS では `cargo llvm-cov` が利用できます。Nix 環境ではインストールが必要な場合があるため、テスト網羅率で代替することも可能です。
199
+
200
+ ## 5.7 まとめ
201
+
202
+ この章では以下を導入しました。
203
+
204
+ | ツール | 役割 | 他言語の対応ツール |
205
+ |--------|------|-------------------|
206
+ | Cargo | パッケージ管理・ビルド | npm, Bundler, Go Modules, Gradle |
207
+ | Clippy | 静的解析(リンター) | ESLint, RuboCop, golangci-lint, Ruff |
208
+ | Clippy(cognitive_complexity) | コード複雑度チェック | PHPMD, PMD, Ruff McCabe, ESLint complexity |
209
+ | rustfmt | コードフォーマット | Prettier, gofmt, RuboCop --auto-correct |
210
+ | cargo-tarpaulin | カバレッジ計測 | c8, SimpleCov, go test -cover |
211
+
212
+ 次章では、これらのツールを **タスクランナー**(just)でまとめて実行できるようにし、**CI/CD** パイプラインを構築します。
@@ -0,0 +1,164 @@
1
+ # 第 6 章: タスクランナーと CI/CD
2
+
3
+ ## 6.1 はじめに
4
+
5
+ 前章では静的コード解析ツールとコードフォーマッターを導入しました。テストの実行、静的解析、フォーマットチェックと、様々なコマンドを使えるようになりましたが、毎回それぞれのコマンドを覚えて実行するのは面倒です。
6
+
7
+ この章では **タスクランナー** を使ってこれらのタスクをまとめて実行できるようにし、さらに **CI/CD** パイプラインを構築します。
8
+
9
+ ## 6.2 just によるタスク管理
10
+
11
+ ### just とは
12
+
13
+ > [just](https://github.com/casey/just) は Rust 製のコマンドランナーです。Makefile に似た構文でタスク(レシピ)を定義し、`just <レシピ名>` で実行できます。Makefile と異なりファイルのビルドではなく **コマンド実行に特化** しており、タブ/スペースの混在を許容し、エラーメッセージもわかりやすいのが特徴です。
14
+
15
+ Ruby の Rake、Java の Gradle、Node の npm scripts、Python の tox、Go プロジェクトでの Makefile に相当します。Rust エコシステムでは Rust 製ということもあり、just がタスクランナーとして広く採用されています。
16
+
17
+ ### justfile の定義
18
+
19
+ ```just
20
+ # Rust プロジェクトのタスクランナー
21
+
22
+ # テスト実行
23
+ test:
24
+ cargo test
25
+
26
+ # Clippy による静的解析
27
+ lint:
28
+ cargo clippy -- -D warnings
29
+
30
+ # 複雑度チェック
31
+ complexity:
32
+ cargo clippy -- -D clippy::cognitive_complexity
33
+
34
+ # コードフォーマット
35
+ fmt:
36
+ cargo fmt
37
+
38
+ # フォーマットチェック
39
+ fmt-check:
40
+ cargo fmt --check
41
+
42
+ # 全チェック実行(フォーマット → 静的解析 → 複雑度 → テスト)
43
+ check: fmt-check lint complexity test
44
+
45
+ # リリースビルド
46
+ build:
47
+ cargo build --release
48
+
49
+ # 実行
50
+ run:
51
+ cargo run
52
+
53
+ # ビルド成果物の削除
54
+ clean:
55
+ cargo clean
56
+ ```
57
+
58
+ ### 主要なタスク
59
+
60
+ | タスク | コマンド | 説明 |
61
+ |--------|---------|------|
62
+ | `just test` | `cargo test` | テスト実行 |
63
+ | `just lint` | `cargo clippy -- -D warnings` | Clippy による静的解析 |
64
+ | `just complexity` | `cargo clippy -- -D clippy::cognitive_complexity` | 複雑度チェック |
65
+ | `just fmt` | `cargo fmt` | コードフォーマット |
66
+ | `just fmt-check` | `cargo fmt --check` | フォーマットチェック |
67
+ | `just check` | fmt-check → lint → complexity → test | 全チェック実行 |
68
+ | `just build` | `cargo build --release` | リリースビルド |
69
+ | `just clean` | `cargo clean` | ビルド成果物の削除 |
70
+
71
+ ### 実行例
72
+
73
+ ```bash
74
+ # 全チェック実行
75
+ $ just check
76
+ cargo fmt --check
77
+ cargo clippy -- -D warnings
78
+ cargo clippy -- -D clippy::cognitive_complexity
79
+ cargo test
80
+ test result: ok. 12 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
81
+ ```
82
+
83
+ ## 6.3 GitHub Actions による CI/CD
84
+
85
+ ### CI/CD とは
86
+
87
+ > CI/CD(Continuous Integration / Continuous Delivery)は、コードの変更を自動的にビルド、テスト、デプロイするプラクティスです。
88
+
89
+ ### ワークフローの定義
90
+
91
+ `.github/workflows/rust-ci.yml` にワークフローを定義します。
92
+
93
+ ```yaml
94
+ name: Rust CI
95
+
96
+ on:
97
+ push:
98
+ branches: [main, develop]
99
+ paths:
100
+ - "apps/rust/**"
101
+ - ".github/workflows/rust-ci.yml"
102
+ pull_request:
103
+ branches: [main]
104
+ paths:
105
+ - "apps/rust/**"
106
+
107
+ permissions:
108
+ contents: read
109
+
110
+ jobs:
111
+ test:
112
+ runs-on: ubuntu-latest
113
+
114
+ steps:
115
+ - name: Checkout the repository
116
+ uses: actions/checkout@v4
117
+
118
+ - name: Install Nix
119
+ uses: cachix/install-nix-action@v30
120
+ with:
121
+ nix_path: nixpkgs=channel:nixos-unstable
122
+
123
+ - name: Cache Nix store
124
+ uses: actions/cache@v4
125
+ with:
126
+ path: /tmp/nix-cache
127
+ key: ${{ runner.os }}-nix-rust-${{ hashFiles('flake.lock', 'ops/nix/environments/rust/shell.nix') }}
128
+ restore-keys: |
129
+ ${{ runner.os }}-nix-rust-
130
+
131
+ - name: Run all checks
132
+ run: nix develop .#rust --command bash -c "cd apps/rust && just check"
133
+ ```
134
+
135
+ ### CI パイプラインの流れ
136
+
137
+ ```
138
+ Push / PR → just check(fmt-check → lint → complexity → test)→ 結果通知
139
+ ```
140
+
141
+ ## 6.4 他言語との比較
142
+
143
+ | 言語 | タスクランナー | CI ツール | テスト | 静的解析 | フォーマット |
144
+ |------|-------------|----------|--------|---------|------------|
145
+ | Rust | just | GitHub Actions | cargo test | Clippy | rustfmt |
146
+ | Go | Makefile | GitHub Actions | go test | golangci-lint | gofmt |
147
+ | Java | Gradle | GitHub Actions | JUnit | Checkstyle + PMD | Checkstyle |
148
+ | Python | tox | GitHub Actions | pytest | Ruff | Ruff |
149
+ | Node | npm scripts | GitHub Actions | Vitest | ESLint | Prettier |
150
+ | Ruby | Rake | GitHub Actions | Minitest | RuboCop | RuboCop |
151
+ | PHP | Composer scripts | GitHub Actions | PHPUnit | PHP_CodeSniffer + PHPStan | phpcbf |
152
+
153
+ ## 6.5 まとめ
154
+
155
+ この章では以下を実現しました。
156
+
157
+ | 項目 | 内容 |
158
+ |------|------|
159
+ | justfile | test / lint / complexity / fmt / check タスクを定義 |
160
+ | `just check` | フォーマットチェック → Clippy → 複雑度 → テストを一括実行 |
161
+ | GitHub Actions | push / PR 時に `just check` で CI を実行 |
162
+ | Nix 統合 | CI でも `nix develop .#rust` を使用し環境を統一 |
163
+
164
+ 第 2 部を通じて、ソフトウェア開発の三種の神器(バージョン管理、テスティング、自動化)を Rust の開発環境に整備しました。just は Rust 製のコマンドランナーであり、Rust エコシステムとの親和性が高く、Makefile よりもシンプルにタスクを定義できます。次の第 3 部では、オブジェクト指向設計(struct、trait、デザインパターン)に進みます。
@@ -0,0 +1,142 @@
1
+ # 第 7 章: カプセル化とポリモーフィズム
2
+
3
+ ## 7.1 はじめに
4
+
5
+ 第 1 部では手続き型の FizzBuzz プログラムを TDD で構築しました。この章からは **オブジェクト指向プログラミング** の要素を Rust で実現していきます。まず **カプセル化** と **ポリモーフィズム** を導入し、手続き型コードを構造化された設計に進化させます。
6
+
7
+ ## 7.2 手続き型コードの課題
8
+
9
+ 第 1 部で作成した `generate` 関数は手続き型プログラミングの典型例です。
10
+
11
+ ```rust
12
+ pub fn generate(number: i32) -> String {
13
+ match (number % 3, number % 5) {
14
+ (0, 0) => "FizzBuzz".to_string(),
15
+ (0, _) => "Fizz".to_string(),
16
+ (_, 0) => "Buzz".to_string(),
17
+ _ => number.to_string(),
18
+ }
19
+ }
20
+ ```
21
+
22
+ この設計の課題は、新しい FizzBuzz タイプ(数値のみ返す、FizzBuzz のみ返す等)を追加する場合に、既存の関数を直接修正する必要があることです。
23
+
24
+ ## 7.3 カプセル化 — 値オブジェクトの導入
25
+
26
+ ### FizzBuzzValue 構造体
27
+
28
+ 数値と FizzBuzz の結果をまとめた値オブジェクトを作成します。
29
+
30
+ ```rust
31
+ #[derive(Debug, Clone, PartialEq)]
32
+ pub struct FizzBuzzValue {
33
+ number: i32,
34
+ value: String,
35
+ }
36
+
37
+ impl FizzBuzzValue {
38
+ pub fn new(number: i32, value: String) -> Self {
39
+ Self { number, value }
40
+ }
41
+
42
+ pub fn number(&self) -> i32 {
43
+ self.number
44
+ }
45
+
46
+ pub fn value(&self) -> &str {
47
+ &self.value
48
+ }
49
+ }
50
+
51
+ impl std::fmt::Display for FizzBuzzValue {
52
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
53
+ write!(f, "{}", self.value)
54
+ }
55
+ }
56
+ ```
57
+
58
+ Rust ではフィールドをデフォルトで非公開(private)にし、メソッド経由でアクセスする設計が標準です。`#[derive(Debug, Clone, PartialEq)]` は Go の手動実装や Java の `equals`/`hashCode` に相当する機能を自動生成します。
59
+
60
+ ## 7.4 ポリモーフィズム — トレイトの導入
61
+
62
+ ### FizzBuzzType トレイト
63
+
64
+ FizzBuzz のタイプを抽象化するトレイトを定義します。
65
+
66
+ ```rust
67
+ pub trait FizzBuzzType {
68
+ fn generate(&self, number: i32) -> FizzBuzzValue;
69
+ }
70
+ ```
71
+
72
+ ### 3 つの実装
73
+
74
+ ```rust
75
+ // タイプ 1: 通常の FizzBuzz
76
+ pub struct FizzBuzzType01;
77
+ impl FizzBuzzType for FizzBuzzType01 {
78
+ fn generate(&self, number: i32) -> FizzBuzzValue {
79
+ let value = match (number % 3, number % 5) {
80
+ (0, 0) => "FizzBuzz".to_string(),
81
+ (0, _) => "Fizz".to_string(),
82
+ (_, 0) => "Buzz".to_string(),
83
+ _ => number.to_string(),
84
+ };
85
+ FizzBuzzValue::new(number, value)
86
+ }
87
+ }
88
+
89
+ // タイプ 2: 数値のみ
90
+ pub struct FizzBuzzType02;
91
+ impl FizzBuzzType for FizzBuzzType02 {
92
+ fn generate(&self, number: i32) -> FizzBuzzValue {
93
+ FizzBuzzValue::new(number, number.to_string())
94
+ }
95
+ }
96
+
97
+ // タイプ 3: FizzBuzz のみ(Fizz/Buzz/FizzBuzz 以外は空文字)
98
+ pub struct FizzBuzzType03;
99
+ impl FizzBuzzType for FizzBuzzType03 {
100
+ fn generate(&self, number: i32) -> FizzBuzzValue {
101
+ let value = match (number % 3, number % 5) {
102
+ (0, 0) => "FizzBuzz".to_string(),
103
+ (0, _) => "Fizz".to_string(),
104
+ (_, 0) => "Buzz".to_string(),
105
+ _ => String::new(),
106
+ };
107
+ FizzBuzzValue::new(number, value)
108
+ }
109
+ }
110
+ ```
111
+
112
+ `trait` は Java の `interface` や Go の暗黙的インターフェースに相当しますが、Rust では `impl Trait for Struct` で明示的に実装します。
113
+
114
+ ## 7.5 ファクトリ関数
115
+
116
+ タイプ番号から適切な実装を返すファクトリ関数を作成します。
117
+
118
+ ```rust
119
+ pub fn create(type_number: i32) -> Result<Box<dyn FizzBuzzType>, String> {
120
+ match type_number {
121
+ 1 => Ok(Box::new(FizzBuzzType01)),
122
+ 2 => Ok(Box::new(FizzBuzzType02)),
123
+ 3 => Ok(Box::new(FizzBuzzType03)),
124
+ _ => Err(format!("タイプ{}は見つかりません", type_number)),
125
+ }
126
+ }
127
+ ```
128
+
129
+ `Box<dyn FizzBuzzType>` はトレイトオブジェクトで、Java の `FizzBuzzType` インターフェース型や Go の `interface{}` に相当します。`Result` 型で不正なタイプ番号のエラーハンドリングも行います。
130
+
131
+ ## 7.6 まとめ
132
+
133
+ この章では以下を学びました。
134
+
135
+ | 概念 | Rust の実現方法 | 他言語の対応 |
136
+ |------|---------------|-------------|
137
+ | カプセル化 | `struct` + 非公開フィールド + メソッド | Java: private + getter |
138
+ | ポリモーフィズム | `trait` + `impl Trait for Struct` | Java: interface |
139
+ | 値オブジェクト | `#[derive(PartialEq)]` + 不変フィールド | Java: equals/hashCode |
140
+ | ファクトリ | `Result<Box<dyn Trait>>` | Java: Factory Method |
141
+
142
+ 次章では、デザインパターン(Command、First-Class Collection)を適用していきます。
@@ -0,0 +1,145 @@
1
+ # 第 8 章: デザインパターンの適用
2
+
3
+ ## 8.1 はじめに
4
+
5
+ 前章では struct と trait を使ってカプセル化とポリモーフィズムを実現しました。この章では **デザインパターン** を適用して、設計をさらに改善します。
6
+
7
+ ## 8.2 Value Object パターン
8
+
9
+ ### FizzBuzzValue の強化
10
+
11
+ 前章で作成した `FizzBuzzValue` は既に Value Object パターンを実現しています。
12
+
13
+ ```rust
14
+ #[derive(Debug, Clone, PartialEq)]
15
+ pub struct FizzBuzzValue {
16
+ number: i32,
17
+ value: String,
18
+ }
19
+ ```
20
+
21
+ `#[derive(PartialEq)]` により、2 つの `FizzBuzzValue` を値で比較できます。`Clone` により値のコピーが可能です。Rust の所有権システムにより、Value Object の不変性が自然に保証されます。
22
+
23
+ ## 8.3 First-Class Collection パターン
24
+
25
+ ### FizzBuzzList 構造体
26
+
27
+ FizzBuzzValue のコレクションを専用の型でラップします。
28
+
29
+ ```rust
30
+ pub struct FizzBuzzList {
31
+ list: Vec<FizzBuzzValue>,
32
+ }
33
+
34
+ impl FizzBuzzList {
35
+ const MAX_COUNT: usize = 100;
36
+
37
+ pub fn new(fizz_buzz_type: &dyn FizzBuzzType) -> Self {
38
+ let list = (1..=Self::MAX_COUNT as i32)
39
+ .map(|n| fizz_buzz_type.generate(n))
40
+ .collect();
41
+ Self { list }
42
+ }
43
+
44
+ pub fn value(&self) -> &[FizzBuzzValue] {
45
+ &self.list
46
+ }
47
+
48
+ pub fn len(&self) -> usize {
49
+ self.list.len()
50
+ }
51
+
52
+ pub fn is_empty(&self) -> bool {
53
+ self.list.is_empty()
54
+ }
55
+ }
56
+
57
+ impl std::fmt::Display for FizzBuzzList {
58
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
59
+ let values: Vec<String> = self.list.iter().map(|v| v.value().to_string()).collect();
60
+ write!(f, "{}", values.join("\n"))
61
+ }
62
+ }
63
+ ```
64
+
65
+ First-Class Collection パターンにより、コレクション操作の責務を `FizzBuzzList` に集約できます。`MAX_COUNT` は定数として定義し、マジックナンバーを排除します。
66
+
67
+ ## 8.4 Command パターン
68
+
69
+ ### FizzBuzzCommand トレイト
70
+
71
+ FizzBuzz の操作をコマンドとして抽象化します。
72
+
73
+ ```rust
74
+ pub trait FizzBuzzCommand {
75
+ fn execute(&self) -> String;
76
+ }
77
+ ```
78
+
79
+ ### 単一値コマンド
80
+
81
+ ```rust
82
+ pub struct FizzBuzzValueCommand {
83
+ fizz_buzz_type: Box<dyn FizzBuzzType>,
84
+ number: i32,
85
+ }
86
+
87
+ impl FizzBuzzValueCommand {
88
+ pub fn new(type_number: i32, number: i32) -> Result<Self, String> {
89
+ let fizz_buzz_type = create(type_number)?;
90
+ Ok(Self { fizz_buzz_type, number })
91
+ }
92
+ }
93
+
94
+ impl FizzBuzzCommand for FizzBuzzValueCommand {
95
+ fn execute(&self) -> String {
96
+ self.fizz_buzz_type.generate(self.number).to_string()
97
+ }
98
+ }
99
+ ```
100
+
101
+ ### リストコマンド
102
+
103
+ ```rust
104
+ pub struct FizzBuzzListCommand {
105
+ fizz_buzz_type: Box<dyn FizzBuzzType>,
106
+ }
107
+
108
+ impl FizzBuzzListCommand {
109
+ pub fn new(type_number: i32) -> Result<Self, String> {
110
+ let fizz_buzz_type = create(type_number)?;
111
+ Ok(Self { fizz_buzz_type })
112
+ }
113
+ }
114
+
115
+ impl FizzBuzzCommand for FizzBuzzListCommand {
116
+ fn execute(&self) -> String {
117
+ let list = FizzBuzzList::new(self.fizz_buzz_type.as_ref());
118
+ list.to_string()
119
+ }
120
+ }
121
+ ```
122
+
123
+ `?` 演算子は `Result` のエラーを自動的に伝播させる Rust のイディオムです。Java の例外伝播や Go の `if err != nil { return err }` パターンに相当します。
124
+
125
+ ## 8.5 他言語との比較
126
+
127
+ | パターン | Java | Go | Rust |
128
+ |---------|------|------|------|
129
+ | Value Object | `equals`/`hashCode` 手動実装 | 構造体比較(手動) | `#[derive(PartialEq)]` |
130
+ | First-Class Collection | クラスで `List<T>` をラップ | 構造体でスライスをラップ | 構造体で `Vec<T>` をラップ |
131
+ | Command | `interface` + クラス | `interface` + 構造体 | `trait` + 構造体 |
132
+ | Factory | `static` メソッド | 関数 | 関数 + `Result<Box<dyn Trait>>` |
133
+
134
+ ## 8.6 まとめ
135
+
136
+ この章では以下のデザインパターンを適用しました。
137
+
138
+ | パターン | 目的 | Rust の実現方法 |
139
+ |---------|------|---------------|
140
+ | Value Object | 値の等価性保証 | `#[derive(PartialEq, Clone)]` |
141
+ | First-Class Collection | コレクション操作の集約 | `struct` + `Vec<T>` |
142
+ | Command | 操作の抽象化と遅延実行 | `trait` + `Box<dyn Trait>` |
143
+ | Factory Method | 型番号による生成 | `match` + `Result<Box<dyn Trait>>` |
144
+
145
+ 次章では SOLID 原則の観点から設計を評価し、モジュール分割を行います。