Devemos evitar os recursos de linguagem que o C ++ possui, mas o Java não?

110

Suponha que eu esteja limitado a usar C ++ pelo ambiente no projeto. É bom impedir o uso de alguns recursos de linguagem que o C ++ possui, mas o Java não possui (por exemplo: herança múltipla, sobrecarga do operador)?

Eu acho que as razões são:

  1. Como o Java é mais recente que o C ++, se o Java não fornece um recurso que o C ++ possui, isso significa que o recurso não é bom, portanto, devemos evitar usá-lo.
  2. O código C ++ com recursos específicos do C ++ (por exemplo: funções de amigo, herança múltipla) só pode ser mantido ou revisado pelos programadores de C ++, mas se escrevermos C ++ como Java (sem o recurso específico da linguagem C ++), o código poderá ser mantido ou revisado por ambos. Programadores em C ++ e Java.
  3. Você pode ser solicitado a converter o código em Java algum dia
  4. Código sem recursos específicos de C ++ geralmente é mais sustentável
  5. Todo recurso específico da linguagem C ++ (por exemplo: herança múltipla) deve ter alternativas a serem implementadas em Java. Caso contrário, isso significa que o padrão de design ou a arquitetura de código é problemática.

Isso é verdade?

ggrr
fonte
7
Se você analisar suas sugestões, estará falando sobre a criação de um padrão de codificação. O fato de você estar criando e seguindo um padrão é realmente o que aumentará a capacidade de manutenção.
Brandin
63
O código Java também deve ser restrito a recursos, que também são encontrados na linguagem C ++? Portanto, não use, por exemplo volatile, Java , acesso de membro da classe privada de pacote, reflexão / introspecção, finalmente blocos, exceções verificadas e assim por diante? A questão toda não faz muito sentido ... C ++ e Java são superficialmente similares, mas, em última análise, linguagens muito diferentes.
Hyde
5
Como os idiomas evoluirão se as pessoas não estiverem dispostas a usar novos recursos? O objetivo dos novos recursos é facilitar sua vida, resolvendo problemas comuns. Se os usuários não usarem novos recursos, não haverá motivação para implementá-los.
Matthew
72
Se você deseja Java, use Java. Se você usa C ++, use C ++, não uma imitação horrível e distorcida de Java com sintaxe C ++. Usar C ++, mas restringir-se ao conjunto de recursos do Java, oferece o pior dos dois mundos.
Jerry Coffin
11
Você ficaria surpreso com a rapidez com que as diferenças o morderão (e com força ). SomeObject a = previousObject;faz coisas muito diferentes em Java e C ++. Em Java, copia uma referência, enquanto em C ++, copia o objeto. Em Java, modificações em atambém afetariam o objeto anterior. No C ++, você tem dois objetos separados.
Clockwork-Muse

Respostas:

307

Não. Isso é lamentável e terrivelmente equivocado.

  • Os recursos Java não são de alguma forma melhores que os recursos do C ++, especialmente no vácuo.
  • Se seus programadores não souberem usar um recurso, treine ou contrate desenvolvedores melhores; limitar seus desenvolvedores ao pior da sua equipe é uma maneira rápida e fácil de perder seus bons desenvolvedores.
  • YAGNI . Resolva seu problema atual hoje, não o fantasma de algum problema futuro.
Telastyn
fonte
6
Recentemente, houve uma pergunta sobre os desenvolvedores revisando o código em um idioma que eles normalmente não escrevem. Eu acho que a sabedoria aqui se aplica aqui: um bom desenvolvedor identificará muitos erros básicos em praticamente qualquer idioma, mas cada idioma tem tantos truques que o benefício máximo é alcançado quando os desenvolvedores do idioma fazem a revisão. Isso é verdade mesmo se o seu C ++ for "Somente recursos Java".
corsiKa
5
+1 Além do seu segundo ponto. O OP deve reservar um tempo para ler sobre "Práticas recomendadas de C ++" para decidir quais recursos eles devem usar. Minhas últimas informações sobre C ++ são que as funções de amigo e a herança múltipla são consideradas práticas inadequadas . Coisas como modelos e sobrecarga de operador são boas práticas do IMHO se você as usar com sabedoria.
some_coder
4
@ someome_coder: é tudo uma questão de saber quando e onde. Quando faço programação baseada em políticas, herdo das (possivelmente múltiplas) classes de políticas para estender a estrutura da minha classe host com os membros que essas classes de políticas exigem para funcionar. É assim que funciona. Além disso, operator<<( ostream &, T const & )geralmente é implementado via friend. Esse é o problema com as declarações gerais sobre o que é um recurso de linguagem bom eo que é mau: Eles são bons conselhos, exceto quando eles não são ...
DevSolar
142

Só porque a sintaxe parece similar na superfície não significa que os dois idiomas sejam compatíveis.

1, 4 e 5 são realmente a mesma pergunta:

Agora, eu não sou fã de C ++, mas dizer "Código sem recursos específicos de C ++ é geralmente mais sustentável" é apenas ridículo - você realmente acredita que o Java acertou tudo e aproveitou todos os recursos bons, ignorando todos os ruins? Você realmente acredita que existe algo universalmente um recurso "ruim" ou "bom"? Se houver, por que não temos um idioma que seja puramente bom? E não, Java certamente não é essa linguagem. Isso significa que Java e C ++ são inúteis? Claro que não.

E se seus líderes decidirem que você vai portar para C #, em vez de Java? O C # não apenas suporta operadores de substituição, mas também é o padrão - se você vai exigir que as pessoas usem, por exemplo, em obj.Equals(obj2)vez de obj == obj2, as pessoas cometem erros o tempo todo. Mesmo que você mantenha apenas os recursos comuns dos dois idiomas, há expectativas diferentes , uma cultura diferente. Se você fizer algo como if (myField == null)em C ++, as pessoas verão que você é novato imediatamente. Se você usa o if (null == myField)C #, as pessoas verão que você ainda não é nativo do C # - os motivos pelos quais os desenvolvedores do C aprenderam a usar a variante "invertida" não existem mais no C #.

Usando sua lógica, deveríamos ter ficado presos ao código de máquina ou montagem ou COBOL, porque por que mudar para algo como Pascal, quando apenas adiciona novos recursos que seus programadores terão que aprender? Por que usaríamos algo como SQL, quando ele nem tem loops ? Por que usaríamos algo além do SQL, quando o SQL não possui loops e o X ?

O código C ++ certamente não pode ser mantido por programadores Java. Não consigo entender de onde você tirou essa idéia - o que resta exatamente quando você limita o C ++ apenas aos recursos que funcionam exatamente da mesma forma que em Java? Você nem receberá chamadas de método - nem mesmo chamadas de função . Novamente, apenas porque os dois idiomas usam chaves, não significa que os idiomas sejam intercambiáveis.

