回答編集履歴

9

キーが合っていないので修正

2019/12/02 08:59

投稿

BluOxy
BluOxy

スコア2663

test CHANGED
@@ -314,15 +314,15 @@
314
314
 
315
315
  // データベースからテーブルデータをdataUnitsへ保存(下記はデバッグ用にデータを生成)
316
316
 
317
- dataUnits.Add(new DataUnit("WalkSpeed", 10.0f));
317
+ dataUnits.Add(new DataUnit("Walk", 10.0f));
318
-
318
+
319
- dataUnits.Add(new DataUnit("AttackSpeed", -20.0f));
319
+ dataUnits.Add(new DataUnit("Attack", -20.0f));
320
-
320
+
321
- dataUnits.Add(new DataUnit("IsPoison", 1f));
321
+ dataUnits.Add(new DataUnit("Health", 1f));
322
-
322
+
323
- dataUnits.Add(new DataUnit("WalkSpeed", 12f));
323
+ dataUnits.Add(new DataUnit("Walk", 12f));
324
-
324
+
325
- dataUnits.Add(new DataUnit("AttackSpeed", 5f));
325
+ dataUnits.Add(new DataUnit("Attack", 5f));
326
326
 
327
327
 
328
328
 

8

コード追加

2019/12/02 08:59

投稿

BluOxy
BluOxy

スコア2663

test CHANGED
@@ -207,3 +207,135 @@
207
207
 
208
208
 
209
209
  これで、`hitables`を列挙したときに新しく追加したインスタンスのメソッドが呼ばれるようになります。
210
+
211
+
212
+
213
+ ----
214
+
215
+
216
+
217
+ 掲示されたコードだとこうなりそうです。
218
+
219
+ `Update`という名前が抽象的ですが、これ以上の具体的な命名は難しそうです。
220
+
221
+
222
+
223
+ ```C#
224
+
225
+ public interface IAbility{
226
+
227
+ void Update(float value);
228
+
229
+ }
230
+
231
+
232
+
233
+ public class Walk : IAbility{
234
+
235
+ private float speed = 0f;
236
+
237
+ public void Update(float value){
238
+
239
+ speed += value;
240
+
241
+ }
242
+
243
+ }
244
+
245
+
246
+
247
+ public class Attack : IAbility{
248
+
249
+ private float speed = 0f;
250
+
251
+ public void Update(float value){
252
+
253
+ speed += value;
254
+
255
+ }
256
+
257
+ }
258
+
259
+
260
+
261
+ public class Health : IAbility{
262
+
263
+ private Condition condition = Condition.None;
264
+
265
+ public void Update(float value){
266
+
267
+ condition = value > 0f ? Condition.Poison : Condition.None;
268
+
269
+ }
270
+
271
+ }
272
+
273
+
274
+
275
+ public enum Condition{
276
+
277
+ None,
278
+
279
+ Poison,
280
+
281
+ Burning,
282
+
283
+ Palsy
284
+
285
+ }
286
+
287
+
288
+
289
+ public class Chara {
290
+
291
+ List<IAbility> abilities = new List<IAbility>();
292
+
293
+
294
+
295
+ public Chara()
296
+
297
+ {
298
+
299
+ abilities.Add(new Walk());
300
+
301
+ abilities.Add(new Attack());
302
+
303
+ abilities.Add(new Health());
304
+
305
+ }
306
+
307
+
308
+
309
+ void TestFunc() {
310
+
311
+ List<DataUnit> dataUnits = new List<DataUnit>();
312
+
313
+
314
+
315
+ // データベースからテーブルデータをdataUnitsへ保存(下記はデバッグ用にデータを生成)
316
+
317
+ dataUnits.Add(new DataUnit("WalkSpeed", 10.0f));
318
+
319
+ dataUnits.Add(new DataUnit("AttackSpeed", -20.0f));
320
+
321
+ dataUnits.Add(new DataUnit("IsPoison", 1f));
322
+
323
+ dataUnits.Add(new DataUnit("WalkSpeed", 12f));
324
+
325
+ dataUnits.Add(new DataUnit("AttackSpeed", 5f));
326
+
327
+
328
+
329
+ foreach(var unit in dataUnits) {
330
+
331
+ var ability = abilities.First(x => x.GetType().Name == unit.Key);
332
+
333
+ ability.Update(unit.Value);
334
+
335
+ }
336
+
337
+ }
338
+
339
+ }
340
+
341
+ ```

7

文章の修正

