<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Strategy-Pattern: Kapselung verbessern]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie ihr ja sicherlich schon gemerkt habe, bin ich bezüglich Design-Patterns nicht so ganz fit. Gerade probiere ich mich am Strategy-Pattern aus. Mal angenommen ich habe eine Klasse die vielerlei Eigenschaften hat und allerhand kann. Um mal das klassische Autobeispiel zu strapazieren:</p>
<pre><code class="language-cpp">class Auto
{
private:
  Gaspedal gaspedal;
  Klimaanlage klimaanlage;
  Radio radio;
  Lenkrad lenkrad;
  Handschuhfach handschuhfach;
  Gangschaltung gangschaltung;
  Sitz fahrersitz;
  Sitz beifahrersitz;
  Gurt fahrergurt;
  Gurt beifahrergurt;
};
</code></pre>
<p>So, nun benutze ich das Strategy-Pattern, um diese Dinge zu benutzen:</p>
<pre><code class="language-cpp">class Auto
{
private:
  Gaspedal gaspedal;
  Klimaanlage klimaanlage;
  Radio radio;
  Lenkrad lenkrad;
  Handschuhfach handschuhfach;
  Gangschaltung gangschaltung;
  Sitz fahrersitz;
  Sitz beifahrersitz;
  Gurt fahrergurt;
  Gurt beifahrergurt;

  Fahrer *fahrer;
  Beifahrer *beifahrer;

public:
  void einsteigen(Fahrer *f) {fahrer = f;}
  void einsteigen(Beifahrer *f) {beifahrer = b;}
  void fahre_zu_ziel(Ziel ziel)
  {
    fahrer-&gt;fahre(ziel, this);
    beifahrer-&gt;mitfahren(this);
  }
};

class Fahrer
{
public:
  virtual void fahre(Ziel, Auto*)=0;
};

class Sonntagsfahrer: public Fahrer
{
  virtual void fahre(Ziel ziel ,Auto *auto)
  {
    // Braucht gaspedal, klimaanlage, radio, lenkrad, handschuhfach, gangschaltung, fahrersitz, fahrergurt
  }
};

class Beifahrer
{
public:
  virtual void mitfahren(Auto*)=0;
};

class Quaengelige_Schwiegermutter: public Beifahrer
{
  virtual void mitfahren(Auto *auto)
  {
    // Braucht klimaanlage, radio, handschuhfach, beifahrersitz, beifahrergurt
  }
};
</code></pre>
<p>Und jetzt habe ich ein Problem mit der Kapselung: Und zwar brauchen die ganzen konkreten Strategien allerlei Zugriff auf die Eigenschaften der Klasse. Wie macht man das üblicherweise?</p>
<ul>
<li>Ich übergebe alles per Parameter, wie es gedacht ist. Nachteil: Elendig lange Liste, wartungsaufwändig.</li>
<li>Ich schreibe Wrappermethoden in der Klasse Auto, welche die Methoden der Member weitergeben. Z.B.:</li>
</ul>
<pre><code class="language-cpp">void Auto::schalte_hoch() {++gangschaltung;}
</code></pre>
<p>Nachteil: Sehr wartungsaufwändig. Außerdem: Verlust der Kapselung. <code>class Fußgänger</code> braucht keinen Zugriff auf die Gangschaltung eines vorbeifahrenden Autos</p>
<ul>
<li>Ich mache alles public. Vorteil: Weniger Wartung. Nachteil: Siehe oben</li>
<li>Ich mache Auto oder Gangschaltung friend zu den Strategien. Vorteil: Kapselung wird nur so weit wie nötig verletzt. Nachteil: Trotzdem ganz schön viel Kapselung verloren. Fahrer könnten theoretisch in anderen Autos die Gänge wechseln. Außerdem sehr wartungsaufwändig, weil friendship nicht vererbt wird</li>
</ul>
<p>Irgendwie habe ich das Gefühl, dass ich hier irgendwas ganz primitives übersehen habe oder dass ich irgendwas an der Methode nicht richtig verstanden habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270636/strategy-pattern-kapselung-verbessern</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 01:15:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270636.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 15 Jul 2010 14:43:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Strategy-Pattern: Kapselung verbessern on Thu, 15 Jul 2010 16:07:10 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>wie ihr ja sicherlich schon gemerkt habe, bin ich bezüglich Design-Patterns nicht so ganz fit. Gerade probiere ich mich am Strategy-Pattern aus. Mal angenommen ich habe eine Klasse die vielerlei Eigenschaften hat und allerhand kann. Um mal das klassische Autobeispiel zu strapazieren:</p>
<pre><code class="language-cpp">class Auto
{
private:
  Gaspedal gaspedal;
  Klimaanlage klimaanlage;
  Radio radio;
  Lenkrad lenkrad;
  Handschuhfach handschuhfach;
  Gangschaltung gangschaltung;
  Sitz fahrersitz;
  Sitz beifahrersitz;
  Gurt fahrergurt;
  Gurt beifahrergurt;
};
</code></pre>
<p>So, nun benutze ich das Strategy-Pattern, um diese Dinge zu benutzen:</p>
<pre><code class="language-cpp">class Auto
{
private:
  Gaspedal gaspedal;
  Klimaanlage klimaanlage;
  Radio radio;
  Lenkrad lenkrad;
  Handschuhfach handschuhfach;
  Gangschaltung gangschaltung;
  Sitz fahrersitz;
  Sitz beifahrersitz;
  Gurt fahrergurt;
  Gurt beifahrergurt;

  Fahrer *fahrer;
  Beifahrer *beifahrer;

public:
  void einsteigen(Fahrer *f) {fahrer = f;}
  void einsteigen(Beifahrer *f) {beifahrer = b;}
  void fahre_zu_ziel(Ziel ziel)
  {
    fahrer-&gt;fahre(ziel, this);
    beifahrer-&gt;mitfahren(this);
  }
};