A conversão de código C ++ semelhante a Java será extremamente suscetível a erros, não importa o que você faça. Existem diferenças demais. Se você deseja reescrever seu aplicativo em um idioma diferente, pense em maneiras razoáveis ​​de modularizar tudo, para poder substituir as peças sem quebrar o todo. Mas, no final, YAGNI - não importa o que você faça, haverá um custo significativo para tornar seu código "pronto para converter para Java". É hora de gastar muito melhor adicionando ou melhorando seus recursos.

Usamos idiomas diferentes porque eles nos fornecem um conjunto diferente de ferramentas para resolver problemas. Se você precisar de executáveis ​​que funcionem "em qualquer lugar", vá com Java. Se você deseja código que compila "em qualquer lugar", o C ++ funciona bem. Se você deseja um código fácil de entender e analisar, vá com o LISP ou o que for. Mas posso lhe dizer uma coisa: escrever código em um idioma como se você estivesse escrevendo em outro é sempre um erro e você sofrerá. Sem mencionar que, quando você realmente contrata um profissional de C ++, ele executa o segundo em que vê o código "compatível com Java". E ... o cara do Java fará o mesmo. Você sabe, mesmo "conhecendo" C ++ e Java, eu correria como o inferno :)

Na verdade, eu tive que trabalhar no código C (simples) escrito por um desenvolvedor de Pascal que parecia pensar como você. Ele usou #defines para redefinir C para parecer e se parecer mais com Pascal, com coisas como "BEGIN traduz para {". O resultado foi bastante previsível - código que nem os desenvolvedores de C nem de Pascal podem entender, e cheio de bugs que foram o resultado da "abstração" vazada de Pascal em cima de C. E Pascal e C são quase idênticos do ponto de vista de hoje. Mesmo usando C <-> C ++ é muito mais uma diferença, e isso ainda é algo semelhante a C ++ <-> Java.

Luaan
fonte
9
"Se você deseja código fácil de entender e analisar, vá com o LISP ou o que for". Eu não concordo com isso. O Lisp é trivial de analisar, mas precisamente por isso - porque foi criado em uma época em que o conhecimento dos analisadores e os princípios por trás da sua criação ainda estavam em sua infância, e por isso eles deram o pontapé e seguiram a coisa mais ridiculamente simplista isso poderia funcionar - você não obtém muitos dos benefícios sintáticos das linguagens modernas. Portanto, é fácil analisar, mas não é nada fácil de entender . Há uma razão pela qual as pessoas chamam de "Perdido em parênteses supérfluos".
Mason Wheeler
9
@MasonWheeler Isso é uma questão de gosto - os programadores em C chamavam isso de LISPers: P. Conte os parênteses - existem tantos quantos no seu programa C ++ típico. A diferença real é a posição deles ( myFunc()versus (myFunc)), e isso tem uma boa razão. As linguagens baseadas em LISP ainda são muito populares, especialmente entre as pessoas de matemática / física. O principal é que as linguagens LISPy não são muito conhecidas pelos programadores modernos de estilo C - mas isso não é motivo para ignorá-lo. Scheme, Clojure e, em certa medida, as linguagens baseadas em ML (OCaml, F # ...) são realmente muito LISPy.
Luaan 26/01
4
@Luaan Posso dizer com certeza que o LISP NÃO é popular na física. Os dois idiomas dominantes no campo são FORTRAN e C ++. FORTRAN é 'popular' porque muitos códigos antigos foram escritos nele, mas quase todos os novos programas são escritos em C ++. Como físico de pesquisa, nunca encontrei nem ouvi falar de um programa LISP. Para não dizer que eles não existem, mas as línguas definitivamente não são populares .
James Matta
4
@Luaan Podemos ou não precisar de mais desenvolvedores de software. Definitivamente, não precisamos de mais graduados em CS. É como dizer "precisamos de mais engenheiros estruturais, por isso precisamos de mais graduados em física teórica".
Rout de milhas
4
@ user1717828 É para evitar os efeitos delicados da digitação incorreta if (myField == null)como if (myField = null), que compila muito bem o C / C ++, mas provavelmente não faz o que você pretendia. Por outro lado, if (null = myField)lançará um erro, pois você não pode atribuir a uma constante.
Wlerin 27/01
94

Vou responder suas perguntas em ordem.

  1. Se o Java não fornece um recurso que o C ++ possui, significa que o recurso não é bom, portanto, devemos evitar usá-lo.

Sim, qualquer recurso que não esteja presente em Java é um anátema no disco rígido. Ele deve ser gravado da sua base de código. Aqueles que não obedecem serão espremidos, suas almas usadas para aplacar os deuses do RAID.

  1. O código C ++ com recursos específicos do C ++ (por exemplo: funções de amigo, herança múltipla) só pode ser mantido ou revisado pelos programadores de C ++, mas se escrevermos C ++ como Java (sem o recurso específico da linguagem C ++), o código poderá ser mantido ou revisado por ambos. Programadores em C ++ e Java.

Em caso de dúvida, escreva um código para o membro menos competente da sua equipe. O código é lido com muito mais frequência do que o escrito, e o código que é tão inteligente quanto você pode escrever é muito inteligente para ler. Revisões de código que sua equipe da recepção não entenderá devem ser rejeitadas. Para ajudar, ensine-os a programar no visual basic 2.0 no fim de semana e emule o estilo de codificação no idioma que você estiver usando.

  1. Você pode ser solicitado a converter o código em Java algum dia

Verdadeiro! Mas por que parar em Java? Você pode ser solicitado a converter o código em basic, assembler e / ou perl um dia. Como existem intérpretes perl em todos os idiomas, simplesmente escreva seu programa como uma longa cadeia perl e marque argumentos nele no idioma de sua escolha.

Agora, quando você precisar alterar os idiomas, basta reescrever o código que envolve a string perl.

  1. Código sem recursos específicos de C ++ geralmente é mais sustentável

É verdade que o código que utiliza menos recursos é mais fácil de manter. E como todas as linguagens são equivalentes a uma Máquina de Turing, e uma Máquina de Turing possui o menor número de recursos de qualquer linguagem de programação, o intérprete perl acima realmente executa uma Máquina de Turing (fita e tudo) que resolve seu problema.

  1. Todo recurso específico da linguagem C ++ (por exemplo: herança múltipla) deve ter alternativas a serem implementadas em Java. Caso contrário, isso significa que o padrão de design ou a arquitetura de código é problemática.

Os recursos específicos da linguagem C ++ têm um uso valioso. Como não são Java, são um anátema, e aqueles que o usam podem ser considerados hereges. Se o C ++ não tivesse esses recursos de linguagem, você não conseguiria encontrar aqueles que precisa sacrificar. Recursos da linguagem C ++ resolvem problemas!


Veja, C ++ e Java têm um conjunto diferente de recursos. A programação na interseção de C ++ e Java resulta em código que descartou a maioria das vantagens de ambas as linguagens.

O Java foi desenvolvido parcialmente como uma reação a alguns abusos dos recursos do C ++. Isso não significa que a reação foi justificada, especialmente anos depois, quando os recursos amadureceram.

Você pode fazer coisas horríveis com sobrecarga do operador; mas nenhum idioma pode impedir que um código horrível seja escrito no idioma, a menos que ele impeça que todo código seja escrito no idioma.

E você também pode fazer coisas muito elegantes com sobrecarga do operador. Coisas simples, como um número complexo ou classe de matriz que funciona como número complexo ou uma matriz.

Cuidado com o uso de recursos C ++ não disponíveis em Java deve ser visualizado com cuidado. Só porque seu conjunto atual de desenvolvedores no nível de habilidade atual não entende um recurso não significa que ele nunca deve ser usado; ao mesmo tempo, só porque você pode usar um recurso, não significa que deveria. No entanto, em uma loja pesada de Java, as chances são de que a resistência será mais forte do que deveria contra recursos que não sejam do estilo Java.

A conversão de código entre idiomas é melhor feita com uma reescrita, não importa quão estruturalmente semelhantes eles sejam. Qualquer tentativa de fazê-lo sem essa reescrita falhará miseravelmente.

Muitos recursos específicos do C ++ são maravilhas para manutenção. O apagamento de tipo (como std::function) permite dissociar hierarquias, o que reduz dependências. Indicadores inteligentes, vida útil determinística e RAII reduzem surpresas de tempo de execução e afastam o clichê de recursos. Verificações de tipo estáticas pesadas significam que o código falha na compilação, em vez de falhar no trabalho. Os mix-ins reduzem a duplicação de código. A ADL permite a extensão ad-hoc independente de interfaces entre hierarquias de tipos. O Lambda permite escrever um código próximo ao local onde é usado. O encaminhamento e a movimentação reduzem as cópias e tornam eficiente a programação de estilos funcionais (sem efeitos colaterais). A sobrecarga do operador reduz o ruído da linha e faz o código parecer mais com a matemática que está modelando.

Cuidado com o poço de Turing Tar. Você pode implementar tudo em qualquer idioma (incluindo uma máquina de Turing com fita), mas isso não significa que você deva . Emular recursos do C ++ usando construções de estilo Java no C ++ é uma ideia horrível; isso resultará em código não sustentável que ninguém pode ler ou entender.

Você pode se inspirar nos projetos Java e portá-los para C ++. Sou um grande fã de pegar os recursos da linguagem Python e implementá-los em C ++, porque gosto da sintaxe. Mas isso não significa que escrevo meus métodos de classe como métodos estáticos, assumindo uma identidade explícita, depois escrevo um wrapper que encaminha a chamada de método não estático para ele.

O C ++ moderno não é muito parecido com a linguagem Java emulada e rejeitada. Não fique bloqueado pelos recursos de um idioma; não existe "uma linguagem verdadeira". Aprenda sobre novos idiomas e seus recursos e absorva sua distinção.

Yakk
fonte
1
-1, de corda longa e pouco clara.
djechlin
4
-1 argumentativo, argumento do homem
palhaço
28
+1, desconstrução adequada das perguntas e eu ri :) #
cat
11
+1. Hilariante, mas mantém o ponto. Muito claro para as pessoas que realmente estão lendo.
Luis Masuelli
14
"A programação na interseção de C ++ e Java resulta em código que jogou fora a maioria das vantagens de ambas as linguagens." Bater o prego na cabeça! +1
Ajedi32
56

