teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

7

追記

2021/02/02 12:17

投稿

BluOxy
BluOxy

スコア2663

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つけなくていいか。サンプルだし

2021/02/02 12:17

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -72,8 +72,8 @@
72
72
  {
73
73
  public abstract class Person
74
74
  {
75
- public string Name { get; private set; }
75
+ public string Name { get; set; }
76
- public int Age { get; private set; }
76
+ public int Age { get; set; }
77
77
 
78
78
  public Person(string Name, int Age)
79
79
  {

5

人の名前や年齢って一応変わるか… private set.

2021/02/02 08:36

投稿

BluOxy
BluOxy

スコア2663

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に変更

2021/02/02 08:36

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -45,7 +45,7 @@
45
45
  NameListはPersonよりも外の世界で作れば良いのではないでしょうか。
46
46
 
47
47
  ```C#
48
- var persons = new List<Person>(){
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 = persons.Where(x => x is Boy);
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 = persons.Where(x => x is Girl);
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

半角スぺースが気になってしまった

2021/02/02 08:34

投稿

BluOxy
BluOxy

スコア2663

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 + ミニ補足

2021/02/02 08:02

投稿

BluOxy
BluOxy

スコア2663

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 = boy.Select(x => x.Name);
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

表記ゆれがひどいので直した

2021/02/02 07:57

投稿

BluOxy
BluOxy

スコア2663

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
+ ソースコードは目的に沿って書くものだからです。