[PYTHON] Wenn es nicht leicht zu verstehen ist, kann es nicht verbessert werden.

Der Engpass bei der Programmentwicklung ist die Klarheit des Quellcodes für Programmierer. Wenn Sie den Code, den andere Mitglieder bisher geschrieben haben, beibehalten, Funktionen hinzufügen und beschleunigen möchten, ist der größte Engpass die Klarheit Ihres vorhandenen Quellcodes.

** Warum Verständnis wichtig ist **

Wenn es nicht leicht zu verstehen ist, kann die Gültigkeit des Entwurfs nicht überprüft oder getestet werden. Um zu bestimmen, nach welchen Kriterien eine vorhandene Routine ersetzt werden kann, wie sich die Genauigkeit der Berechnungsergebnisse verbessert und welche Ergebnisse zur Beschleunigung dieser Routine akzeptiert werden können Es ist leicht zu verstehen, was sie tun (was von ihnen erwartet wird). Wenn dies nicht erfüllt ist, wird der vorhandene Code Schwierigkeiten haben, eine einzelne Zeile zu schreiben, um zu entschlüsseln, was er tun wollte.

** Was können Sie tun, wenn es leicht zu verstehen ist **

・ Sie können anweisen, einen Test zu erstellen. -Wenn Sie den Code beschleunigen müssen, können Sie einen Dritten bitten, eine Hochgeschwindigkeitsversion der Funktion zu entwickeln.

Je mehr Sie mit dem Schreiben von Code beschäftigt sind, desto einfacher ist es, Code zu schreiben. Wenn der Code leicht zu verstehen ist, können Sie die Hilfe anderer erhalten.

** Voraussetzungen für leicht verständliche Funktionen **

-Je kleiner die Anzahl der Funktionsargumente, desto besser. -Es gibt keine Voraussetzungen für die korrekte Verwendung von Argumenten (es gibt nur wenige).

 double sum(double data[]);//Empfehlung
 double sum(double *data);//Nicht empfohlen

-Das formale Argument der Funktion sollte so beschrieben werden, dass In und Out leicht unterschieden werden können.

copyObj(const dataType &src, dataType &dst);//Empfehlung
copyObj(dataType *data1, dataType *data2);//Nicht empfohlen

** Das Schwierigste ist, den Zweck und die Absicht nicht zu kennen **

Was Sie erreichen möchten, sollte in Ihrer Arbeit hätte kommuniziert werden sollen, aber es wurde nicht vollständig kommuniziert. Beschreiben Sie in den Kommentaren im Quellcode die Informationen, die erforderlich sind, um den Zweck und die Absicht der Entwicklung zu kennen, die nicht nur durch die Beschreibung im Quellcode verstanden werden können. Beschreiben Sie die Informationen in dem Dokument, in dem der verwendete Algorithmus beschrieben wird, die Informationen zu den Entwicklungsspezifikationen in der Abteilung und die Informationen, die für das Verständnis des Programms erforderlich sind. (Es gibt jedoch auch Probleme wie das Zurücklassen und Lügen alter Kommentare.) Der wichtige Teil des Verständnisses des Codes sollte geschrieben werden, um Missverständnisse zu vermeiden. Beispiel: Definition der Fourier-Transformation Es gibt verschiedene Definitionen für die Fourier-Transformation (Fourier-Integration), die in der Mathematik häufig verwendet wird. (Es gibt zwei Stile, bei denen ein Koeffizient 1 ist und der Stil auf dieselbe Weise auf beide verteilt ist.) Daher gibt es sechs Definitionen der Fourier-Transformation. Daher ist es wichtig zu klären, welche Definition das aktuell verwendete Fourier-Integral ist, und eine konsistente und konsistente Verarbeitung durchzuführen. (Da nur wenige Programmierer den Code der Fourier-Transformation verwenden, wurde es zu einem Beispiel, dass ich nicht verstehe, was ich sage. (M_ _) m) Beispiel: Definition der Standardabweichung Es muss bestätigt werden, ob der als "Standardabweichung" bezeichnete Wert durch die Anzahl der Abtastwerte n oder n-1 geteilt wird, welcher Wert erforderlich ist und welcher Wert implementiert ist. Ich werde. Wenn die Anzahl der Abtastwerte extrem gering ist, z. B. eine Ziffer, kann nicht ignoriert werden, dass dieser Fehler zu Fehleinschätzungen führen kann. Dies kann dazu führen, dass das, was als Mangel hätte ausgeschlossen werden sollen, als gutes Produkt akzeptiert wird. Fragen Sie jemanden, der mit Statistiken vertraut ist. Beispiel: Das Wort "Abzug" hat zu viele verschiedene Bedeutungen. Sie können dies bestätigen, indem Sie den Abschnitt Abzug in Wikipedia lesen. Glücklicherweise habe ich noch nie ein System in einem solchen Bereich aufgebaut, aber in einem solchen Bereich muss man sich bewusst sein, was man subtrahieren und sorgfältig verstehen muss. Es stellt sich heraus, dass das Verständnis dessen, was Sie erreichen möchten und wie Sie den Quellcode schreiben, für die Entwicklung Ihres Programms von entscheidender Bedeutung ist.