Eu só vou responder suas razões:

  1. Não entendo como você chega a essa conclusão. Idiomas diferentes têm recursos diferentes. Depende do escopo, arquitetura da linguagem, às vezes preferências dos criadores e muitos outros motivos. Alguns recursos de um idioma podem estar ruins, mas sua generalização está claramente errada no IMHO.
  2. Escrever C ++ exatamente como Java pode levar a um código pior. Por exemplo, hoje em dia com o C ++ 11, evito usar new / delete, mas uso ponteiros compartilhados. No seu cenário, eu confiaria apenas em novo / excluir. Se seus programadores entendem apenas Java, treine-os ou contrate melhores.
  3. Isso provavelmente vai acontecer? Por que você não escreve em Java em primeiro lugar? Acho que reescrever programas do zero em um novo idioma geralmente é uma má idéia e você precisaria de uma justificativa muito boa para esse risco.
  4. Esta é apenas uma suposição.
  5. Depende muito do IMHO do seu cenário ou caso de uso.
Simon
fonte
27
E os programadores Java também não usariam delete.
Paŭlo Ebermann
8
Eu tive que corrigir vazamentos de memória causados ​​por programadores Java que desconheciam delete. Pelo que me lembro, em pelo menos um desses casos, a alocação dinâmica ( new) também não era necessária.
Ethan Kaminski
16
@ EthanKaminski Sim, é assim que você pode facilmente identificar um novato em C ++, especialmente alguém que tenha experiência em Java ou similar. Pare de usar novo para tudo, caramba!
Luaan 26/01
1
@ PaŭloEbermann Sim, ainda pior.
Simon
1
"No seu cenário, eu confiaria apenas em new / delete" - engraçado, eu teria pensado que um idioma C ++ "apenas com recursos de Java (como)" seria usado exclusivamente make_shared.
Kyle Strand
26

Java possui recursos que o C ++ não possui, como um coletor de lixo interno, rápido e confiável, uma hierarquia de objetos de raiz única e uma introspecção poderosa.

Os outros recursos do Java foram projetados para trabalhar em conjunto com os recursos exclusivos do Java, e muitas das omissões dos recursos do C ++ são possíveis porque os novos recursos compensam a falta. Por exemplo, o Java não possui objetos alocados à pilha com destruidores determinísticos, mas finalmente bloqueia (e tenta com recursos desde o Java 7) e o coletor de lixo para compensar essa falta.

C ++ não tem finalmente blocos ou coleta de lixo. Se você não usa destruidores porque eles não existem em Java (não conto finalizadores), você está no nível C de gerenciamento de recursos (ou seja, todo o manual), exceto que você não pode nem agrupar sua limpeza em um bloco de limpeza que você deve ir, porque o Java também não tem. Você realmente acha que isso melhora a capacidade de manutenção?

Java possui uma hierarquia abrangente de objetos, onde todas as classes derivam de Object, e os poucos tipos primitivos também podem ser incluídos automaticamente nessas classes. Isso permite escrever contêineres de objetos uma vez, para manter ponteiros para Object. O Java 5 introduziu os genéricos, que eliminam os lançamentos necessários para esses contêineres, mas ainda compilam praticamente o mesmo código.

