Was würden Sie tun, wenn Ihr Kunde von Ihnen verlangt, dass Sie keine objektorientierte Programmierung verwenden?

31

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?

user8
quelle
9
Eine Sache, die seine Meinung ändern könnte, ist, wenn die Kosten dafür höher sind (wenn Sie die OO-Sprachen besser beherrschen als eine funktionierende Programmiersprache).
Holger
Es könnte interessant sein, Rich Hickeys Ameisensimulationscode ( gist.github.com/1093917 ) zu vergleichen - in Clojure, das im Grunde genommen funktioniert, obwohl die Simulation hauptsächlich dazu gedacht war, die Verwendung von STM zu demonstrieren.
mikera
13
Kommentatoren : Hinterlassen Sie hier keine Antwort in den Kommentaren. Schreiben Sie Ihre eigene Antwort. Kommentare sind kein Ort, um verschiedene mögliche Antworten auf die Frage zu erörtern: Bringen Sie Ihren Vorschlag entweder als Antwort vor oder nehmen Sie ihn zum Chatten mit, um ihn zuerst zu erläutern .
6
Ich wollte nur sicherstellen, dass Sie den Punkt von N3dst4 sahen, dass "funktionale Programmierung" eine besondere Programmierdisziplin ist. Programmierung, die nicht objektorientiert ist, wird üblicherweise als "prozedurale Programmierung" bezeichnet.
DJClayworth
1
Warum ist die objektorientierte Implementierung Ihrer Meinung nach "viel sauberer"? Höchstwahrscheinlich ist es viel weniger lesbar als eine funktionierende Lösung.
SK-logic

Antworten:

201

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.

Joris Timmermans
quelle
83
+1 für "Vielleicht lernst du etwas, was du nicht erwartet hast"!
Kenneth
2
Die datenorientierte Programmierung ermöglicht auch hervorragende Leistungen, da sie cachefreundlich ist und besser in Funktionssätzen implementiert wird, die Datenblöcke verarbeiten. Es scheint perfekt für das Problem, an dem Sie arbeiten. Ich weiß nicht, wie es auf die funktionale Programmierung zutrifft, aber ich vermute, es hilft mehr als es schmerzt.
Klaim 29.11.11
8
+1 für "Sie könnten einfach etwas lernen, was Sie nicht erwartet haben" !, ABER: Wenn das OP nicht viel Erfahrung in der funktionalen Programmierung hat und der Kunde eine gute und kostengünstige Lösung erwartet, wäre es ziemlich riskant, in eine zu tauchen neue Art, Probleme zu lösen.
Mort
3
@mort - Der Kunde möchte in diesem Fall etwas Spezifisches, hört sich so an, als ob er genug weiß, um tatsächlich zu wissen, was er will. Wenn die Person, die er anstellt, es nicht kann, ist das ihr Problem. Ich denke, was ich sage, ist die Tatsache, dass der Kunde etwas "Gutes und Billiges" will und sagt, dass er die falsche Person eingestellt hat, die das nicht leisten kann, es ist die Schuld des Kunden, nicht die Schuld des Autors, er weiß nicht, wie man ein Billiges und Gutes liefert gute funktionale Programmierlösung für dieses Problem. Einer davon ist es wert, dass der Autor versucht, das zu liefern, was der Kunde will, da es keinen technischen Grund gibt, dies nicht zu tun.
Ramhound
2
Nirgendwo in der Frage sagte das OP die Worte "gut und billig". Der Wunsch könnte "schnell und gut" sein (von den dreien: schnell, gut, billig). All dies ist ohne OP-Anleitung irrelevant, da in den "Spezifikationen" "Funktionale Programmierung verwenden" steht.
WernerCD
68

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.

