2017-08-15 6 views
1

私は "public vs getter/setter"について多くの記事を読んだことがありますが、パブリック変数については良い点があるのか​​どうか疑問です。パブリック変数はどれも悪いですか?

や質問がある:あなたが新しい素晴らしいプログラミングlanguangeを作るつもりなら

、あなたはまだパブリック変数とその理由をサポートしようとしています?

答えて

1

パブリック変数は、オブジェクトのスコープ内でグローバルにアクセス可能/変更可能な変数があることを意味します。これは本当にユースケースですか?

ここでは、変数databaseAccessorを持つクラスDatabaseQueryHandlerがあります。どのような状況下ではこの変数になりたいでしょう:

  1. (すなわちgettable)公にアクセス
  2. 公的に設定可能な

オプション#1、私はいくつか考えることができます - あなたが取得したいこと挿入操作後の最後の挿入ID、最後に生成されたクエリ、トランザクションのコミットまたはロールバックなどをチェックし、DatabaseAccessorに書かれたこれらのメソッドをDatabaseQueryHandlerよりももっと理にかなっているかもしれません。

オプション#2を使用すると、I SPとD IPの原則に特にに関してで、OOPを行うと、SOLID原則を遵守している場合は特に、あまり望ましくありません。その場合、いつ変数databaseAccessorDatabaseQueryHandlerに設定したいですか?おそらく建設中で、それ以降はいつでも決してありません。おそらく、インターフェイスレベルでもタイプヒントが付いているので、インターフェイスにコードを付けることができます。また、なぜあなたは任意のオブジェクトがデータベースアクセサを変更する必要がありますか? Fooが変数DatabaseQueryHandler->databaseAccessorNULLに変更した後、BarDatabaseQueryHandler->databaseAccessor->beginTransaction()にコールしようとするとどうなりますか?

私はここで一つの例を挙げているに過ぎません。私はPHPでプログラミングしています(腐った腐った果物を避ける)、言語の緩みを考えると、OOPとSOLIDを真剣に受け取ります。フェンスの両側に引数があると確信していますが、パブリッククラス変数の使用を検討している場合は、実際にアクセスする必要があるものと、その変数をどのように使用するかを考慮する必要があります。ほとんどの場合、変数の型が予期せず変更されることなく、パブリックメソッドを介してその機能を公開することができます。

0

単純な答えは:はい、彼らは悪いです。そのような結合やunmaintanableコードのような多くの理由があります。実際には使用しないでください。 OOPでは、パブリック変数の代替はSingletonであり、悪い公安と見なされます。 hereをチェックしてください。

0

これはカプセル化と関連があります。変数にアクセスする必要はありません。 iOS(objective-c)などの他の言語では、プロパティを使用します。

@property(非原子、強)NSArray *配列;

コンパイラは、暗黙的にgetterとsetterでインスタンス変数を生成します。この場合、変数を使用する必要はありません(他の開発者は依然として変数を使用することを好みます)。このプロパティを.hファイルで宣言するか、.mファイルで宣言してprivateにすることで、このプロパティをパブリックにすることができます。

1

私は皆で言われていますほとんどすべてに同意するが、これを追加したい:

公開は自動的に悪いわけではありません。 オブジェクトクラスを作成している場合、一般に公開されていません。 データクラスは問題ありません。このクラスには何も問題はありません。

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を参照してください。

関連する問題