Em uma questão relacionada , foi esclarecido por que o C ++ não é compatível com o C em muitos aspectos. No entanto, o C ++ ainda é uma linguagem "híbrida" *. E, infelizmente, muitos programadores ainda consideram o C ++ como um "C com fluxos e seqüências incorporadas". Isso resulta em um código escrito muito ruim, que não é C ++ nem C. IMHO, seria melhor se a linguagem / compilador obrigasse, em certa medida, os programadores a escrever um código mais elegante. Portanto, existe uma justificativa para manter o híbrido C ++ moderno (por exemplo, C ++ 0x e versões futuras)?
* Por híbrido, quero dizer que cabe ao programador decidir se ele / ela usará: strings e fluxos padrão, classes, namespaces diferentes do padrão, etc.
c++
language-design
rationale
sakisk
fonte
fonte
Object
e valores binários de cópia e matrizes associativas divinadas por idioma (por que ...) juntamente com outras decisões questionáveis de design. Além disso, ele também possui efetivamente o mesmo paradigma do GC que os outros, então eu questionaria o baixo uso de memória.Respostas:
Sim, há uma forte lógica: o código C ++ quase sempre precisa chamar o código C existente. O melhor que podemos fazer é facilitar a escrita de um bom código. Não há nada que um designer de linguagem possa fazer para tornar impossível escrever código incorreto.
fonte
The best we can do is make it easy to write good code.
- Estamos falando do mesmo C ++?Não, não seria. Em absoluto. Como uma demonstração trivial do porquê, defina elegante e depois aposto que dez pessoas vão discordar de você.
Os estilos de codificação impostos pelo idioma são muito, muito ruins. Sem mencionar todo o código legado que será quebrado.
Notavelmente, as classes String e stream Standard são realmente péssimas .
std::string
não tem suporte a Unicode e a pior interface inchada que você poderia imaginar. Os fluxos têm uma sobrecarga horrenda e um design ruim, mesmo recorrendo a herança virtual, indicadores de funçãoconst char*
e feias como essa. Eu não penalizaria ninguém por substituir completamente as duas classes / grupos por classes personalizadas.Não usar classes e espaços para nome é bom para código no estilo de quadro branco e existem muitas bibliotecas que fornecem funções que não estão em uma classe. A aula forçada é uma péssima idéia.
fonte
O C ++ é um híbrido, não porque permite escrever código no estilo C, mas porque suporta vários paradigmas de programação, como procedurais, orientados a objetos e genéricos. O C ++ não o força a uma maneira de fazer as coisas, e essa é a sua força, porque problemas diferentes podem ser resolvidos mais facilmente usando paradigmas diferentes.
Então você primeiro precisa definir o que significa elegante . Em seguida, é necessário verificar se sua definição de elegante é apropriada para todos os domínios e plataformas com problemas nos quais o C ++ é usado. Um estilo de codificação elegante para escrever um processador de texto para Windows pode não ser adequado para a gravação de um sistema incorporado.
Considere escrever código C ++ para executar em um DSP. Primeiro, o compilador C ++ para esse DSP pode simplesmente não suportar certos recursos do C ++, como fluxos. Segundo, você está severamente limitado pela velocidade da CPU e, possivelmente, pela memória, portanto alguns recursos do C ++ podem simplesmente prejudicar o seu desempenho. Por exemplo, você pode ter que evitar funções virtuais por uma questão de velocidade. Tais considerações mudariam radicalmente seu estilo de programação, comparado ao que você usaria em um PC, e o C ++ permite isso.
Para resumir, o C ++ é uma linguagem enorme e complicada, com muitos recursos. Há muitas razões pelas quais qualquer subconjunto desses recursos pode não ser aplicável a um projeto específico: velocidade, portabilidade, suporte ao compilador ou até mesmo experiência e familiaridade com o programador. Por esse motivo, o idioma para forçar o desenvolvedor a usar determinados recursos em oposição a outros para qualquer tarefa é uma má idéia. Pense em Java, onde a linguagem exige que todas as funções sejam o método de uma classe. Existem muitos casos em que a criação de uma classe apenas para envolver um método é incômoda e desnecessária, e você precisa fazer isso porque a linguagem o obriga.
fonte
Ninguém está forçando alguém a usar C ++ em primeiro lugar. Se o idioma não combina com você, use um idioma diferente - há muitos idiomas cobrados como "C ++ sem C".
A filosofia de design do C ++ é deixar o programador decidir. Se eles querem dar um tiro no próprio pé, deixe-os. Isso permite que muitas coisas ruins sejam feitas, mas também permite uma grande flexibilidade. Por exemplo, é improvável que o Boost possa ser escrito em uma linguagem como Java, pois tira proveito dos recursos e práticas da linguagem geralmente evitados. Também é improvável que o C ++ cresça tão grande quanto hoje - ter acesso à vasta biblioteca C é uma grande vantagem, pegue ou largue.
A compatibilidade do C ++ com o C é definitivamente um dos pontos mais fracos, mas também lembre-se de que é um dos melhores.
Vou acrescentar uma maravilhosa citação de Jon Purdy, que considero extremamente relevante:
A remoção do híbrido pode melhorar a elegância, mas prejudica a capacidade.
fonte
Se o comitê tentasse forçar as pessoas a usar (a noção de alguém) de uma linguagem mais elegante, provavelmente seria ignorada. As pessoas continuariam a fazer o que quisessem e os fornecedores de compiladores seguiriam o mercado (mas os fornecedores de compiladores têm representação suficiente no comitê para evitar isso).
Muito do que você está defendendo é realmente uma questão de julgamento, com base no domínio do problema. Existem muitos programas pequenos que simplesmente não precisam (por exemplo) de namespaces. Tentar me forçar a usar um espaço para nome quando estou escrevendo um filtro de texto de 30 linhas seria uma tolice e arrogância. Mesmo que você tenha decidido que isso só se aplicaria quando mais de X linhas de código, funções Y ou o que quer que estivesse envolvido, ainda assim seria contraproducente. Os namespaces foram projetados por uma razão, para prevenir / curar problemas específicos. Tentar forçar seu uso na ausência desses problemas não traz nada de útil para ninguém.
Ao mesmo tempo, acho que vale a pena notar que algumas pessoas realmente gastam muito tempo e esforço tentando não apenas habilitar a elegância em C ++, mas também ensinam e levam as pessoas a usar esses recursos para escrever um código melhor (por exemplo, muitos colaboradores do Boost). Como tal, as pessoas que continuam insistindo em escrever seu código como "C com classes" ignoram praticamente o que está lá fora. Eu acho que eles ficariam tão confortáveis em ignorar novos compiladores quanto em tudo que foi aprendido sobre como usar C ++ na última década ou mais (por exemplo, o Modern C ++ Design foi publicado há 11 anos - mas a maioria das pessoas você está falando sobre aparentemente não ouviu falar ainda, muito menos leu ou entendeu até as partes mais simples).
fonte
Sua ideia constitui grande parte da lógica do design por trás do Java. O Java força você a usar classes, organizar a hierarquia de arquivos de acordo com a hierarquia de pacotes, capturar exceções, etc. As pessoas ainda conseguem escrever código semelhante a C nele.
Como programadores, às vezes esquecemos que a melhor solução pode não ser técnica. As revisões por pares são a solução mais conhecida nesse caso.
fonte
C ++ não tem "um caminho verdadeiro"; toda abordagem tem pontos fortes e fracos. A solução pode ser escrita de cem maneiras diferentes.
Você, como desenvolvedor de software, precisa decidir qual abordagem é melhor para a tarefa em questão.
fonte
Eu acho que o fato de todas as coisas listadas serem opcionais cria um potencial para mais elegância, não menos. Um recurso usado desnecessariamente é deselegante aos meus olhos.
Os problemas que precisamos resolver usando a programação são muito diferentes.
Alguns são bem resolvidos usando princípios OO (por exemplo, GUIs), outros se prestam melhor a um tratamento puramente funcional (por exemplo, coisas numéricas), enquanto outros são melhor expressos em uma linguagem de baixo nível "próxima ao silício".
Muitos softwares precisam resolver subproblemas que são resolvidos melhor de qualquer uma dessas maneiras. Forçar a solução em um formulário específico só levará a um código menos adequado ao seu objetivo (você pode até dizer "menos elegante").
É por isso que o hibridismo do C ++ é uma coisa boa - ele permite resolver uma vasta gama de problemas de uma maneira que se adapte ao problema , não ao dogma atual.
É claro que pode ser mal utilizado - sempre que você tem uma coisa flexível, corre-se o risco de entortá-la de maneira ruim - mas a elegância vem do pensamento e da experiência cuidadosos, não da adesão a qualquer que seja a moda do dia.
fonte