C ++ não tem essa hierarquia. Para facilitar a gravação de contêineres que funcionam para vários tipos, use modelos, que são blueprints que são instanciados pelo compilador conforme necessário para tipos diferentes. Você proibirá o uso de modelos (e macros) e seguirá a rota C escrevendo o mesmo código de contêiner repetidamente para tipos diferentes ou usando ponteiros nulos? (Aguarde, o Java não possui ponteiros nulos!) Você tem certeza de que isso aumentaria a capacidade de manutenção?

Uma linguagem decente possui vários recursos projetados para trabalhar juntos. Ao proibir recursos do idioma A porque o idioma B não os possui, você está prejudicando o idioma A, porque não está ao mesmo tempo adicionando recursos de B que tornam B um todo coerente.

Isso não quer dizer que você não deva restringir os recursos permitidos do C ++. C ++ é uma linguagem grande e historicamente cultivada, que enfatiza a capacidade de o programador fazer o que ele quer sobre segurança e facilidade de uso, e nem todos os seus recursos em toda a sua flexibilidade são necessários para criar bons programas. Existem muitos padrões de codificação que restringem o uso de alguns recursos; por exemplo, as diretrizes do Google proíbem principalmente herança múltipla, modelos complexos e exceções (embora a última seja por motivos históricos). Mas nenhum recurso é proibido "porque o Java não o possui"; os recursos são considerados somente na estrutura do C ++.

Sebastian Redl
fonte
27
Veteranos experientes em C ++ geralmente rejeitam as diretrizes de codificação do Google. O C ++ moderno é muito melhor exatamente porque usa esses recursos. Sim, isso torna ainda mais diferente.
Jan Hudec
17
Observe que o C ++ não possui finalmente blocos, mas possui RAII, o que é muito melhor para a maioria dos casos. E, novamente, diferente.
Jan Hudec
7
Java Objecté praticamente um void*para a maioria dos usos - Ainda assim, eca.
Quentin
1
Além da escolha de recursos, há a questão de estilo e idioma. Geralmente, os programas são mais fáceis de ler e manter, se usarem os idiomas normais para o idioma em que foram escritos. Mesmo se alguém pudesse escrever uma parte de um programa C ++ usando apenas recursos do tipo Java, o resultado seria um C ++ estranho e empolgado.
Patricia Shanahan
2
Eu recomendaria esta resposta por estar no caminho certo ("não faça"), mas não suporto a premissa básica de que o Java é de alguma forma "mais avançado" que o C ++. O C ++ não precisa de um coletor de lixo ou de uma hierarquia de objeto raiz única, da mesma forma que o Java não precisa ... err ... desculpe, não sei como terminar a frase, porque sinto falta de destruidores determinísticos em Java e finallynão é um substituto para eles. As duas línguas são fundamentalmente diferentes.
DevSolar 27/01
25

Eu discuti se deveria me incomodar em postar outra resposta quando você já tiver um número que chegue a conclusões inteiramente razoáveis: que sua ideia é basicamente um desastre esperando para acontecer. Penso, no entanto, que eles falharam em apontar algumas razões altamente relevantes por trás dessa conclusão.

As diferenças entre Java e C ++ são muito mais profundas do que os detalhes nos quais você parece se concentrar.

Por exemplo, você fala sobre proibir herança múltipla em C ++. Primeiro, vou apontar que isso simplesmente está errado. Java define "interfaces" como itens separados de "classes". Uma classe herda apenas de outra classe, mas pode implementar um número arbitrário de interfaces.

C ++ não separa os dois conceitos dessa maneira. O C ++ analógico mais próximo fornece para implementar uma interface em Java é herdada de outra classe. Como tal, para manter os dois razoavelmente bem alinhados, você provavelmente precisará usar herança múltipla em C ++, mas deseja restringir algumas dessas classes base da mesma maneira que Java restringe uma interface em comparação com uma classe (isto é, essencialmente que especifica assinaturas de função, mas, pelo menos principalmente, não implementações).

Isso mal arranha a superfície das diferenças reais entre os dois. Na realidade, onde o código Java provavelmente define interfaces e classes que implementam essas interfaces, o código C ++ tem muito mais chances de definir alguns modelos que funcionarão com qualquer classe que atenda a seus requisitos (não apenas aqueles definidos especificamente para implementar a interface). (s) especifica).

Se você deseja honestamente um código que seja basicamente "Java usando sintaxe C ++", você quase certamente terá que proibir tudo e qualquer coisa semelhante a esta última. Você precisará restringir o uso de modelos para aproximadamente o nível de "contêiner de T" suportado pelos genéricos Java. Infelizmente, fazer isso resultará em código C ++ que é uma bagunça que ninguém pode mantê-lo como existe agora, sem mencionar a possibilidade de longo prazo de traduzi-lo para outra linguagem de programação.

Se você realmente deseja um código que possa ser convertido para outro idioma no futuro, tente torná-lo o mais limpo e legível possível. O ideal é escrever pseudocódigo e ainda executá-lo. Abordagens C ++ modernas e bem escritas, ideais muito mais de perto do que o subconjunto que você sugeriu. Não importa como você o escreva, se você traduzir para Java, precisará traduzir o código, não apenas a sintaxe das instruções individuais.

Jerry Coffin
fonte
Muitos recursos do C ++ podem ser usados ​​de algumas maneiras que mapeiam muito bem os conceitos Java e outras que não. Algumas partes de um programa exigirão algo fora do subconjunto sobreposto da funcionalidade das linguagens, e tentar escrever partes como "Java usando sintaxe C ++" resultará em uma confusão horrível. Por outro lado, muitas outras partes do código podem precisar de algo fora do subconjunto compartilhado, e tentar permanecer dentro do compartilhado para aquelas partes do código em que não há motivo convincente para sair dele pode ser útil.
Supercat 28/01
Presumivelmente, onde você diz "pode ​​precisar", você realmente quer dizer: "pode ​​não precisar"? Supondo que sim, então eu tenderia a concordar.
Jerry Coffin
Sim. Se for necessário oferecer suporte a uma plataforma que suporte Java, mas não C ++, é quase certo que partes do código deverão ser reescritas do zero e não importa se essas partes foram escritas usando algumas técnicas compatíveis com Java, pois será reescrito de qualquer maneira. No entanto, pode ser possível escrever outras partes de uma maneira que permita a migração sem uma reescrita completa e, em alguns casos, o custo extra necessário para isso pode ser mínimo.
Supercat 28/01
4
@supercat: OTOH, dado o número de plataformas que suportam Java, mas não C ++, isso me parece quase inteiramente uma solução em busca de um problema.
Jerry Coffin
Por algum tempo, o suporte ao navegador para miniaplicativos Java era melhor do que para miniaplicativos C ++. O suporte do navegador para JavsScript (sem relação com Java), no entanto, melhorou o suficiente para ser basicamente substituído por ambos.
Supercat
11

