Frage

Ich arbeite an einem Projekt in C #. Der bisherige Programmierer wusste nicht, objektorientierte Programmierung, so dass die meisten der Code ist in großen Dateien (wir reden hier um 4-5000 Linien) verteilt Zehn über und manchmal Hunderte von Methoden, sondern nur eine Klasse. Refactoring, ein solches Projekt ist ein großes Unternehmen, und so habe ich halb gelernt, damit zu leben für den Moment.

Jedes Mal, wenn ein Verfahren in einen der Code-Dateien verwendet wird, wird die Klasse instanziiert und dann wird das Verfahren auf der Objektinstanz aufgerufen.

Ich frage mich, ob es irgendwelche spürbaren Leistungseinbußen es auf diese Weise dabei? Soll ich alle Methoden statisch „für jetzt“ und, was am wichtigsten ist, wird die Anwendung von ihr profitieren in irgendeiner Art und Weise zu machen?

War es hilfreich?

Lösung

hier ein statischer Aufruf ist 4 bis 5 mal schneller eine Instanz jedes Mal, als die Konstruktion Sie rufen eine Instanzmethode. sprechen jedoch sind wir immer noch nur etwa zehn Nanosekunden pro Anruf, so dass Sie wahrscheinlich keinen Nutzen bemerken, wenn Sie wirklich engen Schleifen haben eine Methode millionenfach aufrufen, und Sie könnten den gleichen Nutzen, indem er eine einzelne Instanz außerhalb bekommen diese Schleife und Wiederverwendung es.

Da Sie jeden Anruf Ort ändern müssten die neu statische Methode zu verwenden, sind Sie wahrscheinlich besser verbringen Sie Ihre Zeit auf allmählich Refactoring.

Andere Tipps

Ich habe mit einem ähnlichen Problem befasst, wo ich arbeite. Der Programmierer vor mir erstellt 1 Controller-Klasse, wo alle BLL Funktionen abgeladen wurden.

Wir sind neu zu gestalten, das System jetzt und haben viele Controller-Klassen erstellt je nachdem, was sie sollten beispiel steuern.

Usercontroller, GeographyController, ShoppingController ...

In jeder Controller-Klasse haben sie statische Methoden, die Anrufe cachen oder die DAL mit dem Singleton-Muster zu machen.

Das hat uns zwei wesentliche Vorteile gegeben. Es ist etwas schneller (etwa 2-3 mal schneller, aber sprachen ns hier; P). Die andere ist, dass der Code ist viel sauberer

das heißt

ShoppingController.ListPaymentMethods()

statt

new ShoppingController().ListPaymentMethods()

Ich denke, es Sinn statische Methoden oder Klassen zu verwenden macht, wenn die Klasse jeden Staat nicht erhalten.

Es hängt davon ab, was sonst das Objekt enthält - wenn das „Objekt“ nur ein Bündel von Funktionen ist dann wahrscheinlich es ist nicht das Ende der Welt. Aber wenn das Objekt ein paar andere Objekte enthält, dann Instanziieren es geht nennen ist alle Konstrukteure (und Destruktoren, wenn es gelöscht wird) und Sie können Speicherfragmentierung erhalten und so weiter.

Das heißt, es klingt nicht wie Performance Ihr größtes Problem ist jetzt.

Sie haben die Ziele der Rewrite zu bestimmen. Wenn Sie schönen prüfbar, erweiterbar und wartbar OO Code haben wollen, dann können Sie versuchen, Objekte und deren Instanz-Methoden zu verwenden. Nach all dem Object Oriented ist programing wir hier reden, nicht Klasse orientierte Programmierung.

Es ist sehr einfach zu fälschen und / oder Mock-Objekte, wenn Sie Klassen definieren, die Schnittstellen implementieren und Sie Instanzmethoden ausführen. Dies macht gründliche Unit-Tests schnell und effektiv.

