Aprenda C antes de aprender Objective-C [fechado]

107

Sendo um aspirante a desenvolvedor da Apple, quero saber a opinião da comunidade se é melhor aprender C antes de passar para Objective-C e, por fim, para o Cocoa Framework.

Meu instinto diz aprender C, o que me dará uma boa base.

Cotovia
fonte

Respostas:

163

Eu aprenderia C primeiro. Aprendi C (e muito em C) antes de passar para o Obj-C. Tenho muitos colegas que nunca foram programadores C reais, eles começaram com Obj-C e aprenderam apenas o C o necessário.

De vez em quando, vejo como eles resolvem um problema inteiramente no Obj-C, às vezes resultando em soluções muito desajeitadas. Normalmente, substituo algum código Obj-C por código C puro (afinal, você pode misturá-los o quanto quiser, o conteúdo de um método Obj-C pode ser inteiramente código C puro). Sem qualquer intenção de insultar qualquer programador Obj-C, existem soluções que são muito elegantes no Obj-C, são soluções que funcionam (e parecem) muito melhor graças a objetos(A programação OOP pode tornar programas complexos muito mais atraentes do que a programação funcional; polimorfismo, por exemplo, é um recurso brilhante) ... e eu realmente gosto de Obj-C (muito mais do que C ++! Eu odeio a sintaxe C ++ e alguns recursos de linguagem são simplesmente exageros e levar a padrões de desenvolvimento ruins (IMHO); no entanto, quando às vezes reescrevo o código Obj-C de meus colegas (e realmente só faço isso, se achar que é absolutamente necessário), o código resultante é geralmente 50% menor, precisa de apenas 25% da memória que usou antes e é cerca de 400% mais rápido em tempo de execução.

O que estou tentando dizer aqui: cada idioma tem seus prós e contras. C tem prós e contras, assim como Obj-C. No entanto, o recurso realmente excelente do Obj-C (é por isso que até gosto mais dele do que do Java) é que você pode pular para C simples à vontade e voltar novamente. Por que esse é um recurso tão bom? Porque assim como Obj-C corrige muitos dos contras do C puro, o C puro pode consertar alguns dos contras do Obj-C. Se você misturá-los, você receberá uma equipe muito poderosa.

Se você apenas aprende Obj-C e não tem idéia de C ou apenas conhece o básico dele e nunca experimentou como ele pode resolver alguns problemas comuns com elegância, na verdade aprendeu apenas metade de Obj-C. C é uma parte fundamental do Obj-C. A capacidade de usar C a qualquer hora e em qualquer lugar é uma característica fundamental dele.

Um exemplo típico foi algum código que usamos para codificar dados em base64, mas não podíamos usar uma biblioteca externa para isso (sem OpenSSL lib). Usamos um codificador base64, inteiramente escrito com classes Cocoa. Estava funcionando bem, mas quando o fizemos codificar 200 MB de dados binários, demorou uma eternidade e a sobrecarga de memória era inaceitável. Substituí-o por um codificador base64 minúsculo e ultracompacto escrito inteiramente como uma função C (copiei o corpo da função para o corpo do método, o método pegou NSData como entrada e retornou NSString como saída, porém dentro da função tudo era C). O codificador C era muito mais compacto, batia o codificador Cocoa puro pelo fator 8 em velocidade e a sobrecarga de memória também era muito menor. Codificar / decodificar dados, brincar com bits e tarefas de baixo nível semelhantes são apenas os pontos fortes de C.

Outro exemplo foi algum código de IU que desenhou muitos gráficos. Para armazenar os dados necessários para pintar os gráficos, usamos NSArray's. Na verdade NSMutableArray's, já que o gráfico foi animado. Resultado: animação gráfica muito lenta. Substituímos todos os NSArray por arrays C normais, objetos por structs (afinal as informações de coordenadas do gráfico não são nada que você deve ter em objetos), acesso de enumerador com loops for simples e começamos a mover dados entre os arrays com memcopy em vez de pegar dados de um array para o outro, índice por índice. O resultado: uma aceleração pelo fator 4. O gráfico foi animado suavemente, mesmo em sistemas PPC mais antigos.

O ponto fraco do C é que todo programa mais complexo fica feio no longo prazo. Manter os aplicativos C legíveis, extensíveis e gerenciáveis ​​exige muita disciplina de um programador. Muitos projetos falham porque essa disciplina está faltando. Obj-C torna mais fácil para você estruturar sua aplicação usando classes, herança, protocolos e assim por diante. Dito isso, eu não usaria a funcionalidade C pura além das fronteiras de um método, a menos que seja necessário. Eu prefiro manter todo o código em um aplicativo Objective-C dentro do método de um objeto; todo o resto vai contra o propósito de um aplicativo OO. No entanto, dentro do método, às vezes uso C puro exclusivamente.

Mecki
fonte
e se eu já conheço c ++ e quero aprender Objective-C para o desenvolvimento do iPhone / iTouch, é necessário aprender C qualquer coisa?
chester89
11
@ chester89: se você já conhece C ++, sabe o suficiente sobre C para começar a usar Objective-C.
Sven,
Sven está certo, C ++ é tão complexo e já usa muito C puro, se você conhece C ++ muito bem, também deve conhecer C bem o suficiente.
Mecki
Esta é minha reflexão favorita sobre o assunto, obrigado.
Morkrom
1
@FrederikWitte Deixe o C ++ de fora, ele só vai confundir você como um iniciante (e não é uma linguagem que você precisa para desenvolvimento móvel). Comece com Java, é uma boa linguagem de ensino e apenas saber Java é o suficiente para desenvolver para Android (talvez a menos que você queira escrever jogos ou players de vídeo ou algo assim). Então aprenda C e finalmente Obj-C, a menos que você queira pular tudo isso e aprender Swift. Sua escolha.
Mecki
25

Você pode aprender facilmente C e Objective-C ao mesmo tempo - certamente não há necessidade de aprender as minúcias de C (incluindo aritmética de ponteiros e assim por diante) antes de começar com as adições de Objective-C à linguagem, e como um programador novato iniciar o Objective-C rapidamente pode ajudá-lo a começar a "pensar em objetos" mais rapidamente.

Em termos de recursos disponíveis, a documentação da Apple normalmente pressupõe familiaridade com C, portanto, começar com The Objective-C 2.0 Programming Language não será muito benéfico para você. Eu investiria em uma cópia de Programming in Objective-C, de Stephen Kochan (dependendo da rapidez com que você deseja começar, considere esperar pela segunda edição):

Biblioteca de desenvolvedores de programação Objective-C Biblioteca de desenvolvedores de programação Objective-C 2.0

Ele não assume nenhuma experiência anterior e ensina Objective-C e tanto C quanto você precisa.

Se você se sentir um pouco ambicioso, pode começar com o tutorial "Aprenda C" de Scott Stevenson , mas ele tem alguns pré-requisitos ("Você já deve saber pelo menos uma linguagem de script ou programação, incluindo funções, variáveis ​​e loops. Você ' Também será necessário digitar comandos no Terminal Mac OS X. ").

(Apenas para registro e contexto: eu aprendi os dois ao mesmo tempo em 1991 - não pareceu me fazer mal. Eu, no entanto, tinha experiência em BASIC, Pascal, Logo e LISP. )

mmalc
fonte
2
você absolutamente não deve achar necessário aprender C primeiro. Especialmente se você já conhece uma linguagem como C # de Java. C # e Java devem muito ao objetivo C. Embora C # deva muito mais à experiência de Helsberg e aos erros com Delphi.
Daniel Honig,
18

Pensei muito sobre esse assunto antes de escrever meu livro sobre Objective-C. Primeiro, eu realmente acredito que aprender a linguagem C antes de aprender Objective-C é o caminho errado. C é um processuallinguagem contendo muitos recursos que não são necessários para a programação em Objective-C, especialmente no nível iniciante. Na verdade, recorrer a alguns desses recursos vai contra a tendência de aderir a uma boa metodologia de programação orientada a objetos. Também não é uma boa ideia ensinar todos os detalhes de uma linguagem procedural (e atacar a solução de um problema com funções e técnicas de programação estruturada) antes de aprender uma linguagem orientada a objetos. Isso pode colocar o programador na direção errada, potencialmente levando ao desenvolvimento da orientação e mentalidade erradas para promover uma boa disciplina de programação orientada a objetos. Só porque Objective-C é uma extensão da linguagem C, não significa que você precisa aprender C primeiro!

Acho que ensinar Objective-C e a linguagem C subjacente como uma única linguagem integrada é a abordagem certa. Não há razão para aprender que uma instrução "for" vem da linguagem C e não de seu superconjunto da linguagem Objective-C. Além disso, por que aprender em detalhes sobre coisas como arrays C e strings (e como manipulá-los) antesaprendendo sobre array (NSArray) e objetos string (NSString), por exemplo? Muitos textos C dedicam muito tempo a estruturas e ponteiros a estruturas e iteração por meio de arrays com ponteiros. Mas você pode começar a escrever programas Objective-C sem conhecer nenhum desses recursos da linguagem C. E para um programador novato, isso é um grande negócio. Isso não apenas encurta a curva de aprendizado, mas também reduz a quantidade de material que deve ser aprendido (e parte dele seletivamente filtrado) para escrever programas Objective-C.

Eu concordo que você desejará aprender a maioria, senão todos, os recursos subjacentes do C, mas muitos podem ser adiados até uma compreensão sólida de como definir classes e métodos, trabalhar com objetos e expressões de mensagem e compreender os conceitos de herança e polimorfismo são bem compreendidos.

Skochan
fonte
Isso tudo é para aqueles que querem aprender rápido, evitando dificuldades e um entendimento profundo. Estou ensinando um novato em programação (embora tenha mais de 11 anos de experiência em programação) para programar e costumava ensinar outros antes (mas não sou professor para deixar isso claro). E sabe o que mais? Todos esses conceitos a que estamos acostumados são tão complicados e não intuitivos para um iniciante completo! C é uma ótima maneira de entender as coisas de nível baixo o suficiente, para que no futuro não seja mágica para eles. Dito isso, para um programador melhor, a curva de aprendizado é melhor com C no início com suas regras bárbaras =)
MANIAK_dobrii
15

