On m'a demandé de faire une revue de code et de faire rapport sur la faisabilité de l'ajout d'une nouvelle fonctionnalité pour l'un de nos nouveaux produits, un que je n'ai pas personnellement travaillé jusqu'à maintenant. Je sais que c'est facile à pinailler quelqu'un d'autre code, mais je dirais qu'il est en mauvais état (tout en essayant d'être aussi objectif que possible). Quelques faits saillants de mon examen de code:
L'abus de threads:
QueueUserWorkItem
le nombre de threads et, en général, sont utilisés beaucoup, et le Thread du pool des délégués ont sans valeur informative des noms tels quePoolStart
etPoolStart2
. Il y a aussi un manque de synchronisation entre les threads, en particulier d'accéder aux objets de l'INTERFACE utilisateur sur les threads autre que le thread d'INTERFACE utilisateur.Des numéros de magie et de la magie des cordes: Quelques
Const
s etEnum
s'sont définis dans le code, mais le code s'appuie sur des valeurs littérales.Les variables globales: de Nombreuses variables sont déclarées mondiale et peut ou ne peut pas être initialisé en fonction de ce que les chemins de code obtenir de suivi et de quel ordre les choses se produire dans. Cela devient très déroutant lorsque le code est également sauter partout entre les threads.
Les avertissements du compilateur: Le principal fichier de solution contient plus de 500 mises en garde, et le nombre total est inconnu pour moi. J'ai reçu un avertissement à partir de Visual Studio qu'il ne pouvait pas afficher plus de mises en garde.
Demi-fini de classes: Le code a été travaillé et a ajouté ici et là, et je pense que cela conduit à des gens oublient ce qu'ils avaient fait avant, donc il y a un peu apparemment à moitié fini de classes et de vide talons.
Pas Inventé Ici: Le produit doublons fonctionnalité qui existe déjà en commun des bibliothèques utilisées par d'autres produits, tels que l'accès aux données les aides, la journalisation des erreurs des aides, et de l'interface utilisateur des aides.
La séparation des préoccupations: je pense que quelqu'un tenait le livre à l'envers quand ils ont lu sur le typique "de l'INTERFACE utilisateur -> calque -> couche d'accès aux données" architecture 3 tiers. Dans ce code, la couche d'INTERFACE utilisateur accède directement à la base de données, parce que la couche est partiellement mis en œuvre, mais souvent ignorés en raison de ne pas matérialiser pleinement suffisant, et la couche d'accès aux données des contrôles de la couche d'INTERFACE utilisateur. La plupart du faible niveau de la base de données et du réseau des méthodes fonctionnent sur une référence mondiale dans le formulaire principal, et directement afficher, masquer, et de modifier la forme. Où plutôt mince couche de gestion est effectivement utilisé, il tend aussi à contrôler l'INTERFACE directement. La plupart de ce code de bas niveau utilise également
MessageBox.Show
afficher les messages d'erreur lorsqu'une exception se produit, et la plupart d'avaler l'exception d'origine. Bien sûr, cela rend un peu plus compliqué pour commencer à écrire des unités de tests pour vérifier la fonctionnalité du programme avant de tenter de refactoriser le code.
Je suis juste à gratter la surface, mais ma question est assez simple: Serait-il plus logique de prendre le temps de revoir la base de code existante, en se concentrant sur un problème à la fois, ou envisagez-vous de réécrire la totalité de la chose à partir de zéro?
EDIT: Pour préciser un peu, nous avons les exigences initiales du projet, c'est pourquoi de départ pourrait être une option. Une autre façon de formuler ma question est: Peut-code jamais atteindre un point où le coût de l'entretien qu'il allait devenir plus grande que le prix de dumping et de recommencer?