A sobrecarga do método do objetivo-c torna desaconselhável uma abordagem de design de 'muitos métodos pequenos'?


15

Geralmente sou a favor do uso de métodos pequenos, como recomendado por Bob Martin no Clean Code , entre outros . Também li o suficiente sobre os internos do Objective-C para ter pelo menos uma idéia de como funciona o envio de mensagens (a série bbums é particularmente informativa sobre isso).

Apesar da otimização prematura, eu gostaria de saber se todo o trabalho que o Objective-c faz com objc_msgSend é, em termos práticos, significativo o suficiente para que a abordagem de 'muitos métodos pequenos' seja desaconselhável para projetos de Objective-C.

Achados empíricos são particularmente bem-vindos (talvez eu mesmo faça um teste algum dia). A experiência de quem já escreveu grandes projetos de objetivo-c também seria ótima.

Esclarecimento

O tom geral da pergunta é intencional. Não estou perguntando sobre o ajuste de desempenho de aplicativos específicos (é por isso que pergunto aqui, e não no SO), mas mais sobre se as características de linguagem do Objective-C desencorajam uma certa abordagem de design. Eu observei que grande parte do código que eu vi da Apple e de outras partes (no github etc) tende a métodos (e classes) grandes, e estou me perguntando se esse é um viés que surgiu por causa da linguagem. em si. É claro que eu posso estar lendo o código errado, ou pode ser fatores culturais e não técnicos que levaram à tendência, se ela existir.

(Pelo que vale a pena, atualmente estou escrevendo Objective-C e usando métodos pequenos)

Pedido adicional

Eu concordo com as duas respostas que foram dadas. Outra coisa que eu gostaria é que alguém me aponte para uma base de código Objective-C de código-fonte aberto (que é substancialmente visível) (ou de outra forma visível) que usa métodos curtos e agradáveis ​​(e classes pequenas). Ainda não vi nada no Objective-C para comparar com (por exemplo) a fonte fitnesse .


1
Mike Ash tem alguns posts legais mostrando números para Leopard e iOS . Não os tenho digerido completamente, mas parece que para os IMPs em cache a sobrecarga é insignificante e, mesmo em despachos que exigem pesquisa, é bem pequeno. Se essa rápida impressão estiver correta, parece que pequenos métodos podem permanecer ou cair nos mesmos motivos de design no ObjC que em qualquer outro idioma.
Cris

1
Se você deseja evitar essa sobrecarga, use as funções C.
rightfold 26/10/11

Tecnicamente possível, mas muito está perdido com funções. Substituiria apenas métodos por funções para partes de código direcionadas e sensíveis ao desempenho. Estou perguntando aqui se a sobrecarga é problemática o suficiente para reconsiderar um estilo preferido de codificação / design.
Cris

Consulte Custo do envio de mensagens no Objective-C no SO para obter algumas boas respostas.
Caleb

Por que você simplesmente não cria um perfil do seu código no Xcode? Entendo que você está perguntando em resumo e não sobre código específico, mas como você aparentemente tem algum código com muitos métodos pequenos, por que não executá-lo e ver por si mesmo?
Caleb

Respostas:


4

Realmente não sei se a sobrecarga é insignificante ou não. Porém, eu preferiria projetar um sistema para ser facilmente compreensível e sustentável primeiro , e isso normalmente significa métodos e classes pequenos e focados. Isso também ajudará com o ajuste de código subsequente (apenas porque o código é mais sustentável). Além disso, é importante criar um perfil do código para encontrar gargalos reais, que podem até não estar relacionados à sobrecarga de chamada de método. Se você executar operações fora do processo (por exemplo, chamadas ao banco de dados, rede, sistema de arquivos), elas tendem a dominar o tempo de execução do programa de qualquer maneira.

Mas, como sempre, sua milhagem pode variar ...


É claro que concordo com tudo isso (veja a referência ao 'tio Bob' na pergunta). Mas se uma linguagem não se presta em geral a uma certa abordagem de design, os programadores podem fazer outras escolhas. Eu não vi muito código Objective-C que realmente segue os métodos pequenos (e classes, por sinal), e estou me perguntando o porquê. Vou adicionar uma nota à pergunta.
Cris

@ Cris: "Eu não vi muito código Objective-C que realmente segue os métodos pequenos" -> Apenas curioso: de que corpo de código você tirou essa conclusão? Eu acredito nisso, mas também acredito que não é por causa da conscientização da micro-otimização, mas por mais programadores que não se concentram nos princípios do bom design e da manutenção. Dito de outra forma, a sua Java, C #, Ruby ou qualquer código deve seguir as mesmas práticas ...
Jordão

Sim, isso é bem possível. Eu não tinha nenhuma base de código específica em mente; apenas o que eu olhei ao longo do ano, mais ou menos, trabalhei com o Objective-C. O maior conjunto de código que eu observei foi o código-fonte aberto do grupo Omni e o IIRC que tinha muitos métodos grandes. O código de exemplo da Apple também costuma funcionar. Mas é claro que (a) o código de exemplo é exatamente isso, e (b) meu exemplo pode ser ponderado em relação ao código da interface do usuário, ver os controladores em particular, e estes podem ser codificados de maneira diferente das camadas mais profundas.
Cris

2

A grande maioria do código não será crítica para o desempenho em nenhum aplicativo, portanto, mesmo que a sobrecarga do método fosse significativa em comparação com outras linguagens, a abordagem ideal ainda seria ter muitos métodos pequenos na maioria dos lugares e alinhar apenas aqueles que determinam o perfil. mostrou ser crítico para o desempenho.

Claro, existem muitas pessoas que não sabem como otimizar adequadamente, e algumas podem saber sobre sobrecarga de método e se envolver em atos de otimização prematura global, mas não acredito que o grupo seja grande o suficiente para ter um impacto significativo no ecossistema Objective-C.

É muito mais provável que métodos e classes grandes sejam o trabalho de um grande grupo de pessoas que não sabem nem se importam com criadores de perfil, sobrecarga de método ou design adequado e que tendem a produzir Big Balls of Mud em qualquer idioma. E sim, algumas dessas pessoas trabalham em bases de código de alto perfil nas principais empresas de software.

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.