[PYTHON] Beim Hinzufügen von sehr unabhängigen Funktionen

Bei der Implementierung neuer, sehr unabhängiger Funktionen in den Projekten, die an der Entwicklung beteiligt waren, möchte ich die folgenden Punkte berücksichtigen.

** - Prototyp nur hochgradig unabhängige Prozesse zur Überprüfung des Betriebs. ** **.

Verwenden Sie zu diesem Zeitpunkt eine Kombination aus Sprache und Bibliothek, um die Überprüfung des Algorithmus zu vereinfachen.

In meinem Fall verwende ich häufig Dolmetschersprachen wie MATLAB und Python. Es ist wichtig, über genügend Bibliotheken zu verfügen, um grafisch zu überprüfen, ob sich der Algorithmus verhält, und den Code, um zu zeigen, dass das Verhalten Ihren Erwartungen entspricht, und nicht die tatsächliche Implementierung des Algorithmus selbst. Ist überwiegend mehr.

** - Implementieren Sie von sehr unabhängigen Prozessen nur die am Portziel verwendeten Funktionen in der Zielsprache erneut. ** **.

Es wird am Port-Ziel nicht verwendet, und die Funktionen zum Testen und zur Funktionsprüfung müssen nicht portiert werden.

In meinem Fall verwende ich häufig Interpretersprachen wie Python, Batches und Shell-Skripte als Tools, die die Überprüfung erleichtern, indem nur die implementierten Algorithmen in der Zielentwicklungssprache ausgeführt werden. Erstellen Sie beispielsweise eine Funktion, die eine Datei so verarbeitet, dass sie Befehlszeilenargumente empfängt und verarbeitet, und sie dann mit der Funktion system () in der Interpretersprache ausführt. Auf diese Weise kann der Quellcode in der Zielentwicklungssprache vereinfacht werden, so dass der Quellcode nicht unnötig manipuliert wird und die Zuverlässigkeit des Codes nicht beeinträchtigt wird.

** ・ Portieren Sie den Überprüfungsprozess nicht zwangsweise. ** **.

Erzwingen Sie nicht den Überprüfungsprozess, der für die Produktionsimplementierung nicht erforderlich ist, in die Zielsprache.

** - Machen Sie hoch unabhängige Prozesse zu unabhängigen Dateien. ** **.

Wenn Sie es zu einer unabhängigen Datei machen, wird es für jeden Zweck zu einer separaten Datei, sodass in SVN klar wird, wann und wer die hochgradig unabhängige Funktion aktualisiert hat. Außerdem wird der Ort der Aufteilung jeder Datei klar.

In der Prototyp-Implementierung werden wir zwar die Nützlichkeit des Algorithmus bestätigen, aber die Prototyp-Implementierung so umgestalten, dass sie leicht zu warten ist. In der ersten Version der Prototyping-Implementierung werden der Code zur Überprüfung der Operation und der Algorithmus selbst gemischt. Trennen Sie es und eliminieren Sie unnötige Bibliotheksimporte und #includes. Dann können Sie sehen, was ein sehr unabhängiger Prozess ist und wie er gestaltet wird. Danach. Implementieren Sie das überprüfte Design, indem Sie die Prototyping-Implementierung in der Zielsprache umgestalten. Auf diese Weise können Sie sicher mit dem Entwurf fortfahren, anstatt plötzlich in der Zielsprache zu entwerfen.

** - Reflektieren Sie wichtige Teile in der Zielsprache, die in der Prototyping-Sprache nicht erforderlich sind. ** **.

Fügen Sie in der C ++ - Sprache den const-Modifikator zum Funktionsargument hinzu. Als Argumente übergebene Variablen werden als Referenz übergeben. Das Übergeben von Werten führt zu einer großen Menge unnötiger Kopien von Daten. Übergeben Sie diese also als Referenz. Das Übergeben per Zeiger erfordert eine sorgfältigere Codierung als das Übergeben als Referenz. Wenn das Übergeben als Referenz ausreichend ist, wird es häufig als Referenz übergeben.

** - Was sollte der Rückgabewert der Funktion / Methode in der Zielsprache sein? ** **.

