TD; DR:
Havia alguma confusão sobre o que eu estava perguntando, então aqui está a ideia principal por trás da pergunta:
Eu sempre pretendi que a pergunta fosse o que é. Eu posso não ter articulado bem originalmente. Mas a intenção sempre foi " é um código modular, separado, acoplado, desacoplado, refatorado " marcadamente mais lento por sua própria natureza do que o código " monolítico de unidade única, faça tudo em um só lugar, um arquivo, código fortemente acoplado ". O resto são apenas detalhes e várias manifestações disso que me deparei na época, agora ou depois. É mais lento, com certeza em alguma escala. Como um disco sem desfragmentação, você deve coletar as peças de qualquer lugar. É mais lento. Com certeza. Mas eu deveria me importar?
E a questão não é sobre ...
não se trata de micro-otimização, otimização prematura, etc. Não se trata de "otimizar isto ou aquela parte até a morte".
Então o que é?
Trata-se da metodologia e técnicas gerais e maneiras de pensar sobre a escrita de código que surgiu ao longo do tempo:
- "injete esse código na sua classe como uma dependência"
- "escreve um arquivo por classe"
- "separa sua visão do seu banco de dados, controlador, domínio".
- não escreva espaguetes homogêneos com código único, mas escreva muitos componentes modulares separados que trabalham juntos
Trata-se da maneira e do estilo de código que é atualmente - nesta década - visto e defendido na maioria das estruturas, defendido em convenções, transmitido pela comunidade. É uma mudança de pensamento de 'blocos monolíticos' para 'microsserviços'. E com isso vem o preço em termos de desempenho e sobrecarga no nível da máquina, e também algumas sobrecargas no nível do programador.
Segue a pergunta original:
No campo da Ciência da Computação, notei uma mudança notável no pensamento quando se trata de programação. Me deparo com o conselho muitas vezes que é assim:
- escreva um código menor em função de função (mais testável e sustentável dessa maneira)
- refatorar o código existente em partes cada vez menores até que a maioria dos métodos / funções tenha apenas algumas linhas e fique claro qual é o objetivo delas (o que cria mais funções, comparado a um bloco monolítico maior)
- escrever funções que fazem apenas uma coisa - separação de preocupações, etc (que geralmente cria mais funções e mais quadros em uma pilha)
- crie mais arquivos (uma classe por arquivo, mais classes para fins de decomposição, para fins de camada, como MVC, arquitetura de domínio, padrões de design, OO, etc, o que cria mais chamadas do sistema de arquivos)
Essa é uma alteração comparada às práticas de codificação "antigas" ou "desatualizadas" ou "espaguete", nas quais você tem métodos abrangendo 2500 linhas, e grandes classes e objetos divinos fazendo tudo.
Minha pergunta é esta:
quando se trata de código de máquina, 1s e 0s, instruções de montagem, pratos HDD, devo me preocupar com o fato de que meu código OO perfeitamente separado por classe e com várias funções e métodos refatorados pequenos a minúsculos também gera sobrecarga extra?
Detalhes
Embora eu não esteja intimamente familiarizado com o modo como o código OO e suas chamadas de método são tratadas no ASM no final, e como as chamadas de DB e as chamadas de compilador se traduzem em mover o braço do atuador em uma bandeja de disco rígido, tenho alguma ideia. Suponho que cada chamada de função extra, chamada de objeto ou chamada "#include" (em alguns idiomas) gere um conjunto extra de instruções, aumentando assim o volume do código e adicionando várias despesas gerais de "fiação de código", sem adicionar o código "útil" real . Também imagino que boas otimizações podem ser feitas no ASM antes de serem executadas no hardware, mas essa otimização pode fazer muito também.
Portanto, minha pergunta - quanto de sobrecarga (em espaço e velocidade) um código bem separado (código que é dividido em centenas de arquivos, classes e padrões de design etc.) realmente se compara a um "grande método que contém tudo em um arquivo monolítico ", devido a essa sobrecarga?
ATUALIZAÇÃO para maior clareza:
Estou assumindo que pegar o mesmo código e dividi-lo, refatorá-lo, separá-lo em mais e mais funções, objetos e métodos e classes resultará em mais e mais parâmetros passando entre pedaços de código menores. Porque, com certeza, o código de refatoração deve manter o encadeamento, e isso exige a passagem de parâmetros. Mais métodos ou mais classes ou mais padrões de design dos Métodos de Fábrica resultam em mais sobrecarga na transmissão de vários bits de informação mais do que no caso de uma única classe ou método monolítico.
Foi dito em algum lugar (citação TBD) que até 70% de todo o código é constituído pela instrução MOV do ASM - carregando os registros da CPU com variáveis apropriadas, não a computação real sendo feita. No meu caso, você carrega o tempo da CPU com instruções PUSH / POP para fornecer ligação e passagem de parâmetros entre várias partes do código. Quanto menor você criar suas partes de código, mais "ligação" será necessária. Estou preocupado com o fato de esse vínculo aumentar o inchaço e a desaceleração do software, e me pergunto se devo me preocupar com isso e quanto, se é que existe, porque as gerações atuais e futuras de programadores que estão construindo software para o próximo século , terá que conviver e consumir software criado com essas práticas.
UPDATE: vários arquivos
Estou escrevendo um novo código agora que está substituindo lentamente o código antigo. Em particular, observei que uma das classes antigas era um arquivo de linha ~ 3000 (como mencionado anteriormente). Agora está se tornando um conjunto de 15 a 20 arquivos localizados em vários diretórios, incluindo arquivos de teste e não incluindo a estrutura PHP que estou usando para vincular algumas coisas. Mais arquivos estão chegando também. Quando se trata de E / S de disco, o carregamento de vários arquivos é mais lento que o carregamento de um arquivo grande. É claro que nem todos os arquivos são carregados, eles são carregados conforme necessário, e existem opções de armazenamento em cache em disco e memória e, ainda assim, acredito que seja loading multiple files
necessário mais processamento do que loading a single file
na memória. Estou acrescentando isso à minha preocupação.
ATUALIZAÇÃO: Dependência Injete tudo
Voltando a isso depois de um tempo ... Acho que minha pergunta foi mal compreendida. Ou talvez eu tenha escolhido não entender algumas respostas. Não estou falando sobre micro-otimização, como algumas respostas destacaram (pelo menos eu acho que chamar o que estou falando sobre micro-otimização é um termo impróprio), mas sobre o movimento de "Refatorar código para afrouxar o acoplamento rígido", como um todo , em todos os níveis do código. Vim de Zend Con recentemente, onde esse estilo de código tem sido um dos pontos centrais e centrais da convenção. Desacoplar a lógica da exibição, exibição do modelo, modelo do banco de dados e, se possível, desacoplar dados do banco de dados. Dependency-Injete tudo, o que às vezes significa apenas adicionar código de fiação (funções, classes, clichê) que não faz nada, mas serve como ponto de costura / gancho, dobrando facilmente o tamanho do código na maioria dos casos.
ATUALIZAÇÃO 2: "Separar código em mais arquivos" afeta significativamente o desempenho (em todos os níveis da computação)
Como a filosofia do compartmentalize your code into multiple files
impacto afeta a computação atual (desempenho, utilização de disco, gerenciamento de memória, tarefas de processamento da CPU)?
Eu estou falando sobre
Antes...
Em um passado hipotético, mas bastante real e não tão distante, você pode escrever facilmente um monobloco de um arquivo que possui model e view e controller spaghetti ou não-spaghetti-coded, mas que executa tudo quando já está carregado. Fazendo alguns benchmarks no passado usando o código C, descobri que é MUITO mais rápido carregar um único arquivo de 900Mb na memória e processá-lo em grandes pedaços do que carregar um monte de arquivos menores e processá-los em uma refeição pacífica menor pedaços fazendo o mesmo trabalho no final.
.. E agora*
Hoje eu me pego olhando para o código que mostra um razão, que possui recursos como ... se um item é um "pedido", mostra o bloco HTML do pedido. Se um item de linha puder ser copiado, imprima o bloco HTML que exibe um ícone e os parâmetros HTML por trás dele, permitindo que você faça a cópia. Se o item puder ser movido para cima ou para baixo, exiba as setas HTML apropriadas. Etc. Eu posso, através do Zend Framework, criarpartial()
chama, o que significa essencialmente "chamar uma função que pega seus parâmetros e os insere em um arquivo HTML separado que também chama". Dependendo do detalhamento que desejo obter, posso criar funções HTML separadas para as menores partes do razão. Um para seta para cima, seta para baixo, outro para "posso copiar este item" etc. etc. Crie facilmente vários arquivos apenas para exibir uma pequena parte da página da web. Tomando meu código e o código do Zend Framework nos bastidores, o sistema / pilha provavelmente chama perto de 20 a 30 arquivos diferentes.
O que?
Estou interessado em aspectos, o desgaste da máquina criada pela compartimentação do código em muitos arquivos separados menores.
Por exemplo, carregar mais arquivos significa tê-los localizados em vários locais do sistema de arquivos e em vários locais do HDD físico, o que significa mais tempo de busca e leitura do HDD.
Para a CPU, provavelmente significa mais alternância de contexto e carregamento de vários registros.
Neste sub-bloco (atualização 2), estou interessado mais estritamente em como o uso de vários arquivos para executar as mesmas tarefas que poderiam ser realizadas em um único arquivo afeta o desempenho do sistema.
Usando a API do Zend Form vs HTML simples
Usei a API do Zend Form com as melhores e mais modernas práticas de OO, para criar um formulário HTML com validação, transformando-os POST
em objetos de domínio.
Levei 35 arquivos para fazer isso.
35 files =
= 10 fieldsets x {programmatic fieldset + fieldset manager + view template}
+ a few supporting files
Tudo isso pode ser substituído por alguns arquivos HTML + PHP + JS + CSS simples, talvez um total de 4 arquivos leves.
É melhor? Vale a pena? ... Imagine carregar 35 arquivos + vários arquivos da biblioteca Zend Zramework que os fazem funcionar, em comparação a 4 arquivos simples.