Eu mergulharia direto no Objective C - se você já tem alguns idiomas em seu currículo, não é a sintaxe que é a curva de aprendizado, é o cacau.

Paul Dixon
fonte
1
Dito isso, há muito mais material disponível para aprender C. Descobri que essa era a parte mais difícil sobre ObjC, falta de material bem organizado, claro, com profundidade suficiente para comparar com o material C ou C ++ e realmente ajudar você a entender o que era acontecendo dentro dele.
Spanky
10

Acho que, na maioria das vezes, aprender C é uma boa ideia, não importa em que área você esteja, pelo menos para pegar o jeito do funcionamento interno do desenvolvimento de software antes de usar produtos pré-embalados, dessa forma, se algo der errado você tem uma chance melhor de compreender o funcionamento interno. Há muita discussão sobre isso no SO, e é uma questão bastante subjetiva, mas em geral você usará inerentemente C em seu código Objective-C, então acho que depende de você. Eu sou o tipo de pessoa do chão, mas às vezes isso pode atrapalhar e eu conheço várias pessoas inteligentes que trabalharam de cima para baixo. Acho que a parte importante é que você compreenda o funcionamento interno da maneira que for diferencie seus recursos daqueles que não o fazem e também aumente seus recursos.

TheXenocide
fonte
aprender C primeiro também pode distorcer sua visão da programação OO, se você ainda não estiver fundamentado nela. Misturar codificação estruturada e procedural não é bom. Mas também é verdade que OO perde seu valor em muitos lugares onde C brilha, como escrever código de nível inferior.
Daniel Honig,
1
Minha razão para sugerir que todo desenvolvedor aprenda C em algum ponto é pelo menos baseada na ideia de que até mesmo as linguagens OO compilam exatamente as mesmas instruções que C faz no final. Variáveis ​​para objetos usam ponteiros, Coletores de lixo usam malloc e free, arquivos são bloqueados usando identificadores de SO; quando algo dá errado em um aplicativo Java ou C #, conhecer esses fundamentos pode melhorar muito sua compreensão do que deu errado. Compreender a alocação de recursos que será executada também tende a levar à escrita de um código mais informado que terá um desempenho mais otimizado para um contexto específico.
TheXenocide
7