class Fahrer
{
public:
  virtual void fahre(Ziel, Auto*)=0;
};

class Sonntagsfahrer: public Fahrer
{
  virtual void fahre(Ziel ziel ,Auto *auto)
  {
    // Braucht gaspedal, klimaanlage, radio, lenkrad, handschuhfach, gangschaltung, fahrersitz, fahrergurt
  }
};

class Beifahrer
{
public:
  virtual void mitfahren(Auto*)=0;
};

class Quaengelige_Schwiegermutter: public Beifahrer
{
  virtual void mitfahren(Auto *auto)
  {
    // Braucht klimaanlage, radio, handschuhfach, beifahrersitz, beifahrergurt
  }
};
</code></pre>
<p>Und jetzt habe ich ein Problem mit der Kapselung: Und zwar brauchen die ganzen konkreten Strategien allerlei Zugriff auf die Eigenschaften der Klasse. Wie macht man das üblicherweise?</p>
<ul>
<li>Ich übergebe alles per Parameter, wie es gedacht ist. Nachteil: Elendig lange Liste, wartungsaufwändig.</li>
<li>Ich schreibe Wrappermethoden in der Klasse Auto, welche die Methoden der Member weitergeben. Z.B.:</li>
</ul>
<pre><code class="language-cpp">void Auto::schalte_hoch() {++gangschaltung;}
</code></pre>
<p>Nachteil: Sehr wartungsaufwändig. Außerdem: Verlust der Kapselung. <code>class Fußgänger</code> braucht keinen Zugriff auf die Gangschaltung eines vorbeifahrenden Autos</p>
<ul>
<li>Ich mache alles public. Vorteil: Weniger Wartung. Nachteil: Siehe oben</li>
<li>Ich mache Auto oder Gangschaltung friend zu den Strategien. Vorteil: Kapselung wird nur so weit wie nötig verletzt. Nachteil: Trotzdem ganz schön viel Kapselung verloren. Fahrer könnten theoretisch in anderen Autos die Gänge wechseln. Außerdem sehr wartungsaufwändig, weil friendship nicht vererbt wird</li>
</ul>
<p>Irgendwie habe ich das Gefühl, dass ich hier irgendwas ganz primitives übersehen habe oder dass ich irgendwas an der Methode nicht richtig verstanden habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926745</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 15 Jul 2010 16:07:10 GMT</pubDate></item></channel></rss>