2019/12/02 08:45

投稿

BluOxy
BluOxy

スコア2663

test CHANGED
@@ -12,7 +12,7 @@
12
12
 
13
13
 
14
14
 
15
- まずは振る舞いを定義するためにインタフェースを定義します。
15
+ まずは同一の振る舞いを持ったオブジェクトを複数定義するためにインタフェースを定義します。
16
16
 
17
17
 
18
18
 
@@ -134,7 +134,7 @@
134
134
 
135
135
 
136
136
 
137
- また、掲示されたコードでは、そもそもDataUnitsを使う必要性が分かりませんでした。
137
+ また、掲示されたコードでは、そもそも`DataUnits`を使う必要性が分かりませんでした。
138
138
 
139
139
  下記のような書き方でも良さそうに思います。
140
140
 
@@ -184,13 +184,13 @@
184
184
 
185
185
  `fieldA`,`fieldB`,`fieldC`の違いを明確にしてください。
186
186
 
187
- 配列コレクションで持つ方が望ましいならそうするべきでょう
187
+ おそらく配列コレクションで持つ方が望ましいかもれません
188
188
 
189
189
 
190
190
 
191
191
  また、`DataUnits`の役割を明確にしてください。
192
192
 
193
- もし必要がない、もしくは`DataUnits`を使うことで却って煩雑になるようなら別の実装方法を検討すべきです
193
+ もし定義する必要がない、もしくは`DataUnits`を使うことで却って煩雑になるようなら別の実装方法を検討したほうが良いかもしれません
194
194
 
195
195
 
196
196
 
@@ -206,4 +206,4 @@
206
206
 
207
207
 
208
208
 
209
- これで、`hitables`を`foreach`で列挙したときにぞれのオブジェクト毎処理を行います。
209
+ これで、`hitables`を列挙したときに新しく追加したインスタンスのメソッドが呼ばるようなります。

6

文章の修正

2019/12/02 08:23

投稿

BluOxy
BluOxy

スコア2663

test CHANGED
@@ -80,7 +80,9 @@
80
80
 
81
81
 
82
82
 
83
- 最後に、その振る舞いを持つオブジェクトをリスト保持するようにし、ポリモーフィズムを利用して各要素が持つ`ReceiveDamage`メソッドを呼び出してください。これで、各オブジェクトのメンバーが保持している値を変更できるようになります。
83
+ 最後に、`IHitable`なオブジェクトをリスト保持するようにし、ポリモーフィズムを利用して各要素が持つ`ReceiveDamage`メソッドを呼び出してください。
84
+
85
+ これで、各オブジェクトのメンバーが保持している値を変更できるようになります。
84
86
 
85
87
 
86
88
 

5

文章修正とそれに対応してコードの順番を変更

2019/12/02 08:13

投稿

BluOxy
BluOxy

スコア2663

test CHANGED
@@ -30,9 +30,37 @@
30
30
 
31
31
  次に、その振る舞いを持つオブジェクトを定義します。
32
32
 
33
-
33
+ イメージでは、`Bair.HitPoint`が元`fieldA`、`Dog.HitPoint`が元`fieldB`、`OldMan.IsDead`が元`fieldC`に相当します。
34
-
34
+
35
+
36
+
35
- ```C#
37
+ ```C#
38
+
39
+ public class Bair : IHitable{
40
+
41
+ private int HitPoint = 300;
42
+
43
+ public void ReceiveDamage(int damage){
44
+
45
+ HitPoint -= damage / 2;
46
+
47
+ }
48
+
49
+ }
50
+
51
+
52
+
53
+ public class Dog : IHitable{
54
+
55
+ private int HitPoint = 150;
56
+
57
+ public void ReceiveDamage(int damage){
58
+
59
+ HitPoint -= damage;
60
+
61
+ }
62
+
63
+ }
36
64
 
37
65
 
38
66
 
@@ -48,39 +76,11 @@
48
76
 
49
77
  }
50
78
 