Thanos Papathanasiou
quelle
@downvoter würden Sie ein Feedback geben?
Thanos Papathanasiou
3
Ich verstehe, dass die Notation eine Abwertung wert ist, um einige
Independent
1
Gibt es auf den FAQ- oder Hilfeseiten Hinweise auf die Verwendung von "tl; dr"? Oder sind es nur einige Schurken, die es nicht mögen? Mir scheint, dass das Hinzufügen einer kurzen Zusammenfassung einer Antwort nur eine gute Sache sein kann, daher kann ich mir nicht vorstellen, warum dies als eine Ablehnung wert angesehen wird.
Ben Lee
1
@Bratch Ich dachte, die TL; DR-Notation sei für den Benutzer gedacht, der versucht, meine Antwort zu lesen. Das heißt, selbst wenn Sie den Rest überspringen, wenn Sie dies nur lesen, erhalten Sie den Kern der Antwort. Was meinst du mit dem, was du sagst?
Thanos Papathanasiou
1
Einige von uns alten Leuten haben keine Ahnung, was "Dr." bedeutet (ich habe es
nachgeschlagen
55

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 ...

In der Informatik ist die funktionale Programmierung ein Programmierparadigma, das die Berechnung als Bewertung mathematischer Funktionen behandelt und Zustands- und veränderliche Daten vermeidet. Im Gegensatz zum imperativen Programmierstil, bei dem Zustandsänderungen im Vordergrund stehen, wird die Anwendung von Funktionen betont.

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

N3dst4
quelle
+1 für das Hinauswerfen. Es sollte wirklich in der Frage geklärt werden.
Bratch
Wussten Sie, dass Sie Sprachen haben können, die sowohl OO als auch funktional sind? Das sind zwei Organisationsprinzipien, die eigentlich weitgehend orthogonal zueinander sind. Zwar sind viele OO-Sprachen auch strukturierte Imperativsprachen, aber es gibt keine theoretische Grundlage, um diese stark zu koppeln.
Donal Fellows
@DonalFellows Absolut, es ist ein guter Punkt, dass sich die beiden überhaupt nicht gegenseitig ausschließen. Python (weil die Frage ursprünglich mit Python getaggt war) ist zwingend, objektorientiert und funktional, je nachdem, wo Sie stehen, wenn Sie es betrachten. Und an anderer Stelle auf dieser Seite erwähnt jemand OCaml, das OO und funktional ist.
N3dst4
22

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.

KaptajnKold
quelle
Zustimmen. Es wird nur gesunder Menschenverstand angewendet.
Mister Smith
1
Das Problem ist, dass es aus betriebswirtschaftlicher Sicht nicht immer einfach ist, dem Kunden Ihre mangelnden Kenntnisse zuzugeben ("Sie sollten stattdessen jemanden einstellen, der mit funktionaler Programmierung vertraut ist"). Es ist einfacher zu behaupten, OOP sei besser, einfach weil Sie damit vertraut sind. Weniger ehrlich , aber einfacher.
Andres F.
@Andres F: Der Umgang mit einer neuen Sprache (und einem neuen Paradigma) ist überhaupt nicht einfach. Früher oder später muss der Kunde das Problem überdenken. Besser bald als später.
Mister Smith
4
@Mister Smith: Da stimme ich Ihnen voll zu. Ich sage nur, dass diese Art von Ehrlichkeit vom Anbieter (dh dem Programmierer) nicht immer zu erwarten ist. Im Grunde sagen Sie dem Kunden, er solle jemand anderen einstellen, was weltweit Sinn macht, aber dennoch schmerzhaft ist.
Andres F.
13

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

Doc Brown
quelle
+1 Funktionale Programmierung und OOP sind orthogonale Konzepte. Suchen Sie in OCaml, Scala, Clojure, Python nach Sprachen, die beides beherrschen.
29.
Diese beiden Links sind allein eine Aufwertung wert ...
Wayne Werner
8

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.

Jaydee
quelle
8
  1. 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.

  2. 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.

  3. Wenn der Client die Spezifikation schreibt, implementieren Sie die Spezifikation, andernfalls schreiben Sie die Spezifikation und implementieren Ihre Spezifikation.

  4. Die beste Strategie, um die Entscheidungen der Kunden zu beeinflussen, besteht darin, die unerwünschte Option erheblich teurer zu machen. Es funktioniert immer.

  5. Wenn Sie der Experte (in Bezug auf den Kunden) sind, sollten Sie in der Lage sein, ihn zu überzeugen.

  6. 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.

  7. 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.

Sam
quelle
+1 für "Warum gehen wir alle davon aus, dass der Kunde den Unterschied zwischen funktionaler und imperativer Programmierung kennt?" Der Client könnte so etwas wie "Ich möchte nicht, dass er sich wiederholt, also zerlege alles in Funktionen" bedeuten, was für Entwickler selbstverständlich ist. Ein Kunde glaubt vielleicht nicht, dass es sich um einen gesunden Menschenverstand handelt, also sagt er es Ihnen.
AlexWebr
1
+1, in Wirklichkeit hat der Kunde keine Ahnung, was funktionale Programmierung ist. Entweder wird sie von den neuesten Modewörtern angetrieben oder weil sie es vor zwanzig Jahren getan haben und sich selbst immer noch als technisch betrachten.
Anonym Typ
5

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

class C {
public:
  C();
  void f( int );
  void g();
};

ein klassischer objektorientierter Ansatz sein, aber

struct C;
void construct( C ** );
void f( C *obj, int arg);
void g( C *obj );

nicht (obwohl beide gleichermaßen objektorientiert sind, was die klassische Definition "Daten zusammen mit den Funktionen, die auf sie wirken" betrifft).

Frerich Raabe
quelle
2
Warum über die genaue Bedeutung von OOP streiten? Es ist besser zu fragen, warum der Kunde der Meinung ist, dass seine Simulation besser für die funktionale Programmierung geeignet ist. Der Kunde mag Recht haben ... Ich bezweifle ernsthaft, dass er mit "funktional" Ihr zweites C-Beispiel gemeint hat oder dass er "funktional" mit "imperativ" verwechselt hat.
Andres F.
@Andres F .: Ich habe nicht behauptet, dass er mit "funktional" mein zweites C-Beispiel meinte. Ich habe nur darauf hingewiesen, dass einige Leute es als OOP betrachten, andere nicht. Bevor Sie mit einem Streit beginnen, sollten Sie Missverständnisse vermeiden. Vielleicht gibt es überhaupt keine Meinungsverschiedenheiten. Vielleicht nimmt der Chef, da er sagte, dass er mit OOP selbst nicht vertraut ist, an, dass OOP bestimmte Eigenschaften hat (genau wie das OP anscheinend angenommen hat, dass funktionale Programmierung bestimmte Eigenschaften hat).
Frerich Raabe
Streng genommen würde ich letzteres nicht als OOP betrachten, da der Methodenaufruf / Nachrichtenversand nicht über das Objekt geleitet wird. Das ist ein Schlüsselmerkmal von OOP.
Donal Fellows
5

Würden Sie versuchen, Ihren Kunden davon zu überzeugen, dass die Verwendung objektorientierter Programmierung viel sauberer ist?

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.

Oder würden Sie versuchen, dem zu folgen, was er wollte, und ihm einen beschissenen Code geben?

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.

luis.espinal
quelle
3

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

  • Klassenbasierte Vererbung (es ist einfach, eine neue Klasse zu erstellen, die vorgibt, eine alte zu sein)
  • Klassenbasierter Polymorphismus (es ist einfach, der Simulation danach neue Arten von Ameisen hinzuzufügen)

Wenn Sie eines davon nicht dringend benötigen, sollte dies im Grunde genommen mit jedem Programmierparadigma ohne allzu viele Probleme gelöst werden.

hugomg
quelle
Ich würde hinzufügen, dass jede funktionale Programmiersprache mit Unterstützung für Polymorphismus es ziemlich einfach machen sollte, einen objektorientierten oder pseudoobjektorientierten Stil zu schreiben, mit dem Sie leicht neue Arten von Ameisen hinzufügen können.
Marcin
@Marcin: Es ist wahr, dass moderne FP-Sprachen ziemlich mächtig sind. Ich wollte nur wirklich auf die Unterscheidung zwischen Datenstrukturen / ADTs und OO
hinweisen
Aber OO ist wirklich nur ADTs plus objektgesteuerter Methodenversand. Alles andere baut darauf auf. (Nun, die einzige Kontrolle, die das Objekt über den Versand hat, ist oft der Objekttyp, aber das ist eine Verfeinerung.)
Donal Fellows
3

mein kunde sagte, dass er, da er einen hintergrund in funktionaler programmierung hat, möchte, dass die simulation mit funktionaler programmierung durchgeführt wird.

(Dies ist ein weiteres Beispiel dafür, dass ein soziales Problem mit einem technischen / gestalterischen Problem verwechselt wird.)

Hier gibt es zwei Möglichkeiten:

  1. 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.)

  2. 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.

