私は "public vs getter/setter"について多くの記事を読んだことがありますが、パブリック変数については良い点があるのかどうか疑問です。パブリック変数はどれも悪いですか?
や質問がある:あなたが新しい素晴らしいプログラミングlanguangeを作るつもりなら
、あなたはまだパブリック変数とその理由をサポートしようとしています?
私は "public vs getter/setter"について多くの記事を読んだことがありますが、パブリック変数については良い点があるのかどうか疑問です。パブリック変数はどれも悪いですか?
や質問がある:あなたが新しい素晴らしいプログラミングlanguangeを作るつもりなら
、あなたはまだパブリック変数とその理由をサポートしようとしています?
パブリック変数は、オブジェクトのスコープ内でグローバルにアクセス可能/変更可能な変数があることを意味します。これは本当にユースケースですか?
ここでは、変数databaseAccessor
を持つクラスDatabaseQueryHandler
があります。どのような状況下ではこの変数になりたいでしょう:
オプション#1、私はいくつか考えることができます - あなたが取得したいこと挿入操作後の最後の挿入ID、最後に生成されたクエリ、トランザクションのコミットまたはロールバックなどをチェックし、DatabaseAccessor
に書かれたこれらのメソッドをDatabaseQueryHandler
よりももっと理にかなっているかもしれません。
オプション#2を使用すると、I SPとD IPの原則に特にに関してで、OOPを行うと、SOLID原則を遵守している場合は特に、あまり望ましくありません。その場合、いつ変数databaseAccessor
をDatabaseQueryHandler
に設定したいですか?おそらく建設中で、それ以降はいつでも決してありません。おそらく、インターフェイスレベルでもタイプヒントが付いているので、インターフェイスにコードを付けることができます。また、なぜあなたは任意のオブジェクトがデータベースアクセサを変更する必要がありますか? Foo
が変数DatabaseQueryHandler->databaseAccessor
をNULL
に変更した後、Bar
をDatabaseQueryHandler->databaseAccessor->beginTransaction()
にコールしようとするとどうなりますか?
私はここで一つの例を挙げているに過ぎません。私はPHPでプログラミングしています(腐った腐った果物を避ける)、言語の緩みを考えると、OOPとSOLIDを真剣に受け取ります。フェンスの両側に引数があると確信していますが、パブリッククラス変数の使用を検討している場合は、実際にアクセスする必要があるものと、その変数をどのように使用するかを考慮する必要があります。ほとんどの場合、変数の型が予期せず変更されることなく、パブリックメソッドを介してその機能を公開することができます。
これはカプセル化と関連があります。変数にアクセスする必要はありません。 iOS(objective-c)などの他の言語では、プロパティを使用します。
@property(非原子、強)NSArray *配列;
コンパイラは、暗黙的にgetterとsetterでインスタンス変数を生成します。この場合、変数を使用する必要はありません(他の開発者は依然として変数を使用することを好みます)。このプロパティを.hファイルで宣言するか、.mファイルで宣言してprivateにすることで、このプロパティをパブリックにすることができます。
私は皆で言われていますほとんどすべてに同意するが、これを追加したい:
公開は自動的に悪いわけではありません。 オブジェクトクラスを作成している場合、一般に公開されていません。 データクラスは問題ありません。このクラスには何も問題はありません。
public class CommentRecord
{
public int id;
public string comment;
}
...なぜですか?クラスはではないので、の変数を使用します。これは単なるデータオブジェクトです。は、を意味し、単純なデータリポジトリに過ぎません。
しかし、このクラスで間違っ絶対に何かがあります:
public class CommentRecord
{
public int id;
public string comment;
public void UpdateInSQL()
{
// code to update the SQL table for the row with commentID = this.id
// and set its UserComment column to this.comment
}
}
が...なぜこれが悪いのですか?それはデータクラスではないからです。それは実際にその変数を詰め込むクラスです。そのためにそれらを公開すると、はクラスを使用している人にクラスの内部を知らせます。それを使用している人は、「私がコメントを更新したい場合は、公開変数を変更する必要がありますが、ではなく、がIDを変更してから、UpdateInSQL()メソッドを呼び出してください。さらに悪いことに、もし彼らがうまくいけば、意図されていないやり方で、また、予期しない結果を引き起こすような形でクラスを使用します。
これについてさらに詳しく知りたい場合は、Robert Martinの第6章「データ/オブジェクト対称対称」のClean Codeを参照してください。