Ich schreibe ein Programm zur Simulation der Aktivität von Ameisen in einem Raster (PDF). Die Ameise kann sich bewegen, Dinge aufnehmen und Dinge fallen lassen.
Das Problem ist, dass während die Aktion der Ameisen und die Positionen jeder Ameise leicht durch Klassenattribute verfolgt werden können (und wir können leicht viele Instanzen solcher Ameisen erstellen), mein Klient sagte, dass er, da er einen Hintergrund in funktionaler Programmierung hat, die möchte Simulation durch funktionale Programmierung.
Um klar zu sein, sind die ursprünglichen Wörter vom Client nur "keine Klasse", aber keine "funktionale Programmierung". Ich gehe also davon aus, dass er nicht funktionales Programmieren meint und ich kann es zwingend. Darüber hinaus habe ich keine Vorkenntnisse in der funktionalen Programmierung.
Ich halte es jedoch für nützlich, sich auf diese Frage zu konzentrieren, bei der es vor allem um eine funktionale Programmieranforderung geht, und nicht einfach nur "zwingend".
Wie würden Sie mit dieser Situation umgehen? Würden Sie versuchen, Ihren Kunden davon zu überzeugen, dass die Verwendung der objektorientierten Programmierung viel sauberer ist, versuchen Sie, den Anforderungen des Kunden zu folgen und ihm Code von schlechter Qualität zu geben, oder tun Sie etwas anderes?
Antworten:
Objektorientierter Code ist nicht per Definition sauberer, und umgekehrt ist Nicht-OO-Code per Definition nicht beschissen. Es scheint zwar eine ziemlich offensichtliche objektorientierte Zuordnung zu diesem bestimmten Problem zu geben, ich würde jedoch vorschlagen, dass Sie trotzdem den Ansatz der funktionalen Programmierung ausprobieren. Geben Sie Ihr Bestes, versuchen Sie, das Problem mit dem besten funktionalen Programmierstil zu lösen, den Sie anwenden können, und lernen Sie möglicherweise etwas, das Sie nicht erwartet haben.
quelle
Sie erwähnen, dass der Client früher in einer funktionalen Sprache programmiert hat. Vielleicht hat er einen Grund dafür, dass Sie den Code in einem funktionalen Stil schreiben müssen. Du solltest ihn fragen warum .
Vielleicht beabsichtigt er, den Code zu behalten und ihn später selbst zu pflegen.
Außerdem denke ich nicht, dass die beiden Möglichkeiten entweder im OO-Stil sind oder beschissenen Code schreiben, wie Sie es erwähnt haben. Sicher, das Schreiben von funktionalem Code in einem Beispiel wie diesem könnte schwieriger sein, insbesondere wenn Sie nur Erfahrung in objektorientierten Sprachen haben, aber wenn der Client bereit ist, etwas länger auf Sie zu warten, um sich mit dem funktionalen Stil vertraut zu machen, ist dies nicht der Fall. Es tat weh, ihn das zu fragen.
Ich würde ihn fragen, warum er den Code im funktionalen Stil haben möchte, und wenn die Zeit nicht so wichtig ist, würde ich um einige zusätzliche Tage bitten, um mich mit der funktionalen Programmierung vertraut zu machen. (Hurra, dass du dafür bezahlt wirst, dass du lernst!)
Wenn alles andere fehlschlägt, erklären Sie, dass es viel weniger Zeit in Anspruch nehmen würde, es in einem OO-Stil zu tun.
quelle
Ist Ihnen bewusst, dass funktionale Programmierung nicht nur "Programmieren ohne Klassen" bedeutet?
Siehe den Wikipedia-Artikel darüber für die volle Schtick, aber in Kürze ...
Funktionale Programmierung ist ein Programmierparadigma, genau wie OO ein Programmierparadigma ist.
Wenn Ihr Hintergrund in OO ist, kann ich sehen, wie Sie möchten, dass alle Ihre Ameisen Objekte sind. Wenn Sie andererseits eine Ameisenfarm mit Millionen von Ameisen simulieren, können OO und Nachrichtenübermittlung ineffizient werden.
Zum Glück verfügt Python über hervorragende Tools für die funktionale Programmierung (das Wichtigste ist, dass Funktionen erstklassige Objekte sind.)
Python Funktionsprogrammierung HOWTO
quelle
Erklären Sie Ihrem Kunden, dass er, wenn er funktionale Programmierung möchte, jemanden einstellen sollte, der sich darauf spezialisiert hat. Die funktionale Programmierung unterscheidet sich stark von OOP, und Sie werden sich irren, wenn Sie der Meinung sind, dass Sie es einfach aufgreifen und eine komplexe Lösung von hoher Qualität liefern können.
quelle
Es gibt ein weit verbreitetes Missverständnis, dass "OO" völlig im Gegensatz zu "funktional" steht. Diese Dinge können sehr gut Hand in Hand gehen. In Ihrem Beispiel kann eine "Ameise" wohl als abstrakter Datentyp modelliert werden, der mit Klassen und Objekten direkt implementiert werden kann. Übergänge zwischen "Ant-Zuständen" können auf natürliche Weise mithilfe von Funktionen modelliert werden. Dies führt Sie zu einem funktionalen Ansatz, sofern es sich bei Ihrer "Ant" -Klasse um einen unveränderlichen Typ handelt.
Und sei dir bewusst, dass "Objekte" durch das funktionale Konzept eines Verschlusses ausgetauscht werden können, da Objekte die Verschlüsse des armen Mannes sind. Die Objekte des armen Mannes sind die ... ;-):
https://stackoverflow.com/questions/2497801/closures-are-poor-mans-objects-and-vice-versa-what-does-mean
https://stackoverflow.com/questions/501023/closures-and-objects
quelle
Nachdem Sie mit dem Kunden darüber gesprochen haben, erledigen Sie entweder einen professionellen Job, wenn er es immer noch so will, oder wenn Sie es nicht können, nehmen Sie entweder den Vertrag nicht an oder finden einen Ausweg.
Es wäre höchst unprofessionell, "beschissenen Code" zu produzieren, nur weil Sie anderer Meinung sind.
quelle
Warum gehen wir alle davon aus, dass der Kunde den Unterschied zwischen funktionaler und imperativer Programmierung kennt? Viele Leute kennen die Namen oder Besonderheiten von Nicht-OO-Programmierparadigmen nicht und werden Begriffe wie "prozedural", "imperativ" und "funktional" leicht austauschen.
Gehen Sie nicht so, wie andere Ihnen sagen, dass Sie gehen sollen, es sei denn, Sie glauben, Sie sollten so gehen. Wenn Sie der Meinung sind, dass funktionale Programmierung nicht geeignet ist, sollten Sie sich nicht darauf einstellen, fehlzuschlagen oder ein Projekt halbherzig anzunehmen.
Wenn der Client die Spezifikation schreibt, implementieren Sie die Spezifikation, andernfalls schreiben Sie die Spezifikation und implementieren Ihre Spezifikation.
Die beste Strategie, um die Entscheidungen der Kunden zu beeinflussen, besteht darin, die unerwünschte Option erheblich teurer zu machen. Es funktioniert immer.
Wenn Sie der Experte (in Bezug auf den Kunden) sind, sollten Sie in der Lage sein, ihn zu überzeugen.
Um wirklich zu wissen, ob der Kunde einen gültigen Punkt hat, müssen Sie mehr Erfahrung mit funktionaler Programmierung sammeln, damit Sie ihn mit Zuversicht abschießen oder erkennen können, dass Ihre Neigung zu OO auf Ihrer Unerfahrenheit beruht.
Warum nicht beides machen, dann lassen Sie den Client beide Implementierungen sehen und entscheiden, welche einfacher zu warten ist. Berücksichtigen Sie dies einfach in Ihren Projektschätzungen, damit Sie die Lernkurve genießen können, während Sie bezahlt werden.
quelle
Bevor ich mich weiter damit beschäftige, stelle ich sicher, dass Sie beide über dasselbe reden. Sie könnten ihn fragen, wann Software für ihn "objektorientiert" ist. Sine sagte er, dass es nicht seine Hauptkompetenz selbst ist, es kann sein, dass er eine verdrehte Idee hat.
Zum Beispiel könnten viele Leute darüber nachdenken
ein klassischer objektorientierter Ansatz sein, aber
nicht (obwohl beide gleichermaßen objektorientiert sind, was die klassische Definition "Daten zusammen mit den Funktionen, die auf sie wirken" betrifft).
quelle
Ich denke, Sie müssen sich mehr über Programmierparadigmen informieren. Objektorientierter programmierter Code ist nicht unbedingt sauberer und in der Tat nicht universell anwendbar. Ein guter objektorientierter Codierer weiß auch, wie man mit einem prozeduralen / modularen Verfahren gute Arbeit leistet (mit funktionalen und deklarativen Paradigmen ist es ein bisschen schwieriger, aber es sollte für einen guten Programmierer nicht allzu schwierig sein, zu gelangen - durch Lesen und Ableiten - zu einer akzeptablen FP / deklarativen Lösung.)
Ich wiederhole, Sie können so gut wie nie, Sie können so gut wie nicht verstehen, wann und wie Sie die Objektorientierung verwenden, ohne ein gutes Verständnis für die prozedurale und modulare Programmierung zu haben. OO ist viel mehr als nur das Deklarieren von Klassen und Vererbungshierarchien.
Wenn Sie keinen guten Code prozedural schreiben können, bezweifle ich, dass Sie guten Code objektorientiert schreiben können. Zeitraum. Ich versuche hier nicht zu urteilen, aber das muss behauptet werden.
Objektorientierung ist eine Erweiterung der prozeduralen und modularen Programmierung. Durch die Objektorientierung erhalten Sie lediglich Tools, mit deren Hilfe Sie bei angemessener Verwendung bessere Mechanismen zur Behandlung von Problemen mit der Kapselung, Kopplung, Kohäsion und Wiederverwendung / Erweiterbarkeit von Code erhalten.
Aber all diese Probleme sind nicht inhärent und einzigartig für OO. Sie existieren im prozeduralen / modularen Code (und in anderen Paradigmen in dieser Hinsicht). Dies ist die Art von Komplexitätsproblemen, die im Kern paradigmenunabhängig sind. Wenn Sie sie nicht ohne OO-Kleber handhaben können, ist es unwahrscheinlich, dass Sie sie damit handhaben können.
=========
Zurück zu Ihrer ursprünglichen Frage, ob Sie versuchen sollen, Ihren Kunden zu überzeugen. Es hängt davon ab, ob. Als Poster sagte Sean McMillan, wenn der Kunde einfach versucht, den Entwicklungsaufwand für eine Agenda (Lesen, Büropolitik) zu minimieren, dann gehe weg. Leute, die diese Sabotageprojekte durchführen, um jemand anderem die Schuld zu geben oder eine bestimmte Agenda voranzutreiben. Daran möchten Sie nicht beteiligt sein.
OTH, es könnte andere Gründe für eine solche Anforderung geben. Viele eingebettete Shops, egal ob richtig oder falsch, legen großen Wert darauf, was Sie mit C ++ tun können (keine virtuellen Methoden, keine Ausnahmen zum Beispiel). Manchmal gibt es dafür gültige technische Gründe.
Sie müssen also verstehen, warum der Client OO-Code vermeiden möchte. Und wenn Sie vermuten können, dass es keine politische Agenda gibt (keine roten Fahnen), dann sollten Sie das Professionelle tun, dh einfach den Code prozedural / modular ausführen und einen guten Job machen.
Es gibt wirklich keine Entschuldigung dafür, beschissenen Code zu liefern, unabhängig vom Programmierparadigma. Wenn Sie mit einem Paradigma keinen akzeptablen Code erstellen können, können Sie mit Sicherheit keinen akzeptablen Code generell erstellen.
quelle
Sie mischen Datenstrukturen und objektorientierte Programmierung (eine häufige Verwirrung in dieser von OO befallenen Welt)
Wenn Sie lediglich Datenattribute in einer Datenstruktur verfolgen und ändern müssen, hat fast jede Sprache, die nach den 70er Jahren erstellt wurde, eine gute Grundlage dafür, ob OO oder nicht.
Die Dinge, die in OO einfacher zu tun sind, sind grobe Fliegen
Wenn Sie eines davon nicht dringend benötigen, sollte dies im Grunde genommen mit jedem Programmierparadigma ohne allzu viele Probleme gelöst werden.
quelle
(Dies ist ein weiteres Beispiel dafür, dass ein soziales Problem mit einem technischen / gestalterischen Problem verwechselt wird.)
Hier gibt es zwei Möglichkeiten:
Ihr Kunde erwartet, dass er den von Ihnen geschriebenen Code nach dem Schreiben selbst anpassen oder warten kann. Wenn ja, sollten Sie viel mehr über den "Hausstil" wissen - funktional gegen OO ist nur die Spitze des Eisbergs. Sie müssen sich entweder auf einen Programmierstil beschränken, den Ihr Kunde versteht, oder Sie müssen Ihren Kunden die von Ihnen bevorzugten Stile vermitteln. (Einmal wurde ich gebeten, eine Web-App mit CGI zu erstellen, ohne Vorlagen oder Bibliotheken zu verwenden, da der Client möglicherweise Änderungen vornehmen möchte.)
Ihr Kunde versucht aufgrund einer bestimmten Agenda, die Entwicklung zu kontrollieren. Dies ist eine Tasche voller Verrückter, mit der du nichts zu tun haben willst. Wenn Sie wirklich eine "schlüsselfertige" Software bereitstellen, sollte es dem Kunden egal sein, ob sie aus Hamstern besteht, die auf Rädern laufen, solange sie die Aufgabe zuverlässig erledigen. Das Erlauben, auf diese Weise mikromanaged zu werden, fordert nur Schmerz.
Es liegt an Ihnen, zu entscheiden, in welcher Situation Sie sich befinden, und entsprechend zu handeln.
quelle
Ähm ... bin ich der einzige hier, der denkt "das ist offensichtlich ein Testjob / eine Testaufgabe"? .
Erstens - die Aufgabe selbst ist von Natur aus "akademisch" (simuliert einen Aspekt des Verhaltens von Ameisen).
Zweitens - eine Aufforderung zur Implementierung von Anforderungen unter Verwendung (oder Vermeidung) eines sehr spezifischen Programmierparadigmas riecht nach dem "Client", der Code lesen und solche Behauptungen aufstellen kann.
Wenn dies der Fall ist, tun Sie besser, was von Ihnen gefordert wird - es wird eine schöne Lernerfahrung, und wenn Sie es schaffen, werden Sie dabei viel lernen ...
Ist dies nicht der Fall, sollten Sie sich und / oder den Kunden nach der Begründung der Abtretung fragen. Wenn die Argumentation solide ist, dann tun Sie es - Sie werden es lernen und Sie werden als Programmierer für die Erfahrung besser sein. Wer weiß - vielleicht lernst du sogar, funktionalen Stil gegenüber OO zu mögen.
Wenn die Erklärung fehlt, dann sind alle Wetten aus .. Ich kann Ihnen nicht empfehlen, was zu tun ist.
Möglicherweise möchten Sie versuchen, die Anforderungen unabhängig von der funktionalen Sprache / dem funktionalen Stil umzusetzen, oder Sie lehnen das Angebot höflich ab, wenn Sie etwas faul empfinden.
Die Hauptsache ist - sobald Sie die Motivation hinter den Anforderungen verstanden haben, wird die richtige Vorgehensweise offensichtlich.
BEARBEITEN: Nach einem diagonalen Blick auf die referenzierte PDF-Datei scheinen die dort beschriebenen Algorithmen mit Sicherheit eher für den funktionalen Stil als für OO geeignet zu sein
quelle
Ihre Bitte, funktionale Programmierung zu verwenden, hat mehrere gute Aspekte:
Aber es gibt auch einige alarmierende Anzeichen:
quelle
Befürworten Sie die obigen Antworten, dass OO möglicherweise nicht die beste Lösung ist. In diesem Fall hat der Kunde möglicherweise einen Punkt.
Schauen Sie sich die AI Challenge an, die einige der Verhaltensweisen modelliert, die in der folgenden Frage beschrieben sind: http://aichallenge.org. Schauen Sie sich dann die verschiedenen Starter-Pakete an: http://aichallenge.org/starter_packages.php/ most sind Sprachen, die ich nicht in das OO-Paradigma einordnen würde.
quelle
Sie haben nichts über die Programmiersprache geschrieben, was dort wahrscheinlich das Wichtigste ist. Der Unterschied zwischen OOP und funktionaler Programmierung liegt nicht nur in der Art und Weise, wie der Code organisiert ist, sondern auch in der Sprache selbst. Wenn eine hohe Nebenläufigkeit vorliegt, wird die Funktionssprache Erlang verwendet, und sie hat einen sehr hohen Vorteil gegenüber z. B. Java (sie wird z. B. von Facebook-Chat verwendet). Die OOP-Lösung kann einfach aufgrund von Leistungsproblemen fehlschlagen.
Der Kunde hier ist die Universität, daher ist Sprache nicht nur ein Leistungs- / Konfigurationsproblem, der Code kann auch für didaktische Arbeiten mit Studenten oder eigene Recherchen verwendet werden. Daher ist es meiner Meinung nach hier nicht zutreffend, den Kunden davon zu überzeugen, ein anderes Paradigma zu wählen. Dies ist entweder so, dass Sie sich mit der Aufgabe befassen können, oder Sie können es nicht (und deshalb sollten Sie dieses Projekt nicht übernehmen).
quelle
Klient sagt "Sprung", Ihre Antwort ist: __ _ ?
Für mich würde ich versuchen zu überzeugen, ob es Sinn macht (neues Projekt), aber ich habe auch einen Kunden mit einer 10 Jahre alten VB6-App, für den ich gelegentlich Upgrades durchführe ... und ihn nicht überzeugen werde
quelle
Untersuchen Sie Ihren Kunden ein wenig (nicht konfrontativ):
Kennt der Kunde tatsächlich den Unterschied zwischen OOP und funktionaler Programmierung? Sind die Bedenken / Wünsche des Kunden berechtigt?
Wenn "Ja": Wenn Sie qualifiziert sind, tun Sie, was sie wollen, und nehmen Sie Ihr Geld. Wenn Sie nicht qualifiziert sind, sagen Sie es ihnen und lassen Sie sie entscheiden, was zu tun ist.
Else: hi-tail es raus da!
quelle
Diese Funktion ist funktionsfähig, solange sie nichts außerhalb der Funktion liest / schreibt. Wenn die Funktion eine Klassenvariable berühren würde, wäre sie nicht länger "funktional". Der Vorteil des funktionalen Stils besteht darin, dass keine Fehler mehr aufgrund von Änderungen oder ungültigen Status auftreten. Viele Funktionen sind nur mathematische Formeln. Das ist funktionale Programmierung auf den Punkt gebracht.
Übrigens können Sie einen funktionalen Stil innerhalb eines objektbasierten oder orientierten Designs kombinieren. Zum Beispiel sind die beiden "Punkt" -Variablen Objekte mit Status. Und die Funktion ist noch funktionsfähig! Yay!!
quelle