2011-01-13 3 views
29

In letzter Zeit verliere ich mein Vertrauen in OOP. Ich habe schon viele Beschwerden über häufige OOP-Missbrauch oder einfach übermäßiger Gebrauch gesehen. Ich nicht bedeuten die gemeinsame Verwirrung zwischen ist-a und hat-eine Beziehung. Ich meine Zeug wie die Probleme von ORM im Umgang mit relationalen Datenbanken, die übermäßige Verwendung der Vererbung von C# und auch mehrere Jahre der Suche bei Code mit der gleichen falschen Verkapselung Glauben, dass Scott Meyers Erwähnungen in Artikel 23 von Effective C++Symptome und Alternativen zu überstrapaziert OOP

Ich bin daran interessiert, mehr über diese und nicht OOP-Software Muster zu lernen, die bestimmte Probleme besser lösen können als ihre OOP Pendants. Ich bin davon überzeugt, dass da draußen viele Leute sind geben gute Ratschläge, wie dies als ein Vorteil mit nicht reinen OOP Sprachen wie C++ zu verwenden.

Kennt jemand eine gute Referenz (Autor, Buch, Artikel), um gestartet zu bekommen?

Bitte beachten Sie, dass ich suche zwei verwandte, aber verschiedene Dinge:

  • Gemeinsame Mißbräuche von OOP-Konzepte (wie Artikel 23)
  • Patterns wo OOP ist nicht die beste Lösung (mit Alternativen)
+1

Exzessive Nutzung der Vererbung ?? Was ist das? –

+7

Verwenden Sie Vererbung, wo Aggregation besser zu verwenden ist. – dzendras

+0

relationale Datenbanken haben ihre eigenen Probleme, deshalb entwickeln T-SQL und ähnliche in volle Sprachen, Sie können Java SQL Server-Prozeduren schreiben usw. Außerdem gibt es gute ORMs, ich habe mich sehr brauchbar geschrieben. und +1 für Noahs Kommentar, wirklich, was ist exzessiver Gebrauch der Vererbung ?! – peenut

Antwort

3

Nun, ich kann Ihnen ein Buch Agile Principles, Patterns, and Practices in C# empfehlen. Beispiele sind in C# natürlich, aber die Idee des Buches ist universell. Es deckt nicht nur Agile ab, sondern konzentriert sich auch auf schlechte Praktiken und zeigt in Beispielen, wie man schlechten Code in einen guten Code umwandelt. Es enthält auch Beschreibungen vieler Entwurfsmuster und zeigt, wie sie in einem semi-reellen Beispiel einer Payroll-Anwendung implementiert werden.

0

Ich würde sagen, Game Engines zu betrachten. Meistens hat OOP eine Tendenz, leichte Leistungseinbußen zu verursachen, und die Spieleindustrie ist anscheinend besessen davon, leichte Verlangsamungen zu beseitigen (und manchmal große zu ignorieren). Daher wird ihr Code, obwohl er normalerweise in einer Sprache geschrieben wird, die OOP unterstützt, nur die Elemente von OOP verwenden, die für einen sauberen Code/Wartungsfreundlichkeit erforderlich sind, der auch die Leistung ausgleicht.

EDIT:

auch sagen, dass ich nicht weiß, ob ich wirklich auf Unreal aussehen gehen würde. Sie machen einige seltsame Dinge, um ihre Content-Pipeline für Entwickler einfacher zu machen ... sie macht ihren Code ... nun, schau, ob du es wirklich wissen willst.

+1

Die Spieleindustrie ist weitgehend davon besessen, welches Programmierparadigma vor 15 Jahren cool war, weil sie es jetzt nicht mehr als "zu langsam" empfinden. – jalf

+0

yep jalf, das liegt daran, dass sie jetzt alle über OO sind :) – jsz

2

Dies muss getan werden, aber wenn Sie wirklich von OOP wegkommen oder zumindest Konzepte betrachten möchten, die nicht OOP sind, aber mit großer Effektivität verwendet werden: Learn you a Haskell. Probieren Sie ein neues Programmierparadigma aus und sehen Sie dann, wo Sie viele der Konzepte wieder auf OOP-Sprachen anwenden können. Das spricht deine zweite Kugel an, nicht direkt, aber vertrau mir, es wird dir mehr helfen, als du denken kannst.

2

Es ist ein bisschen komisch, dass Sie C# erwähnen. Es hat sehr leistungsstarke Keywords, um die übliche Erbärmlichkeit in Schach zu halten. Der erste sollte das interne Schlüsselwort sein. Der Begriff der Einschränkung der Sichtbarkeit auf ein Modul. Dieses Konzept fehlt in C++ vollständig, das Build-Modell unterstützt es einfach nicht. Ansonsten ein großartiges Konzept: "Ich vertraue nur den Mitgliedern meines Teams, um es richtig zu machen". Natürlich tust du.

Dann gibt es das Slammer One, das Siegel Schlüsselwort. Außerordentlich kraftvoll, "der Dollar bleibt hier stehen, leg dich nicht mit mir an". Mit chirurgischer Präzision im .NET-Framework verwendet, habe ich noch nie einen Fall gefunden, in dem versiegelt wurde wurde unangemessen verwendet. Auch fehlt in C++, aber mit obskuren Möglichkeiten, das zu funktionieren.

Aber ja, das WPF Objektmodell saugt ziemlich schwer. 6 Ebenen tief zu vererben und Hintertüren wie eine Abhängigkeitseigenschaft zu verwenden, ist beleidigend. Die Vererbung ist hart, lass uns einkaufen gehen.

+0

In C++ beschränkt 'static' eine Funktion oder ein Objekt auf die Sichtbarkeit von Dateien. Keine Entsprechung für "versiegelt" obwohl (abgesehen von einem chaotischen Hack mit virtueller Vererbung). –

+1

Uhm ... C++ hat einen klaren und einfachen Weg (das gleiche wie C), um den Zugriff auf Ihre Klassen auf Ihr eigenes * Modul * (Bibliothek/ausführbare Datei) zu beschränken: Veröffentlichen Sie die Objekte nicht in den Headern. Über Versiegelungsklassen ... Ich kenne den Trick seit einiger Zeit, sowohl den einfachen nicht narrensicheren als auch den komplexeren und teureren zu schreiben ... aber ich habe nie das Gefühl gehabt, dass ich wirklich eine Klasse * versiegeln * müsste. –

+0

In C++ können Sie eine Klasse versiegeln, indem Sie ihren Konstruktor privat machen. (Und dann natürlich eine andere Möglichkeit, es zu instanziieren.) –

0

Eine häufige Überlastung erzwingt OOP in Programmen/Skripten, die einige Eingaben benötigen, sie in Ausgabe umwandeln, dann beenden (und während des Prozesses keine Eingabe von einer anderen Quelle erhalten). Der verfahrensmäßige Weg ist in diesen Fällen viel sauberer.

Ein typisches Beispiel dafür ist das Erzwingen von OOP in PHP-Skripten.