É uma boa ideia aprender C antes de aprender Objective-C, que é um superconjunto estrito de C. Isso significa que Objective-C pode suportar todo o código C normal, portanto, o código comum aos programas C é obrigado a aparecer mesmo em Objective- Código C.

Além de ver as coisas puramente do ponto de vista da linguagem, você descobrirá que o Mac OS X é um sistema operacional Unix completo. Todas as bibliotecas de nível de sistema são escritas em C.

Provavelmente é possível aprender os dois ao mesmo tempo, mas acho que você apreciará e compreenderá mais Objective-C se primeiro tiver um conhecimento prático de C sólido.

Doug
fonte
5

Eu aprenderia Objective-C e aprenderia tanto C quanto você precisar à medida que avança.

As áreas de C das quais você não dependerá muito:

  • Aritmética e matrizes de ponteiro. Eu nunca usei matrizes C.
  • Strings C. As strings de Objective-C fazem o trabalho de maneira mais agradável e segura.
  • Gerenciamento de memória manual se você usar GC no Obj-C 2.1. Eu recomendo fortemente esta rota por motivos de velocidade de desenvolvimento e desempenho.
Giao
fonte
6
Uma advertência: a coleta de lixo em Objective-C não está disponível em todas as plataformas (especialmente no iPhone), que é algo a se ter em mente.
Mark Bessey,
5

