このページでは、「6. 文字の表示 その2」のプログラムの内容をクラス化したものを公開しておきます。
あくまで一例ですので、参考までに。
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. |
|
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. 169. 170. 171. 172. 173. 174. 175. 176. 177. 178. 179. 180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196. 197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. |
|
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. |
|
ここからはクラス設計に関するただの垂れ流し文章なので、見る必要はないです。
クラス定義は長いのですが、それを利用するコードはかなりすっきりしています。
クラスの設計というものをやってみたのはこれで 2 度目なのですが、今回は「Effective C++」を部分的にですが読んだおかげで、「カプセル化」とか「is-inmplemented-in-terms-of 関係」(実装関係)というものを意識できた気がします。
最初、文字列を描画する render メソッドは Fontdata オブジェクト(フォントのデータを記憶)を引数に渡し、メソッド内部で Fontdata クラスの private メンバにアクセスして処理を行なう、というものでした。
イメージ的に工場での流れ作業みたいなものを考えていたので、データを保持するだけのクラス, データを処理するだけのクラス、という分け方をしていました。
でも、そうすると、引数に渡したオブジェクトの private メンバにはアクセス出来ないので、もちろん、friend 登録はしてあります。
しかし、普通は friend を使わずにカプセル化をきちんとやるのが当然な気がする。
ということで、メソッドの処理を行なうのに必要な情報(リソース)として、内部に Fontdata オブジェクトを持つ形に変更したのが現在の形です。
正直それだけ。でも、friend を使わずに、やりたいことが綺麗に処理できている。
カプセル化もきちんとできている。
ただ、strRenderer クラスのメソッドに、setSize, setFont のメソッドを用意しなければいけないのが、個人的に違和感を覚える。
用意しないと文字サイズと使うフォントファイルの入れ替えは出来ない。
でも、Renderer という機能的に、描画機能ではない処理がメソッドとしてあるのは、変な気がする。
逆に、内部に Fontdata がない場合だと、一々引数に Fontdata を渡さなければならないから、正直面倒な気もする。
friend を使うけど、フォントに対する処理に関してはアクセス方法が自然な方か。
もしくは、完全にカプセル化されており、文字列描画を行なうメソッドの引数指定もすっきり!な方か。
普通は後者なんだろうな……。“自分”もですが。