Sean McMillan
quelle
3

Ä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

Roland Tepp
quelle
2

Ihre Bitte, funktionale Programmierung zu verwenden, hat mehrere gute Aspekte:

  1. Sie haben einen Kunden, es ist immer ein gutes Zeichen
  2. Der Kunde erwartet von Ihnen, dass Sie sehr gut in dem sind, was Sie tun. Deshalb fragen sie nach funktionaler Programmierung. Ihre Verkaufsorganisation leistet also gute Arbeit, oder Sie verlangen einen sehr hohen Preis für Ihre Dienstleistungen.
  3. Die Kundenorganisation hat einige Leute, die wissen, dass funktionale Programmierung eine gute Sache ist und in Zukunft eine große Rolle spielen wird

Aber es gibt auch einige alarmierende Anzeichen:

  1. Sie scheinen nicht bereit zu sein, es in die funktionale Programmierung umzusetzen. Sie sind in Ihren Fähigkeiten bereits ein wenig veraltet und können mit den Änderungen nicht Schritt halten.
  2. Oder der Client erwartet von Ihnen, dass Sie ein besserer Programmierer sind, als Sie es wirklich sind. Dies bedeutet, dass Sie möglicherweise ihre Anforderungen herabstufen müssen, bis Sie dies ordnungsgemäß tun können.