** Lass uns zuhören **

Wenn die Person, die den Code geschrieben hat, noch da ist, führen Sie ein Interview. Wenn Sie einen Dokumentationskommentar für die Funktion hinzufügen und nicht verstehen, was dies bedeutet, hören Sie so viel wie möglich zu. Versuchen Sie zu diesem Zeitpunkt, den Respekt für die andere Person zu wahren. Die Person, die den Code zuvor geschrieben hat, hat wahrscheinlich hart gearbeitet, um ein Programm zu schreiben, das in einer geschäftigen Situation sowieso funktionieren würde. Unabhängig davon, ob es sich um ungewöhnlich tief eingerückten Code oder über 1000 Funktionszeilen handelt, wäre es eine Menge Arbeit gewesen, ein Programm zu schreiben, das ohnehin für den gewünschten Prozess funktioniert. Interviews können durchgeführt werden Wenn Sie sich in einer glücklichen Situation befinden, führen Sie ein Interview. Auch wenn es sich um eine Bestätigung handelt, dass Sie den Code bereits gelesen und verstanden haben, lohnt es sich, ihn anzuhören und zu bestätigen.

** Versuchen Sie, einen Code zu verschieben **

Wenn Sie nicht wissen, was der Code tut und wie, schreiben Sie ein Programm, das die Funktion nur aufruft und ausführt. Selbst im Fall einer Open-Source-Bibliothek kann möglicherweise nicht anhand des Codes festgestellt werden, welche Art von Ergebnis die Bibliotheksfunktion tatsächlich zurückgibt und wie sie verwendet wird. Selbst im Fall von geerbtem Code ist es also möglich, das Verständnis durch einen solchen Ansatz zu verbessern.

Nachtrag: Was durch Verschieben eines Codes klar wird Wenn Sie versuchen, einen Code zu verschieben, wird möglicherweise ein Fehler bei der Kombination der Argumente angezeigt. Dieses Wissen ist auch wichtig. Es stellt sich heraus, dass die vom Aufrufer erzeugte Kombination von Argumenten überprüft werden muss, um festzustellen, ob sie einen solchen Fehler verursacht.

** Wenn Sie den Code nicht kennen, aber wissen, was zu tun ist **

-Manuelle Rückverfolgung

Selbst wenn Sie den relevanten Teil des geerbten Codes nicht kennen, können Sie dies tun, wenn das Programm weiß, was zu tun ist. Es ist ein Experiment mit manueller Arbeit, um herauszufinden, welche Art von Dateneingabe verarbeitet und welche Art von Ergebnis ausgegeben werden soll. Auf diese Weise erhalten Sie ein besseres Verständnis dafür, was Sie entwickeln müssen.

・ Experimentieren Sie mit verschiedenen Sprachen und Bibliotheken