Conforme você aprende Objective-C e Cocoa, não pode evitar o aprendizado de bits de C. Por exemplo, retângulos são comumente representados por CGRect, uma estrutura C.

Se você tiver tempo, aprenda C. Como outros já disseram aqui, o livro de Kochan (segunda e primeira edições) é excelente como um livro para mergulhar.

Mattwestbright
fonte
4

Há muitas coisas que você não pode fazer puramente em Objective-C, então aprender algumas habilidades básicas de C será muito crítico. Você precisará pelo menos entender as declarações de variáveis ​​e as funções básicas da biblioteca C, ou ficará frustrado.

Mark Bessey
fonte
3

Honestamente, muitas linguagens são baseadas na sintaxe C que é bom estar familiarizado. Eu levaria uma ou duas semanas para me familiarizar com C de qualquer maneira.

Dito isso, acabei de me ensinar o Objetivo C, e tenho que ser honesto: não achei minha experiência com C tão útil quanto pensava. Objetivo C foi definitivamente revelador para mim.

user25967
fonte
3

Você pode pular diretamente para Objective-C, com os seguintes benefícios:

  1. Você aprenderá "algum" C no caminho.
  2. Você aprenderá as partes C que são relevantes para você.

Pelo menos para mim é mais fácil aprender um novo idioma quando estou interessado em algum aplicativo ou amostra específica, e fracasso quando tenho que aprender outra coisa que não é exatamente o que estou interessado.

Você sempre pode refinar seu conhecimento de C mais tarde, se ficar interessado em programação de nível inferior.

OscarRyz
fonte
3

Melhor, não sei, muito menos porque não conheço Objective-C.
Mas as bases do C não são tão difíceis de aprender, não é uma linguagem muito complexa (em termos de sintaxe, não em termos de masterização!), Então vá em frente, não será uma perda de tempo.
Pessoalmente, acho sempre uma boa ideia aprender C, pois dá uma boa ideia de como o computador funciona. Afinal, a maioria das linguagens e sistemas ainda são escritos em C. Então siga em frente! :-)

PS .: Por "seguir em frente", não quis dizer "largue", apenas "aprenda mais, aprenda diferente". Depois de conhecer C, você nunca mais vai abandoná-lo: Java usa JNI para chamar rotinas C para coisas de baixo nível, Python, Lua, etc. são frequentemente estendidos com código C (a referência de Lua apenas assume algum conhecimento de C para algumas funções que são apenas um invólucro fino para a função C por trás) e assim por diante.

PhiLho
fonte
3

Sim, aprender a linguagem C antes de qualquer outro idioma avançado o ajudará a aprender outros idiomas rápidos.

Codificando futuro
fonte
2

De acordo com a Wikipedia , Objective-C é um superconjunto estrito de C. Sendo assim, eu sugeriria aprender C primeiro. Então, quando você aprender Objective-C, ficará claro quais partes são adicionadas como parte de Objective-C.

Trent
fonte
2

C oferece muito pouca abstração do assembly. Alguns compiladores C até permitem a montagem embutida. Isso pode ser muito útil para pensar sobre como o computador funciona, o que é importante saber.

Dito isso, se você está realmente interessado em Object-C, não se deixe levar por escrever algo em C só porque é "bom para você". Você não precisa se frustrar enquanto tenta aprender um novo conjunto de habilidades. É importante que você se divirta com o que está fazendo.

Steve g
fonte
2

Você quer ser um desenvolvedor de núcleo duro? Em seguida, aprenda c primeiro.

Os livros que você precisa para dominar completamente c são alguns dos melhores escritos em tecnologia. Aqui está o que você precisa:

Linguagem de Programação C

A Biblioteca C padrão

Freddie
fonte
2

O objetivo C é suficientemente diferente de C para não merecer aprender C primeiro.

