¿La gente usa mucho const cuando programa en Objective C?

Respuestas:

21

Debido a la forma en que funcionan los objetos Objective-C, constdeja de ser una aplicación y comienza a ser una notación para el programador. Considere este programa:

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

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

Eso realmente no se compilará aquí (estoy usando clang): el compilador puede detectar el intento de modificar el tipo C primitivo y emite un error. Pero ahora compáralo con este programa:

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;
}

Aunque la función pasa un puntero constante a un objeto constante, aún es posible mutar el objeto.

En la programación orientada a objetos, la mejor manera de hacer cumplir la naturaleza constante de un objeto es hacer que ese objeto sea inmutable, es decir, no proporcione ningún método que pueda cambiar su estado. Imagina que la función anterior tomó un NSStringargumento en lugar de NSMutableString, y que pasé el literal en @"Hello"lugar de una copia mutable. Ahora, razonablemente hablando, no hay posibilidad de mutar el objeto pasado [*]. Objective-C no tiene ninguna manera de hacer cumplir eso, aunque, a diferencia de consto finalreferencias a objetos en otros lenguajes orientados a objetos.

A modo de comparación, constfunciona de manera completamente diferente en C ++. Si obtengo una constreferencia a un objeto C ++, solo se me permite llamar a constfunciones miembro en ese objeto. Estas funciones preservan la constnaturaleza del objeto, ya sea al no hacer ningún cambio o al modificar solo las variables miembro que han sido marcadas explícitamente mutablepor el diseñador de la clase. Así que imagina que tengo algún tipo MutableStringen C ++ que es equivalente a NSMutableStringen Objective-C. El equivalente de mi ejemplo anterior se vería así:

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

Esto definitivamente no se compilará: además de appendString()no ser una constoperación, la función elimina el constcalificador de la referencia de tipo que requiere a const_cast.

[*] Espero que haya una forma retorcida de hacerlo, pero ahora estamos en el ámbito de un programador que intenta sabotear a otro haciendo cosas "inteligentes".


fuente
Gracias. Por lo tanto, no hay forma de evitar modificaciones a través del modificador const.
user4951
Correcto. El compilador todavía trata la constdecoración como significativa, por lo que obtienes contorsiones como alias o moldes para suprimir las advertencias, pero no hay cambios en el comportamiento del programa como resultado de estas contorsiones.
55
Creo constque aún podría ser útil en el Objetivo C para afirmar que el puntero a un objeto nunca está asignado para apuntar a un objeto diferente . Es decir, con NSString * const xusted sabe que xsiempre será la misma cadena y no una cadena diferente.
tboyce12
3

En cuanto al objetivo C, no programo en él, así que no puedo responder la pregunta. Sin embargo, la pregunta que puedo responder es "¿Debería la gente usar constmucho al programar en el Objetivo C?" - ese es un "Sí" definitivo.

Constness es esencialmente una característica de seguridad de software que se utiliza para hacer que los programas sean más confiables y mantenibles. Muchos programadores crecen sin apreciar realmente el valor de consts, hasta que un día sucede algo malo y tienen un momento de "Ah, ja": "Oh, para eso constse usa". Es completamente posible escribir un programa sin constantes, es prácticamente imposible hacer que dicho programa sea confiable.

Muchas muestras de código no son realmente programas, solo fragmentos diseñados para mostrar una característica específica. No se usan constya que distrae del punto que la muestra está tratando de hacer. El otro tipo de código que ve es el código escrito por programadores sin experiencia que basan lo que hacen en los ejemplos que han aprendido, o aquellos que conocen las constantes, y son demasiado vagos para usarlos.

Mattnz
fuente
0

No he usado el objetivo c durante mucho tiempo.

Sin embargo, me pregunto por qué ningún cuerpo menciona este aspecto.

Objective-c ya tiene algo más relacionado con constante. Mutabilidad

Por ejemplo, Nstring * apuntará a una cadena constante. Si desea una cadena que pueda modificar, use NMutableString o algo así. Ese NMutableString proporcionará métodos adicionales que permitirán a las personas modificar la cadena.

Ahora, ¿qué pasa si quieres que el puntero sea una constante? Nunca tengo que preocuparme por eso mientras codifico un proyecto muy grande.

Entonces creo que es por eso.

user4951
fuente