どのような状況で私たちは変数を公開し、プライベートな方法で作るのですか?

現在、私はJavaとC ++の基礎を学んでいます。私は Let Us C ++ という本を読んでいます。ほとんどすべてのケースで、セキュリティのためにインスタンス変数をプライベートにし、メソッドを公開しています。しかし、本書では、変数を公開してメソッドをプライベートにする場合もあることも言及されています。

私は絶えず考えており、その場合はそうするでしょう。誰でもこれを説明できますか?

4
あなたの投稿の質を向上させてください(綴り、句読点、文頭の大きな文字など)。
追加された 著者 Spook,
@クリス、先生は同じものの例を挙げてください。
追加された 著者 Mayank Tiwari,
@ Spook、ありがとう、私は次回からこれを覚えています...
追加された 著者 Mayank Tiwari,
あなたは、ユーザが気にする必要のないクラス内のユーティリティ関数を常に必要とすることができます。あなたが厳密な関数をとることは、一つのことがアプローチすることは素晴らしいことです。
追加された 著者 chris,
C ++でシングルトンを行うと、コンストラクタは非公開になります
追加された 著者 Alexis,

8 答え

プライベートメソッド(またはC ++用語のプライベートメンバ関数)は、ヘルパー関数として最も有用です。たとえば、分数を実装したいが、分数が常に正規化されていることを確認したい場合を考えてください。次に、分数を正規化し、各演算の後に呼び出され、非正規化された分数をもたらす可能性のあるprivateメンバ関数 normalize()を使用することができます(C ++コード)。

class Fraction
{
public:
  Fraction(int num, int den = 1);
  Fraction operator+=(Fraction const& other);
  Fraction operator*=(Fraction const& other);
 //...
private:
  int numerator, denominator;
};

Fraction::Fraction(int num, int den):
  numerator(num),
  denominator(den)
{
  normalize();
}

Fraction Fraction::operator+=(Fraction const& other)
{
  int new_den = denominator*other.denominator;
  numerator = numerator*other.denominator + denominator*other.numerator;
  denominator = new_den;
}

Fraction Fraction::operator*=(Fraction const& other)
{
  numerator *= other.numerator;
  denominator *= other.denominator;
  normalize();
}

void Fraction::normalize()
{
  int factor = gcd(numerator, denominator);
  numerator /= factor;
  denominator /= factor;
}

プライベート関数の別のC ++固有の使用法は、C ++ではプライベートではアクセス制御のみであり、可視性に関してではないという事実に基づいています。これにより、実際の関数を仮想的にしながら、基本クラスで前状態の変更不可能なチェックを行うことができます:

class Base
{
public:
  foo frobnicate(some arguments);
private:
  virtual foo do_frobnicate(some arguments) = 0;
};

foo Base::frobnicate(some arguments)
{
  check_precondition(arguments);
  foo result = do_frobnicate(arguments);
  check_post_condition(foo);
  return foo;
}

Base から派生したクラスは do_frobnicate をオーバーライドしますが、派生クラスの内容にかかわらず常にpre/postconditionsをチェックする frobnicate

2
追加された
変数を公開するのはどうですか?そうする理由は何ですか?
追加された 著者 Ravid Goldenberg,
@petric私の一般的なルールは、すべての変数がパブリック(構造体)であるか、まったくないことです。最初のケースでは、便利にコンストラクタを追加することができます(C ++ 03では、C ++ 11では統一された初期化構文が必要性をほとんど排除します)。プライベート関数が必要な可能性がありますこれらのコンストラクタの使用のために(それは確かにあまり頻繁ではありませんが)。
追加された 著者 James Kanze,

一般に静的最終変数はクラス内で公開されます。その変数の値を変更する必要がなく、他のクラスにアクセスさせたい場合は、public static finalにします。

プライベートメソッドは、そのクラスの内部でタスクを実行するためにクラス内でのみ使用されます。ユーティリティメソッドやビジネス計算メソッドのように。パブリックメソッドのコードを複数のプライベートメソッドに分割し、メソッドがあまり大きくならないようにするだけです。

1
追加された

経験則として、他のクラスがアクセスできるようになったら、 public メソッドを作成します。内部メソッドまたはヘルパーメソッドは、あなたのクラスを拡張するメソッドによって拡張できるようにするには、保護されたまたは保護されたこれを private とマークするだけでいいです。

0
追加された

プライベートメソッドは、クラスの内部使用のためのものです。彼らは他の公共クラスから呼び出すことができます。それらはあなたが外の世界からカプセル化されているのでプライベートです。

例えば

public void method1(){
    method2();
}

private void method2(){
   //for internal use
}

