Da unsere bevorzugten Imperativsprachen funktionale Konstrukte erhalten, sollten Schleifen als Code-Geruch betrachtet werden?

8

In Anspielung Obasanjos Eindrücke auf die Karte zu wagen, Reduce, Filter ( Functional Programming in C # 3.0: Wie Map / Reduce / Filter Ihrer Welt Rock kann) „mit diesen drei Bausteinen, man konnte die Mehrheit des Verfahrens für Schleifen in Ihrer Anwendung mit einer einzigen Codezeile ersetzen. C # 3.0 einfach nicht aufhören . "

Sollen wir sie zunehmend anstelle von Schleifen verwenden? Und sollten Schleifen (anstelle von diesen drei Bausteinen der Datenmanipulation) eine der Metriken sein, um Horror auf Code-Reviews zu kodieren? Und warum?

[HINWEIS] Ich bin nicht voll funktionale Programmierung auf diesem Codes befürworten, den Schleifen übersetzt werden kann einfach (z. Schwanz Rekursion)

für politer Begriff Vorstellung. Bedenkt man, dass der Ausdruck "Codegeruch" nicht so diplomatisch ist, habe ich geschrieben eine andere Frage Ссылка über das richtige Wort für "Codegeruch", äh .. äußerst schlechten Code. Sollte dieser Satz in unserem Programmiersprache einen Platz haben?

    
Michael Buen 11.01.2009, 06:03
quelle

9 Antworten

18

Lassen Sie uns unsere traditionelle Einstellung zur Konstruktion von Programmen ändern: Anstatt uns vorzustellen, dass unsere Hauptaufgabe darin besteht, einen Computer zu unterrichten, konzentrieren wir uns lieber darauf, den Menschen zu erklären, was wir von einem Computer erwarten .

- Donald Knuth

    
grettke 11.01.2009, 06:42
quelle
7

@grettke: +1 für dieses Knuth-Zitat!

Alle Konstrukte, die wir haben (Schleifen, Rekursion, Goto, Regex-Ersetzungen, Funktionsaufrufe, ...) können mit Bedacht verwendet werden oder können dazu missbraucht werden, völlig obskuren Code zu schreiben. Eines von ihnen zu verbieten wäre einfach nutzlos.

Dogmatische Ansichten wie "alles ist eine Funktion", "alles ist ein Objekt" usw. sind schädlicher als nützlich. Man würde sich schließlich in einen vordefinierten Plan einordnen, der Klarheit opfert (das sollte das Hauptanliegen beim Schreiben von Code sein).

Es ist ein tief verschachteltes "Schleifenkonstrukt" schlecht, wenn eine einfachere "Verkettung von Funktionsaufrufen" verwendet werden könnte? JA!

Es ist eine lange rekursive "Verkettung von Funktionsaufrufen" schlecht, wenn eine einfachere "Schleife" verwendet werden könnte? JA!

Also, bitte, geben Sie mir die Freiheit, das zu verwenden, was ich am besten fühle, um auszudrücken, was ich in meinem Code meine, und mich für das Durcheinander verantwortlich mache, nicht die Sprache!

    
Remo.D 11.01.2009 08:42
quelle
5

Es kommt darauf an. Wenn die For-Schleife genau die Absicht des Codes ausdrückt: "Mach diese Dinge in dieser bestimmten Reihenfolge, einzeln nacheinander", dann ist alles gut.

Auf der anderen Seite, wenn Sie wirklich gemeint haben "machen Sie diese Dinge in keiner bestimmten Reihenfolge, und es ist in Ordnung, mehr als eins auf einmal zu tun", dann wollten Sie wirklich etwas funktionelles (z. B. Parallel LINQ).

    
Roger Lipscombe 11.01.2009 09:37
quelle
2

Können wir ein höflicheres Wort als "riechen" finden? Der Ausdruck "Code-Geruch" sollte für das reserviert sein, wofür er gedacht ist: starke Hinweise darauf, dass etwas schlecht codiert ist. Was wir hier haben, ist ein sanfter Hinweis darauf, dass es Möglichkeiten zur Verfeinerung geben könnte.

Die Tatsache, dass Sie Zugriff auf Map / Reduce / Filter-Operationen haben, bedeutet, dass viele Schleifen über Sammlungen eine Gelegenheit zum Refactoring sind. Sie könnten etwas kompakteren und lesbareren Code bekommen (solange der Leser die Konzepte versteht). Sie könnten in Zukunft eine bessere Leistung erzielen, wenn Sie auf einer Plattform arbeiten, die solche Operationen parallelisieren kann.

Es wird jedoch immer Situationen geben, in denen eine Schleife wirklich eine Schleife bedeutet. Sie wollen die Dinge in der Reihenfolge tun, und die Schleifensyntax ist die klarste Art, das zu schreiben.

%Vor%     
slim 11.01.2009 07:03
quelle
1

Warum? Ich stimme absolut nein!

Diese Art von Schleife:

%Vor%

ist akzeptabel, und es gibt nichts Schreckliches daran.

    
hasen 11.01.2009 06:09
quelle
1

Es wird sicherlich sehr davon abgeraten, Loops zu verwenden, wenn Sie eine Sprache wie APL oder eine andere Sprache verwenden natürlich entworfen, um direkt mit Arrays zu arbeiten (von eindimensionalen Vektoren zu Hypercubes), ohne iterativ mit jedem Element umgehen zu müssen. Denken Sie daran, 2 Matrizen hinzuzufügen: in Math würden Sie einfach M1 + M2 schreiben, da jeder es in APL programmieren würde; eine Schleife dafür zu schreiben ist eine schlechte Programmierung.
C # beginnt sich einige sehr mächtige Features zu leihen, die APL so effizient machen wie Reduce (f / AVector, wo der Operator f zwischen den einzelnen Elementen von AVector wie AVector angewendet wird. 1 f AVector [2] f ... f AVector [n]) oder Take ...

    
François 11.01.2009 07:22
quelle
0

Die Sprachgeschichte beeinflusst das wahrscheinlich: Wenn die Sprache X bis jetzt ein "foreach" -Konstrukt hatte, werden die meisten Programmierer daran gewöhnt sein. Es kann eine Weile dauern, bis sich das Idiom ändert, wenn überhaupt.

    
orip 11.01.2009 06:55
quelle
0

Ich glaube nicht, dass wir Schleifen überhaupt aufgeben sollten. Wenn Sie sich anschauen, was Dare sagt, empfiehlt er das auch nicht. Schließlich konzentrieren sich fast alle Methoden der Enumerable-Klasse und in LINQ auf die Rückgabe einer IEnumerable-Implementierung.

Es wird alles über iteriert.

Was er zu sagen versucht, ist, dass wir jetzt eine sauberere Trennung von Code mit LINQ haben können, indem wir Elemente in einer Aufzählung viel einfacher außerhalb einer Schleife deklarieren, transformieren und zuordnen können, statt den Zweck der Schleife selbst zu verschleiern , die normalerweise auf eine Menge dieser gefilterten Elemente, Transformationen und Zuordnungen wirkt.

    
casperOne 11.01.2009 07:22
quelle
0

Ich habe Smalltalk vor 15 Jahren programmiert. Ich erinnere mich an eine Menge davon, aber ich kann mich nicht einmal daran erinnern, ob Smalltalk für jede Iteration verwendet wurde (also könnte es nicht sehr wichtig gewesen sein). Da wir all diese Dinge neu erfinden / wiederentdecken, glaube ich, dass die Geschichte die Antwort hat.

    
krosenvold 11.01.2009 07:34
quelle