Se você escrever um código no idioma X, dedique algum tempo para aprender o idioma corretamente e use todos os recursos que ele oferece para ajudá-lo a resolver o problema. As coisas ruins acontecem quando você tenta fazer uma tradução "palavra por palavra" de um idioma para outro, seja japonês para inglês ou Java para C ++. É muito melhor começar com uma boa compreensão do problema e expressar a solução da maneira mais natural para o idioma que está sendo usado.

Anos atrás, vi um programa em C que não tinha recuo e todas as declarações começaram na coluna 7, porque o autor do código era um programador Fortran que estava usando C. Outros programadores do Fortran estavam nervosos com essas coisas novas, chamadas ponteiros. Eu não tinha coragem de mencionar ponteiros para ponteiros, acho que eles teriam desmaiado imediatamente.

Imagine contratar alguém para manter esse código no futuro. Se for um bom código C ++, você poderá contratar um desenvolvedor C ++ competente e ele poderá encontrar o caminho. Se for "Java em C ++", nem os desenvolvedores de C ++ nem Java terão facilidade em entender o código.

Tom Penny
fonte
7

Todos os seus motivos podem ser contestados:

Se o Java não fornece um recurso que o C ++ possui, significa que o recurso não é bom, portanto, devemos evitar usá-lo.

Isso não significa que o recurso não seja bom (nenhum recurso pode ser inerentemente ruim). Isso significa apenas que o recurso foi frequentemente mal utilizado (ou impossível de implementar devido a conceitos fundamentais, como ponteiros diretos versus coleta de lixo). O Java, por definição, visa ser mais fácil e mais amigável ao programador, daí a remoção de recursos que provaram ser facilmente abusáveis.

O código C ++ com recursos específicos do C ++ (por exemplo: funções de amigo, herança múltipla) só pode ser mantido ou revisado pelos programadores de C ++, mas se escrevermos C ++ como Java (sem o recurso específico da linguagem C ++), o código poderá ser mantido ou revisado por ambos. Programadores em C ++ e Java.

Oh pode ser? Vamos ver o código C ++ mais simples:

int len = mystring->size();

Ops, nenhum recurso "específico da linguagem" foi usado, mas ele já é impossível de manter pelos desenvolvedores Java! Porque em Java você desreferencia com "." enquanto aqui está "->.

Você pode ser solicitado a converter o código em Java algum dia

Ou c #. Ou Haskell. Ou Python. Ou Ruby. Ou COBOL (sim, você pode!). Como você pode dizer o futuro?

Código sem recursos específicos do C ++ geralmente é mais sustentável.

Exatamente o oposto. Todos os recursos foram introduzidos para tornar a programação mais fácil e, portanto, mais sustentável. Ex: pegue um programa operando em carros alegóricos. Agora atualize-o para lidar com números complexos. Operador sobrecarregando para o resgate!

Todo recurso específico da linguagem C ++ (por exemplo: herança múltipla) deve ter alternativas a serem implementadas em Java. Caso contrário, isso significa que o padrão de design ou a arquitetura de código é problemática.

Mas o Java tem herança múltipla! É chamado de "interface". A implementação de Java é uma solução alternativa problemática para evitar o temido diamante causado pela derivação de tudo Object. Isso é feito introduzindo interfacequal único objetivo é ser algo que não deriva Object. O C ++ nunca teve esse problema - não há base comum obrigatória, portanto todas as classes podem funcionar como uma interface sem o temido diamante.

Nota lateral: Java introduziu recentemente ... métodos concretos em interfaces. Adicionado um recurso que o C ++ sempre tinha para resolver um problema que nunca existia.

Você também mencionou muito poucas "coisas que o C ++ possui, mas o Java não". Uma das maiores diferenças entre C ++ e Java é o controle sobre o layout da memória. Você pode criar uma matriz de ponteiros para objetos (como em Java) OU pode criar um bloco de memória contíguo. Agora, se eu me preocupasse com um recurso C ++ que pudesse enganar os desenvolvedores Java, algo tão oculto e sutil quanto este poderia ser classificado na minha lista muito mais alto do que óbvio e reconhecível à primeira vista, como herança múltipla ou operadores sobrecarregados.

Conclusão: código limpo é código limpo. Java ou C ++ - mesma diferença. Apenas mantenha as coisas simples. Complicações desnecessárias são a principal causa de código incorreto.

Agent_L
fonte
Java oferece alguns recursos e garantias que não seriam compatíveis em uma linguagem que oferece todos os recursos do C ++. Uma linguagem não pode, por exemplo, permitir o carregamento dinâmico de tipos e a gama completa de lançamentos de preservação de identidade do Java, oferecendo as formas generalizadas de herança múltipla incluídas no C ++.
supercat
@ supercat Eu não entendo por que você está dizendo isso aqui. A questão não é sobre recursos Java que não podem ser reproduzidos em C ++, é sobre recursos C ++ que Java descartou.
Agent_L 26/01
Meu argumento é que alguns recursos em Java não estão incluídos no C ++, mas sim que alguns recursos do Java são fundamentalmente incompatíveis com outros recursos incluídos no C ++, de modo que nenhuma linguagem poderia ter tipos compatíveis com ambos (linguagens como C ++ / CLI têm tipos que suportam recursos C ++ e tipos que suportam recursos Java-ish, mas eles habitam efetivamente universos separados com interoperabilidade limitada).
Supercat 26/01
6

Não, geralmente você não deve escrever C ++ como se fosse Java, e definitivamente não deve omitir os recursos da linguagem C ++ que não estão presentes em Java.

Por um lado, Java é coletado como lixo e, portanto, não tem equivalente da palavra-chave "delete" do C ++. Ok, então você implementa um programa sem excluir, porque de acordo com suas regras, não é permitido.

Parabéns, agora você tem um vazamento de memória;). Isso também não é teórico - eu já vi essa situação exata acontecer em um jogo de código aberto.

Da mesma forma, Java não tem nada parecido com ponteiros C ++, o que exclui muitas convenções comuns de chamada de função.

Existem recursos do C ++ que você talvez deva evitar (veja abaixo), mas "não estar em Java" não é um bom teste decisivo.


Melhores diretrizes seriam as seguintes:

  1. Escreva um código adequado ao seu idioma, ambiente e ferramentas.
  2. Escreva um código que sua equipe possa entender.
  3. Verifique se sua equipe é competente no domínio especificado.

O item (3) significa que você não deve ter código de programadores Java em C ++ sem treiná-los em C ++. Existem algumas diferenças sutis, mas muito importantes, que eles talvez não aprendam se estiverem tentando tratá-lo como um dialeto estranho de Java.

O item (2) significa que, se sua equipe não se sentir à vontade com a herança múltipla (por exemplo), e se houver uma solução adequada que não a use, será melhor usar essa solução alternativa. No entanto, isso depende especificamente da sua equipe. Por outro lado, se sua equipe estiver mais desconfortável com essa solução alternativa do que com herança múltipla, use herança múltipla!


