2012-08-09 8 views
5

wenn ich eine Funktion wieIrgendwelche Nachteile beim Ändern eines ungültigen Rückgabetyps auf etwas anderes in einer häufig verwendeten Dienstprogrammfunktion?

public void usefulUtility(parameters...) { 
    string c = "select * from myDB"; 
    do_a_database_call(c); 
} 

haben, die in eine Menge von Orten verwendet wird, gibt es bei der Veränderung es zu einem möglichen Schaden ist:

public bool usefulUtility(parameters...) { 
    string c = "select * from myDB"; 
    bool result = do_a_database_call(c); 
    return result; 
} 

Könnte dies möglicherweise beliebigen Code brechen?

Ich kann an nichts denken ... aber es ist möglich?

+2

[Ja] (http://blogs.msdn.com/b/ericlippert/archive/2012/01/09/every-public-change-is-a-breaking-change.aspx) – Servy

+1

Der Artikel, auf den verwiesen wird Servy ist technisch korrekt, aber wenn Sie von einem Rückgabetyp "void" zu einem Rückgabetyp "string" wechseln, würde der Code Ihres Kunden nicht beschädigt. – jp2code

+1

@ jp2code Ja, eigentlich könnte es. Siehe die Antwort, die ich geschrieben habe. Der Artikel verwendet das nicht als eines seiner Beispiele, aber es behauptet, dass jede öffentliche Veränderung eine bahnbrechende Veränderung ist. – Servy

Antwort

3

Ja, praktisch alles, was Sie möglicherweise tun könnten, das Ihre öffentliche Schnittstelle betrifft, ist eine bahnbrechende Änderung. Es könnte klein genug sein, dass es Ihnen egal ist, und dass niemand oder fast niemand die Eckfälle tatsächlich trifft, aber Eric Lippert explains, dass es Randfälle gibt (von denen viele Typinferenz beinhalten), die sogar verursachen können Diese scheinbar harmlosen Änderungen brechen.

Für Ihr spezielles Beispiel würde dieser Code durch diese Änderung gebrochen werden.

Action a = usefulUtility; 
+0

Aber seine ursprüngliche Version gab 'null' zurück, so dass Sie keine Möglichkeit haben würden, 'a' mit der ursprünglichen Version zuzuweisen. Richtig? – jp2code

+2

Anscheinend bin ich nicht der einzige, der einen Katalog von Lipperts Posts in meinem Kopf hä[email protected] jp2code In diesem Fall ruft er nicht die usualUtility-Methode auf, sondern speichert sie als Delegat für die Action-Methode, die bricht, weil sich die Delegate-Definition geändert hat. –

+0

@ jp2code Dieser Code funktioniert gut mit einem void Rückgabetyp. Es wird nicht kompiliert, nachdem es geändert wurde, um eine Zeichenfolge zurückzugeben. – Servy

0

Sie müssten tatsächlich eine Zeichenfolge oder mindestens Null für die zu kompilierende Methode zurückgeben. Sie können die Methode nicht mehr ohne Rückgabe beenden.

+4

Ich nehme an, er meint in Bezug auf, "Ist dies eine brechende Änderung für meine Kunden, wenn dies eine Bibliotheksfunktion ist?". – Servy

1

Es ist sicherlich möglich , dass es einen anderen Code brechen könnte. Wie Lippert hervorhebt, fast Every public change is a breaking change in einer bizarren Situation.

Die wichtigere Frage ist, ist es wahrscheinlich zu etwas zu brechen, und die Antwort ist nein. Sie sollten ziemlich sicher sein, diese Änderung vorzunehmen, weil die Leute wahrscheinlich nicht die bizarren Dinge tun, die sie tun müssten, um Probleme zu verursachen. Das bedeutet nicht, dass es unmöglich ist, einen anderen Code zu brechen, aber es liegt außerhalb des Verantwortungsbereichs.

+0

Es ist erwähnenswert, dass die Auswirkung auch eine Funktion davon ist, wie Ihre Bibliothek verwendet wird (zusätzlich zur Wahrscheinlichkeit). Für eine BCL-Methode treten sogar sehr, sehr unwahrscheinliche Umstände auf, manchmal ziemlich viele absolute Zahlen. Wenn es sich um eine Bibliothek handelt, die nur für eine Handvoll von Projekten in Ihrem Unternehmen verwendet wird, werden möglicherweise sogar Fälle nicht angezeigt. – Servy

0

Wenn Sie absolut sicher sein wollen, nichts zu brechen, geben Sie der Methode, die einen String zurückgibt, einen anderen Namen und lassen Sie die Signatur der void-Methode gleich.

2

Eine solche Änderung könnte definitiv etwas kaputt machen, sowohl hinsichtlich der Binärkompatibilität als auch hinsichtlich der Quellenkompatibilität.

Sie können sich vielleicht einen Blick auf this StackOverflow answer und den zugehörigen Thread werfen, in dem die API-breaking-Änderungen ausführlich behandelt werden.

+0

Ah! Ich sehe einen Verweis auf einen Delegaten in Ihrem Link. Daran hatte ich nicht gedacht. – jp2code

Verwandte Themen