In welke situaties maken we variabelen als openbaar en methoden als privé?

Momenteel ben ik basisbegrippen van Java en C ++ aan het leren. Ik heb in boek Let Us C ++ gelezen dat we in vrijwel alle gevallen instantievariabelen privé en methoden openbaar maken voor beveiligingsdoeleinden. Maar in dit boek wordt ook vermeld dat we in sommige gevallen variabelen openbaar maken en methoden privé ..

Ik ben continu aan het denken, in welke gevallen we dat zullen doen. Kan iemand dit alsjeblieft uitleggen?

4
Verbeter de kwaliteit van je berichten (spelling, interpunctie, grote letters aan het begin van de zin, etc.).
toegevoegd de auteur Spook, de bron
@chris, mijnheer, kunt u een voorbeeld geven voor hetzelfde.
toegevoegd de auteur Mayank Tiwari, de bron
@Spook, bedankt, ik zal dit van de volgende keer onthouden ...
toegevoegd de auteur Mayank Tiwari, de bron
U kunt altijd een hulpprogramma in een klasse nodig hebben waar uw gebruikers niets om hoeven te geven. Het is geweldig als je een strikte functie kiest voor één ding.
toegevoegd de auteur chris, de bron
Als je een singleton doet in C ++, dan is de constructor privé
toegevoegd de auteur Alexis, de bron

8 antwoord

Privémethoden (of privélidfuncties in C ++ -terminologie) zijn vooral nuttig als hulpfuncties. Denk bijvoorbeeld aan het geval dat u fracties wilt implementeren, maar zorg ervoor dat uw breuk altijd genormaliseerd is. Dan zou u een private member-functie normalize() kunnen gebruiken die uw breuk normaliseert en die na elke bewerking wordt opgeroepen die kan leiden tot een niet-genormaliseerde breuk, bijvoorbeeld (C ++ -code):

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;
}

Een ander, C ++ specifiek gebruik van privé-functies is gebaseerd op het feit dat in C ++ privé alleen draait om toegangscontrole, niet om zichtbaarheid. Dit maakt het mogelijk om onoverwinnelijke controle achteraf in de basisklasse uit te voeren terwijl de feitelijke functie virtueel wordt gemaakt:

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;
}

Klassen afgeleid van Base overschrijven do_frobnicate , terwijl gebruikers frobnicate aanroepen, die altijd de pre/postcondities controleert, ongeacht de afgeleide klasse.

2
toegevoegd
Hoe zit het met het maken van een variabele openbaar? Enige reden om dit te doen?
toegevoegd de auteur Ravid Goldenberg, de bron
@petric Mijn algemene regel is dat alle variabelen openbaar zijn (een struct), of geen van de variabelen zijn. In het eerste geval kan ik constructeurs toevoegen voor het gemak (in C ++ 03, hoe dan ook --- in C ++ 11, elimineert de uniforme initialisatiesyntaxis grotendeels de noodzaak), en ik denk dat het mogelijk is dat ik misschien een privéfunctie wil voor gebruik door deze constructeurs (hoewel het zeker niet erg frequent is).
toegevoegd de auteur James Kanze, de bron

Over het algemeen zijn statische eindvariabelen openbaar in een klasse. Als u de waarde van die variabele niet hoeft te wijzigen en wilt dat andere klassen er toegang toe hebben, maakt u deze openbaar statisch definitief.

Privé-methoden worden alleen binnen de klas gebruikt voor het uitvoeren van de taak, die intern is voor die klasse. Zoals een gebruiksmethode of een zakelijke berekeningsmethode. Of simpelweg om de code van de openbare methode te splitsen in meerdere privémethoden, zodat de methoden niet te groot worden.

1
toegevoegd

Een vuistregel, je maakt methoden openbaar wanneer het voor andere klassen in orde is om ze te benaderen. interne methoden of hulpmethoden moeten beschermd of privé zijn. Beschermd als u wilt dat de methode uitbreidbaar is door degenen die uw klasse uitbreiden, maar als u wil dit niet, markeer ze gewoon privé .

0
toegevoegd

privémethoden zijn voor het interne gebruik van de klas. Ze kunnen vanuit andere openbare klassen worden gebeld. Die zijn privé omdat je ingekapseld bent van de buitenwereld.

Bijvoorbeeld

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. Bijvoorbeeld

public static  final int FLAG = true;

Je kunt de variabele direct van buitenaf bellen.

0
toegevoegd

Het hangt ervan af hoeveel beveiliging je wilt voor elke klas.

Als u bijvoorbeeld een Vector-klasse hebt, die slechts 3 variabelen x, y en z heeft, moet u deze openbaar maken. Veel klassen zullen waarschijnlijk de Vector-klasse gebruiken en het is prima als ze hierin waarden veranderen.