De uma perspectiva de sintaxe / família de linguagem, é quase melhor estudar SmallTalk (no qual o objetivo C é baseado)

De uma perspectiva prática, concentre seus esforços em aprender um idioma de cada vez.

Posteriormente, se você deseja aprender outra linguagem, C ++, Java e Python são 1) fáceis de aprender em conjunto 2) populares e, portanto, comercializáveis ​​3) poderosos.

Brooks
fonte
1
Não, Objective-C é um superconjunto muito pequeno de C. Sem C você não pode fazer nada em Objective-C. Claro, o modelo de objeto é obtido do smalltalk, mas a sintaxe para a maioria das partes nem chega perto.
Sven,
2

Você deve ter um conhecimento básico de C antes de iniciar Objective_C, mas não há necessidade de dominar todos os detalhes de C.

Publiquei minhas notas depois de ler "Programação em Objective-C", caso isso ajude outra pessoa.

aprenda o objetivo c com a programação

cfischer
fonte
1

Dependendo de muitas linguagens que você já conhece, pode ser uma ideia melhor começar a aprender Objective-C. A base na maioria das linguagens é basicamente a mesma, é a sintaxe que é diferente. Aprender C primeiro não vai fazer muita diferença quando se trata de aprender Objective-C.

Dave
fonte
Mas apenas se alguém souber pelo menos uma outra linguagem de programação.
Sven,
Além do comentário de
@Sven
1

Aprendi Objective-C imediatamente e funcionou bem por cerca de um ano. Só tive alguma dificuldade em ler o código C quando baixei o projeto para ver como eles funcionam, mas agora eu realmente sinto a necessidade de aprender C. Você pode tentar aprender ObjC sem C, mas mais cedo ou mais tarde, você precisará de C.

Alexandre Cassagne
fonte
1

IMHO deve-se primeiro aprender pelo menos alguns C e especialmente sobre ponteiros. Isso é ainda mais importante se alguém vier de uma linguagem que não possui ponteiros. Muitas pessoas perguntam sobre códigos como

NSString *string = [[NSString alloc] init];
string = @"something";

uma vez que eles não sabem sobre a distinção entre um ponteiro e o objeto para o qual ele aponta.

É claro que não é preciso aprender tudo em C antes de começar com Objective-C, mas algumas coisas fundamentais são absolutamente necessárias.

Sven
fonte
Eu gostaria de poder votar +10. Certa vez, em uma entrevista obj-c dev, me perguntaram se é possível criar um ponteiro para NSInteger ... Fiquei chocado, porque isso era tão essencial para mim, mas, não parece para todos. Portanto, é importante e fácil esquecer que isso também precisa ser compreendido.
MANIAK_dobrii
0

Caramba, não, vá direto para o objetivo C!

Mudei do ActionScript 3 para o Objective C e já tenho um estagiário em uma empresa!

Faça o que você quiser.

Nathan
fonte
Por que você perderia totalmente o estado de espírito orientado a objetos e começaria a aprender C primeiro? É como aprender a empinar pipa e ter esperança de ser piloto. Você deve integrar o OOP desde o início.
SwiftArchitect de
0

Se você aprender algum outro idioma antes, sempre terá confusão ao escrever a sintaxe correta. Não sei o propósito, mas Object C usa sintaxe estranha (não comum) para chamar métodos de objeto. Ele o nomeia como envio de mensagens, sim, é verdade, de acordo com o puro conceito orientado a objeto, no entanto, a maioria das linguagens orientadas a objeto o nomeia como método de chamada e usa uma sintaxe mais tradicional de métodos de chamada. A coleta de lixo também é algo muito estranho, o Objeto C é baseado na contagem de referência da velha escola. Portanto, você terá dificuldade em aceitá-lo se mudar de outro idioma. Estou escrevendo um livro guia de migração rápida de Object C para programadores C / C ++ na esperança de ajudar as pessoas a perceber todas as diferenças mais rapidamente.

Dmitriy
fonte
Porque em Objective-C "enviar uma mensagem" não é "chamar um método", mas, ao mesmo tempo, enviar uma mensagem causa a chamada de um método (função) =) Quando você envia uma mensagem para um objeto, ela passa por um despacho de mensagem mecanismo (você pode ler sobre isso aqui: developer.apple.com/library/ios/documentation/Cocoa/Conceptual/… ou aqui: stackoverflow.com/questions/982116/… )
MANIAK_dobrii