Por fim, existem recursos de linguagem do C ++ que, sem dúvida, deve-se evitar. Se você quiser saber o que são, pergunte aos programadores C ++ , em vez de programadores de uma linguagem diferente. Alguns exemplos para começar são a aritmética de ponteiros (sem consenso universal) e o goto.

Ethan Kaminski
fonte
6

Já existem bons pontos em outras respostas, mas eu gostaria de fornecer uma resposta mais completa, abordando suas perguntas e declarações individualmente.


Se o Java não fornece um recurso que o C ++ possui, significa que o recurso não é bom, portanto, devemos evitar usá-lo.

Isso foi muito bem respondido: Java não é "as partes boas" do C ++, nem há qualquer razão para pensar isso.

Em particular, embora os méritos de cada recurso C ++ individual sejam discutíveis, muitos dos recursos do C ++ 11 / C ++ 14 que não fazem parte do Java não são necessariamente excluídos porque os designers do Java acharam que era uma má idéia. Como exemplo, até a versão 8, o Java não tinha lambdas, mas elas foram introduzidas no C ++ no padrão C ++ 11. Antes do Java 8, sua suposição de que os recursos C ++ ausentes do Java estavam ausentes por design porque eles "não são bons" implicaria que lambdas como um recurso de linguagem "não são bons" (para o horror dos LISPers em todos os lugares, apesar de serem provavelmente horrorizado o suficiente para ouvir que você aparentemente gosta de Java). Mas agora os designers de Java colocaram seu Stamp of Approval (TM) em lambdas, então agora são uma coisa boa.

Para aprofundar um pouco mais, mesmo no Java 8, os lambdas como fechamentos não são tão flexíveis quanto os lambdas do C ++ 14, mas isso pode ser devido a limitações da arquitetura da JVM, em vez de uma decisão consciente de que a abordagem mais flexível é ruim para um cliente. perspectiva de design de linguagem.


O código C ++ com recursos específicos do C ++ (por exemplo: funções de amigo, herança múltipla) só pode ser mantido ou revisado pelos programadores de C ++, mas se escrevermos C ++ como Java (sem o recurso específico da linguagem C ++), o código poderá ser mantido ou revisado por ambos. Programadores em C ++ e Java.

Esta é a principal coisa que eu queria responder.

Em termos gerais, pode haver algum valor em obter análises de código de programadores que não estão intimamente familiarizados com o idioma que você está usando. Eles podem fornecer um feedback valioso sobre a clareza dos nomes e comentários de suas funções / métodos e (como sua pergunta indica corretamente), se o idioma for semelhante a um ou mais idiomas que eles já conhecem, eles poderão seguir o fluxo básico do programa e potencialmente capturar erros lógicos.

No entanto, não é esse o caso que esse tipo de revisão será "tão boa quanto" ou "equivalente a" a revisão de desenvolvedores que realmente conhecem o idioma que você está usando. Essencialmente, isso ocorre porque fazer com que uma linguagem pareça com outra normalmente oculta diferenças sutis, enquanto faz com que uma linguagem se comporte como outra (especialmente no caso de C ++ e Java) pode não ser idiomática para a linguagem e / ou ainda pode ser muito confusa. para os revisores.

Primeiro, vamos pensar no que significaria fazer o C ++ "parecer" Java. Como um caso simples, você pode usar newpara instanciar objetos, assim como em Java:

Foo foo = new Foo();

Mas os objetos instanciados dessa maneira usam em ->vez de .chamar métodos, portanto, se você deseja que as chamadas se pareçam com Java, você deve escrever:

Foo& foo = *new Foo();