Als u een persoonsklasse hebt die creditcardnummer, achtergrondrecord, adres, enz. Opslaat, moet u deze privé maken om beveiligingsproblemen te voorkomen.

Als u echter alle variabelen als privé hebt en u accessors en mutators voor al deze biedt, maakt u ze in feite net publiek (maar met meer werk).

BEWERK: Alle constante variabelen moeten openbaar zijn, omdat je ze toch niet kunt wijzigen. Statische variabelen kunnen beide zijn, afhankelijk van een situatie. Waarschijnlijk beter om statische get-and-set-functies voor statische variabelen te hebben.

0
toegevoegd
ik weet dit al ...
toegevoegd de auteur Mayank Tiwari, de bron
Geen reden om privé te zijn! Waarom verstop je iets dat je niet kunt veranderen?
toegevoegd de auteur Oleksiy, de bron
Het gaat erom om beveiligingsproblemen te voorkomen. Geen probleem - privé-zoekwoorden zijn niet nodig.
toegevoegd de auteur Oleksiy, de bron
@juanchopanza Waarom privé iets maken dat niet kan worden gewijzigd? Tenzij ik specifiek andere klassen wil beperken de constante te bekijken, waarom zou ik het verbergen?
toegevoegd de auteur Oleksiy, de bron
@Cong Xu Hoe zorgen privéconstanten voor betere inkapseling? Nogmaals, tenzij andere klassen de constante niet mogen zien, kan ik geen enkele reden bedenken waarom het privé is.
toegevoegd de auteur Oleksiy, de bron
Er is geen reden voor dat alle constante variabelen openbaar zijn. Ze kunnen een implementatiedetail zijn zonder enige reden om helemaal openbaar te zijn.
toegevoegd de auteur juanchopanza, de bron
Nee, dat is helemaal niet het punt. Waarom iets openbaar maken dat de klant niet nodig heeft?
toegevoegd de auteur juanchopanza, de bron
Waarom iets openbaar maken dat niet openbaar hoeft te zijn? Het is een basisprincipe van OOP.
toegevoegd de auteur juanchopanza, de bron
@ ole_92 Het punt van toegangsspecificaties is zeker niet beperkt tot beveiliging, en afhankelijk van de definitie van beveiliging is het hoe dan ook jammerlijk ontoereikend voor dat doel. Toegangsspecificaties bieden ook een betere inkapseling door duidelijk te documenteren wat de openbare interface is.
toegevoegd de auteur congusbongus, de bron
@ ole_92 niet rechtstreeks, maar ze helpen inkapseling door de lezers duidelijk te vertellen dat ze geen deel uitmaken van de openbare interface. Als mensen een publiek constant zien, is het niet meteen duidelijk of ze zich daar zorgen over moeten maken of dat het een detail van de implementatie is. Er zijn redenen waarom dingen standaard privé zijn in C ++ en Java.
toegevoegd de auteur congusbongus, de bron

Als u de varibale of methode in andere klassen niet nodig hebt, maakt u deze niet openbaar. Dit geldt voor methoden en variabelen.

0
toegevoegd

Privévariabelen of -functies kunnen alleen worden gebruikt in de klasse waarin ze zijn gedeclareerd.

Openbare variabelen of functies kunnen overal in uw toepassing worden gebruikt.

Dus moet u privé al die variabelen en functies declareren die u ENKEL gaat gebruiken in de klas waartoe ze behoren.

Voorbeeld:

public class Car {
    private String model;

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

    public getModel() {
        return model;
    }

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

In de klasse Car verklaren we het String-model als privé omdat we het alleen in de klasse Car gaan gebruiken. Dit zorgt ervoor dat andere klassen de waarde van deze tekenreeks niet kunnen wijzigen zonder de functie setModel te gebruiken.

De functies setModel en getModel zijn openbaar, dus we kunnen ALLEEN via deze methoden toegang krijgen tot het privé-variabeliemodel van andere klassen.

In dit voorbeeld controleert de functie setModel of de waarde nul is. In dat geval wordt de waarde niet ingesteld. Hier kunt u zien dat als u het String-model openbaar had verklaard, u geen controle zou hebben over de waarde die wordt vastgelegd.

De functie doSomething is privé en andere klassen kunnen het niet gebruiken. Voor de andere kant, zoals deze functie privé is en deze tot dezelfde klasse behoort waar het String-model is, kan deze de waarde ervan veranderen zonder de methode setModel te gebruiken.

0
toegevoegd

Wanneer een methode door andere methoden (openbaar) van de klasse moet worden gebruikt en u niet wilt dat het object rechtstreeks toegang krijgt tot die methode, maken we die methode als privé.

En in sommige gevallen, als u rechtstreeks vanuit het klassenobject toegang wilt krijgen tot uw variabele, maak deze dan openbaar.

0
toegevoegd