In Interpreter-Sprachen wie MATLAB und Python können Funktionen mehrere Variablen zurückgeben. Daher ist es möglich, den Eingabewert als Argument und den Ausgabewert als Rückgabewert zu codieren. In der C / C ++ - Sprache ist der Rückgabewert einer Funktion oder Methode auf eine einzelne Datenstruktur beschränkt, sodass der Ausgabewert häufig als Argument der Funktion oder Methode durch Übergeben eines Zeigers oder als Referenz empfangen wird. Trotzdem hat das Empfangen der Ausgabe als Rückgabewert einer Funktion vom Typ cv :: Mat viele Vorteile, die das Schreiben des zu verwendenden Codes erleichtern. cv::Mat somefunc(const cv::Mat &img); Erklärt in cv::imwrite("junk.png ", somefunc(cv::imread("lena.jpg ")); Es wird möglich, wie zu beschreiben. Der Inhalt der Verarbeitung in einer Zeile wird um diesen Betrag umfangreicher und der Code wird leichter verständlich. Sie sind sich des Teils des Zuweisens und Freigebens von Speicher weniger bewusst und können sich auf den Algorithmus konzentrieren.

Wenn beim herkömmlichen IplImage die Zeigervariable vom Typ IplImage deklariert wird, wenn der Zeiger vom Typ IplImage NULL ist, ist der Bereich gesichert oder der Wert im Bereich festgelegt, ist dies bereits der Fall. In einigen Fällen handelt es sich um einen Verweis auf einen vorhandenen IplImage-Typ. Wenn die Verarbeitung über das Programm verteilt ist, kann es vorkommen, dass vergessen wird, den IplImage-Typbereich freizugeben.

** ・ Führen Sie einen eindeutigen Namespace für die hochgradig unabhängige Verarbeitung ein. ** **.

Die Verwendung eines eindeutigen Namespace verhindert, dass der Bezeichner mit anderem Quellcode kollidiert. Schreiben Sie nicht mit dem Namespace, sowohl auf der Seite, die das hinzugefügte Modul verwendet, als auch auf dem Modul selbst.

** ・ Grenzen Sie die zu veröffentlichenden Schnittstellen ein. ** **.

Grenzen Sie die Schnittstellen ein, die zusätzliche Module verfügbar machen. Fügen Sie Funktionen, die nur in dieser Datei aufgerufen werden, eine statische Deklaration hinzu.

** - Schreiben Sie ausreichende Dokumentationskommentare für die veröffentlichte Schnittstelle. ** **.

Schreiben Sie in meinem Fall einen Dokumentationskommentar mit Doxygen.

** ・ Machen Sie es einfach, Unit-Tests durchzuführen. ** **.

Erstellen Sie zusätzlich zum Hauptprogramm für den normalen Betrieb eine Projektdatei, die ein Testprogramm generiert. Lassen Sie kleine Programme testen, ob sich die Funktionen der zusätzlichen Implementierung wie beabsichtigt verhalten. Es wird möglicherweise nicht immer zuerst in dem von CppUnit dargestellten Unit-Test-Framework angezeigt, kann jedoch mit einem kleinen Testprogramm getestet werden, das sich vom normalen Betriebsprogramm unterscheidet, wodurch das Testen des Programms vereinfacht wird.

** Überprüfen Sie die portierte Schnittstelle **

Schauen wir uns den Quellcode des Portziels genauer an, um festzustellen, welcher Teil des Quellcodes des Portziels die zusätzlichen Funktionen verwendet. Wenn Sie keine gemütliche Oberfläche haben, kann eine Funktion zu viel tun und muss "die Funktion extrahieren".

Auf diese Weise möchte ich problemlos zusätzliche Funktionen implementieren.

--

Hinweis: Verwenden wir eine Skriptsprache für ein komfortables C ++ - Leben. C ++ - Implementierung nach Überprüfung mit Python

Recommended Posts

Beim Hinzufügen von sehr unabhängigen Funktionen
Intelligentes Schreiben beim Hinzufügen von Statistiken zum maschinellen Lernen als Funktionen