51
-
52
-
53
- public class Bair : IHitable{
54
-
55
- private int HitPoint = 300;
56
-
57
- public void ReceiveDamage(int damage){
58
-
59
- HitPoint -= damage / 2;
60
-
61
- }
62
-
63
- }
64
-
65
-
66
-
67
- public class Dog : IHitable{
68
-
69
- private int HitPoint = 150;
70
-
71
- public void ReceiveDamage(int damage){
72
-
73
- HitPoint -= damage;
74
-
75
- }
76
-
77
- }
78
-
79
- ```
79
+ ```
80
-
81
-
82
-
80
+
81
+
82
+
83
- 最後に、その振る舞いを持つオブジェクトをリストで保持するようにし、ポリモーフィズムを利用して共通の振る舞いをった`ReceiveDamage`メソッドを呼び出せばそぞれ初期化ができるようになります。
83
+ 最後に、その振る舞いを持つオブジェクトをリストで保持するようにし、ポリモーフィズムを利用して各要素が`ReceiveDamage`メソッドを呼び出してください。こで、各オブジェクトのメンバー保持している値を変更できるようになります。
84
84
 
85
85
 
86
86
 
@@ -98,76 +98,76 @@
98
98
 
99
99
  void TestFunc(){
100
100
 
101
+ hitables.Add(new Bair());
102
+
103
+ hitables.Add(new Dog());
104
+
101
105
  hitables.Add(new OldMan());
102
106
 
107
+
108
+
109
+ List<DataUnit> dataUnits = new List<DataUnit>();
110
+
111
+ dataUnits.Add(new DataUnit("Bair", 20));
112
+
113
+ dataUnits.Add(new DataUnit("Dog", 1));
114
+
115
+ dataUnits.Add(new DataUnit("Oldman", 10));
116
+
117
+
118
+
119
+ foreach(var unit in dataUnits){
120
+
121
+ var hitable = hitables.First(x => x.GetType().Name == unit.Key);
122
+
123
+ hitable.ReceiveDamage(unit.Value);
124
+
125
+ }
126
+
127
+ }
128
+
129
+ }
130
+
131
+ ```
132
+
133
+
134
+
135
+ また、掲示されたコードでは、そもそもDataUnitsを使う必要性が分かりませんでした。
136
+
137
+ 下記のような書き方でも良さそうに思います。
138
+
139
+
140
+
141
+ ```C#
142
+
143
+ public class Test{
144
+
145
+ List<IHitable> hitables = new List<IHitable>();
146
+
147
+
148
+
149
+ void TestFunc(){
150
+
151
+ var bair = new Bair();
152
+
153
+ bair.ReceiveDamage(20);
154
+
155
+ var dog = new Dog();
156
+
157
+ dog.ReceiveDamage(1);
158
+
159
+ var oldMan = new OldMan();
160
+
161
+ oldMan.ReceiveDamage(10);
162
+
163
+
164
+
103
165
  hitables.Add(new Bair());
104
166
 
105
167
  hitables.Add(new Dog());
106
168
 
107
-
108
-
109
- List<DataUnit> dataUnits = new List<DataUnit>();
110
-
111
- dataUnits.Add(new DataUnit("Oldman", 10));
112
-
113
- dataUnits.Add(new DataUnit("Bair", 20));
114
-
115
- dataUnits.Add(new DataUnit("Dog", 1));
116
-
117
-
118
-
119
- foreach(var unit in dataUnits){
120
-
121
- var hitable = hitables.First(x => x.GetType().Name == unit.Key);
122
-
123
- hitable.ReceiveDamage(unit.Value);
124
-
125
- }
126
-
127
- }
128
-
129
- }
130
-
131
- ```
132
-
133
-
134
-
135
- また、掲示されたコードでは、そもそもDataUnitsを使う必要性が分かりませんでした。
136
-
137
- 下記のような書き方でも良さそうに思います。
138
-
139
-
140
-
141
- ```C#
142
-
143
- public class Test{
144
-
145
- List<IHitable> hitables = new List<IHitable>();
146
-
147
-
148
-
149
- void TestFunc(){
150
-
151
- var oldMan = new OldMan();
152
-
153
- oldMan.ReceiveDamage(10);
154
-
155
- var bair = new Bair();
156
-
157
- bair.ReceiveDamage(20);
158
-
159
- var dog = new Dog();
160
-
161
- dog.ReceiveDamage(1);
162
-
163
-
164
-
165
169
  hitables.Add(new OldMan());
166
170
 
167
- hitables.Add(new Bair());
168
-
169
- hitables.Add(new Dog());
170
-
171
171
  }
172
172
 
173
173
  }

4

文章の修正

2019/12/02 08:11

投稿

BluOxy
BluOxy

スコア2663

test CHANGED
@@ -196,11 +196,11 @@
196
196
 
197
197
 
198
198
 