tp1
quelle
-1 für die implizite Annahme, dass FP besser als OOP ist.
Russell Borogove
@ tp1 1) Sie gehen davon aus, dass der Client technisch intelligenter ist als der Programmierer. Dies ist jedoch nicht der Fall, da der Client nur der Client ist. 2) FP ist älter als OOP und obwohl es in letzter Zeit eine Menge Presse gibt, ist an OOP nichts auszusetzen, und Sie müssen nicht vergessen, FP zu verwenden. 3) Das Schlimmste daran ist, dass man davon ausgeht, dass FP besser und nutzerfreundlicher ist FP macht Sie zu einem besseren Programmierer, ist nur von Fall zu Fall wahr und in diesem Fall scheint das nicht wahr zu sein.
Joe Tyman
@ Joe Tyman: Nun, es muss die Annahme bestehen, dass die Leute nicht dumm sind, oder dass Kunden auf andere Weise im Nu verschwunden sind. Ich wollte nicht sagen, dass oop schlecht oder schlechter ist, sondern dass die Annahme, dass Funktionalität in dieser Situation unangemessen ist - vielleicht kennt der Client die Fähigkeiten der Programmierer nicht, oder, schlimmer noch, versucht er, Programmierer dazu zu bringen, ihre Technik zu wechseln.
tp1
@Joe Tyman: Das schlimmste Szenario, das ich mir vorgestellt hatte, war, dass Kunden wirklich Leute brauchen, die fortgeschrittene funktionale Programme wie Kategorietheorie ausführen können, und sie versuchen, ein Team zu finden, das das kann - aus diesem Grund die Anfrage für sie könnte unvernünftig sein.
1.
1

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.

Luke
quelle
1

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).

Donau Seemann
quelle
0

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

Boomhauer
quelle
Obwohl die VB6-App technisch in Ordnung ist, ist sie fast in Ordnung, und wenn sie auf dem aktuellen Betriebssystem einwandfrei funktioniert, warum sollten Sie ein "Upgrade" auf .NET durchführen? Dies ist nur dann sinnvoll, wenn Sie die neuen Funktionen nutzen möchten.
Anonym Typ
Ja, aber haben Sie in letzter Zeit versucht, vb6 zu verwenden? es ist soooo schmerzhaft;)
boomhauer 30.11.11
Jep. Wir verwenden viel davon, um vorhandene Apps zu warten, denen noch kein Budget für ein Update auf Java oder .net zugewiesen wurde. Es ist schmerzhaft (im Vergleich zu einer modernen IDE), aber es ist auch relativ. Wie bei jeder Sprache (einschließlich Skripten) wird Ihre Definition von Schmerz, sobald Sie sie beherrschen, viel subjektiver.
Anonym Typ
0

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!

Vektor
quelle
0
double dist(Point p1, Point p2) 
{
  //return distance
}

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!!

Lord Tydus
quelle