2012-12-21 5 views
6

Wikipedia klassifiziert "Anruf Super" als ein Anti-Muster, und ich verstehe nicht wirklich warum. Das Muster wird ziemlich häufig in Ziel-C/Kakao verwendet; zum Beispiel init/dealloc, drewrect, awakefromnib erfordern alle, dass Sie super aufrufen. Verkenne ich das Konzept hier falsch?Warum wird "Call Super" nach Wikipedia als Anti-Pattern betrachtet?

Link zum Artikel: http://en.wikipedia.org/wiki/Call_super

+0

Können Sie die Quelle angeben? das Aufrufen von Super ist nur ein Teil der objektorientierten Programmierung, ich weiß nicht, warum das ein Anti-Pattern sein sollte. – NSAddict

+0

Link zum entsprechenden Wikipedia-Artikel? (Denken Sie daran, dass Wikipedia kollaborativ bearbeitet wird, sie könnten falsch sein). – driis

+0

Das ist wirklich traurig, dass diese Frage als "nicht konstruktiv" markiert ist. Ich fand es sehr wichtig – Kuba

Antwort

13

Wie es in the article, sagt, es ist die Notwendigkeit die Super-Methode aufzurufen, die die Antipattern ist, das heißt der Superklasse „erwartet“ die Methode zu überschreiben die machen Funktionalität vollständig - aber ohne explizite Erwartung. Und es erwartet auch, dass Sie die Super-Implementierung aufrufen. Beide werden benötigt, damit das Programm funktioniert.

Dies ist ein Antipattern, weil die Absicht des Programmierers nicht aus dem Code abgeleitet werden kann. Wenn Ihre Kollegen sich dafür entscheiden würden, daran zu arbeiten, würden sie nicht wissen, was Sie von der Klasse erwartet haben, und werden daher wahrscheinlich auf Probleme und/oder Irritationen stoßen.

Wenn Sie also erwarten, dass einige Teile einer Methode außer Kraft gesetzt werden, aber andere Dinge an Ort und Stelle bleiben müssen, empfiehlt es sich, die template method pattern zu verwenden, wo Sie alle Dinge, die nicht ersetzt werden müssen, in einem (privaten) Methode, die dann ruft eine andere - völlig separate -, die muss implementiert werden, damit das Programm funktioniert (in einigen Sprachen wird es nicht einmal kompilieren, sonst). Auf diese Weise stellen Sie sicher, dass die wichtigen Dinge dort bleiben, wo sie sein müssen, und wer auch immer die Klasse erweitert, wird genau wissen, was zu tun ist, während er glücklicherweise die anderen Implementierungsdetails ignoriert.

Objective-C hat keine abstrakten oder virtuellen Methoden, aber Sie können den gleichen Effekt erzielen, indem Sie explizit eine Ausnahme auslösen, wenn die super-Methode aufgerufen wird. Wenn Ihre Mitarbeiter vergessen, die Methode zu überschreiben, stürzt das Programm ab - und es stürzt mit einer Fehlermeldung ab, die sie verstehen und die es ihnen ermöglicht, das Problem schneller und einfacher zu verstehen und zu beheben als bei anderen Verhalten ohne Erklärung, da die Funktionalität nicht vollständig ist.

+0

Korrigieren Sie mich, wenn ich falsch liege, aber gibt es Vorlagen in Objective-C? –

+0

, aber darum geht es OP nicht. –

+0

Er fragt, warum Anruf Super ist ein Anti-Muster, richtig. Ich habe darauf geantwortet, oder? – weltraumpirat

3

Der Kern des Problems ist:

..However, die Tatsache, dass die Sprache selbst nicht zu Lage sein kann, alle Bedingungen zu diesem Aufruf ist vorgeschrieben erzwingen, was das macht ein anti-Muster.

Also sind die Autoren anal über Programmierer, die etwas tun müssen, von dem sie glauben, dass die Sprache für sie tun sollte.

Die Lösung in dem Wikepedia Artikel erwähnt Call Super ist:

Ein besserer Ansatz, diese Probleme zu lösen, anstatt die Vorlage Methode Muster zu verwenden ist, wo die übergeordnete Klasse eine rein abstrakte Methode enthält , die umgesetzt werden müssen von den Unterklassen und haben die ursprüngliche Methode aufrufen, die Methode

Das Problem ist, dass Objective-c nicht virtuelle Funktionen haben. Es hat nur Nachrichten, also können Sie nicht implementieren, was wikepedia vorschlägt.

+0

Warum ist ein Template-Muster besser als Super-Aufruf? – eyebrowsoffire

+0

@eyebrowsoffire siehe meine bearbeiten –

+1

@While Peter ist richtig zu sagen, es gibt keine virtuellen Funktionen, es ist einfach, ähnliche Semantik zu produzieren (zB siehe Antwort http://stackoverflow.com/questions/13793864/abstract-class-for-objective- c/13797335 # 13797335). Wenn Sie möchten, können Sie das Vorlagenmuster implementieren. – CRD