Ich denke, es ist vielleicht besser, mit verschiedenen Sprachen und Bibliotheken zu experimentieren, um zu verstehen, was zu entwickeln ist. Anstelle eines automatisierten, effizienten und raffinierten Systems, das nicht validiert wurde (was wahrscheinlich funktionieren sollte), werden wir mit einer gut charakterisierten Bibliothek experimentieren, selbst mit manueller Dateneingabe. Versuchen. Wenn Sie wissen, was zu tun ist, probieren Sie diese Techniken aus, um eine bessere Vorstellung von Ihrer Arbeit und dem Quellcode zu erhalten. Ich benutze OpenCV häufig, daher verwende ich die Python-Bindung von OpenCV als Import-CV2 aus Python. Indem Sie das Codefragment mit OpenCV in Python neu schreiben und bedienen, können Sie die Bedeutung besser verstehen. Das Experimentieren mit verschiedenen Sprachen und Bibliotheken kann Ihnen helfen, den gesuchten Code zu verstehen.

Klarheit priorisieren. Indem Sie Klarheit schaffen, hilft es der Person, die die Wartung übernimmt, zu verstehen, was Sie erreichen möchten und welche Methoden Sie wählen können. Infolgedessen ist ein effektives Umschreiben möglich, und der Rechenaufwand kann durch Verwendung von Merkmalen, die für das Berechnungsziel eindeutig sind, auf einen Bruchteil reduziert werden.

Wie auch immer, lassen Sie uns die Klarheit des Programms priorisieren. Die Verständlichkeit des Programms erleichtert die Entwicklung des Programms und macht es effizienter.

** Die Eingabe- / Ausgabevariable assert () beschreibt explizit die Funktionsspezifikation **

Verwenden Sie assert (), um die Eingabe- und Rückgabewerte der Funktion zu überprüfen. Dies bietet nicht nur eine Laufzeitprüfung für das Programm im Debug-Modus, sondern gibt dem Quellcodeleser auch einen Hinweis darauf, welche Daten voraussichtlich eingehen werden. .. Wenn Sie assert (img.channels () == 1) schreiben, bedeutet dies, dass Sie ein Graustufenbild anstelle eines Farbbilds annehmen.

** Verwenden Sie keine Zeiger für das, was durch std :: vector <> dargestellt werden kann **

Im Fall des Vektortyps sind die Methode zum Hinzufügen von Elementen und die Methode zum Bestimmen, ob ein Element das letzte ist, standardisiert, und jeder kann es auf die gleiche Weise verstehen. Bei der Implementierung mithilfe von Zeigern kann das letzte Element jedoch einen bestimmten Wert haben, um zu bestimmen, dass es das letzte Element ist. Die Person, die den Code geschrieben hat, weiß, was der bestimmte Wert ist, um anzuzeigen, dass es das letzte Element ist, aber die Person, die den Code zum ersten Mal liest, kennt den bestimmten Wert nicht. (Achtung: Ich sage nicht, dass es schlecht ist, Zeiger zu verwenden, aber ich beklage, dass die Seite, die die Datenstruktur verwendet, eine Schnittstelle hat, die nur mit bloßen Zeigeroperationen verwendet werden kann. Ich möchte nicht, dass der Code inkrementiert im Quellcode verteilt und nicht gekapselt wird.)

Wenn Sie mit dem Typ std :: vector <> und seiner Methode schreiben, können Sie auf einen Blick sehen, was Sie versuchen. Wenn eine Funktion, die dieser entspricht, durch eine eindeutige Implementierung implementiert wird und ein eindeutiger Funktionsname verwendet wird, verursacht das korrekte Verstehen der Funktion unnötige Kosten für das Verständnis. (Wenn Sie nur die STL-Methode verwenden, wird die Anzahl der zu testenden Elemente erheblich reduziert. Für diejenigen, die die ursprüngliche Datenstruktur für "Effizienz" verwenden, ist der Aufwand für die Entwicklung und den Entwickler erforderlich Es ist schade, dass viele Leute nicht bemerkt haben, dass es sich nachteilig auf die Entwicklungseffizienz auswirkt.)