Auch wenn Sie gute OO Prinzipien folgen (siehe SOLID unter http: //en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29 ) und / oder die Verwendung Entwurfsmuster werden Sie sicherlich eine Menge Instanz basieren tun, Interface-basierte Entwicklung, und nicht viele statische Methoden.

Wie für diesen Vorschlag:

  
    

Es scheint mir dumm ein Objekt GERADE zu erstellen, so dass Sie eine Methode aufrufen kann, die     scheinbar hat keine Nebenwirkungen auf dem Objekt (aus Ihrer Beschreibung Ich gehe davon aus dem).

  

Das sehe ich eine Menge in dot net Geschäften und mir diese verletzt Kapselung, ein Schlüssel OO-Konzept. Ich soll in der Lage zu sagen, ob nicht eine Methode, mit Nebenwirkungen hat, ob die Methode ist statisch. Neben Verkapselung brechen bedeutet dies, dass Sie ändernden Methoden vom statischen zum Beispiel sein müssen, wenn / wenn Sie sie ändern Nebenwirkungen haben. Ich schlage vor, Sie auf dem Open / Closed-Prinzip für diesen lesen und sehen, wie der vorgeschlagene Ansatz, oben zitierte damit arbeitet im Auge behalten.

Beachten Sie, dass alte Kastanie, ‚vorzeitige Optimierung ist die Wurzel allen Übels ist‘. Ich denke, in diesem Fall bedeutet dies nicht, springt durch Reifen mit unangemessenen Techniken (d Class Oriented Programming), bis Sie wissen, dass Sie ein Leistungsproblem haben. Selbst dann, das Problem debuggen und suchen die am besten geeignet.

Statische Methoden sind viel schneller und verbraucht viel weniger Speicher. Es ist dieses Missverständnis, dass es nur ein wenig schneller ist. Es ist ein wenig schneller, solange Sie nicht setzen es auf Schleifen. BTW, sehen einige Schleifen klein, aber wirklich nicht, weil der Aufruf der Methode die Schleife enthält auch eine andere Schleife ist. Sie können den Unterschied in Code sagen, dass Funktionen Rendering führt. Viel weniger Speicher ist leider wahr in vielen Fällen. Eine Instanz ermöglicht den einfachen Austausch von Informationen mit Schwester Methoden. Eine statische Methode wird für die Informationen fragen, wenn er sie braucht.

Aber wie Autos in Fahrt, Geschwindigkeit bringt Verantwortung. Statische Methoden haben in der Regel mehr Parameter als ihre Gegenstück-Instanz. Da ein Beispiel dafür sorgen würde, gemeinsam genutzte Variablen zwischenzuspeichern, die Instanz Methoden aussehen wird schöner.

ShapeUtils.DrawCircle(stroke, pen, origin, radius);

ShapeUtils.DrawSquare(stroke, pen, x, y, width, length);

VS

ShapeUtils utils = new ShapeUtils(stroke,pen);

util.DrawCircle(origin,radius);

util.DrawSquare(x,y,width,length);

In diesem Fall, wenn die Instanzvariablen von allen Methoden die meiste Zeit verwendet werden, sind beispielsweise Methoden ziemlich wert. Instanzen sind NICHT ÜBER STAATLICHE, es geht um TEILEN obwohl gemeinsamen Staat eine natürliche Form des Teilens ist, sind sie nicht das gleiche. Faustregel ist: Wenn das Verfahren eng mit anderen Methoden gekoppelt ist --- sie sie lieben, so sehr, dass sie, wenn man aufgerufen wird, um die anderen Bedürfnisse zu nennen und sie wahrscheinlich die gleiche Tasse water-- teilen - sollte es gemacht Instanz werden. Um statische Methoden in Instanzmethoden zu übersetzen ist nicht so schwer. Sie müssen nur die freigegebenen Parameter nehmen und sie als Instanzvariablen setzen. Der andere Weg ist um härter.

Sie können auch eine Proxy-Klasse machen, die die statischen Methoden überbrücken. Während es scheinen mag ineffizienter in der Theorie zu sein, sagt die Praxis eine andere Geschichte. Dies liegt daran, wenn Sie eine DrawSquare einmal anrufen müssen (oder in einer Schleife), können Sie direkt auf die statische Methode. Aber immer, wenn Sie gonna verwenden es immer und immer zusammen mit DrawCircle sind, sind Sie gonna verwenden die Instanz-Proxy. Ein Beispiel dafür ist die System.IO Klassen Fileinfo (Beispiel) vs Datei (statisch).

Statische Methoden sind prüfbar. In der Tat, noch mehr prüfbar als Beispiel einmal. Verfahren GetSum (x, y) wäre sehr überprüfbar nicht nur Unit-Test, sondern Belastungstest, integrierten Test- und Gebrauchstest. Instanzmethoden sind gut für die Einheiten-Tests, aber schrecklich für alle anderen Tests (bei dem es um mehr als Einheiten Tests BTW), das ist, warum wir so viele Fehler in diesen Tagen. Die Sache, die alle Methoden nicht überprüfbar sind Parameter macht, die oder globaler Zustand wie DateTime.Now keinen Sinn wie (, EventArgse Sender n) machen. In der Tat, statische Methoden auf Testbarkeit so gut sind, dass Sie wenige Fehler in C-Code eine neuen Linux-Distribution als der Durchschnittswert der OO-Programmierer sehen (er ist voll von s *** ich weiß).

Ich glaube, Sie teilweise diese Frage in der Art und Weise beantwortet haben Sie es gefragt: gibt es eine bemerkbar Leistungseinbußen in dem Code, den Sie haben

Wenn die Strafen nicht erkennbar sind, müssen Sie nicht unbedingt überhaupt nichts zu tun. (Obwohl es selbstverständlich, die Code-Basis dramtically von einer allmählichen Refactoring zu einem respektablen OO-Modell profitieren würde).

Ich denke, was ich sagen will ist, ein Leistungsproblem nur ein Problem, wenn Sie feststellen, dass es ein Problem ist.

Es scheint mir dumm ein Objekt GERADE zu erstellen, so dass Sie eine Methode aufrufen kann, die scheinbar keine Nebenwirkungen auf das Objekt hat (aus Ihrer Beschreibung Ich gehe davon aus das). Es scheint mir, dass ein besserer Kompromiss mehrere globale Objekte und benutzen Sie einfach diejenigen zu haben wäre. Auf diese Weise können Sie die Variablen setzen, die normalerweise global in die entsprechenden Klassen sein würden, so dass sie etwas kleinen Umfang haben.

Von dort können Sie langsam den Umfang dieser Objekte bewegen kleiner und kleiner zu sein, bis man ein anständiges OOP Design haben.

erneut Dann wird der Ansatz, dass I wahrscheinlich verwenden würde, ist anders;).

Ich persönlich würde konzentriert wahrscheinlich auf Strukturen und Funktionen, die auf sie arbeiten und versuchen, diese in Klassen mit den Mitgliedern nach und nach zu konvertieren.

Wie für die Leistung Aspekt der Frage, sollen statische Methoden geringfügig schneller (aber nicht viel), da sie sich nicht mit der Konstruktion, vorbei und dekonstruiert ein Objekt aus.

Es ist nicht gültig in PHP,
Objektmethode ist schneller:
http://www.vanylla.it/tests/static-method-vs -object.php

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top