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