basyura's blog

あしたになったらほんきだす。

C# のプロパティ禁止ルールを設けてみたい

便利ですよね、プロパティ。

public class Person
{
  public string FirstName { get; set; }
  public string LastName  { get; set; }
  public int    Age       { get; set; }
}

って定義すれば。

Person person = new Person()
{
  FirstName = "hogemura",
  LastName  = "hogeo",
  Age       = 20,
};

ってできるし、プロパティは public な変数じゃなくて、 Getter Setter の代わりなので呼び出し元の IF を変更させることなく変更することができる。

public class Person
{
  private string _firstName = null;

  public string FirstName
  { 
    get { "☆ " +  _firstName; }
    set { _firstName = value;  }
  }
  public string LastName  { get; set; }
  public int    Age       { get; set; }
}

うむうむ。
これを java で書くとしたら Person クラスがこうなって

public class Person {
  private String firstName_ = null;
  private String lastName_  = null;
  private int    age_       = 0;

  public String getFirstName() {
    return firstName_;
  }

  public void setFirstName(string firstName) {
    firstName_ = firstName;
  }

  public String getLastName() {
    return lastName_;
  }

  public void setLastName(string lastName) {
    lastName_ = lastName;
  }

  public int getAge() {
    return age_;
  }

  public void setAge(int age)
  {
    age_ = age;
  }
}

使うときは

Person person = new Person();
person.setFirstName("hogemura");
person.setLastName("hogeo");
person.setAge(20);

うわぁぁぁぁ、java ひでー、まじひでー (^q^)
それに比べて C# はすげーべんりべんりーまじべんりー・・・・・って、うぉらぁ ヽ(`Д´)ノ 彡┻━┻

ていう流れは強引かもしれないけど・・・java だと行数が多いのもあって違和感バリバリ感じる人が多いと思う。
まぁ、↓こう書くべきだよねって思うんじゃないだろうか。

public class Person {
  private String firstName_ = null;
  private String lastName_  = null;
  private int    age_       = 0;

  public Person(String firstName, String lastName, int age)
  {
    firstName_ = firstName;
    lastName_  = lastName;
    age_       = age;
  }

  public String getFirstName() {
    return firstName_;
  }

  public String getLastName() {
    return lastName_;
  }

  public int getAge() {
    return age_;
  }
}

やってるのは、

  • インスタンスの生成に必要な物はコンストラクタで渡す
  • カプセル化する
  • 必要なメソッドだけ定義する
  • 変更されてほしくないものは外に見せない

これはもちろん C# でもできる。当然。

public class Person
{
  public Person(string firstName, string lastName, int age)
  {
    FirstName = firstName;
    LastName  = lastName;
    Age       = age;
  }

  public string FirstName { get; private set; }
  public string LastName  { get; private set; }
  public int    Age       { get; private set; }
}

java と同じ。もちもち。

僕が気になるのは

プロパティを多用しすぎて、いろいろ疎かになってんじゃね?

ってこと。見せなくていいものをチラつかせて、インスタンスを作るにもチマチマプロパティに右から左、右から左。

  • このインスタンス生成に必須なものって何?
  • 触られたくないものって何?
  • どう使って欲しいの?

ってのが放置されてオブジェクトがただの "入れ物" になってることが非常に悲しい気持ちにさせる。その原因になってるのがプロパティと考える。"良い感じにかけている" と錯覚させている。"あると便利だけど、まっさきに使うものじゃない" ってのが僕の考え。

僕の周りだけなのかよく分からん。うまくいえない、風呂にいこう。