回答編集履歴
7
追記
test
CHANGED
@@ -201,3 +201,97 @@
|
|
201
201
|
大事なのは、目的がないソースコードを書かないことです。
|
202
202
|
|
203
203
|
ソースコードは目的に沿って書くものだからです。
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
## 追記について
|
208
|
+
|
209
|
+
|
210
|
+
|
211
|
+
> 例えば染色体(Chromosomes)をPersonは持っています.これはどのPersonにもあり,インスタンスごとに違うものでもないのでstaticです
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
PersonはBoyかもしれないしGirlかもしれません。すなわち、Personが持つ染色体はxyかもしれないしxxかもしれません。すなわち、PersonのChromosomesはstaticではありません。
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
> 例えば染色体みたいなBoy全体が持っていて,かつxyと決まっているものでしたらstatic変数かと思うのですが,いかがでしょうか?
|
220
|
+
|
221
|
+
|
222
|
+
|
223
|
+
こちらの質問もまず前提にはなりますが、staticはそもそもオブジェクト指向の考えにはないキーワードです。ポリモーフィズム(今回でいう継承)とstaticは相性が悪いので混ぜられません。
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
私なら下記のように抽象プロパティを使って実現します。
|
228
|
+
|
229
|
+
```C#
|
230
|
+
|
231
|
+
public abstract class Person
|
232
|
+
|
233
|
+
{
|
234
|
+
|
235
|
+
public string Name { get; set; }
|
236
|
+
|
237
|
+
public int Age { get; set; }
|
238
|
+
|
239
|
+
public abstract string Chromosomes { get; }
|
240
|
+
|
241
|
+
|
242
|
+
|
243
|
+
public Person (string Name, int Age) {
|
244
|
+
|
245
|
+
this.Name = Name;
|
246
|
+
|
247
|
+
this.Age = Age;
|
248
|
+
|
249
|
+
}
|
250
|
+
|
251
|
+
}
|
252
|
+
|
253
|
+
|
254
|
+
|
255
|
+
public class Boy : Person
|
256
|
+
|
257
|
+
{
|
258
|
+
|
259
|
+
public override string Chromosomes { get; } = "xy";
|
260
|
+
|
261
|
+
public Boy (string Name, int Age) : base (Name, Age) { }
|
262
|
+
|
263
|
+
}
|
264
|
+
|
265
|
+
|
266
|
+
|
267
|
+
public class Girl : Person
|
268
|
+
|
269
|
+
{
|
270
|
+
|
271
|
+
public override string Chromosomes { get; } = "xx";
|
272
|
+
|
273
|
+
public Girl (string Name, int Age) : base (Name, Age) { }
|
274
|
+
|
275
|
+
}
|
276
|
+
|
277
|
+
```
|
278
|
+
|
279
|
+
|
280
|
+
|
281
|
+
BoyとGirlにstaticなメンバーを持たせて実現もできますが、それならオブジェクトを作るのではなくenumを作ってそこから"xy"だったり"xx"の情報を得る方がわかりやすくて良いと思います。
|
282
|
+
|
283
|
+
|
284
|
+
|
285
|
+
```C#
|
286
|
+
|
287
|
+
public enum HumanChromosomes
|
288
|
+
|
289
|
+
{
|
290
|
+
|
291
|
+
Male = "xy",
|
292
|
+
|
293
|
+
Female = "xx"
|
294
|
+
|
295
|
+
}
|
296
|
+
|
297
|
+
```
|
6
privateつけなくていいか。サンプルだし
test
CHANGED
@@ -146,9 +146,9 @@
|
|
146
146
|
|
147
147
|
{
|
148
148
|
|
149
|
-
public string Name { get;
|
149
|
+
public string Name { get; set; }
|
150
|
-
|
150
|
+
|
151
|
-
public int Age { get;
|
151
|
+
public int Age { get; set; }
|
152
152
|
|
153
153
|
|
154
154
|
|
5
人の名前や年齢って一応変わるか… private set.
test
CHANGED
@@ -146,9 +146,9 @@
|
|
146
146
|
|
147
147
|
{
|
148
148
|
|
149
|
-
public string Name { get; }
|
149
|
+
public string Name { get; private set; }
|
150
|
-
|
150
|
+
|
151
|
-
public int Age { get; }
|
151
|
+
public int Age { get; private set; }
|
152
152
|
|
153
153
|
|
154
154
|
|
4
固定長ではないのでpersonsからpeopleに変更
test
CHANGED
@@ -92,7 +92,7 @@
|
|
92
92
|
|
93
93
|
```C#
|
94
94
|
|
95
|
-
var pe
|
95
|
+
var people = new List<Person>(){
|
96
96
|
|
97
97
|
new Boy("Taro", 12),
|
98
98
|
|
@@ -110,7 +110,7 @@
|
|
110
110
|
|
111
111
|
|
112
112
|
|
113
|
-
var boys = pe
|
113
|
+
var boys = people.Where(x => x is Boy);
|
114
114
|
|
115
115
|
var boyNames = boys.Select(x => x.Name);
|
116
116
|
|
@@ -118,7 +118,7 @@
|
|
118
118
|
|
119
119
|
|
120
120
|
|
121
|
-
var girls = pe
|
121
|
+
var girls = people.Where(x => x is Girl);
|
122
122
|
|
123
123
|
var girlNames = girls.Select(x => x.Name);
|
124
124
|
|
3
半角スぺースが気になってしまった
test
CHANGED
@@ -92,13 +92,13 @@
|
|
92
92
|
|
93
93
|
```C#
|
94
94
|
|
95
|
-
var persons = new List<Person>()
|
95
|
+
var persons = new List<Person>(){
|
96
|
-
|
96
|
+
|
97
|
-
new Boy("Taro", 12
|
97
|
+
new Boy("Taro", 12),
|
98
|
-
|
98
|
+
|
99
|
-
new Boy("Jiro", 13
|
99
|
+
new Boy("Jiro", 13),
|
100
|
-
|
100
|
+
|
101
|
-
new Boy("Sabu", 14
|
101
|
+
new Boy("Sabu", 14),
|
102
102
|
|
103
103
|
new Girl("Ichi", 15),
|
104
104
|
|
2
typo + ミニ補足
test
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
|
16
16
|
|
17
|
-
例え、どんな設計思想であれ、**これ等の基本的な思想からはブレてはいけません。**
|
17
|
+
例え、C#のどんな設計思想であれ、**これ等の基本的な思想からはブレてはいけません。**
|
18
18
|
|
19
19
|
これがそもそも論でお伝えしたいポイントです。
|
20
20
|
|
@@ -112,7 +112,7 @@
|
|
112
112
|
|
113
113
|
var boys = persons.Where(x => x is Boy);
|
114
114
|
|
115
|
-
var boyNames = boy.Select(x => x.Name);
|
115
|
+
var boyNames = boys.Select(x => x.Name);
|
116
116
|
|
117
117
|
Console.WriteLine(String.Join(",", boyNames)); // Taro,Jiro,Sabu
|
118
118
|
|
1
表記ゆれがひどいので直した
test
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
コードは目的に沿って書くものです。
|
5
|
+
ソースコードは目的に沿って書くものです。
|
6
|
-
|
6
|
+
|
7
|
-
コードはその目的が分かりやすく、かつ読みやすいように表現されるべきです。
|
7
|
+
ソースコードはその目的が分かりやすく、かつ読みやすいように表現されるべきです。
|
8
8
|
|
9
9
|
|
10
10
|
|
@@ -20,7 +20,7 @@
|
|
20
20
|
|
21
21
|
|
22
22
|
|
23
|
-
この基本的な思想からブレていないかもう1度コードを見直してください。
|
23
|
+
この基本的な思想からブレていないかもう1度ソースコードを見直してください。
|
24
24
|
|
25
25
|
|
26
26
|
|
@@ -198,6 +198,6 @@
|
|
198
198
|
|
199
199
|
|
200
200
|
|
201
|
-
大事なのは、目的がないソースを書かないことです。
|
201
|
+
大事なのは、目的がないソースコードを書かないことです。
|
202
|
-
|
202
|
+
|
203
|
-
コードは目的に沿って書くものだからです。
|
203
|
+
ソースコードは目的に沿って書くものだからです。
|