Public variables are mainly used for class variables in which cases there is no harm of direct accessing the variables from outside. 例えば

public static  final int FLAG = true;

外部から直接変数を呼び出すことができます。

0
追加された

それは各クラスにどれくらいのセキュリティが必要かによって決まります。

たとえば、Vectorクラスを持っていて、x、y、zの3つの変数しかない場合は、それらを公開する必要があります。多くのクラスはおそらくVectorクラスを使用しますが、クラス内の値を変更しても問題ありません。

クレジットカード番号、バックグラウンドレコード、住所などを格納するPersonクラスがある場合、セキュリティ問題を避けるためにプライベートにする必要があります。

しかし、すべての変数を非公開にして、すべての変数にアクセサーとミューテータを提供すると、事実上、それらは公開と同じようになります(しかし、より多くの作業が必要になります)。

編集: とにかくそれらを変更することはできないので、すべての定数変数はpublicでなければなりません。 静的変数は、状況に応じて両方になる可能性があります。おそらく、静的変数の静的getおよびset関数を持つほうがよいでしょう。

0
追加された
私はすでにこれを知っています...
追加された 著者 Mayank Tiwari,
どちらもプライベートになる理由はありません!変更できないものを隠すのはなぜですか?
追加された 著者 Oleksiy,
全体のポイントは、セキュリティの問題を避けることです。問題はありません。プライベートキーワードは必要ありません。
追加された 著者 Oleksiy,
@juanchopanzaなぜ変更することができないプライベートなものを作るのですか?他のクラスに定数を表示させないように特に制限しない限り、なぜ私はそれを隠すのでしょうか?
追加された 著者 Oleksiy,
@Cong Xuプライベート定数はどのようにしてカプセル化を改善しますか?繰り返しますが、他のクラスで定数を表示できないようにしなければ、私はそれを非公開にする理由を考えることはできません。
追加された 著者 Oleksiy,
すべての定数変数が公開される理由はありません。それらは、公開される理由がなく実装の詳細になる可能性があります。
追加された 著者 juanchopanza,
いいえ、それは全くポイントではありません。クライアントが必要としないものを公開するのはなぜですか?
追加された 著者 juanchopanza,
なぜパブリックにする必要がないものを公開するのですか? OOPの基本原則です。
追加された 著者 juanchopanza,
@ ole_92アクセス指定子のポイントは、セキュリティに限定されているのではなく、セキュリティの定義によっては、とにかくその目的のために悲観的に不十分です。アクセス指定子は、パブリックインターフェイスの内容を明確に文書化することによって、より優れたカプセル化を提供します。
追加された 著者 congusbongus,
@ ole_92は直接ではありませんが、読者に公開インタフェースの一部ではないことを明確に伝えることによってカプセル化を助けます。人々が公的な定数を見ると、それを気にするべきかそれとも実装の詳細なのかはすぐには分かりません。 デフォルトでプライベートなものがある理由はありますか? C ++およびJava。
追加された 著者 congusbongus,

他のクラスでvaribaleやmethodeを必要としない場合は、それを公開しないでください。これはメソッドと変数に適用されます。

0
追加された

プライベート変数または関数は、宣言されているクラスでのみ使用できます。

パブリック変数または関数は、アプリケーションのどこでも使用できます。

したがって、あなたが属しているクラスで ONLY を使用するすべての変数と関数をprivate宣言する必要があります。

例:

public class Car {
    private String model;

    public setModel(String model) {
        if (model != null)
            this.model = model;
    }

    public getModel() {
        return model;
    }

    private doSomething() {
        model = "Ford";
    }
}

Carクラスでは、Stringモデルをprivateクラスとして宣言しています。これはCarクラスでのみ使用するため、setModel関数を使用せずに他のクラスがこのStringの値を変更できないことを保証します。

関数setModelとgetModelはpublicであるため、これらのメソッドを使用する場合のみ、他のクラスからプライベート変数モデルにアクセスできます。

この例では、関数setModelは値がnullかどうかをチェックし、その場合は値を設定しません。ここでは、Stringモデルをpublicとして宣言していれば、それが記録されている値を制御することができないことがわかります。

関数doSomethingはプライベートで、他のクラスはそれを使用できません。反対側では、この関数はプライベートであり、Stringモデルがどこにあるのかは同じクラスに属していますが、メソッドsetModelを使用せずに値を変更できます。

0
追加された

メソッドがクラスの他のメソッド(public)によって使用され、オブジェクトがそのメソッドに直接アクセスしないようにする場合、そのメソッドはprivateとして扱われます。

場合によっては、クラスオブジェクトから変数に直接アクセスしたい場合は、その変数をパブリックにします。

0
追加された