2009-07-14 10 views
5

Ich stoppe immer beim Erstellen von Klassen. Ich bin ziemlich intermediate zu Architektur, also ertragen Sie mit mir. Hier ist mein Dilemma. Irgendwann komme ich irgendwann in eine Klasse, in der ich mich fragen muss: "Braucht diese Methode Parameter, wenn ich nur das bekommen kann, was ich von der Klasse oder dem privaten Hintergrundfeld der Klasse brauche?".Methode Parameter Dilemma

Nun für öffentliche Methoden, sollten Sie wahrscheinlich Parameter haben, weil jemand Ihre Klasse verbrauchen und diese Methoden verwenden wird, ob sie in einer Instanz-Klasse oder statischen Klasse sind. In dieser Debatte geht es nicht um öffentliche Methoden, weil das für mich offensichtlich ist. Wenn Sie eine öffentliche Methode in Ihrer Klasse haben, können wir sagen, dass Sie einen der benötigten Werte aus einer Eigenschaft oder einem privaten Feld in dieser Klasse abrufen können, anstatt einen Parameter für diese Methode zu benötigen und den Parameter zu verwenden sollte immer noch params benötigen und die params verwenden oder zumindest nicht auszählen, wenn man einige params angeben kann. Zumindest sehe ich so öffentliche Methoden, weil jemand weiß, wie jemand anders diese Methode verwenden kann und sie wissen müssen, was zu übergeben ist, und sie die eigentlichen Daten an die Methode übergeben müssen, da sie außerhalb Ihrer Klasse liegen.

Das Problem kommt zum Beispiel, wenn ich private Methoden oder etwas dieser Art erstelle und benutze. Nehmen wir an, ich erstelle ein benutzerdefiniertes Steuerelement (.cs). Seine Aufgabe besteht darin, eine Reihe von Methoden auszuführen, die die Logik für dieses Steuerelement ausgebreitet haben und einige HTML-Strings erstellen, die an den Browser ausgegeben werden. Nun, ich erstelle eine Eigenschaft, die öffentlich ist, so dass jeder, der dieses Steuerelement verwendet, ein bestimmtes Objekt füttern kann. Und dieses bestimmte Objekt benutzt die Hälfte der Methoden in meiner Klasse, um HTML zu erzeugen. Da es sich um eine Eigenschaft handelt, kann jede der Methoden in meiner benutzerdefinierten Klasse sie verwenden. Es übergeht also jegliche Notwendigkeit, Parameter in einigen dieser Methoden zu erstellen, da ich es nur als Eigenschaft erhalten kann. Aber dann komme ich an einen Punkt, an dem ich eine Menge parameterloser Methoden erstelle, weil ich Objekte aus den Hintergrundfeldern oder eine Kombination aus Hintergrundfeldern und Eigenschaften bekomme. Oder kann ich sie nur von ein paar wenigen bekommen, wenn ich in der Lage bin zu bekommen, was ich andere Wege in diesem Kurs brauche? Aber dann sagt etwas zu dir nein, das ist böser Mann, du brauchst ab und zu mal Parameter ... zumindest eine Kombination von Parametern und die Verwendung einiger Hintergrundfelder oder Eigenschaften in deiner Methode usw., aber nicht immer Parameter diskontieren auch wenn diese Parameter möglicherweise einige interne Elemente sind (Felder oder Eigenschaften). Aber dann, wenn ich internals als params übergebe, wo ist die feine Grenze zwischen dem Zugriff auf und der Verwendung dieser Felder oder Eigenschaften nicht durch die Methode als Parameter, sondern direkt in der Methode selbst.

Aber das stört mich, denn dann frage ich, warum ich Methodenparameter in Fällen brauche, wo ich den Wert woanders bekommen kann.

Kann jemand die feine Linie hier erklären und mir helfen, zu einer Schlussfolgerung auf der Linie zwischen dem Verwenden einer Menge von Unterstützungsfeldern in Ihren Methoden oder Eigenschaften eher als einige Parameter zu kommen, die Sie in den Methoden angeben .. obwohl einige dieser Parameter kann noch ein Wert aus einem Unterstützungsfeld oder einer Eigenschaft übergeben werden, wenn eine andere Methode sie aufruft?

Ich hoffe, das macht jede Ahnung Sinn, aber ich kann nicht der einzige sein, der auf dieses Dilemma stößt. Vielleicht bin ich der Einzige, der an dieses Sh ** denkt und ich denke, ich weiß es nicht. Aber das Hauptproblem, das ich persönlich mit OOP habe, ist, dass es so viele verdammte Wege gibt, um das zu bekommen, was man braucht (Konstruktor, Eigenschaft, Hintergrundfeld, Methode).

Antwort

5

weniger Kaffee, weniger Worte ;-)

zusammenzufassen

, wenn die Parameter in Methoden zu bedienen?

kurze Antwort

, wenn die benötigten Informationen nicht verfügbar bereits in dem Objekt, in Übereinstimmung mit dem Yourself-Prinzip nicht wiederholen sind

parameterlos Methoden sind in Ordnung, es gibt keine Notwendigkeit, ein Objekt zu sagen etwas, das es bereits kennt

+0

Hier ist eine Antwort, die ich von einem engen Freund bekommen habe. Das ist auch eine andere ziemlich gute Antwort. Ich denke: Erstens, öffentliche Methoden: Wird ein externer Anrufer jemals einen diff-Wert liefern müssen? Für private (und öffentliche) Denkvererbung und auch wenn unterschiedliche Werte jemals weitergegeben würden ... – PositiveGuy

+0

@ [coffeeaddict]: ich muss oberflächlich mit deinem Freund nicht einverstanden sein: wenn der übergebene Parameter derselbe (semantisch) ist wie ein Objekt Eigenschaft dann ist es überflüssig. Wenn der übergebene Parameter den Wert der Objekteigenschaft ändert, verstößt er gegen das DRY-Prinzip und bewirkt, dass die Methode nicht offensichtliche Nebenwirkungen hat. –

1

Gute Antwort von Steve. Nur um in C# 4.0 hinzuzufügen, können Sie auch die Funktion des Standardparameters verwenden. Dies ist in einigen Fällen nützlich, insbesondere bei Utility-Klassen. Ich habe eine Methode wie diese in meiner OracleHelper Klasse

ExecuteReaderNoParam(OracleConnection conn, string cmdText, OracleTransaction trans, CommmandType cmdType) 

Die meisten der Anrufer brauchen keine Transaktion und Commandtype zur Verfügung zu stellen. Standardparametern Ich kann die Methode schreiben wie

ExecuteReaderNoParam(OracleConnection conn, string cmdText, OracleTransaction trans=null, CommmandType cmdType = CommandType.StoredProcedure) 

Der der Anrufer nur

OracleConnection connection = new OracleConnection(connectionString); 
OracleHelper.ExecuteReaderNoParam(conn, "SP_GET_ALL_STATUS"); 
0

auch (in Bezug auf andere Antworten) aufrufen können, desto weniger Parameter die besser lesbar und bequem ist das Verfahren. Wenn eine Methode viele Parameter akzeptiert, verletzt sie wahrscheinlich die Single Responsibility Principle und könnte sich in einige einfachere Methoden aufteilen, die leichter zu verwenden und zu verstehen sind.