Il y a quelque temps, j'ai posé une question sur SO sur quelque chose écrit en C++, mais au lieu d'avoir une réponse au problème à la main, les commentaires sont allés tous fous sur mon style de codage, même lorsque j'ai indiqué que cela était un [~ # ~] WIP [~ # ~ # ~] morceau de code et que je voulais le nettoyer plus tard quand j'avais le cas de base en cours d'exécution . (J'ai eu tellement de votes en baisse que j'ai décidé de tirer la question, comme mon représentant sur SO est déjà proche d'Abyssmal)
Cela m'a fait me demander pourquoi les gens adoptent une telle ligne difficile "tu es un noob, allez te baiser" Attitude. J'étais accusé d'avoir écrit C++ comme si c'était Java. Quelque chose que je ne peux pas comprendre, et cela me déflève encore.
Je suis en train de programmer dans un certain nombre de langues OOP pendant plusieurs années maintenant, bien que des intervalles. Je choisis la langue à utiliser en termes de bibliothèques disponibles et d'environnements d'exécution optimaux pour le travail à portée de main. J'adopte des modèles de conception dans OOP code et je suis assez confiant que mon utilisation de motifs est sonore et que OO sage, je peux tenir le mien. Je comprends la boîte à outils OOP, mais choisissez d'utiliser les outils uniquement lorsque je pense que c'est vraiment nécessaire, de ne pas simplement utiliser un trucoche pour montrer mon esprit de codage. (Ce que je sais ne sont pas une note supérieure, mais je pense ne pas être au niveau n00b non plus).
Je concevons mon code avant d'écrire une seule ligne. Pour définir des tests, je énumère les objectifs d'une certaine classe et les critères de test qu'il doit adhérer à. Parce qu'il est plus facile pour moi de créer des diagrammes de séquence, puis d'écrire un code, j'ai choisi d'écrire mes tests après que l'interface soit devenue évidente.
Je dois admettre que dans la pièce de code je posté dans la question, j'utilisais toujours des pointeurs, au lieu d'utiliser des pointeurs intelligents. J'utilise Raii quand je peux. Je sais que le vrai Raii signifie la sauvegarde contre les Nullpointers, mais je travaille progressivement. C'était un travail en cours et je voulais le nettoyer plus tard. Cette façon de travailler a été condamnée fortement.
À mon avis, je devrais d'abord avoir un exemple de travail afin que je puisse voir si le cas de base est un moyen de pensée viable. Je pense également que le nettoyage du code est quelque chose qui est typique de la phase de refactorisation de l'agile, une fois que le cas de base a été prouvé. Je dois admettre que bien que je reçois lentement la norme CXX, je préfère utiliser ce que je comprends, au lieu de prendre le risque d'utiliser des concepts que je n'ai pas encore à maîtriser le code de production. J'essaie de nouvelles choses de temps en temps, mais généralement dans des projets de jeu que j'ai sur le côté, juste à cette fin.
[modifier] J'aimerais préciser que la suggestion de GNAT [1] ne s'est pas présentée dans la recherche que j'ai faite avant de commencer à poser ma question. Cependant, bien que sa suggestion couvre un aspect de la question, la question qu'il a liée à ne répond pas au cœur de ma question, juste une partie de cela. Ma question concerne davantage la réponse que je suis arrivée à mon style de codage et les aspects professionnels de la gestion des différents styles de codage et des niveaux de compétence (apparents). Avec ma question précédente sur SO et sa réponse en tant que cas en points. [/Éditer]
La question est alors: pourquoi goffe quelqu'un qui n'utilise pas votre style de codage?
Les questions/subdivisions à la main pour moi sont:
Sans voir le code en question, il existe quelques façons d'écrire Java Code en C++, d'un peu pire que d'autres.
class HelloWorldApp {
public:
void main() {
cout << "Hello World!" << endl;
}
};
[.____] C'est ainsi que Java Source serait aménagée. C'est techniquement légal en C++, mais mettez tout dans le fichier d'en-tête et tout ce qui est en ligne (en la définissant dans la déclaration de classe) est terrible Style et tuera vos performances de compilation. Ne le fais pas.À l'exception du n ° 1, aucun de ces éléments ne constitue un programme de mauvais programme C++, mais ce n'est pas non plus le type de code que je préfère travailler en tant que programmeur C++. (Je n'aurais pas non pas d'apprécier de travailler avec des Perl non idiomatique ou un python non idiomatique, etc.) Une langue a ses propres outils et idiomes et philosophies, et le bon code utilise ces outils et idiomes au lieu d'essayer d'utiliser le dénominateur commun le plus bas ou essayer de reproduire l'approche d'une autre langue. Écrire un code non idiomatique dans un domaine de langue/problématique particulier/Tout ce qui ne rend pas quelqu'un un mauvais programmeur, cela signifie simplement qu'ils ont plus à apprendre sur cette langue/problème de problèmes/autre. Et il n'y a rien de mal avec ça; Il y a une très longue liste de choses que j'ai plus à apprendre, et C++ en particulier a une tonne absolue de choses à apprendre.
En ce qui concerne la question particulière de la rédaction de code temporel d'erreur avec l'intention de le nettoyer plus tard, ce n'est pas noir et blanc:
Pour utiliser des pointeurs bruts par rapport aux pointeurs intelligents comme exemple, si vous allez travailler en C++, l'utilisation des pointeurs RAII et SMART est assez fondamental que cela devrait être plus rapide Pour écrire du code de la manière que de revenir en arrière et de le nettoyer plus tard. Encore une fois, ne parviennent pas que cela ne signifie pas que quelqu'un est un mauvais programmeur, peu professionnel, etc., mais cela signifie qu'il y a plus d'apprendre.
Chaque langage de programmation dispose d'un ensemble d'idiomes et de meilleures pratiques, ce qui conduira généralement à un code élégant, correct et performant. Voici quelques pires pratiques parfaitement parfaites dans une autre langue:
for ($i = 0; $i < 42; $i++) { … }
à Perl, mais pas en PHPnew Foo()
en C++ sans raison, mais pas en Javareturn null
À Scala, mais pas dans une langue de type COption
)Il est facile d'utiliser une nouvelle langue comme si c'était quelque chose que vous connaissez et avec de la chance, cela fonctionnera même. "Vous pouvez écrire Fortran dans n'importe quelle langue". Mais vous ne voulez vraiment pas ignorer les fonctionnalités spécifiques Langue X Offres, car les chances sont bonnes que X offre un avantage sur l'U.
" Je choisis la langue à utiliser en termes de bibliothèques disponibles et d'environnements d'exécution optimaux pour le travail à portée de main " - mais si cette langue x est réellement meilleure que la langue u pour le travail Il dépend également de votre familiarisation avec cette langue, ou de la durée qu'il faudra pour être suffisamment familière afin de bien l'utiliser. Vous ne céderez pas une tronçonneuse lourde simplement parce que cela coupe le bois le plus rapide, lorsque vous voulez vraiment votre vieux couteau stylo, car il vous convient parfaitement. Sauf si vous voulez réellement tomber un arbre.
Mais votre question est davantage sur un problème culturel : Apprendre toutes les meilleures pratiques prend beaucoup de temps et les débutants posent la plupart des questions, alors que les gourous leur répondent. Mais ce qui est évident pour un gourou n'est pas évident pour un débutant et les gourous oublient parfois cela. En tant que débutant, la solution ne doit pas cesser de poser des questions. Cependant, on peut montrer une ouverture pour apprendre et appliquer les meilleures pratiques, par ex. par essayer pour nettoyer votre code autant que possible avant le montrer à d'autres. La plupart des langues ont quelques meilleures pratiques principales qui sont faciles à apprendre, même lorsque toute la courbe d'apprentissage est réellement très longue.
Un problème courant est que les personnes nouvelles de la programmation de toute indentation ou d'une autre mise en forme, puis sont confuses car leur programme ne fonctionne pas. Je serais également confus, et la première étape de la compréhension d'un programme s'assure qu'il est parfaitement aménagé. Ensuite, de simples erreurs comme une citation de fermeture oubliée ou une virgule manquante deviennent soudainement évidentes. J'espère que vous pratiquez déjà de bonnes formatrages, et voici une métaphore pour d'autres meilleures pratiques: Les meilleures pratiques empêchent les erreurs, les meilleures pratiques facilitent la recherche d'erreurs, en appliquant les meilleures pratiques avant Trouver le problème.
Il est trop bon marché de dire "Je vais le répernerai plus tard", lors de la réparation, il aurait résolu votre problème (aussi, cette "phase de nettoyage" légendaire peut ne jamais venir, la seule option responsable est de le faire correctement le première fois). À tout le moins, essayant de rendre votre code aussi bon que possible avant de demander aux autres de l'aide, il leur permet de raisonner sur votre code, de même que la chose polie à faire.
Je ne suis pas un développeur Hardcore C++, mais ...
Pourquoi serait-il une mauvaise pratique de programmation d'utiliser plus de code sujet aux erreurs dans des situations prototypes, si le refactoring le rend plus robuste après?
Une chose à garder à l'esprit est qu'une erreur de C++ signifie généralement "comportement indéfini". Dans une langue sûre, le pire qui pourrait arriver est une exception terminant votre programme immédiatement. En C++, vous avez de la chance si vous obtenez un Segfault. C'est tout à fait possible que votre programme continue de faire quelque chose de mal. Il pourrait également se comporter correctement pendant une période de temps et manifestez beaucoup plus tard, ou cela pourrait se comporter correctement tout le temps, mais éventuellement manger toute votre mémoire.
En tout état de cause, il ne prend qu'une seule erreur de prendre complètement l'exécution du programme sur le Rails et en territoire inexploré. Il est probable que, pour le développeur C++ à temps plein, le "cas de base" signifie " aucune possibilité de comportement indéfini ni de fuites de mémoire. "
Comment le programme peut-il être écrit en C++ être comme il a été écrit en Java? Qu'est-ce qui en fait un mauvais programme?
Je ne pense pas qu'il y ait une réponse à cela qui ne sera pas largement spéculatoire et d'opinion. Si vous voulez que je sache, ==Java a tendance à avoir quelques anticitatères associés au fait que tout doit être un objet. Où dans d'autres langues, vous passeriez un pointeur, le fonctionnement , ou fonction, in Java Vous trouvez généralement des tonnes d'utilité et étroitement utiles ThingDoers
, FooFactories
, et IFrobnicators
qui ne sont que des fonctions déguisé.
De même, où dans d'autres langues, vous pourriez passer un simple tuple ou une struct sans nom, dans Java pour regrouper même seulement 2 objets dans un simple conteneur de données nécessite de prédéfinir une classe named de 30+ lignes avec Setteurs, getters et javadocs. Le manque relatif de Java de fonctionnalités oblige les programmeurs à faire des backflips doubles orientés d'objets pour que les choses soient faites parfois. Le code résultant est rarement idiomatique à l'extérieur de Java.
Ensuite, il y a le fait qu'en C++, vous avez besoin d'un graphique d'objet très simplifié pour gérer la mémoire manuellement; Habituellement, un objet appartient exactement à un autre objet. IN Java Vous n'avez pas besoin de suivre de telles contraintes serrées, car le collecteur des ordures garantit que les choses seront nettoyées lorsqu'il n'y a plus de références à leur. Il y a donc un risque de gestion de la mémoire incorrecte si Vous venez de transférer le code de Java à C++.
Enfin, cela pourrait être l'élitisme. Je ne prétends pas qu'ils composent la majorité, mais j'ai certainement vu un sentiment de "Je n'ai pas besoin d'une langue qui me tiendra la main et de me garder de choses stupides" parmi certains développeurs C++. Dans leur esprit, C++ est une "vraie" langue et si vous ne pouvez pas gérer ses idiosyncrasies, vous n'êtes pas un "véritable programmeur".
Légèrement hors topique réponse ...
Ne vous inquiétez pas - c'est un "comportement" commun dans toute communauté d'experts. Et soyez honnête, si vous êtes bon dans n'importe quelle langue, vous rencontrerez un code ce qui est "étrange", vous le critiquerez probablement aussi. (parce que, voulez enseigner).
Je suis dans le monde Perl - quand va voir quelque chose comme:
$imax=$#array;
$str=""
for($i=0; $i<$imax; $i++) {
$str = "$str" . $array[$i];
}
à la place de:
my $str = join '', @array;
bien sûr, le commentaire Lire: Enseigner l'auteur) À propos de la fonction join
.
Quoi qu'il en soit, Trop La critique est contre-productive du tout et l'un des meilleurs exemples est le suivant: (attrapé de: --- (http: // Perl-begin.org/humour/#how_can_i_switch_off_the_t.v..3f )
(Ce bit a été posté anonymement à un pastebot le 23 mars 2011. Il est placé ici pour la postérité après une montage.) - légèrement édité aussi
Question: Comment puis-je passer à mon téléviseur?
Qu'est-ce que l'OP veut entendre?
Par exemple: localisez le bouton ON/OFF Votre télécommande de la télévision en appuyez sur IT. Le bouton est généralement rouge et situé à la ligne la plus haute sur la télécommande.
La réponse de l'expert #Perl: Tout d'abord, que voulez-vous dire avec "allumer"? Définissez-le en premier. Nopastez votre téléviseur, télécommande TV et le salon aussi.
... Après un nopaste:
Votre chambre est laide. Et le téléviseur a l'air terrible. Utilisez M. Clean à l'écran et nettoyez-vous d'abord votre salon. Utilisez trois vadrouilles de nettoyage au lieu de deux. Utilisez HDMI et n'utilisez jamais de connecteurs SCART (?), Sauf si vous voulez vraiment. Votre télécommande TV a des boutons illisibles, nettoyer en premier. Vous êtes un débutant, alors lisez:
http://experts.blog/how_to_design_a_future_3d_tv.htmlhttp://experts.blog/the_basics_of_tv_repairing.htmlhttp://experts.log/viruses_in_living_room_short_essay. htmlhttp://experts.blog/global_chip_replacement_guide.html
IRC Guest: Mais je ne veux pas être un expert de la télévision.
Réponse: Pourquoi voulez-vous changer le téléviseur à ce moment-là ?!
Pourquoi serait-il une mauvaise pratique de programmation d'utiliser plus de code sujet aux erreurs dans des situations prototypes, si le refactoring le rend plus robuste après?
Lorsque vous écrivez rapidement et sale avec l'esprit de la réparation plus tard, il y a le danger d'oublier quelque chose que vous devez corriger.
Comment le programme peut-il être écrit en C++ être comme il a été écrit en Java? Qu'est-ce qui en fait un mauvais programme (considérant que j'ai indiqué l'intention du style actuel et du travail prévu à améliorer?)
Dans Java Vous n'avez pas à penser à qui possède un certain objet, vous venez de passer la référence et d'oublier cela comme si ce n'est rien. Toutefois, en C++, il faut une définition claire de ceux qui possède l'objet et qui est responsable de la nettoyer.
Comment devrais-je être un mauvais professionnel si j'ai choisi d'utiliser une construction utilisée dans un certain paradigme de programmation (paragraphe-OUP/DP)
Vous ne voudriez pas; C++ est une langue multi-paradigme, il arrive à soutenir OOP plutôt bien mais cela peut faire beaucoup d'autres choses aussi. Cependant, la majeure partie de celle-ci se résume à l'utilisation de l'outil correct pour le travail au lieu de tirer le marteau à chaque fois que vous devez conduire une pointe pointue dans un peu de bois.
La raison pour laquelle vous avez eu une mauvaise réponse est que la plupart des gens sur SO ont tendance à juger de compétences par la manière dont vous pouvez coder dans la langue que vous posez. Les personnes familiarisées avec C++ ont tendance à se branler au genou lorsqu'ils voient un mauvais code qui ressemble à quelque chose qui les a mordu dans le passé.