Nur neugierig. Das meiste, was ich je hatte, war eine for-Schleife innerhalb einer for-Schleife, denn nachdem ich dies von Linus Torvalds gelesen hatte :
Tabulatoren bestehen aus 8 Zeichen und Einrückungen aus 8 Zeichen. Es gibt ketzerische Bewegungen, die versuchen, 4 (oder sogar 2!) Zeichen tief einzurücken, und das ist vergleichbar mit dem Versuch, den Wert von PI als 3 zu definieren.
Begründung: Die Idee hinter dem Einrücken besteht darin, klar zu definieren, wo ein Kontrollblock beginnt und endet. Vor allem, wenn Sie 20 Stunden hintereinander auf Ihren Bildschirm geschaut haben, können Sie die Funktionsweise des Einzugs bei großen Einzügen viel besser erkennen.
Nun behaupten einige Leute, dass sich der Code durch Einrückungen mit 8 Zeichen zu weit nach rechts bewegt und es schwierig macht, auf einem Terminalbildschirm mit 80 Zeichen zu lesen. Die Antwort darauf lautet: Wenn Sie mehr als drei Einrückungsstufen benötigen, sind Sie sowieso durchgedreht und sollten Ihr Programm reparieren.
https://www.kernel.org/doc/Documentation/CodingStyle
Ich dachte, es wäre eine inakzeptable Praxis für mich, zu einer dritten Schleife überzugehen und meinen Code neu zu strukturieren (hauptsächlich Qt).
Scherzte Linus?
Kommt es auf die Sprache oder Anwendung an?
Gibt es Dinge, die unbedingt drei oder mehr Schleifenstufen benötigen?
Antworten:
Der Kernel bevorzugt nachdrücklich einfache Algorithmen
Während für eine Vielzahl von Algorithmen möglicherweise tief verschachtelte Schleifen in Schleifen erforderlich sind, benötigen Sie im Kontext des Linux-Kernels (in dem das Zitat verwendet wurde) im Allgemeinen schnelle Echtzeitantworten. In diesem Zusammenhang ist Deep Nesting ein Geruch, der möglicherweise darauf hinweist, dass der Codefluss für diese Domäne zu komplex ist und aufgrund seiner Ausführungseigenschaften und nicht aufgrund von Lesbarkeits- oder Einrückungsproblemen geändert werden muss.
Darüber hinaus unterscheidet sich der Linux-Kernel in Bezug auf die Überprüfbarkeit und die Tests von den meisten Anwendungscodes - und würde es daher vorziehen, keinen verschachtelten Algorithmus der Stufe 4+ in einer einzelnen Funktion zu haben. Es sollte offensichtlich sein, was jedes Codefragment genau und ausführlich tut , einschließlich aller möglichen Kontrollflüsse und Randfälle. Tief verschachtelter Code behindert das.
quelle
because
denen Sprachen auf niedrigerer Ebene verwendet werden, und von einem Codierungsstil profitieren, der sich auf einfachere Algorithmen konzentriert?Bis zu einem gewissen Grad habe ich dieses Zitat bei "Tabs are 8 characters" nicht mehr ernst genommen . Der springende Punkt bei Tabulatoren ist, dass es sich nicht um eine feste Anzahl von Zeichen handelt (wenn überhaupt, ist ein Tabulator ein Zeichen). Was für ein Haufen Scheiße. Ebenso bin ich nicht ganz davon überzeugt, dass das Festlegen einer Hard-and-Fast-Regel mit "drei Einrückungsstufen" vernünftig ist (genauso wie das Festlegen einer Hard-and-Fast-Regel für alles vernünftig ist).
Das Einschränken der Einrückung ist jedoch im Allgemeinen ein vernünftiger Vorschlag und sollte Sie nicht überraschen.
Wenn Ihr Programm drei Iterationsebenen benötigt, ist dies letztendlich das, was Ihr Programm benötigt . Der Sinn des Zitats besteht nicht darin, diese Anforderung Ihres Projekts auf magische Weise zu mildern, sondern die Logik in Funktionen und Typen zu unterteilen, damit Ihr Code schärfer und aussagekräftiger wird.
Dies speist sich nur aus derselben Richtlinie, die oben in Bezug auf Einrückungsgrade angegeben wurde. Es geht darum, wie Sie Ihren Code strukturieren und lesbar, wartbar und unterhaltsam halten, damit er über Jahre hinweg geändert werden kann.
quelle
Outside of comments, documentation and except in Kconfig, spaces are never used for indentation, and the above example is deliberately broken.
- 6 Absätze unter dem Zitat im OP.Der Punkt ist derselbe wie für alle Flow-Control-Konstrukte: Wenn der Code schwer zu verstehen ist, müssen Sie ihn umgestalten. Wenn Sie eine einfache Manipulation eines mehrdimensionalen Arrays durchführen, kann es sinnvoll sein, Schleifen mit einer Tiefe von fünf oder sechs zu haben, solange die Logik in der innersten Schleife einfach ist. Wenn Sie jedoch eine komplizierte Geschäftslogik verarbeiten und der Rumpf Ihrer Schleife aus einem Dutzend Zeilen oder mehr besteht, möchten Sie wahrscheinlich nicht mehr als eine Schleife verschachteln. Sie können versuchen, die zyklomatische Komplexität des Codes zu berechnen . Entscheidend ist jedoch die Lesbarkeit und Wartbarkeit des betreffenden Codes.
quelle
Das Stück ist in einem spielerischen Stil verfasst, der darauf hindeutet, dass der Autor mit der Art und Weise vertraut ist, wie Codierungsstile unter ernsthaften Praktizierenden diskutiert werden: Wir alle haben unsere Vorlieben und verteidigen sie tollwütig, aber zumindest teilweise mit der Zunge im Gesicht. Wir verstehen sehr gut, dass vieles nur eine Frage des persönlichen Geschmacks ist. Er sagt in so vielen Worten
"Coding style is very personal, and I won't _force_ my views on anybody"
- zumindest außerhalb des von ihm persönlich gepflegten Codes. Die Konsistenz des Stils in einem bestimmten Projekt ist jedoch eine sehr gute Idee. Ich codiere lieber einen Stil, den ich nicht mag, als mich mit mehreren Stilen in einer bestimmten Funktion zu befassen.Hier ist ein Beispiel für deutlich verspieltes Schreiben:
Verspielt (1).
Es ist wohl ein guter Rat, zu versuchen, Einrückungen zu vermeiden, die außer Kontrolle geraten, obwohl ein Maximum von drei Ebenen möglicherweise hyperbolisch ist. Ich werde nicht die Kernelquelle durchsuchen und Sequenzen von vier Tabulatoren zählen, aber ich wette, Sie könnten mindestens eine finden, die Torvalds geschrieben hat.
Wenn andererseits jemand den Linux-Kernel schreiben kann, ohne häufig drei Einrückungsstufen zu überschreiten, ist eine dreistufige Beschränkung möglicherweise eine Übung, die es sich lohnt, eine Weile in Ihrem eigenen Code auszuprobieren, nur um zu sehen, wohin es Sie führt. Das ist nicht wie eine Geschlechtsumwandlung, weißt du? Es ist keine lebenslange Verpflichtung.
Wenn Sie jemandem im Internet begegnen, der glaubt, er verstehe das Programmieren viel besser als Torvalds (2), dann wissen Sie, welche Art von Leuten im Internet gerne groß reden.
Andererseits irrt er sich kriminell, wenn es um Tabulatoren mit acht Leerzeichen geht. Das ist das Schwärmen eines Mannes, der in Fesseln gehalten und durch einen Schlitz gefüttert werden sollte. Vier Leerzeichen sind offensichtlich richtig.
(1) Beachten Sie jedoch, wie er fälschlicherweise ein Leerzeichen vor die Ellipsen und zwei Leerzeichen nach ihnen und zwei Leerzeichen nach einem Punkt setzt. FALSCH, FALSCH, FALSCH. Und dann hat er die dreiste Galle, um Ketzer zu züchtigen. Der Ketzer bist du, Torvalds! DU BIST ES!
(2) Wenn Sie darüber sprechen möchten, wie man ein Quellcodeverwaltungssystem entwirft , gibt es möglicherweise Raum für Diskussionen.
Hinweis: Sehr geehrter Mitbenutzer, der wiederholt dieselbe Bearbeitung eingereicht hat: Die Formatierung im zitierten Material wird genau so beibehalten, wie es der Autor beabsichtigt hat. Das liegt daran, dass es sich um einen Aufsatz handelt, der sich mit der Formatierung von Text mit fester Breite befasst, der in Text mit fester Breite geschrieben wurde, und von jemandem, der die Formatierung von Text mit fester Breite gründlich überlegt hat. Die Formatierung ist ein bewusster und bewusster Teil der Absicht des Autors und für das Thema relevant.
Außerdem habe ich in meinem eigenen Text auf diese Formatierung zurückgegriffen. Wenn Sie die Vorformatierung herausnehmen, wird meine Fußnote (1) Kauderwelsch. Wenn die Vorformatierung entfernt wird, sollte sich der Text in meiner Fußnote (1) auf die Leerzeichenpaare nach den vollständigen Anschlägen an den Satzenden beziehen. Ich kann ohnehin einen Grund dafür sehen, diese Fußnote zu entfernen, weil sie weniger lustig ist, als es schien, als ich sie schrieb. Das Entfernen der Formatierung ohne Entfernen der Fußnote ist jedoch nicht hilfreich.
quelle
.
in diesem Kommentar ;-))preferred coding style
genau wiebut this is what goes for anything that I have to be able to maintain
Linus hat einen sehr stumpfen Sprechstil und einen trockenen Sinn für Humor, aber er hat in diesem Fall keinen Scherz gemacht. Es gibt Situationen, in denen ein Algorithmus tiefer als zwei Ebenen verschachtelt werden muss. Sie können dies jedoch auch auf andere Weise als durch Einrücken des Codes erreichen. Der Linux-Kernel-Styleguide bevorzugt diese anderen Methoden aufgrund der Schwierigkeit, tief verschachtelte Schleifen beizubehalten, und genau das sagt Linus hier.
Für einige Beispiele alternativer Methoden können Sie die Rekursion verwenden, innere Schleifen in ihre eigenen Funktionen aufteilen oder dazwischen liegende Datenstrukturen erstellen.
Übermäßiges Verschachteln ist einer dieser Fälle, die einfacher zu schreiben, aber schwerer zu lesen sind. Das Einstellen einer großen Tabulatortiefe ist Linus 'Art, das Schreiben zu nerven.
quelle
Es gibt viele Fragen, bei denen der Rat für jemanden, der die Frage stellt, anders ist als für jemanden, der nicht fragt. Wenn Sie die Frage "Sollte ich jemals Schleifen haben, die mehr als zwei Ebenen tief verschachtelt sind" stellen, lautet die Antwort für Sie, die Person, die diese Frage stellt, NEIN. Wenn Sie fragen, dann tun Sie es nicht. Wenn Sie genug Erfahrung haben, die Sie nicht zu fragen brauchen, dann wissen Sie, was in jedem Fall die richtige Antwort ist. Und streite nicht, wenn du mit der Antwort nicht einverstanden bist, denn die Antwort ist nichts für dich.
quelle
Dies scheint ein Lehrbuchfall zu sein, in dem der Schwanz mit dem Hund wedelt.
Wenn Sie eine Anzeige mit 80 Zeichen haben, werden Sie natürlich versuchen, den Code so gut wie möglich anzupassen, auch wenn er nicht die beste Struktur für den Code ergibt .
Wenn Sie den Rest Ihrer Punkte in Angriff nehmen, gehen Sie folgendermaßen vor:
Ich dachte, es sei eine inakzeptable Praxis.
Ich denke, Sie lesen zu viel darüber. Widerstehen Sie dem Drang, alles, was Sie lesen, als Evangelium zu betrachten, ohne den Kontext richtig zu verstehen.
Scherzte er?
Es ist schwer, den Kontext zu bestimmen, aber siehe meinen ursprünglichen Punkt oben.
Kommt es auf die Sprache oder Anwendung an?
Besonders gern. Verwenden Sie eine beliebige Mainframe- / Midrange-Sprache, in der Sie wahrscheinlich auf einem Terminal (oder Terminalemulator) codieren.
Gibt es Dinge, die unbedingt drei oder mehr Schleifenstufen benötigen?
Ja, das ist bei einigen Brute-Force-Algorithmen sehr häufig. Siehe Aufgabe 31 zu Project Euler. Dies ist ein klassisches Beispiel für ein Problem, das mit brachialer Gewalt mithilfe einer Reihe von Schleifen gelöst werden könnte (8, um genau zu sein).
quelle
Nein, das sind die offiziellen Richtlinien.
Codierungsrichtlinien hängen im Allgemeinen von der Sprache und der Anwendung ab. Tief verschachtelter Code belastet den Leser jedoch immer .
Das Problem mit verschachteltem Code ist, dass die zyklomatische Komplexität im Allgemeinen zunimmt. Das heißt, je mehr der Code verschachtelt ist, desto mehr potenzielle Ausführungspfade gibt es in der Funktion. Eine kombinatorische Explosion potenzieller Ausführungspfade erschwert die Begründung des Codes und sollte daher generell vermieden werden.
Warum also 3? Eine subjektive Kodierungsrichtlinie ist sowohl schwer durchzusetzen als auch unmöglich automatisch durchzusetzen. Um eine objektive Kodierungsrichtlinie für die maximale Einrückung zu erstellen, muss eine Zahl festgelegt werden: Im Linux-Kernel wurde 3 ausgewählt.
Es ist willkürlich und anscheinend ausreichend für sie.
Algorithmisch gesehen können Sie den Code jedoch in ausreichend aussagekräftigen Sprachen immer wieder in kleinere Teile zerlegen (ob mit Funktionen oder Closures).
Sie können offensichtlich verschachtelten Code mit wenig Verschachtelung und vielen kleinen Funktionen schreiben, die sich gegenseitig aufrufen, ohne jemals ihren Vertrag zu buchstabieren ...
... jedoch sind kleine Funktionen mit klaren Verträgen viel einfacher zu prüfen als große Funktionen mit klaren Verträgen im Allgemeinen.
quelle