As pessoas usam const constantemente ao programar no Objective C?


Respostas:


21

Devido à maneira como os objetos Objective-C funcionam, constdeixa de ser uma aplicação e passa a ser uma notação para o 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;
}

Na verdade, isso não será compilado aqui (estou usando o clang): o compilador pode detectar a tentativa de modificar o tipo C primitivo e emitir um erro. Mas agora compare-o com 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;
}

Mesmo que a função passe um ponteiro constante para um objeto constante, ainda é possível alterar o objeto.

Na programação orientada a objetos, a melhor maneira de impor a natureza constante de um objeto é tornar esse objeto imutável - ou seja, não forneça nenhum método que possa alterar seu estado. Imagine que a função acima pegou um NSStringargumento em vez de NSMutableString, e que eu havia passado a literal em @"Hello"vez de uma cópia mutável. Agora, razoavelmente falando, não há chance de alterar o objeto passado [*]. Objective-C não tem qualquer maneira de impor que, embora, ao contrário constou finalreferências de objeto em outras linguagens OO.

Para comparação, constfunciona de maneira totalmente diferente em C ++. Se eu receber uma constreferência a um objeto C ++, só posso chamar constfunções de membro nesse objeto. Essas funções preservam a constintegridade do objeto, não fazendo alterações ou modificando apenas variáveis ​​de membros que foram explicitamente marcadas mutablepelo designer de classe. Imagine que eu tivesse algum tipo MutableStringem C ++ equivalente a NSMutableStringObjective-C. O equivalente do meu exemplo acima seria algo como:

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

Definitivamente, isso não será compilado: além de appendString()não ser uma constoperação, a função remove o constqualificador da referência de tipo que requer a const_cast.

[*] Espero que exista alguma maneira distorcida de fazê-lo, mas agora estamos no reino de um programador tentando sabotar outro fazendo coisas "inteligentes".


Obrigado. Portanto, não há como impedir modificações através do modificador const.
usar o seguinte comando

Certo. O compilador ainda trata a constdecoração como significativa, para que você obtenha contorções como aliases ou conversões para suprimir avisos, mas não há alterações no comportamento do programa como resultado dessas contorções.

5
Acredito constque ainda poderia ser útil no Objetivo C afirmar que o ponteiro para um objeto nunca é atribuído para apontar para um objeto diferente . Ou seja, com NSString * const xvocê sabe que xsempre será a mesma string e não uma string diferente.
tboyce12

3

No que diz respeito ao objetivo C - eu não programo, portanto não posso responder à pergunta. A pergunta que posso responder é: "As pessoas devem usar constmuito ao programar no Objetivo C?" - esse é um "sim" definitivo.

O Constness é essencialmente um recurso de segurança de software usado para tornar os programas mais confiáveis ​​e sustentáveis. Muitos programadores crescem sem realmente apreciar o valor de consts, até que um dia algo ruim acontece e eles têm um momento "Ah ha" - "Ah, consté para isso que é usado". É perfeitamente possível escrever um programa sem constantes, é praticamente impossível tornar esse programa confiável.

Muitas amostras de código não são realmente programas, apenas trechos projetados para mostrar um recurso específico. Eles não usam const, pois distraem do ponto que a amostra está tentando fazer. O outro tipo de código que você vê é o código escrito por programadores inexperientes que baseiam o que fazem nos exemplos de que aprenderam ou naqueles que sabem sobre constantes e são preguiçosos demais para usá-los.


0

Não uso o objetivo-c há muito tempo.

No entanto, eu me pergunto por que nenhum corpo menciona esse aspecto.

O objetivo-c já tem algo mais relacionado à constante. Mutabilidade

Por exemplo, Nstring * apontará para uma seqüência constante. Se você deseja modificar uma string, use NMutableString ou algo parecido. Esse NMutableString fornecerá métodos adicionais que permitem às pessoas modificar a string.

Agora, e se você quiser que o ponteiro em si seja uma constante. Eu nunca preciso me preocupar com isso enquanto codifico um projeto muito grande.

Então eu acho que é por isso.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.