2010-05-18 7 views
5

mit benannten Parametern wieBenannte Parameter führen zu Wartungsproblemen und schlechter Lesbarkeit?

def f(x : Int = 1, y : Int = 2) = x * y 

Ihrer Parameternamen Teil der

f(x=3) 
Schnittstelle werden

Nun, wenn Sie die Parameternamen lokal ändern mögen, werden Sie den öffentlichen Namen des Parameters perserve gezwungen :

def f(x : Int = 1, y : Int = 2) = { 
     val (a,b) = (x,y) 
     a * b 
    } 

Wenn das ein echtes Problem ist? Gibt es eine Syntax, um dies direkt zu unterstützen? Wer geht mit anderen Sprachen um?

Eine kleine Illustration der Probleme, denen Sie begegnen können, wenn Sie die Parameternamen wechseln, wie von Jon vorgeschlagen.

trait X{ def f(x : Int, y : Int) } 
class A extends X{ 
    override def f(y : Int, x : Int) = println("" + y + x) 
} 
val a = new A 
scala> a.f(x = 1, y = 2) 
21 
scala> (a : X).f(x = 1, y = 2) 
12 

Antwort

13

Ja, der Parametername ist effektiv Teil der öffentlichen Schnittstelle. Dies ist ein "Problem" für jede Sprache, die Argumente benannt hat - oder tatsächlich Code produziert, der durch Sprachen, die benannte Argumente unterstützen, konsumiert. Manchmal ist das nicht gut verstanden.

Zum Beispiel unterstützt C# 3 benannte Argumente nicht - aber VB tut. Wenn Sie also eine Bibliothek in C# 3 erstellen, baut jemand dagegen in VB auf, und dann ändert sich das Ändern von Parameternamen als brechende Änderung.

Letztendlich werden einige davon durch Refactoring-Tools erledigt, aber es läuft auf dieselbe Vorsicht hinaus wie bei jedem anderen Aspekt einer öffentlichen API ... Sie müssen sehr vorsichtig sein.

Sie sollten auch sehr vorsichtig sein beim Überschreiben einer Methode mit Parametern - verwenden Sie die gleichen Parameternamen wie die ursprüngliche Methode, oder Sie könnten einige sehr subtile Probleme verursachen. (Insbesondere wäre es sehr böse, die Namen der Parameter umzuschalten ...)

+0

Guter Punkt, dachte nicht einmal in Bezug auf öffentliche vs nicht-öffentliche API. – R0MANARMY

+0

Ich habe einen Beispielcode für das von Ihnen vorgeschlagene Namensumschaltungsproblem hinzugefügt. –

1

Ich weiß nichts über den Teil der "minderwertigen Lesbarkeit" Ihres Titels. Die wenigen Male, die ich benannte Parameter verwendete, war es, Standardwerte wie increment:Int = 100000, maxCount:Int = 1000000 bereitzustellen. Ich denke, es hilft Lesbarkeit, wenn Sie auf Wert geändert werden müssen, wo Sie die Funktion aufrufen.

+0

Der Punkt ist, dass Sie den Parameternamen in einer öffentlichen Schnittstelle nicht ändern können. Dies führt zu einer schlechteren Lesbarkeit in der Methode, da Sie einen irreführenden Parameternamen oder eine Aliasdefinition erhalten. –

+0

Sie können den Methodennamen auch nicht ändern, ohne den gesamten Clientcode vollständig zu refaktorieren. –

+0

@Randall - Aber wenn Sie nicht rekursiv aufrufen, verweisen Sie nicht auf den Methodennamen in der Implementierung. Die Parameternamen werden in der Methode verwendet und haben einen größeren Einfluss auf die Lesbarkeit. –

Verwandte Themen