Warum generieren Programmiersprachen Methodensignaturen ohne Rücksicht auf den Rückgabetyp?

11

Ich habe mit vielen Sprachen gearbeitet, die keine Methodensignatur basierend auf dem Rückgabetyp generieren. Ich habe auch mit einem (vielleicht einigen?) Gearbeitet, der dies tut. Diejenigen, die mir in der Vergangenheit keine Probleme bereitet haben (wie hier ). Warum generieren Programmiersprachen Methodensignaturen ohne Rücksicht auf den Rückgabetyp?

Update: Ich beziehe mich speziell auf kompilierte statisch typisierte Sprachen

Charles Lambert
quelle
Dies ist eine sehr unbegründete Vermutung, aber ich vermute, dass dies etwas mit der Schwierigkeit der Compiler-Implementierung und / oder der Tool-Unterstützung zu tun hat.
Charles Lambert
In Haskell können Sie Typklassen verwenden, um Funktionen, die vom Rückgabetyp abhängig sind, grundsätzlich zu machen. I <3 Haskell: D: D: D
Thomas Eding

Antworten:

5

Es würde nicht gut mit Typecasting und Typhierarchien zusammenpassen. Wenn Sie zwei Versionen einer Methode haben, von denen eine Typ A und eine Typ B zurückgibt, treten folgende Probleme auf:

  • A oder B sind Untertypen voneinander, und Sie weisen den Rückgabewert demjenigen zu, der der Supertyp ist.
  • A und B haben einen gemeinsamen Supertyp, und Sie weisen einen solchen Supertypwert zu.

Sie könnten dies mit Casts umgehen, aber das würde genauso viel Eingabe erfordern wie das Umbenennen einer der Funktionen. Sie können auch einen Compilerfehler registrieren, wenn der Aufruf nicht eindeutig ist. In diesem Fall muss der Benutzer ähnliche Anstrengungen unternehmen.

jprete
quelle
1
Ich habe mit Sprachen gearbeitet, die den Rückgabetyp in der Signatur enthalten. Das Casting überall ist kein Problem, wie Sie angeben. In Ihrem speziellen Beispiel müssten Sie dies nicht mit Abgüssen umgehen. Wenn A und B (Subtypen von C) beide dieselbe Operation haben, sollte sie in C deklariert werden. Wenn der Rückgabetyp für A anders ist als für B: In den meisten Fällen wird versucht, einen Subtyp von C zurückzugeben. Sie einfach Fügen Sie dem Subtyp eine weitere Methode hinzu, die den Subtyp zurückgibt, und implementieren Sie die Version von C, um die mit dem spezifischen Subtyp aufzurufen. Jetzt müssen Sie nicht mehr überall wirken.
Charles Lambert
@ Charles Lambert: Es handelt sich nicht um eine Operation für die Klassen A, B oder C. Es handelt sich um zwei Funktionen mit demselben Namen und derselben Parameterliste, von denen eine etwas vom Typ A und die andere etwas vom Typ B zurückgibt. Diese Frage gilt auf mehr als nur OOP-Systeme, so antwortete ich basierend auf allgemeinen Typen und Funktionen. Ich verstehe auch nicht, was Ihr Gegenbeispiel bewirken soll; Ich muss mehr Details angeben, um darauf antworten zu können.
jprete
Ein Kommentar ist für ein Beispiel zu kurz. pastebin.com/JR39PKs0 Grundsätzlich haben Sprachen, die den Rückgabetyp in der Signatur enthalten, bereits Möglichkeiten gefunden, um das von Ihnen beschriebene Problem zu beheben. Sei es eine Codierungskonvention oder nur eine Standardpraxis. Es ist auch zu beachten, dass nicht viel von dem, was Sie schreiben, die Erstellung von Methoden rechtfertigen würde, die sich nur im Rückgabetyp unterscheiden. Also noch einmal, Sie würden sich nicht sehr oft damit beschäftigen
Charles Lambert
Wäre es schwierig, eine Regel zu haben, dass nur eine "primäre" Methode für eine bestimmte Argumentsignatur deklariert werden darf, aber eine beliebige Anzahl von sekundären Methoden deklariert werden könnte, und ein Compiler sollte eine Überladung durchführen, indem er zuerst eine Argumentsignatur identifiziert, für die a Es gibt eine primäre Methode, und dann werden sekundäre Methoden in einer bestimmten Reihenfolge überprüft, um festzustellen, ob eine solche Methode eindeutig besser übereinstimmt (oder auch dann verwendbar wäre, wenn die primäre Methode nicht vorhanden wäre).
Supercat
3

Weil Sie eine Methode aufrufen und ihr Ergebnis nicht zuweisen können.

Chiron
quelle
3
Nicht in jeder Sprache.
Jörg W Mittag
@Jorg Wie welche Sprache?
Chiron
1
f # ist eine Sprache. Sie sehen häufig foo -> ignorieren, wobei ignorieren eine Methode mit Rückgabetyp der Einheit ist, die void ähnlich ist
Charles Lambert
Ada ist ein besseres Beispiel. Diese Sprache verwendet tatsächlich auch Rückgabetypen als Teil der Signatur.
Charles Lambert
-4

Faustregel: Stark typisierte Sprachen binden normalerweise die Methodensignatur an einen Rückgabetyp. Schwach getippte Sprachen nicht.
Ich kenne C # nicht, aber ich gehe davon aus, dass das Problem möglicherweise an der Art und Weise liegt, wie C # mit Generika umgeht. Es könnte eine völlig andere Methode für die generische sein. In diesem Fall handelt es sich tatsächlich um zwei verschiedene Methoden.

CMR
quelle
1
Ich bin gespannt, auf welche dieser stark typisierten Sprachen Sie sich beziehen. Ich kenne keine und ich weiß, dass C ++ die Auflösung des Rückgabetyps ausdrücklich verbietet.
Greyfade
2
-1 Wenn Sie eine Faustregel angeben, die angeblich mit einem einzelnen Beispiel, das gegen diese Regel verstößt, falsch ist, sollten Sie diese mit allen anderen Beispielen befolgen, bei denen die Regel eingehalten wird.
@greyfade, mein Punkt war, dass in schwach typisierten Sprachen die Zuordnung beim Kompilieren nicht überprüft wird. Stimmen Sie zu, das könnte hier nicht relevant sein.
CMR
Ihr Standpunkt wird durch Ihre ungenaue Behauptung verdeckt, dass "stark typisierte Sprachen normalerweise ... an einen Rückgabetyp binden".
Greyfade