Mas isso não é idiomático; em particular, a memória deve ser limpa posteriormente delete &foo, que alguns desenvolvedores experientes em C ++ podem nem perceber que é um código legal . De qualquer forma, existem símbolos não-Java-like engraçadas polvilhadas por toda parte, por isso não podemos bastante tornar a linguagem "parecer" Java. (Você pode eliminar o *newuso #define New *new, ou, pior, #define new *newmas você está apenas implorando para que seus colegas desenvolvedores o odeiem.) E, como mencionado acima, deletenão existe em Java, portanto, em qualquer caso (como mencionado em outra resposta ) você nunca pode realmente fazer com que o uso de objetos "pareça" da maneira que acontece em Java sem vazamentos de memória.

Mas o C ++ moderno inclui ponteiros compartilhados inteligentes, que se comportam muito como as referências de variáveis ​​gerenciadas por memória do Java. Então, em todo lugar em Java que você pode escrever Foo foo = new Foo();, você pode escrever:

std::shared_ptr<Foo> foo = std::make_shared<Foo>();

Agora você está usando um recurso de linguagem que é realmente muito parecido com o Java. Mas de repente você tem muito a explicar aos revisores que não são do C ++: o que é isso shared_ptr? Quais são os truques sutis e complicados make_shared? (Ele usa o encaminhamento perfeito, que tem alguns casos de falha e pode levar à chamada do construtor "errado".) Por que os métodos precisam ser chamados ->, mas o uso .com alguns métodos é permitido pelo compilador? ( shared_ptrpossui métodos próprios.) Se o método Foo::reset(void)existe, um desenvolvedor incauto pode tentar chamá-lo foo.reset(), o qual (se houver apenas um ponteiro compartilhado apontando para a instância de Fooquando a chamada ocorre) excluirá a memória subjacente e anulará foo, e É provável que os desenvolvedores Java não detectem esse problema.

Além disso, C ++ tem um monte de armadilhas que são específicas para a linguagem. Tanto quanto posso dizer, a maioria dos desenvolvedores de C ++ aprende a lidar com essas armadilhas desenvolvendo gradualmente seu próprio idioma para práticas "seguras" de C ++, que geralmente são únicas para eles ou para sua equipe de desenvolvimento (veja, por exemplo, a resposta existente que menciona o As práticas de codificação do Google e o comentário dizendo que "veteranos experientes em C ++ geralmente rejeitam as diretrizes de codificação do Google"). Todas as alegações de que a linguagem pode ser muito complicada, ao que parece (pelo menos na minha experiência), geralmente são encontradas com algumas variações de "bem, pare de usá-la de maneira errada". Sei que esta é uma visão altamente negativa da ++ comunidade C, e há certamente desenvolvedores experientes mais dispostos a ajudar de linguagem alunos, mas não faz parece ser uma certa atitude defensiva sobre, por exemplo, comportamento indefinido (veja, por exemplo, grande parte da discussão no meu link 'armadilhas' acima).

Os desenvolvedores de Java simplesmente não serão úteis para encontrar e corrigir essas armadilhas via revisão de código.


Você pode ser solicitado a converter o código em Java algum dia.

É totalmente válido - até recomendável - tentar levar em consideração o que pode acontecer com seu código no futuro enquanto você estiver na fase de design.

Mas, primeiro, essa consideração em particular parece uma possibilidade remota: o código normalmente é reutilizado como está (por exemplo, você pode conectar parte ou todo o código C ++ em trabalho em algum software Java futuro usando uma interface JNI) ou reescrito inteiramente do que diretamente "transcrito" manualmente.

E, segundo, você diz mais tarde,

Todo recurso específico da linguagem C ++ (por exemplo: herança múltipla) deve ter alternativas a serem implementadas em Java ....

Isso basicamente cancela o ponto "converter para Java". Se o software é escrito em C ++ idiomático e depois convertido em Java idiomático, não há razão para esperar que essa conversão (ou possa!) Seja feita aplicando um mapeamento preciso dos recursos do C ++ aos recursos Java.


Código sem recursos específicos do C ++ geralmente é mais sustentável.

Não está claro o que você quer dizer aqui, mas concordo um pouco com parte disso: a menos que você seja muito cuidadoso e, mesmo quando cuidadoso, os recursos do C ++ podem levar a problemas de manutenção. O C ++ FQA Lite (um site crítico da linguagem e de seus seguidores de alguém que pelo menos parece realmente entendê-la bastante bem) afirma que

... 80% dos desenvolvedores entendem no máximo 20% da linguagem. Não é o mesmo 20% para pessoas diferentes, portanto, não conte com elas para entender o código uma da outra.

ATENÇÃO: Se você é um fã de C ++ e chega a esse ponto na minha resposta, sente-se inclinado a pular para os comentários para argumentar que o autor do FQA não entende realmente C ++ ou é falso na maioria de seus argumentos , observe que (1) exatamente duas frases depois que eu o citei, reconheço que o FQA é uma fonte muito tendenciosa e (2) realmente não importa o que estou tentando dizer se o autor do FQA entende ou não C ++ , e não estou tentando bash em C ++, e você deve ler o restante da postagem sem assumir que sou anti-C ++ apenas porque citei o FQA. Fim da nota.

Da mesma forma, Linus Torvalds odeia C ++ por esse motivo (aviso: o link envolve muitos palavrões, no verdadeiro estilo infame de Linus).

Obviamente, essas abordagens são muito tendenciosas, mas mesmo os proponentes de C ++ costumam dizer que você não deve usar a totalidade do conjunto de recursos de idiomas (mais uma vez, consulte as diretrizes de codificação do Google; também Bjarne Stroustrup, criador de C ++ , declarou publicamente: "No C ++, há uma linguagem muito menor e mais limpa lutando para sair").

Então, acho que há algum mérito na ideia de que os recursos do C ++ podem ser muito fáceis de usar, especialmente se você é oriundo de Java. Além disso, há mérito na idéia de aliviar esses problemas, restringindo-se a algum subconjunto do idioma.

No entanto, decidir qual subconjunto usar com base em um idioma diferente não parece a abordagem correta, a menos que o "idioma diferente" seja C, pois realmente existe um subconjunto do tipo C da linguagem C ++. (Linus se refere a isso em seu discurso acima, e Scott Meyers até se refere a esse subconjunto como uma "sub-linguagem".) O paradigma de tempo de execução do Java (coletado de lixo, executando em uma VM) é tão fundamentalmente diferente dos C ++ que é não está claro que existem lições úteis a serem tiradas sobre o uso do C ++ e, como observado acima, tentar extrair lições sobre o C ++ diretamente do Java pode levar a um código muito não-idiomático.

Em vez disso, tente definir seu "subconjunto aceitável" do idioma para entender como o idioma pode ser usado idiomaticamente. Se você deseja um subconjunto bastante restritivo que ainda aproveite muitos dos recursos do C ++ além do que o C oferece, a diretriz do Google Coding acima mencionada pode ser um bom ponto de partida. Claro, você terá desenvolvedores que dizem que "não há argumento racional" para algumas das restrições do Google , mas, a menos que você esteja procurando contratar Alexandrescu para longe do trabalho dele na linguagem D (que por si só deveria lhe dizer algo), provavelmente está bem. Certamente é melhor do que tentar transformar C ++ em Java.

Outro bom ponto de partida para um conjunto de diretrizes de código é o novo C ++ Core Guidelines , um trabalho em andamento de Bjarne Stroustrup e Herb Sutter.

A única outra maneira de lidar com as deficiências do C ++ é escolher um idioma diferente. Parece que você gosta de Java e acha que há uma chance de que esse projeto possa ser convertido em Java eventualmente. Como observado em outra resposta, você pode simplesmente ... começar com Java.

Há duas razões pelas quais você pode realmente precisar usar algo diferente de Java:

  1. Você realmente precisa do desempenho em tempo de execução. Nesse caso, tratar C ++ como Java provavelmente não o ajudará, porque técnicas semelhantes a Java, como ponteiros compartilhados, degradam seu desempenho em tempo de execução.
  2. Você precisa que o software funcione em uma plataforma obscura que ainda não suporta a JVM. Nesse caso, você provavelmente está preso a idiomas que possuem front-ends GCC ou Clang. C e C ++ são candidatos óbvios, mas você também pode procurar algo como Rust. (Plugue rápido: não usei Rust extensivamente, mas parece incrível e estou ansioso para trabalhar em um grande projeto Rust o mais rápido possível, e acho que todos que estão pensando em iniciar um projeto C ++ devem considerar o Rust como uma alternativa.)

Todo recurso específico da linguagem C ++ (por exemplo: herança múltipla) deve ter alternativas a serem implementadas em Java. Caso contrário, isso significa que o padrão de design ou a arquitetura de código é problemática.

Eu já falei sobre isso um pouco, mas intencionalmente deixei de fora sua segunda frase.

Não estou convencido de que algo como constexpr, que não faria sentido em uma linguagem parcialmente JIT como Java, seja uma indicação de arquitetura inválida. Estou mais aberto à ideia de que o uso excessivo da meta-programação de modelos pode ser mais problemático do que vale a pena, especialmente agora que constexprexiste para fazer a avaliação de funções em tempo de compilação, mas fica claro a partir do caso constexprque não há falha de design se você está usando: você está simplesmente garantindo que alguns cálculos ocorram antes mesmo de executar o código, o que é um incrível aumento de desempenho (veja, por exemplo, esta entrada para o problema de corpo n do jogo Benchmark Game , que supera todas as outras entradas, exceto outra escrito em C ++,

Kyle Strand
fonte
5
O autor do FQA definitivamente se enquadra no grupo "entender no máximo 20% da linguagem". Existem algumas respostas factualmente erradas, e muitas outras que simplesmente não entendem o assunto, ilustradas com palha em palha.
Ben Voigt
2
Muitas (quase todas?) Das reclamações no C ++ FQA são absurdas. As línguas modernas são enormes. C ++ é bastante pequeno em comparação com Python, Ruby, Perl e sim, Java. Faça uma pergunta básica nesses idiomas no stackoverflow e a primeira resposta é quase inevitavelmente na linha de "Por que você não fez import SomeVeryBasicPackagee apenas fez isso ?" Faça uma pergunta avançada e a primeira resposta é quase inevitavelmente na linha de "Por que você não fez import SomeMagicalPackagee apenas fez isso ?"
David Hammen
1
@DavidHammen Acho que a divisão 80/20 se refere aos principais recursos da linguagem, não apenas aos componentes padrão da biblioteca; nesse caso, as linguagens mencionadas, com a possível exceção do Perl, realmente não parecem tão grandes e complicadas quanto o C ++. De qualquer forma, essa foi uma parte muito pequena da minha resposta e reconheci que é uma fonte tendenciosa.
Kyle Strand
1
As linguagens gerenciadas / VM são obviamente muito mais complicadas, mas quero dizer complicadas da perspectiva do uso.
Kyle Strand
1
Não tenho idéia se sua teoria está correta, embora, no meu caso, eu definitivamente aprendi C ++ e C separadamente, e minha classe C ++ fosse realmente bastante completa. Mas a citação completa sobre a divisão 20/80 é que cada programador sabe um diferente de 20% da língua, o que não seria explicado pela maioria dos programadores que está sendo ensinado a parte C da linguagem de forma independente. De qualquer forma, se você quiser explicar em detalhes como o C ++ permite uma programação mais robusta (eu afirmo que já vi antes, mas não entendo), provavelmente é melhor fazê-lo em uma sala de bate-papo ou algo assim, e não nos comentários aqui .
Kyle Strand
5

Suponha que eu esteja limitado a usar C ++ pelo ambiente no projeto. É bom impedir o uso de alguns recursos de linguagem que o C ++ possui, mas o Java não possui (por exemplo: herança múltipla, substituição de operador)?

Não.

Se "pelo ambiente do projeto" você se limita a usar C ++, então há pouco, se é que há, até mesmo pensando em qualquer outra tecnologia, não importa o quanto você pessoalmente prefira / espere usar / evangelizar.
Se a "Tecnologia X" ou "Y" oferece suporte a um determinado recurso não deve ter qualquer influência sobre a maneira como você cria seu aplicativo C ++.
É um aplicativo C ++, presumivelmente por alguma "boa razão" (agora ou no passado); portanto, você deve escrevê-lo como um aplicativo C ++, usando o que essa "caixa de ferramentas" específica fornecer.

Se e quando houver um requisito para portar o aplicativo para alguma outra tecnologia, então (e somente então) você poderá considerar os recursos em outras plataformas. Não faz sentido "cortar o nariz para irritar o rosto" com a chance de que algo possa acontecer. Lembre-se, no entanto, que a reescrita por atacado é uma operação cara e arriscada que é improvável que a Gerência realize sem uma boa razão para isso.

Houve um debate semelhante ("usar ou não usar") alguns anos atrás no mundo do Visual Basic [.Net], onde alguém teve a brilhante idéia de que você deveria escrever aplicativos do Visual Basic sem usar nenhum dos [idiomas principais] funcionalidade fornecida pelo espaço para nome Microsoft.VisualBasic. Seria como tentar escrever um aplicativo C ++ sem o espaço de nome std ::; OK, é possível, mas por que na Terra alguém se preocuparia em fazê-lo?

Phill W.
fonte
1
Até o último ponto sobre o Visual Basic: O problema com essas bibliotecas de fornecedores é que elas são proprietárias. Usá-los significa acorrentar-se a esse fornecedor. O fornecedor gostaria que você fosse acorrentado, mas você não fará isso a longo prazo: você não pode usar o software de outro fornecedor sem reescrever tudo o que depende da funcionalidade específica do fornecedor. Quanto mais você usar a funcionalidade específica do fornecedor, maior será o custo de troca de fornecedores, capacitando seu fornecedor a forçar alterações em você. Essa é uma das razões pelas quais o software livre (como na liberdade!) É tão importante.
precisa saber é
O Microsoft.VisualBasicespaço para nome é um pouco exagerado. Faz muitos anos desde a última vez que o usei, mas pelo menos no começo ele era voltado principalmente para a compatibilidade com o VB6 (e / ou para fazer com que os programadores do VB6 se sintam "em casa"); fornecia principalmente a funcionalidade que já estava disponível no restante da estrutura de forma mais moderna (e melhor integrada); portanto, em novos projetos, raramente fazia sentido usá-la. Pelo contrário, é o std::espaço de nomes onde reside toda a biblioteca padrão - evitá-lo seria como evitar todo o BCL no .NET.
Matteo Italia
2

Todas as respostas atuais dizem que isso é uma coisa ruim a se fazer, pois você deve tirar proveito da linguagem que está usando e também explicar por que um recurso C ++ não é "ruim" só porque não está no jave. Vou responder isso de um ângulo diferente.

Uma coisa é evitar recursos complexos do C ++, como herança múltipla, sobrecarga do operador e definição do seu próprio modelo.

Mas qualquer problema que faça mais do que a tarefa mais simples:

  • aloca memória,
  • conecta esse dinheiro com pontos
  • então construa estruturas de dados
  • permite que a memória seja reutilizada quando for seguro fazê-lo

Não há um subconjunto comum de Java e C ++ que permita o exposto, portanto, o que você está pedindo é impossível de fazer. (Se você estivesse perguntando sobre Java e C #, teria muito mais chances, pois ambos usam coletores de lixo.)

No entanto, você pode exigir que o código seja escrito para que um desenvolvedor Java possa entender o que é feito (mas não o "como" detalhado) e isso seria sensato.

Você também pode criar sua própria linguagem que implementou em C ++ e JAVA .....

Ian
fonte
0

Ninguém deve escrever nenhum código que outros codificadores não entendam. Se você acha que o bloqueio de idioma é um problema, aguarde até ter o bloqueio do desenvolvedor. Um deles é mais provável de mantê-lo refém do que o outro.

Realmente não há razões técnicas. O que você criou é um cenário em que uma linguagem foi usada por qualquer motivo, mas muitos desenvolvedores atuais e possivelmente futuros não a entendem.

Meu palpite é que os desenvolvedores de Java provavelmente escreverão C ++ da maneira que escrevem em Java, então por que torná-lo uma regra? Você pode descobrir alguns recursos específicos de C ++ que são mais fáceis de implementar e manter com um pouco de instrução / documentação de C ++ para seus desenvolvedores Java do que a grande bagunça de Java com a qual eles estariam presos.

Este tem sido um argumento sobre os problemas dos programadores do BASIC migrando para linguagens orientadas a objetos. Não é que eles implementem práticas de POO em detrimento de novos desenvolvedores que não o entendem, mas que eles não o implementam. Se o fazem, geralmente entendem errado. Se algo é feito mal, ele precisa ser removido, independentemente do motivo.

Além de alguém apenas copiar e colar cegamente o código, eles o farão em muitas áreas que eles não entendem.

JeffO
fonte