199
- 0. `IHitable`を実装した新しいクラスを定義してください
199
+ 0. `IHitable`を実装した新しいクラスを定義
200
-
200
+
201
- 0. そのクラス内の`ReceiveDamage`メソッドに独自の処理を追加してください
201
+ 0. そのクラス内の`ReceiveDamage`メソッドに独自の処理を追加
202
-
202
+
203
- 0. `hitables`に新しく追加したクラスのインスタンスを追加をしてください
203
+ 0. `hitables`に新しく追加したクラスのインスタンスを`Add`する
204
204
 
205
205
 
206
206
 

3

誤字

2019/12/02 08:04

投稿

BluOxy
BluOxy

スコア2663

test CHANGED
@@ -192,7 +192,7 @@
192
192
 
193
193
 
194
194
 
195
- # 処理パターン増やす場合
195
+ # パターン増やす場合
196
196
 
197
197
 
198
198
 

2

文章の修正

2019/12/02 08:02

投稿

BluOxy
BluOxy

スコア2663

test CHANGED
@@ -196,8 +196,12 @@
196
196
 
197
197
 
198
198
 
199
+ 0. `IHitable`を実装した新しいクラスを定義してください
200
+
199
- `IHitable`を実装した新しいクラスを定義して、そのクラスに定義する`ReceiveDamage`メソッドに独自の処理を追加してください
201
+ 0. そのクラス内の`ReceiveDamage`メソッドに独自の処理を追加してください
200
-
201
-
202
-
202
+
203
- そして`hitables`に追加をすれば処理が行われます。
203
+ 0. `hitables`に新しく追加したクラスのインスタンス追加をしてください
204
+
205
+
206
+
207
+ これで、`hitables`を`foreach`で列挙したときにそれぞれのオブジェクト毎に処理を行います。

1

構文エラーとマークダウンの修正

2019/12/02 08:01

投稿

BluOxy
BluOxy

スコア2663

test CHANGED
@@ -1,4 +1,4 @@
1
- とりあえず、下記ケースを想定してサンプルを作りました。
1
+ 各`field`がどういう値を持つのかを明確にするため、下記ケースを想定してサンプルを作りました。
2
2
 
3
3
 
4
4
 
@@ -106,8 +106,6 @@
106
106
 
107
107
 
108
108
 
109
-
110
-
111
109
  List<DataUnit> dataUnits = new List<DataUnit>();
112
110
 
113
111
  dataUnits.Add(new DataUnit("Oldman", 10));
@@ -154,21 +152,17 @@
154
152
 
155
153
  oldMan.ReceiveDamage(10);
156
154
 
157
-
158
-
159
155
  var bair = new Bair();
160
156
 
161
157
  bair.ReceiveDamage(20);
162
158
 
163
-
164
-
165
159
  var dog = new Dog();
166
160
 
167
- dog.ReceiveDamage(1)
161
+ dog.ReceiveDamage(1);
168
-
169
-
170
-
162
+
163
+
164
+
171
- hitables.Add();
165
+ hitables.Add(new OldMan());
172
166
 
173
167
  hitables.Add(new Bair());
174
168
 
@@ -182,16 +176,28 @@
182
176
 
183
177
 
184
178
 
185
- 少し独自路線へ向かってしまいましたので、話を戻します。
186
-
187
-
188
-
189
- スマートさを出すためには、
179
+ # スマートさを出すために検討すべきこと
190
-
180
+
181
+
182
+
191
- - `fieldA`,`fieldB`,`fieldC`の違いを明確にしてください(配列・コレクションで持つ方が望ましいならそうする)
183
+ `fieldA`,`fieldB`,`fieldC`の違いを明確にしてください
184
+
192
-
185
+ 配列・コレクションで持つ方が望ましいならそうするべきでしょう。
186
+
187
+
188
+
189
+ また、`DataUnits`の役割を明確にしてください。
190
+
193
- - `DataUnits`の役割を明確にてください(必要がない、もしくは`DataUnits`を使うことで却って煩雑になるなら使わない)
191
+ し必要がない、もしくは`DataUnits`を使うことで却って煩雑になるようなら別の実装方法を検討すべきです。
194
-
195
-
196
-
192
+
193
+
194
+
197
- を心掛ける必要ありま
195
+ # 処理パターン増や場合
196
+
197
+
198
+
199
+ `IHitable`を実装した新しいクラスを定義して、そのクラスに定義する`ReceiveDamage`メソッドに独自の処理を追加してください。
200
+
201
+
202
+
203
+ そして`hitables`に追加をすれば処理が行われます。