<?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[Verletzung von Schnittstellen-Anforderungen: Wie behandeln?]]></title><description><![CDATA[<p>Grundsätzliches grübeln mal wieder:</p>
<pre><code class="language-cpp">// Modul.h:

class Modul{
      //...
   public:
      void Start(){ /*...*/ m_run=true; }
      void Stop() { /*...*/ m_run=flase; }
      //...
   private:
      bool m_run;
};
</code></pre>
<pre><code class="language-cpp">// main.cpp:

int main(void){

   Modul modul;
   modul.Start(); // Super, Modul läuft!

   //...
   modul.Start(); // Huch, läuft doch schon!

   //...
   modul.Stop();  // Aha, fertig also...

   //...
   modul.Stop();  // gestoppt, gestoppter, am gestopptesten?!
}
</code></pre>
<p>Folgende Möglichkeiten:</p>
<pre><code class="language-cpp">// Modul.cpp:
#include &lt;Modul.h&gt;
//...
void Modul::Start(){
   if(m_run) return; // Ignorieren
   //...
   m_run=true;
}
//...
</code></pre>
<pre><code class="language-cpp">// Modul.cpp:
#include &lt;Modul.h&gt;
//...
void Modul::Start(){
   if(m_run) throw ModulError(&quot;Modul bereits gestartet!&quot;); // Exception
   //...
   m_run=true;
}
//...
</code></pre>
<pre><code class="language-cpp">// Modul.cpp:
#include &lt;Modul.h&gt;
#include &lt;cassert&gt;
//...
void Modul::Start(){
   assert(!m_run); // Assert
   //...
   m_run=true;
}
//...
</code></pre>
<p>Welches Design ist am sinnvollsten?<br />
Ich würde zu assert tendieren, da das wiederholte Aufrufen der Funktionen ein Programmierfehler ist, der später im Release weg sein sollte.</p>
<p>Die Ignore-Variante wäre hier vielleicht auch möglich, aber man hat die zusätzliche if-Abfrage. Bin anderen Fällen wäre das Ignorieren auch nicht sinnvoll, da ein vielleicht ein Gedankenfehler des Aufrufers nicht bzw. erst später auftaucht.</p>
<p>Die Exception-Variante besitzt auch die ständige if-Abfrage.</p>
<p>Ich bin mir aber einfach nicht sicher...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/244638/verletzung-von-schnittstellen-anforderungen-wie-behandeln</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 23:47:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/244638.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 03 Jul 2009 09:13:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Fri, 03 Jul 2009 09:13:50 GMT]]></title><description><![CDATA[<p>Grundsätzliches grübeln mal wieder:</p>
<pre><code class="language-cpp">// Modul.h:

class Modul{
      //...
   public:
      void Start(){ /*...*/ m_run=true; }
      void Stop() { /*...*/ m_run=flase; }
      //...
   private:
      bool m_run;
};
</code></pre>
<pre><code class="language-cpp">// main.cpp:

int main(void){

   Modul modul;
   modul.Start(); // Super, Modul läuft!

   //...
   modul.Start(); // Huch, läuft doch schon!

   //...
   modul.Stop();  // Aha, fertig also...

   //...
   modul.Stop();  // gestoppt, gestoppter, am gestopptesten?!
}
</code></pre>
<p>Folgende Möglichkeiten:</p>
<pre><code class="language-cpp">// Modul.cpp:
#include &lt;Modul.h&gt;
//...
void Modul::Start(){
   if(m_run) return; // Ignorieren
   //...
   m_run=true;
}
//...
</code></pre>
<pre><code class="language-cpp">// Modul.cpp:
#include &lt;Modul.h&gt;
//...
void Modul::Start(){
   if(m_run) throw ModulError(&quot;Modul bereits gestartet!&quot;); // Exception
   //...
   m_run=true;
}
//...
</code></pre>
<pre><code class="language-cpp">// Modul.cpp:
#include &lt;Modul.h&gt;
#include &lt;cassert&gt;
//...
void Modul::Start(){
   assert(!m_run); // Assert
   //...
   m_run=true;
}
//...
</code></pre>
<p>Welches Design ist am sinnvollsten?<br />
Ich würde zu assert tendieren, da das wiederholte Aufrufen der Funktionen ein Programmierfehler ist, der später im Release weg sein sollte.</p>
<p>Die Ignore-Variante wäre hier vielleicht auch möglich, aber man hat die zusätzliche if-Abfrage. Bin anderen Fällen wäre das Ignorieren auch nicht sinnvoll, da ein vielleicht ein Gedankenfehler des Aufrufers nicht bzw. erst später auftaucht.</p>
<p>Die Exception-Variante besitzt auch die ständige if-Abfrage.</p>
<p>Ich bin mir aber einfach nicht sicher...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1736461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1736461</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Fri, 03 Jul 2009 09:13:50 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Fri, 03 Jul 2009 09:21:25 GMT]]></title><description><![CDATA[<p>Du könntest die Assertion und die Ignorieren-Methode auch kombinieren. So kriegst du beim Entwickeln die Assertion, und für alle Fälle gehts auch im Release-Build weiter, um Schlimmstes zu verhindern (falls halt mal fehlerhafter Code beim Kunden gelandet ist o.ä.)...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1736470</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1736470</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 03 Jul 2009 09:21:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Fri, 03 Jul 2009 10:35:50 GMT]]></title><description><![CDATA[<p>Stimmt, das wäre eine sichere Variante.</p>
<p>Besitzt eben nur den (geringen) Nachteil der zusätzlichen if-Abfrage.</p>
<p>Ist das eine gängige und oft anzutreffende Lösung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1736508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1736508</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Fri, 03 Jul 2009 10:35:50 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Fri, 03 Jul 2009 10:51:22 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>Ist das eine gängige und oft anzutreffende Lösung?</p>
</blockquote>
<p>Ich kann dir nur sagen, dass ich sowas schon öfter in unserem Source entdeckt habe. Teilweise aber auch in Bereichen, die noch nicht fertig programmiert sind und eigentlich nicht erreicht werden sollten. Wenn der Kunde es doch schafft, soll er soweit wie möglich weitermachen können. Wenn wir an diese Stelle kommen, sollen wir uns daran erinnern, dass da ja noch was zu tun war... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1736524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1736524</guid><dc:creator><![CDATA[_matze]]></dc:creator><pubDate>Fri, 03 Jul 2009 10:51:22 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Fri, 03 Jul 2009 11:07:09 GMT]]></title><description><![CDATA[<p>Beste/Sauberste Lösung wäre vermutlich, Starten und Beenden von sowas von vornherein wegzukapseln. Siehe RAII.<br />
Das hieße entweder, Start() und Stop() gleich in Konstruktor und Destruktor des Moduls zu integrieren, oder, wenn das nicht möglich ist (z.B. weil das Modul vor dem Starten ggf. noch Informationen verabreicht bekommt) eine eigene Klasse zu schreiben die das übernimmt. Skizze:</p>
<pre><code class="language-cpp">class Modul{
      //...
   public:
      void SetSomeParameters();
   protected:
      void Start(){ /*...*/ m_run=true; }
      void Stop() { /*...*/ m_run=flase; }
      //...
   private:
      bool m_run;
};

template &lt;class ModuleToRun&gt;
struct ModuleRunner : private ModuleToRun
{
  ModuleRunner(ModuleToRun const&amp; mtr) : ModuleToRun(mtr) { mtr.Start(); }
  ~ModuleRunner() {mtr.Stop(); }
};
</code></pre>
<p>In der Art wäre dann der ModuleRunner das eigentliche laufende Modul, die Klasse Modul wäre dann eher so eine Art Policy, die bestimmt <em>wie</em> es läuft. Man kanns auch über friends oder auf noch andere Arten lösen, aber ich denke die Grundidee wird klar: Start() udn Stop() nicht mehr frei aufrufen lassen sondern kontrolliert je genau einmal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1736540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1736540</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 03 Jul 2009 11:07:09 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Fri, 03 Jul 2009 12:40:48 GMT]]></title><description><![CDATA[<p>Wenn Modul::stop() aufgerufen wird, so wird doch nur m_run auf false gesetzt. Danach ist das Modul im Zustand STOP. Wenn nochmals Modul::stop() aufgerufen wird, warum sollte es da Ueberpruefen ob es schon im Zustand STOP ist? Oder gar eine Exception werfen? Eindeutig ein Designfehler! Wenn man etwas stopt, das sich schon in Ruhe befindet, so bleibt es in Ruhe. D.h. Stop sollte nur m_run setzen und sonst nichts anderes. Ich persoenlich modeliere solche Sachen meist als Moore-Automat (seltener als Mealy-Automat).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1736609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1736609</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 03 Jul 2009 12:40:48 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Tue, 07 Jul 2009 05:06:17 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Modul{
      //...
   public:
      void SetSomeParameters();
   protected:
      void Start(){ /*...*/ m_run=true; }
      void Stop() { /*...*/ m_run=flase; }
      //...
   private:
      bool m_run;
};

template &lt;class ModuleToRun&gt;
struct ModuleRunner : private ModuleToRun
{
  ModuleRunner(ModuleToRun const&amp; mtr) : ModuleToRun(mtr) { mtr.Start(); }
  ~ModuleRunner() {mtr.Stop(); }
};
</code></pre>
</blockquote>
<p>Das ist eine gute Idee, pumuckl!</p>
<p>Nur verstehe ich das Beispiel noch nicht ganz: Muss ModuleRunner nicht public von ModuleToRun erben? Und dann hat man das Problem, dass man nur mit einer Kopie von Module arbeitet, statt das Module-Objekt selbst zu starten, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738293</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Tue, 07 Jul 2009 05:06:17 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Tue, 07 Jul 2009 05:37:06 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>Nur verstehe ich das Beispiel noch nicht ganz: Muss ModuleRunner nicht public von ModuleToRun erben?</p>
</blockquote>
<p>Nein, warum?</p>
<blockquote>
<p>Und dann hat man das Problem, dass man nur mit einer Kopie von Module arbeitet, statt das Module-Objekt selbst zu starten, oder?</p>
</blockquote>
<p>In dem Beispiel stimmt sowieso etwas nicht: Der Parameter mtr wird an die Basis übergeben (in sie kopiert) und dann gestartet. Damit bleibt das Modul-Objekt in der Basis aber ungestartet. Im Destruktor wird ein Objekt mtr benutzt, welches es an dieser Stelle garnicht gibt, da die Klasse keine Membervariablen hat.</p>
<p>Das könnte man wie folgt lösen:</p>
<pre><code class="language-cpp">template &lt;class ModuleToRun&gt;
struct ModuleRunner
{
  // keine const Referenz mehr, da temporäre Objekte nicht lange genug leben würden
  ModuleRunner(ModuleToRun&amp; mtr) : m_mtr(&amp;mtr) { m_mtr-&gt;Start(); }
  ~ModuleRunner() {m_mtr-&gt;Stop(); }

private:
  ModuleToRun* m_mtr;

  // Hinweis: auch noch eine gute Idee: Kopieren verbieten
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738301</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 07 Jul 2009 05:37:06 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Tue, 07 Jul 2009 05:52:20 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Das könnte man wie folgt lösen:</p>
<pre><code class="language-cpp">template &lt;class ModuleToRun&gt;
struct ModuleRunner
{
  // keine const Referenz mehr, da temporäre Objekte nicht lange genug leben würden
  ModuleRunner(ModuleToRun&amp; mtr) : m_mtr(&amp;mtr) { m_mtr-&gt;Start(); }
  ~ModuleRunner() {m_mtr-&gt;Stop(); }

private:
  ModuleToRun* m_mtr;

  // Hinweis: auch noch eine gute Idee: Kopieren verbieten
};
</code></pre>
</blockquote>
<p>Auch das ist irgendwo Käse. Wenn du Kopien vermeiden willst, muss mtr auf den Heap. Dann sollte man wegen Vermeidung von Mißverständnissen auch direkt nen Pointer im Konstruktor angeben. Sonst kommt jemand auf den Gedanken, und erstellt mtr auf dem Stack, mit fatalen Folgen für m_mtr, denn der Zeiger wird dann ungültig...</p>
<p>Es kommt halt jetzt drauf an. Sind das wirklich Module im Sinne von Plugin? Oder steht zur Compilezeit fest, welche Module mit rein kompiliert werden? Dann kannst du es über Template und Inheritance machen. Wenn noch andere Methoden außer start und stop zur Verfügung stehen, brauchts ne Public inheritance, außer du stellst diese in ModuleRunner selber noch mal zur Verfügung (fänd ich komisch).</p>
<p>Wenn du dich für den Member entscheidest, musst du dann natürlich auch eine Methode anbieten um auf diesen zugreifen zu können (klar...).<br />
Und dafür brauchst du kein Template, wenn du Modul von ModulAbstractInterface oder so erben lässt.<br />
Wenn du templates verwenden willst, lass doch den Parameter für den Konstruktor komplett weg und überlass der Templateklasse das Erstellen und Zerstören des Modul-Members.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738304</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Tue, 07 Jul 2009 05:52:20 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Tue, 07 Jul 2009 06:00:24 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Auch das ist irgendwo Käse. Wenn du Kopien vermeiden willst, muss mtr auf den Heap. Dann sollte man wegen Vermeidung von Mißverständnissen auch direkt nen Pointer im Konstruktor angeben. Sonst kommt jemand auf den Gedanken, und erstellt mtr auf dem Stack, mit fatalen Folgen für m_mtr, denn der Zeiger wird dann ungültig...</p>
</blockquote>
<p>Auch bei einem Zeiger im Konstruktor kann ich die Adresse eines Stack-Objekts übergeben. Was im Übrigen nichtmal schlimm ist, das Objekt muss nur länger leben als der Runner. Käse ists trotzdem, da muss ich Dir recht geben, eben weil die Lebensdauer schlecht kontrollierbar ist.</p>
<p>Wenn man das Modul absolut nicht als Bestandteil der Klasse (sei es als Member oder Basis) haben möchte, wäre noch ein shared_ptr&lt; Modul &gt; (oder weak) denkbar. Wenn den jemand mit einem Stack-Objekt initialisieren möchte, muss er sich explizit Gedanken über die Lebensdauer machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738307</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Tue, 07 Jul 2009 06:00:24 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Tue, 07 Jul 2009 06:05:24 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Roger Wilco schrieb:</p>
<blockquote>
<p>Nur verstehe ich das Beispiel noch nicht ganz: Muss ModuleRunner nicht public von ModuleToRun erben?</p>
</blockquote>
<p>Nein, warum?</p>
</blockquote>
<p>Gedankenfehler... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>l'abra d'or schrieb:</p>
<blockquote>
<p>Es kommt halt jetzt drauf an. Sind das wirklich Module im Sinne von Plugin? Oder steht zur Compilezeit fest, welche Module mit rein kompiliert werden?</p>
</blockquote>
<p>Es ist mehr grundsätzlich. Konkret habe ich das z.B. bei einer Timer-Klasse, bei der ich das mehrmalige Starten/Stoppen verhindern möchte und bei Anwendungsmodulen, die bei Programmstart je nach Fall (Aufrufparameter) als Konsolenanwendung oder als Windows-Dienst geladen werden sollen. Dabei möchte ich mich davon freimache, wie (Umgebung) der eigentlich Programmcode läuft. Das sollen die Starter-Klassen machen (Konsole anlegen oder Windows-Dienst-typische Aktionen).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738310</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Tue, 07 Jul 2009 06:05:24 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Tue, 07 Jul 2009 15:01:55 GMT]]></title><description><![CDATA[<p>Folgender Code läuft bei mir problemlos (VC 6.0).</p>
<p>Nun wollte ich fragen, ob er überhaupt Standard-konform ist, da ich widersprüchliche Sachen bezüglich virtuelle Member-Funktionen von Template-Klassen gelesen habe. Sind die (rein) virtuelle Funktionen in Template-Klassen gestattet? Es funktioniert, aber ist das nur Zufall bzw. liegt es an der Nicht-Standard-Konformität meiner IDE?</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class Module{
    public:
        Module(){}
        ~Module(){}

    public:
        void Start(){ Thread::Start(&amp;ThreadEntry, this); }
        virtual void Stop() = 0;

    protected:
        struct implementation;
        boost::shared_ptr&lt;implementation&gt; m_impl;

    private: // Einstiegsfunktion für Thread
        static unsigned int __stdcall ThreadEntry(void* param){
            static_cast&lt;T*&gt;(param)-&gt;Run();
            return 0;
        }
};
</code></pre>
<pre><code class="language-cpp">template&lt;class TModule&gt;
struct ModuleRunner{
    ModuleRunner(Module&lt;TModule&gt;&amp; module){ module.Start(); }
    ~ModuleRunner(){ Stop(); }

    void Stop(){ module.Stop(); }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1738673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738673</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Tue, 07 Jul 2009 15:01:55 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Wed, 08 Jul 2009 00:56:31 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>Sind die (rein) virtuelle Funktionen in Template-Klassen gestattet?</p>
</blockquote>
<p>Ja. Klassentemplates sind nur Vorlagen für Klassen; wenn du die Templateparameter einsetzt, entstehen daraus ganz normale Klassen.</p>
<p>Trotzdem rate ich dir davon ab, MSVC++ 6 weiterhin zu verwenden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738928</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738928</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 08 Jul 2009 00:56:31 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Wed, 08 Jul 2009 05:36:04 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Trotzdem rate ich dir davon ab, MSVC++ 6 weiterhin zu verwenden.</p>
</blockquote>
<p>Ja, ich würde gerne umsteigen, darf es aber (noch) nicht.</p>
<p>Wenn Du mir Gründe gibst, womit ich meinen Vorgesetzten überzeugen kann, möglichst fix umzusteigen, wäre ich Dir dankbar.</p>
<p>Er schreibt selber seit 20 Jahren C bzw. C++ im Klassen-C-Stil, kennt und nutzt nicht die Standardbibliothek sondern exzessiv die Assistenten von VC++6.0 und MFC/ATL/COM. VC6.0 reicht ihm vollkommen aus (er nutzt nicht einmal eine neue SDK von MS) und als ich ihm mal eine VS2008-Demo zeigte, musste er nur verbittert feststellen, dass seine Programme mit VS2008 nicht mehr kompilieren und die Assistenten ganz anderen Code erzeugen.</p>
<p>Wenn ich Probleme habe, sagt er mir, ich muss ja nicht unbedingt alle Sprachfeatures ausreizen, sondern soll es lieber &quot;einfach&quot; und im C-Stil machen.</p>
<p>Ich muss dazu sagen, dass wir hier mehr technische Software programmieren, die meist als Konsolenanwedung oder Windows-Dienst laufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1738943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1738943</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Wed, 08 Jul 2009 05:36:04 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Wed, 08 Jul 2009 12:45:06 GMT]]></title><description><![CDATA[<p>Du hast ja bereits einige Gründe genannt (modernes standardkonformes C++, Verwendung der Standardbibliothek), aber wenn dein Vorgesetzter derart stur ist, kann man wohl nicht viel machen.</p>
<p>Du kannst versuchen, ihm weiszumachen, wie veraltet VC 6 ist, was für Bugs die IDE besitzt, und welche Errungenschaften von schönem C++ einem dabei entgehen. Aber wie gesagt, keine Ahnung, obs hilft... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739183</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739183</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 08 Jul 2009 12:45:06 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Wed, 08 Jul 2009 14:29:23 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Du kannst versuchen, ihm weiszumachen, wie veraltet VC 6 ist, was für Bugs die IDE besitzt, und welche Errungenschaften von schönem C++ einem dabei entgehen. Aber wie gesagt, keine Ahnung, obs hilft... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Die Kompatibilität zu seinem alten VC6.0-Code ist ihm wichtiger als die Standard-Konformität, da er wie gesagt eh nicht die Standardbibliothek nutzt. Er nutzt lieber MFC/ATL und findet diese &quot;einfacher&quot;...</p>
<p>Es wäre gut eine Quelle zu haben, wo mal einige Bugs und Verbesserungen aufgezählt werden. Ich weiß ja auch nichts genaues, außer dass VC6.0 nicht Standard-Konform ist.</p>
<p>Er sieht halt nur das Geld und sieht für sich keinen Vorteil. Ganz im Gegenteil: Für ihn bedeutet es, dass sein Code entweder portiert werden muss oder dass wir zwei IDEs (6.0 + 9.0) parallel haben müssen. Beides ist mit Zeit und Kosten verbunden.</p>
<p>Was soll ich zu den Argument sagen: &quot;Dann benutze halt MFC, wenn es Probleme mit der Standardbibliothek gibt!&quot; Wie soll ich mit Standard-C++ gegen MFC anstinken, wenn Portabilität keine Bedeutung bei uns hat.</p>
<p>Wenn ich sage, dass MFC ebenfalls einen ordentlichen Versionssprung gemacht hat, sagt er wieder: &quot;Ach, die blähen das mit unnötigen Ballast auf, um nur was neues verkaufen zu können!&quot;</p>
<p>Wenn ich sage, dass ab Feb. 2003 keine PSDK von MS VC6.0 mehr unterstützt und alle neuen WinAPI-Funktionen damit nicht nutzbar sind für uns, entgegnet er, dass man alles auch mit der alten SDK (die mitgelieferte bei VC6.0!) und den alten WinAPI-Funktionen machen kann, da die i.d.R. weiterhin unterstützt werden.</p>
<p>Er kommt halt aus der Assembler und C-Welt und ich finde einfach noch nichts, wo ich sagen kann: Für den Aufwand und das Geld bekommen wir die und die Vorteile.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739226</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Wed, 08 Jul 2009 14:29:23 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Wed, 08 Jul 2009 14:35:46 GMT]]></title><description><![CDATA[<p>Bei so uneinsichtigen Menschen würde ich mit schon überlegen ob ich dort arbeiten möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739229</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739229</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Wed, 08 Jul 2009 14:35:46 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Wed, 08 Jul 2009 14:49:53 GMT]]></title><description><![CDATA[<p>Sowas nennt man beratungsresistent. Fuer gewoehnlich werden solche Organismen verbrannt. Fire him! Dieser Artikel ist vielleicht recht interessant: <a href="http://www.paulgraham.com/icad.html" rel="nofollow">http://www.paulgraham.com/icad.html</a> . Im Abschnitt &quot;The Cost of Being Average&quot; wird dargelegt, was es ausmachen kann, sich gegen neue Tools, Sprachen oder Technologien zu straeuben. Auch kann man gerade im Bereich Software nicht stillstehen. In <a href="http://www.paulgraham.com/avg.html" rel="nofollow">http://www.paulgraham.com/avg.html</a> werden Programmiersprachen verglichen, aber es kann auch allgemeiner fuer Technologien verstanden werden. Ist alles recht Lisplastig, aber ich hoffe das stoert nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739236</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739236</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 08 Jul 2009 14:49:53 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Wed, 08 Jul 2009 15:20:40 GMT]]></title><description><![CDATA[<p>Wäre interessant herauszufinden ob die alte WinAPI in Vista und dem Kommenden Win7 noch komplett unterstützt wird. Denn spätestens wenn seine 90er-Jahre Programme schlichtweg nichtmehr laufen ist es für ihn an der Zeit sich umzustellen (oder sich auf den Altenteil zurückzuziehen, weil er mit dem Alter scheinbar recht unflexibel geworden ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739248</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 08 Jul 2009 15:20:40 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Wed, 08 Jul 2009 15:36:38 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>...entgegnet er, dass man alles auch mit der alten SDK (die mitgelieferte bei VC6.0!) und den alten WinAPI-Funktionen machen kann, da die i.d.R. weiterhin unterstützt werden.</p>
</blockquote>
<p>Und damit liegt er extrem verkehrt. Er hat wohl nur noch nicht Kunden mit neuen Windowsversionen oder benötigt bestimmte API-Funktionen nicht. Ich kenne solche Probleme, auch wenn mein damaliger Programmierchef dann mit einigen dreckigen Hacks an den Problemen vorbei gearbeitet hat. Interessanterweise sind da wahre Stresssituationen entstanden (Ich hatte den Support recht früh gebeten Vista mit zu testen, doch erst als ein Kunde Probleme hatte wurde dies tatsächlich gemacht).</p>
<p>Viel Spaß wenn dann &quot;urplötzlich&quot; und &quot;unerwartet&quot; bestimmte - teilweise schon im VC6 als deprecated markierte - API-Funktionen nicht mehr das tun, was sie sollen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739257</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739257</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 08 Jul 2009 15:36:38 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Wed, 08 Jul 2009 15:37:48 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Wäre interessant herauszufinden ob die alte WinAPI in Vista und dem Kommenden Win7 noch komplett unterstützt wird.</p>
</blockquote>
<p>Wird sie nicht. Bereits mit Vista (und ich glaube auch XP) gibt es einige API-Befehle die nicht mehr unbedingt laufen (frag mich aber nicht nach den konkreten, ist schon etwas her).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739259</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 08 Jul 2009 15:37:48 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Thu, 09 Jul 2009 06:35:10 GMT]]></title><description><![CDATA[<p>Tja, danke für Euren Beistand. Leicht ist es wirklich nicht, aber andererseits: Wie würdet Ihr reagieren, wenn Ihr mit 20 Jahren Programmiererfahrung (und bis jetzt habt Ihr alles mit Euren Mitteln auch wunderbar hinbekommen), dann ein Frischling kommt und nach einem halben Jahr plötzlich alles anders machen möchte?</p>
<p>Erstmal muss man sich beweisen und aufzeigen, dass die neue Programmiertechnik auch effektiven Code erzeugt. So ein Beweis bleib ich ihm noch schuldig.</p>
<p>Bis dahin stört er sich an meine C++-Konstrukte und möchte mich zum C-Stil bewegen. &quot;Warum so kompliziert? Mach es doch ganz einfach mit #definies. Das versteht dann auch jeder...! Und nicht so viele '::', da muss man ja mit dem Debugger durch, um das zu verstehen...!&quot;</p>
<pre><code class="language-cpp">Log::CLogFile logFile(fileName, Log::CLogFile::FileSize::MB(5)); // Logfile mit max. 5MB Größe
</code></pre>
<pre><code class="language-cpp">#define LOG_FILE_NAME _T(&quot;Test.log&quot;)
#define LOG_FILE_SIZE 5000000 //ca. 5MB
//...
CLogFile logFile(LOG_FILE_NAME, LOG_FILE_SIZE);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1739495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739495</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Thu, 09 Jul 2009 06:35:10 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Thu, 09 Jul 2009 07:32:07 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>Tja, danke für Euren Beistand. Leicht ist es wirklich nicht, aber andererseits: Wie würdet Ihr reagieren, wenn Ihr mit 20 Jahren Programmiererfahrung (und bis jetzt habt Ihr alles mit Euren Mitteln auch wunderbar hinbekommen), dann ein Frischling kommt und nach einem halben Jahr plötzlich alles anders machen möchte?</p>
</blockquote>
<p>Ich würde anfangen mich zu fragen, ob ich mich in den letzten 20 Jahren vielleicht zu sehr auf meinen Lorbeeren ausgeruht habe. Mein ehemaliger Chef war, bevor er letzten Monat mit 61 in den Ruhestand ging, nicht so drauf wie Dein Vorgesetzter <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<blockquote>
<p>Erstmal muss man sich beweisen und aufzeigen, dass die neue Programmiertechnik auch effektiven Code erzeugt. So ein Beweis bleib ich ihm noch schuldig.</p>
</blockquote>
<p>Das wüsste er, wenn er den Anschluß behalten hätte. Wenigstens im Bereich derjenigen Sprachen, die er selbst nutzt.</p>
<pre><code class="language-cpp">Log::CLogFile logFile(fileName, Log::CLogFile::FileSize::MB(5)); // Logfile mit max. 5MB Größe
</code></pre>
<p>Dann komm ihm bloß nicht mit sowas: <code>FileSize::MegaByte&lt;5&gt;::value</code> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739516</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739516</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 09 Jul 2009 07:32:07 GMT</pubDate></item><item><title><![CDATA[Reply to Verletzung von Schnittstellen-Anforderungen: Wie behandeln? on Thu, 09 Jul 2009 08:04:23 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>...aber andererseits: Wie würdet Ihr reagieren, wenn Ihr mit 20 Jahren Programmiererfahrung..., dann ein Frischling kommt und nach einem halben Jahr plötzlich alles anders machen möchte?</p>
</blockquote>
<p>Wie wäre es mit folgenden Möglichkeiten:<br />
a) Feststellen das man etwas aufzuarbeiten hat (Damit hatte aber bereits mein etwa 45jähriger Vorgesetzte Probleme, der hat das lernen imho mit 25 weitgehend aufgegeben).<br />
b) Als Neuling: Vielleicht nach einer besseren Stelle umsehen.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739533</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 09 Jul 2009 08:04:23 GMT</pubDate></item></channel></rss>