Privát adatosztály minta
A privát adatosztály minta egy szerkezeti programtervezési minta. Célja, hogy a privát adatokat úgy elrejtse, hogy azokról senki más ne tudjon. Nevezik pimpl mintának vagy opaque (átlátszatlan) pointernek is.
A privát adatokat egyetlen adat objektumba csomagolja, ezzel csökkenti az attributumok számát. Az osztály készítője dönthet arról, hogy még az osztály metódusai se tudják írni azokat az adattagokat, amelyek konstansok, de ez nincs deklarálva, például azért, hogy a konstruktor többször is beállíthassa. Ez a minta egyik motivációja.
Egy másik motivációja az, hogy egy osztály (A) tudhat egy másik osztály (B) privát adattagjairól. Ez a tudása fölösleges, hiszen amúgy sem tudja közvetlenül elérni őket, viszont ezek változásakor nemcsak a B osztályt, hanem az A osztályt is újra kell fordítani. A minta alkalmazásával ez a tudás és függés a privát adattagoktól nem létezik, a privát adattagok változásával a program binárisan kompatibilis marad az előző verzióval.
Résztvevők: a burkoló osztály és az adatosztály. Az adatosztály nem érhető el közvetlenül kívülről, hanem csak a burkoló osztály publikus függvényeivel. A burkoló osztály adatlekérői és beállítói delegálják a kérést az adat osztálynak. Maga a burkoló osztály az adat osztály getter és szetter függvényein keresztül érheti el a privát adattagjait. Egyes változatokban az adatosztály függvényeket is tartalmaz, amiket a burkoló osztály meghívhat, de mások nem.
A minta használatának következményei:
- Új konstans típus: konstruktor után konstans.
- Erősebb ellenőrzés az osztály privát adattagjaihoz való hozzáférést tekintve.
- Adatok és metódusok elkülönítése.
- Adat inicializáció egységbe zárása.
Példa
szerkesztésA következő C# példa a minta alkalmazására:
public class Circle
{
private double radius;
private Color color;
private Point origin;
public Circle(double radius, Color color, Point origin)
{
this.radius = radius;
this.color = color;
this.origin = origin;
}
public double Circumference
{
get { return 2 * Math.PI * this.radius; }
}
public double Diameter
{
get { return 2 * this.radius; }
}
public void Draw(Graphics graphics)
{
//...
}
}
A példában szereplő radius, color, és origin nem változhatnak a Circle() konstruktor hívása után. Láthatóságukat a private módosító korlátozza, de a Circle osztály metódusai még mindig hozzáférhetnek.
Az attribnutumok fölösleges láthatósága fölösleges kapcsolatot hoz létre metódusok között. A minta lehetővé teszi a láthatóság további csökkentését és a kapcsolatok gyengítését:
public class CircleData
{
private double radius;
private Color color;
private Point origin;
public CircleData(double radius, Color color, Point origin)
{
this.radius = radius;
this.color = color;
this.origin = origin;
}
public double Radius
{
get { return this.radius; }
}
public Color Color
{
get { return this.color; }
}
public Point Origin
{
get { return this.origin; }
}
}
public class Circle
{
private CircleData circleData;
public Circle(double radius, Color color, Point origin)
{
this.circleData = new CircleData(radius, color, origin);
}
public double Circumference
{
get { return 2 * this.circleData.Radius * Math.PI; }
}
public double Diameter
{
get { return this.circleData.Radius * 2; }
}
public void Draw(Graphics graphics)
{
//...
}
}
Most a Circle osztály CircleData típusú adattagja foglalja magában azokat az adattagokat, amiket korábban a Circle metódusai kezeltek. A mostani elrendezésben csak a konstruktor tudja őket beállítani, a metódusok nem.
Ismert példák
szerkesztésA Qt keretrendszer használja a mintát megosztott könyvtáraiban.[1] A beágyazó osztálynak van d-pointere az adatosztályra.
Jegyzetek
szerkesztésForrások
szerkesztésFordítás
szerkesztésEz a szócikk részben vagy egészben a Private class data pattern című angol Wikipédia-szócikk fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.