回答編集履歴
7
追記
answer
CHANGED
@@ -99,4 +99,51 @@
|
|
99
99
|
```
|
100
100
|
|
101
101
|
大事なのは、目的がないソースコードを書かないことです。
|
102
|
-
ソースコードは目的に沿って書くものだからです。
|
102
|
+
ソースコードは目的に沿って書くものだからです。
|
103
|
+
|
104
|
+
## 追記について
|
105
|
+
|
106
|
+
> 例えば染色体(Chromosomes)をPersonは持っています.これはどのPersonにもあり,インスタンスごとに違うものでもないのでstaticです
|
107
|
+
|
108
|
+
PersonはBoyかもしれないしGirlかもしれません。すなわち、Personが持つ染色体はxyかもしれないしxxかもしれません。すなわち、PersonのChromosomesはstaticではありません。
|
109
|
+
|
110
|
+
> 例えば染色体みたいなBoy全体が持っていて,かつxyと決まっているものでしたらstatic変数かと思うのですが,いかがでしょうか?
|
111
|
+
|
112
|
+
こちらの質問もまず前提にはなりますが、staticはそもそもオブジェクト指向の考えにはないキーワードです。ポリモーフィズム(今回でいう継承)とstaticは相性が悪いので混ぜられません。
|
113
|
+
|
114
|
+
私なら下記のように抽象プロパティを使って実現します。
|
115
|
+
```C#
|
116
|
+
public abstract class Person
|
117
|
+
{
|
118
|
+
public string Name { get; set; }
|
119
|
+
public int Age { get; set; }
|
120
|
+
public abstract string Chromosomes { get; }
|
121
|
+
|
122
|
+
public Person (string Name, int Age) {
|
123
|
+
this.Name = Name;
|
124
|
+
this.Age = Age;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
|
128
|
+
public class Boy : Person
|
129
|
+
{
|
130
|
+
public override string Chromosomes { get; } = "xy";
|
131
|
+
public Boy (string Name, int Age) : base (Name, Age) { }
|
132
|
+
}
|
133
|
+
|
134
|
+
public class Girl : Person
|
135
|
+
{
|
136
|
+
public override string Chromosomes { get; } = "xx";
|
137
|
+
public Girl (string Name, int Age) : base (Name, Age) { }
|
138
|
+
}
|
139
|
+
```
|
140
|
+
|
141
|
+
BoyとGirlにstaticなメンバーを持たせて実現もできますが、それならオブジェクトを作るのではなくenumを作ってそこから"xy"だったり"xx"の情報を得る方がわかりやすくて良いと思います。
|
142
|
+
|
143
|
+
```C#
|
144
|
+
public enum HumanChromosomes
|
145
|
+
{
|
146
|
+
Male = "xy",
|
147
|
+
Female = "xx"
|
148
|
+
}
|
149
|
+
```
|
6
privateつけなくていいか。サンプルだし
answer
CHANGED
@@ -72,8 +72,8 @@
|
|
72
72
|
{
|
73
73
|
public abstract class Person
|
74
74
|
{
|
75
|
-
public string Name { get;
|
75
|
+
public string Name { get; set; }
|
76
|
-
public int Age { get;
|
76
|
+
public int Age { get; set; }
|
77
77
|
|
78
78
|
public Person(string Name, int Age)
|
79
79
|
{
|
5
人の名前や年齢って一応変わるか… private set.
answer
CHANGED
@@ -72,8 +72,8 @@
|
|
72
72
|
{
|
73
73
|
public abstract class Person
|
74
74
|
{
|
75
|
-
public string Name { get; }
|
75
|
+
public string Name { get; private set; }
|
76
|
-
public int Age { get; }
|
76
|
+
public int Age { get; private set; }
|
77
77
|
|
78
78
|
public Person(string Name, int Age)
|
79
79
|
{
|
4
固定長ではないのでpersonsからpeopleに変更
answer
CHANGED
@@ -45,7 +45,7 @@
|
|
45
45
|
NameListはPersonよりも外の世界で作れば良いのではないでしょうか。
|
46
46
|
|
47
47
|
```C#
|
48
|
-
var
|
48
|
+
var people = new List<Person>(){
|
49
49
|
new Boy("Taro", 12),
|
50
50
|
new Boy("Jiro", 13),
|
51
51
|
new Boy("Sabu", 14),
|
@@ -54,11 +54,11 @@
|
|
54
54
|
new Girl("San", 17),
|
55
55
|
};
|
56
56
|
|
57
|
-
var boys =
|
57
|
+
var boys = people.Where(x => x is Boy);
|
58
58
|
var boyNames = boys.Select(x => x.Name);
|
59
59
|
Console.WriteLine(String.Join(",", boyNames)); // Taro,Jiro,Sabu
|
60
60
|
|
61
|
-
var girls =
|
61
|
+
var girls = people.Where(x => x is Girl);
|
62
62
|
var girlNames = girls.Select(x => x.Name);
|
63
63
|
Console.WriteLine(String.Join(",", girlNames)); // Ichi,Ni,San
|
64
64
|
```
|
3
半角スぺースが気になってしまった
answer
CHANGED
@@ -45,10 +45,10 @@
|
|
45
45
|
NameListはPersonよりも外の世界で作れば良いのではないでしょうか。
|
46
46
|
|
47
47
|
```C#
|
48
|
-
var persons = new List<Person>()
|
48
|
+
var persons = new List<Person>(){
|
49
|
-
new Boy("Taro", 12
|
49
|
+
new Boy("Taro", 12),
|
50
|
-
new Boy("Jiro", 13
|
50
|
+
new Boy("Jiro", 13),
|
51
|
-
new Boy("Sabu", 14
|
51
|
+
new Boy("Sabu", 14),
|
52
52
|
new Girl("Ichi", 15),
|
53
53
|
new Girl("Ni", 16),
|
54
54
|
new Girl("San", 17),
|
2
typo + ミニ補足
answer
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
オブジェクト指向では、目的に沿ってオブジェクトを定義します。
|
7
7
|
また、クラスであったりメンバーであったりは名が体を表すべきです。
|
8
8
|
|
9
|
-
例え、どんな設計思想であれ、**これ等の基本的な思想からはブレてはいけません。**
|
9
|
+
例え、C#のどんな設計思想であれ、**これ等の基本的な思想からはブレてはいけません。**
|
10
10
|
これがそもそも論でお伝えしたいポイントです。
|
11
11
|
|
12
12
|
この基本的な思想からブレていないかもう1度ソースコードを見直してください。
|
@@ -55,7 +55,7 @@
|
|
55
55
|
};
|
56
56
|
|
57
57
|
var boys = persons.Where(x => x is Boy);
|
58
|
-
var boyNames =
|
58
|
+
var boyNames = boys.Select(x => x.Name);
|
59
59
|
Console.WriteLine(String.Join(",", boyNames)); // Taro,Jiro,Sabu
|
60
60
|
|
61
61
|
var girls = persons.Where(x => x is Girl);
|
1
表記ゆれがひどいので直した
answer
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
## そもそも論
|
2
2
|
|
3
|
-
コードは目的に沿って書くものです。
|
3
|
+
ソースコードは目的に沿って書くものです。
|
4
|
-
コードはその目的が分かりやすく、かつ読みやすいように表現されるべきです。
|
4
|
+
ソースコードはその目的が分かりやすく、かつ読みやすいように表現されるべきです。
|
5
5
|
|
6
6
|
オブジェクト指向では、目的に沿ってオブジェクトを定義します。
|
7
7
|
また、クラスであったりメンバーであったりは名が体を表すべきです。
|
@@ -9,7 +9,7 @@
|
|
9
9
|
例え、どんな設計思想であれ、**これ等の基本的な思想からはブレてはいけません。**
|
10
10
|
これがそもそも論でお伝えしたいポイントです。
|
11
11
|
|
12
|
-
この基本的な思想からブレていないかもう1度コードを見直してください。
|
12
|
+
この基本的な思想からブレていないかもう1度ソースコードを見直してください。
|
13
13
|
|
14
14
|
## 問題点1
|
15
15
|
|
@@ -98,5 +98,5 @@
|
|
98
98
|
}
|
99
99
|
```
|
100
100
|
|
101
|
-
大事なのは、目的がないソースを書かないことです。
|
101
|
+
大事なのは、目的がないソースコードを書かないことです。
|
102
|
-
コードは目的に沿って書くものだからです。
|
102
|
+
ソースコードは目的に沿って書くものだからです。
|