・ C = a> b? A: b; C = std :: max (a, b) ist leichter zu verstehen als. ・ C = a> b? A - b: 0; C = std :: max (a-b, 0); ist leichter zu verstehen als.

if( (a < x) && (x < b)){} Ist besser if( (x > a) && (x < b)){} Es ist für mich leichter zu verstehen als (vielleicht weil ich mir eine gerade Linie vorstellen kann).

Ausdrücke, die Verweigerung enthalten, sind in der Regel schwer zu verstehen. Versuchen Sie daher, Verweigerung nur dann zu verwenden, wenn sie leichter zu verstehen ist.

Es gibt viele Möglichkeiten, die Programmentwicklung zu beschleunigen, wenn die Gesamtstruktur des Programms, die Rollen der einzelnen Module und die Funktionalität jeder Funktion gut verstanden werden. Es gibt viele Möglichkeiten, die Ausführungsgeschwindigkeit zu verbessern, solange die Spezifikationen klar sind. Der Artikel über den Fall der Nichtentwicklung eines Großsystems besagt, dass es nicht möglich war, eine hinreichend klare Spezifikation für die Entwicklung festzulegen.

Zusammenfassung: Die leicht verständliche Codierung beschleunigt die Programmentwicklung.

Referenzinformationen ["Programmiermethode"](http://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F% E3% 83% B3% E3% 82% B0% E4% BD% 9C% E6% B3% 95-% E3% 83% 96% E3% 83% A9% E3% 82% A4% E3% 82% A2% E3 % 83% B3-% E3% 82% AB% E3% 83% BC% E3% 83% 8B% E3% 83% 8F% E3% 83% B3 / dp / 4756136494) Kapitel 1 Empfohlener Stil für Kollegen Bitte. Es heißt, dass das Schreiben von grammatikalisch korrektem Code nicht ausreicht und dass Konsistenz, Redewendungen usw. für die Verständlichkeit erforderlich sind.

Recommended Posts

Wenn es nicht leicht zu verstehen ist, kann es nicht verbessert werden.
Was tun, wenn pip nicht installiert werden kann?
Was tun, wenn pyenv nicht aktiviert ist (zsh)
Bei Verwendung von tf.print () kann der Inhalt des Tensors nicht angezeigt werden, wenn er sich innerhalb der F-Zeichenfolge befindet.
Was tun, wenn die Paketabhängigkeit nicht repariert werden kann?
Wurde Liebe geboren? Ist es jemandes Verschwörung?
Der Speicher wird nicht nur von plt.close () freigegeben. Es sollte plt.clf () → plt.close () sein.
Was tun, wenn PyAudio unter Python 3.7, 3.8, 3.9 unter Windows nicht installiert werden kann?
[Für Anfänger] Rekursive Funktion (Der Turm in Hanoi ist leicht zu verstehen!)
Ich habe eine KI gemacht, um zu beurteilen, ob es Alkohol ist oder nicht!
Wenn pip aufgrund von SSL stoppt, ist es besser, Python selbst neu zu installieren
Unverständliche binäre Baumdurchquerung
Eine Geschichte, die manchmal nicht funktioniert, wenn pip die neueste ist
Maßnahmen, die zu ergreifen sind, wenn in X11 Forward "Anzeige kann nicht geöffnet werden" angezeigt wird
[OpenCV] Wenn Sie überprüfen möchten, ob es mit imread richtig gelesen wird
Wenn in der Funktion eine Ausnahme auftritt, wird diese an den Anrufer 2 übertragen
Hackasons Erfahrung, dass es am wichtigsten ist, die Gefühle des Veranstalters zu verstehen
Wenn in der Funktion eine Ausnahme auftritt, wird diese an den Anrufer 1 übertragen
Wenn Sie versuchen, Python2 pip nach der Installation von Python3 pip zu installieren, wird dies abgelehnt
Was tun, wenn die japanische Unterstützung unter Ubuntu 16.04 nicht vollständig installiert ist?