Als ich anfing, Quellcode mit STL (Standard Template Library) in der C ++ - Sprache zu schreiben, hatte ich das Gefühl, dass die Datenstrukturoperationen in der Standardbibliothek vorbereitet wurden, sodass der logische Teil leichter zu verstehen war. Es ist.
Als ich den Code las, der die ursprüngliche Datenstruktur vor STL verwendete, bemerkte ich, dass es schwierig war, den Betrieb der Datenstruktur von der Logik zu unterscheiden, was das Verständnis des Codes behinderte. Selbst wenn es beispielsweise Code gibt, der ein Array von Strukturen verwendet, für die ein Bereich reserviert wurde, den Code zum Zuweisen des Anfangswertes, den Code zum Zuweisen eines gültigen Werts zum i-ten Array-Element und wie viele gültige Werte enthalten sind. Die magische Zahl, die angibt, wo sie sich befindet und wo sie ungültig ist. Wenn Sie also die Struktur solide manipulieren, können Sie nicht zwischen der Manipulation der Datenstruktur und der von Ihnen implementierten Logik unterscheiden.
Selbst wenn Sie eine eigene Datenstruktur wie ein Strukturarray verwenden, müssen Sie daher möglicherweise eine Funktion erstellen, die Daten hinzufügt, Daten zuweist, Daten kopiert, Daten anzeigt, Daten löscht usw. Kopieren Sie außerdem die Strukturdaten nicht mit memcpy (Hinweis 1). Selbst bei der Codierung im Rahmen von C ist es wichtig, Operationen (De-facto-Methoden) für diese Datenstrukturen zu implementieren (zu kapseln) und zu testen (De-facto-Methoden). Durch Testen einer solchen Methode können Sie das Strukturarray mit Sicherheit verwenden (Hinweis 2).
Wenn eine solche De-facto-Methode vorbereitet wird, kann die Manipulation der Datenstruktur und des Codes der Logik klar unterschieden werden, und die Logik des Programms wird leicht verständlich. Schreiben wir also den Quellcode, um zwischen Datenstrukturmanipulation und Logikcode zu unterscheiden.
Beginnen Sie bei der Verbesserung Ihres Legacy-Codes mit dem Refactoring. Versuchen Sie nicht plötzlich, mit STL neu zu schreiben. Hinzufügen von Komponententests zum Legacy-Code. Lassen Sie uns die Richtigkeit des Codes durch Unit-Tests sicherstellen. Versuchen Sie nicht, STL zu verwenden, um neu zu schreiben, was Ihr Legacy-Code tut, bevor er vollständig selbsterklärend ist.
Nachtrag: Für mich als Python-Shop die Standard-Datenstruktur von Python, Liste (C ++) Durch die Verwendung des Äquivalents von std :: vector in C ++ und des Äquivalents von std :: unsorted_map in C ++ kann gesagt werden, dass die Standarddatenstruktur verwendet wurde. Man kann auch sagen, dass Pythons umfangreiche Standardbibliotheksgruppe den gleichen Effekt hatte wie die Verwendung der Boost-Bibliothek von C ++ und eine standardmäßige, reichhaltige und zuverlässige Bibliothek, die vom Betriebssystem unabhängig ist. "Manchmal habe ich den Drang, alles von Grund auf neu zu schreiben, aber ich muss diese Versuchung überwinden." -97-273ae6a4irb6e2hsoiozc2g4b8082p.com/%E3%82%A8%E3%83%83%E3%82%BB%E3%82%A4/%E3%83%AA%E3%83%95%E3%82%A1 % E3% 82% AF% E3% 82% BF% E3% 83% AA% E3% 83% B3% E3% 82% B0% E3% 81% AE% E9% 9A% 9B% E3% 81% AB% E6 % B3% A8% E6% 84% 8F% E3% 81% 99% E3% 81% B9% E3% 81% 8D% E3% 81% 93% E3% 81% A8)
Nachtrag: Bei der Entwicklung eines Programms ist es einfacher, den Code für Datenstrukturoperationen und den Logikcode für Datenstrukturoperationen zu bestimmen. Wenn die Manipulation der Datenstruktur endgültig wird, neigt der Code dazu, ausreichend toter Code zu werden. Andererseits wird der Algorithmus wahrscheinlich aufgrund von Versuch und Irrtum viele Male geändert, es sei denn, der bereits abgeschlossene Algorithmus wird portiert. Daher ist es ratsam, die Datenstrukturoperationen in einer separaten Datei zu speichern.
Hinweis 1: Mit memcpy ist es einfach, eine unbeabsichtigte flache Kopie zu erstellen, und die Zeichenfolge einer bestimmten Struktur (Zeiger der Startposition) und die Zeichenfolge der Kopierzielstruktur (Zeiger der Startposition) werden identisch. Wenn Sie einen ändern, ändert sich auch der andere. Insbesondere sollte memcmp nicht zum Vergleichen von Strukturen verwendet werden. EXP04-C. Vergleichen Sie keine Bytes einschließlich Strukturen.
Anmerkung 2: Meine persönliche Meinung ist, dass STL verwendet werden sollte. Das Ersetzen eines Strukturarrays durch eine STL in einem vorhandenen Programm kann eine entmutigende Aufgabe sein. In einem solchen Fall denke ich, dass es notwendig ist, eine De-facto-Methodenfunktion hinzuzufügen, um die Operation an der exponierten Datenstruktur für das Strukturarray zu reduzieren.
Recommended Posts