Verwenden die Benutzer häufig const, wenn sie in Objective C programmieren?

Antworten:

21

Aufgrund der Funktionsweise von Objective-C-Objekten wird constdie Durchsetzung aufgegeben und es wird eine Notation für den Programmierer. Betrachten Sie dieses Programm:

int f(const int x) {
    return ++x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        int x = 3;
        NSLog(@"%d", f(x));
    }
    return 0;
}

Das wird hier eigentlich nicht kompiliert (ich verwende Clang): Der Compiler kann den Versuch erkennen, den primitiven C-Typ zu ändern, und gibt einen Fehler aus. Aber jetzt vergleiche es mit diesem Programm:

NSMutableString *f2(const NSMutableString * const x) {
    [x appendString: @" world!"];
    return x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSMutableString *x = [@"Hello" mutableCopy];
        NSLog(@"%@", f2(x));
    }
    return 0;
}

Obwohl der Funktion ein konstanter Zeiger auf ein konstantes Objekt übergeben wird, ist es dennoch möglich, das Objekt zu mutieren.

Bei der objektorientierten Programmierung besteht die beste Möglichkeit, die Konstanz eines Objekts durchzusetzen, darin, das Objekt unveränderlich zu machen - dh keine Methoden bereitzustellen, die seinen Zustand ändern können. Stellen Sie sich vor, die obige Funktion hätte NSStringstattdessen ein Argument angenommen NSMutableStringund @"Hello"statt einer veränderlichen Kopie das Literal übergeben . Vernünftigerweise besteht jetzt keine Chance mehr, das übergebene Objekt zu mutieren [*]. Objective-C hat jedoch keine Möglichkeit, dies zu erzwingen, im Gegensatz zu constoder finalObjektreferenzen in anderen OO-Sprachen.

Zum Vergleich constfunktioniert das in C ++ ganz anders. Wenn ich einen constVerweis auf ein C ++ - Objekt erhalte , darf ich nur constMember-Funktionen für dieses Objekt aufrufen . Diese Funktionen erhalten die const-ness des Objekts, indem sie entweder keine Änderungen vornehmen oder nur Elementvariablen ändern, die mutablevom Klassendesigner explizit markiert wurden. Stellen Sie sich vor, ich hätte einen Typ MutableStringin C ++, der dem NSMutableStringin Objective-C entspricht. Das Äquivalent meines obigen Beispiels würde ungefähr so ​​aussehen:

MutableString& f3(const MutableString& x) {
  x.appendString(" world!");
  return x;
}

Dies wird definitiv nicht kompiliert: Die Funktion ist appendString()nicht nur keine constOperation, sondern entfernt das constQualifikationsmerkmal aus der Typreferenz, für die a erforderlich ist const_cast.

[*] Ich gehe davon aus, dass es eine verdrehte Vorgehensweise gibt, aber jetzt befinden wir uns im Bereich eines Programmierers, der versucht, einen anderen zu sabotieren, indem er "clevere" Dinge tut.


quelle
Vielen Dank. Es gibt also keine Möglichkeit, Änderungen durch den const-Modifikator zu verhindern.
user4951
Richtig. Der Compiler betrachtet die constDekoration immer noch als sinnvoll, sodass Sie Verfälschungen wie Aliase oder Casts erhalten, um Warnungen zu unterdrücken. Aufgrund dieser Verfälschungen ändert sich jedoch nichts am Verhalten des Programms.
5
Ich glaube, constdass es in Ziel C immer noch nützlich sein könnte, festzustellen, dass der Zeiger auf ein Objekt niemals einem anderen Objekt zugeordnet ist . Das heißt, NSString * const xSie wissen, dass dies ximmer die gleiche Zeichenfolge und keine andere Zeichenfolge sein wird.
Tboyce12
3

Was Ziel C betrifft, programmiere ich nicht, kann die Frage also nicht beantworten. Die Frage, die ich jedoch beantworten kann, lautet: "Sollten die Leute constbeim Programmieren in Objective C viel verwenden?" - Das ist ein definitives "Ja".

Konstanz ist im Wesentlichen eine Software-Sicherheitsfunktion, die verwendet wird, um Programme zuverlässiger und wartbarer zu machen. Viele Programmierer wachsen auf, ohne den Wert von consts wirklich zu schätzen , bis eines Tages etwas Schlimmes passiert und sie einen "Ah ha" -Moment haben - "Oh, das ist, wofür constverwendet wird". Es ist durchaus möglich, ein Programm ohne Konstanten zu schreiben, es ist praktisch unmöglich, ein solches Programm zuverlässig zu machen.

Viele Codebeispiele sind eigentlich keine Programme, sondern nur Ausschnitte, die eine bestimmte Funktion aufweisen sollen. Sie werden nicht verwendet, constda dies von dem Punkt ablenkt, den die Probe zu machen versucht. Die andere Art von Code, die Sie sehen, ist Code, der von unerfahrenen Programmierern geschrieben wurde, die ihre Arbeit anhand der Beispiele, aus denen sie gelernt haben, oder derjenigen, die sich mit Konstanten auskennen und zu faul sind, um sie zu verwenden.

mattnz
quelle
0

Ich habe sehr lange nicht mehr mit Objective-C gearbeitet.

Ich frage mich jedoch, warum kein Körper diesen Aspekt erwähnt.

Objective-c hat bereits etwas anderes mit Konstante zu tun. Wandlungsfähigkeit

Beispielsweise zeigt Nstring * auf eine konstante Zeichenfolge. Wenn Sie eine Zeichenfolge möchten, die Sie ändern können, verwenden Sie NMutableString oder ähnliches. Dieser NMutableString stellt zusätzliche Methoden bereit, mit denen Benutzer die Zeichenfolge ändern können.

Was ist nun, wenn der Zeiger selbst eine Konstante sein soll? Ich muss mir darüber keine Gedanken machen, wenn ich ein sehr großes Projekt programmiere.

Deshalb denke ich.

user4951
quelle