Im Allgemeinen bevorzuge ich die Verwendung kleiner Methoden, wie sie unter anderem von Bob Martin in Clean Code empfohlen werden . Ich habe auch genug über die Interna von Objective-C gelesen, um zumindest eine Vorstellung davon zu haben, wie der Nachrichtenversand von Objective-C funktioniert ( bbums series ist dazu besonders informativ).
Ungeachtet vorzeitiger Optimierungsbedenken würde ich gerne wissen, ob all die Arbeit, die Objective-c mit objc_msgSend leistet, praktisch so aussagekräftig ist, dass der Ansatz "viele kleine Methoden" für Objective-C-Projekte nicht empfehlenswert ist.
Empirische Befunde sind besonders erwünscht (vielleicht stelle ich irgendwann selbst einen Test auf). Die Erfahrung von jedem, der große Objective-C-Projekte geschrieben hat, wäre auch großartig.
Klärung
Der allgemeine Ton der Frage ist beabsichtigt. Ich frage nicht nach der Leistungsoptimierung bestimmter Apps (weshalb ich hier eher frage als bei SO), sondern eher danach, ob die Sprachmerkmale von Objective-C einen bestimmten Designansatz behindern. Ich habe beobachtet, dass ein Großteil des Codes, den ich von Apple und anderen Parteien (auf Github usw.) gesehen habe, in Richtung großer Methoden (und Klassen) tendiert, und ich frage mich, ob dies eine Tendenz ist, die sich aufgrund der Sprache eingeschlichen hat selbst. Natürlich habe ich möglicherweise den falschen Code gelesen, oder es sind eher kulturelle als technische Faktoren, die zu der Tendenz geführt haben, dass der Code existiert.
(Für das, was es wert ist, schreibe ich gerade Objective-C und verwende kleine Methoden.)
Weitere Anfrage
Ich bin mit beiden Antworten einverstanden. Eine weitere Sache, die ich möchte, ist, dass mich jemand auf eine (hoffentlich substanzielle) Open-Source- (oder anderweitig sichtbare) Objective-C-Codebasis hinweist, die nette kurze Methoden (und kleine Klassen) verwendet. Ich habe in Objective-C noch nichts gesehen, was mit der Fitnessquelle verglichen werden könnte .
Antworten:
Ich weiß nicht wirklich, ob der Aufwand vernachlässigbar ist oder nicht. Aber ich würde es vorziehen , ein System zu entwerfen leicht verständlich und sein wartbar zuerst , und das normalerweise kleine Mittel konzentrierten sich Methoden und Klassen. Dies hilft sogar bei der nachfolgenden Code-Optimierung (nur weil der Code besser gewartet werden kann). Außerdem ist es wichtig, den Code zu profilieren, um echte Engpässe zu finden, die möglicherweise nicht einmal mit dem Overhead von Methodenaufrufen zusammenhängen. Wenn Sie Vorgänge außerhalb des Prozesses ausführen (z. B. Aufrufe der Datenbank, des Netzwerks oder des Dateisystems), dominieren diese ohnehin die Laufzeit des Programms.
Aber wie immer kann Ihr Kilometerstand variieren ...
quelle
Die überwiegende Mehrheit des Codes wird in keiner Anwendung leistungskritisch sein. Selbst wenn der Methoden-Overhead im Vergleich zu anderen Sprachen erheblich wäre, bestünde der optimale Ansatz darin, an den meisten Stellen viele kleine Methoden zu verwenden und nur solche zu integrieren, die ein Profil erstellen hat sich als leistungskritisch erwiesen.
Natürlich gibt es viele Leute, die nicht wissen, wie man richtig optimiert, und von denen einige vielleicht etwas über den Overhead von Methoden wissen und sich auf globale vorzeitige Optimierungen einlassen, aber ich glaube nicht, dass diese Gruppe groß genug ist, um einen signifikanten Einfluss zu haben auf das Objective-C-Ökosystem.
Bei großen Methoden und Klassen handelt es sich viel häufiger um die Arbeit einer großen Gruppe von Personen, die nichts über Profiler, Methoden-Overhead oder korrektes Design wissen oder sich darum kümmern und dazu neigen, Big Balls of Mud in einer beliebigen Sprache zu produzieren. Und ja, einige dieser Leute arbeiten an hochkarätigen Codebasen in großen Softwareunternehmen.
quelle