Sehen Sie eine Verwendung für "Tabellenkalkulationsprogrammierung"? [geschlossen]

11

Vor einiger Zeit bin ich auf das Konzept gestoßen, Tabellenkalkulationen (ich meine Zellen und Formeln, nicht Makrocode) als Möglichkeit zur Angabe der Programmierlogik zu verwenden. Die Idee ist:

  • Erstellen Sie eine Tabelle mit einem klar definierten Berechnungsfluss (die manchmal besser für das "Datenfluss" -Paradigma von Tabellenkalkulationen geeignet sind als prozedurale oder objektorientierte Programmierstile).

  • Eingabezellen definieren

  • Ausgabezellen definieren

  • Kompilieren Sie das Ganze zu einer eigenständigen ausführbaren Klasse (oder Funktion, Prozedur, ...).

  • Verwenden Sie es in normalem Code in einem breiteren Softwareprojekt

  • Verwenden Sie die Tabelle als Quellcode, um sie im Laufe der Zeit zu pflegen

Die Idee ist, diese Technik für Probleme zu verwenden, die wirklich in das Modell passen und die zu natürlich gut dokumentiertem und leicht zu wartendem Code führen würden. Ich bin daran interessiert zu wissen, ob Sie Erfahrung mit der Technik haben und wofür. Eine Beispielanwendung, die mir in den Sinn kam, sind Versicherungstarifrechner, die normalerweise von Aktuaren in Excel-Tabellen erstellt, erstellt und validiert und erst später in einer schwer zu wartenden Programmierlogik codiert werden (dies ist ein schmerzhafter Prozess).

Paolo Bozzola
quelle
Ich bin nicht glücklich, diese Frage zu schließen. Ok, es gibt keine Antwort wie "Ja" oder "Nein" oder "str_replace ()", aber es wird eine interessante Diskussion eingeleitet. Los
ern0
@ ern0 hast du die Tour- Seite überprüft ? "Bei Programmierern geht es darum , Antworten zu bekommen . Es ist kein Diskussionsforum ..."
Mücke

Antworten:

5

Obwohl es nicht genau der Stil von "Erstellen einer Tabelle, Kompilieren in Code" ist, nach dem Sie gefragt haben, verwendet die Cells-Datenflusserweiterung für CLOS ein ähnliches Modell: Diese Formeln, die Datenflüsse und Transformationen ausdrücken, sind die "Quellmaterial" / "Darstellung" of record "für Objekt- / Klassendesign. Betrachten Sie es als eine alternative Möglichkeit, das zu erstellen, wonach Sie gefragt haben.

Und nur zum Spaß: Tabellenkalkulationsmakro

SK-Logik
quelle
1
Ich bin mir sicher, dass OP dies nicht im Sinn hatte.
zzzzBov
4
@zzzzBov, obwohl es perfekt zur Beschreibung des OP passt.
SK-Logik
3

die manchmal besser für das "Datenfluss" -Paradigma von Tabellenkalkulationen geeignet sind als für prozedurale oder objektorientierte Programmierstile

Ehrlich gesagt kann ich mir kaum reale Berechnungen vorstellen, bei denen dies zutrifft. Die "Datenfluss" -Programmierung kann problemlos mit vielen modernen Programmiersprachen durchgeführt werden (siehe LINQ in der .NET-Welt oder die Listenverarbeitungsoperatoren von Perl und Python), und meiner Erfahrung nach führt dies zu einem viel wartbareren Code als eine Menge von "Tabellenkalkulationsformeln" mit schwer zu pflegenden Zellreferenzen.

Auf der anderen Seite haben ich und meine Kollegen viele Tabellenkalkulationsanwendungen (genauer gesagt MS-Excel) erstellt, bei denen Excel entweder als benutzerfreundliches Tool zur Eingabe von Eingabedaten / zur schnellen Erstellung von Eingabemasken verwendet wurde oder zum Erstellen einer formatierten Ausgabe oder beides. In all diesen Fällen wurde die Berechnung oder Verarbeitung dieser Daten nicht (oder nur teilweise) mit Excel-Formeln durchgeführt, sondern mit Programmcode, da Excel-Formeln nicht leistungsfähig genug oder das völlig falsche Werkzeug waren (und glauben Sie mir, wir haben ein viel Wissen, was mit Excel-Formeln möglich ist und was nicht).

Doc Brown
quelle
2

Seit ich diesen Artikel gelesen habe, habe ich immer wieder über das Konzept nachgedacht. Ich denke, es gibt definitiv eine Verwendung dafür.

Eine Sache bei der Optimierung einer solchen Sache ist, dass eine Tabellenkalkulation dem Speicherplatz sehr ähnlich ist. Es ist auch dem Anzeige- und Druckbereich sehr ähnlich (wie in x, y). Auch dort gibt es viele Vorteile.

Als Sie die Wartbarkeit bemerkten, eröffnete sich mir eine Menge Ideen. Ich weiß nicht, was es wirklich zu kompilieren gibt, und Sprachfunktionen, Bibliotheken usw. könnten ziemlich schmerzhaft sein. Trotzdem könnte irgendwo eine Zukunft drin sein.

Ich habe wirklich meistens nur VB-Skripte für Tabellenkalkulationen, Notenbücher und Buchhaltungssoftware geschrieben. Nie ausführbare Apps aus Tabellenkalkulationen erstellt, außer Excel-Dateischnittstellen aus einer C ++ - App.

Garet Claborn
quelle
1

Ja, aber ich betrachte es eher als "Tabellenkalkulationstest" als als "Tabellenkalkulationsprogrammierung". Zum Beispiel habe ich kürzlich an einer Funktion für unser Projekt gearbeitet, bei der eine Berechnung für eine große Anzahl von Datenbankeinträgen durchgeführt wird. Die Berechnung war relativ einfach, aber wichtig und erforderte daher besondere Aufmerksamkeit beim Testen. Darüber hinaus erforderte die von uns verwendete Formel eine geringe Anpassung, um auf unsere Situation anwendbar zu sein.

Ich habe einige Berechnungen von Hand durchlaufen, um meine Komponententests zu schreiben, während der Tester, mit dem ich gearbeitet habe, eine Tabelle erstellt hat, wie Sie sie für seine End-to-End-Tests beschrieben haben. Aufgrund der Anpassung der Quellformel hatten wir keine unabhängigen Testdaten zum Vergleich, daher bot die Tabelle eine Art Stilprüfung mit doppelter Buchführung, die uns die Gewissheit gab, dass der Code korrekt war.

Ja, ich sehe diese Technik als sehr nützliche Quelle für Testdaten in Fällen, in denen die beteiligten Berechnungen einfach in eine Tabelle zu implementieren sind, ansonsten aber in Code implementiert werden müssen. Eine solche Tabelle sollte jedoch nicht verwendet werden, um die Programmierlogik per se anzugeben, sondern lediglich die erforderlichen Endergebnisse.

Robert Johnson
quelle
1

Tabellenkalkulation "Programmierung" ist eine Art der Datenflussprogrammierung.

Wir haben ein sprachliches Problem damit, wir sollten es nicht "Programmierung" nennen, weil es weit weniger ist als wir Programmierung nennen, aber es ist definitiv mehr als die Eingabe von Daten in ein Programm.

Die Datenflussprogrammierung ist eine Architektur und Disziplin, bei der die Anwendung ein Netzwerk unabhängiger Module ist, die sich gegenseitig Nachrichten (Daten) senden. Dieses Modell ist nicht auf jedes Problem anwendbar, nur für solche, bei denen Quelldaten oder -ströme (oder mehr) vorhanden sind, die über das Verarbeitungsnetzwerk übertragen werden und Ausgabedaten / -ströme erzeugen. Siehe Liste unten.

Es gibt verschiedene Arten der Datenflussprogrammierung. Sehen wir uns einige an:

  • Tabellenkalkulation: Eingabenummern werden durch Formeln verarbeitet, dann Ergebniszahlen und Diagramme. Besondere Merkmale: Die Ausführungszeit beträgt "One-Shot". Wenn sich der Eingabewert (Komponente) ändert, wird der entsprechende Teil des Verarbeitungsdiagramms erneut ausgeführt und erzeugt eine Ausgabe.
  • Unix-Pipe: Die Shell startet mehrere Programme und verknüpft stdout-> stdin. Besondere Merkmale: Es ist nur eine Verbindung im Pipe-Stil zulässig. Das Diagramm ist eine einzelne Warteschlange.
  • Synchronisierte Ausführung: Es gibt einen Takt, der die Verarbeitung eines Frames oder Samples in einer bestimmten Frequenz auslöst. Jede Komponente läuft einmal im Taktzyklus. Video- und Audioverarbeitungssysteme die Beispiele, sie arbeiten mit einer bestimmten Bild- / Abtastrate.
  • Asynchrone Ausführung: Der Graph befindet sich im Leerlauf, bis ein externes Ereignis eintritt. Dann verarbeitet es das Ereignis, generiert eine Ausgabe (oder nicht) und geht in den Ruhezustand.

Zurück zu Ihrer Frage: Ich denke ja, es ist eine gute Idee, eine Datenflussanwendung als eigenständige App zu veröffentlichen. Ich habe es schon geschafft. Zweimal .

Ich und ein Freund von mir haben einen Prototyp eines DF-Systems für die Hausautomation erstellt. Wir haben keinen Grafikeditor, daher kann die App vom Benutzer nicht bearbeitet werden. Einige Parameter werden in einer Konfigurationsdatei gespeichert, aber sonst nichts. Wir haben eine DF-Skriptsprache, die in C ++ - Code "kompiliert" wird (eine Liste der Komponentenerstellung und Nachrichtendefinitionen), die in eine native ausführbare Datei kompiliert wird. Die Module sind C ++ - Klassen (andere Klassen, um einige Informationen über unser System zu erhalten: Nachricht, Dispathcer, Komponente (Zusammenfassung), Port (Zusammenfassung), ConsumerPort, ProducerPort).

Auch wir waren überrascht von den Vorteilen eines DF - System bieten: wir serielle Sniffer App innerhalb 2 Minuten gemacht haben, oder wir haben ein Testprogramm gemacht Vor-Ort- , die blinkt , one-by-one - Lampen (es gab keine Dokumentation auf Hardware-IDs). Wir haben MIDI- und Joypad-Komponenten nur zum Spaß erstellt, ich habe auch eine leichte Orgel daraus gemacht (siehe http://homeaut.com/under_construction/ ).

Ich kann nur eine Schwierigkeit bei Tabellenkalkulationen erkennen: Da jede Zahl und Formel (möglicherweise: jede Zelle) eine Komponente ist, ist Ihr Diagramm nicht endgültig. Wenn Sie Ihrer einfachen sum () - App eine Zeile hinzufügen, bedeutet dies, dass das Datenflussdiagramm geändert wird. Sie müssen das Diagramm also zur Laufzeit "neu programmieren", oder wir sollten es "Metaprogrammierung" nennen. In Excel würde ein Makro die Arbeit erledigen, aber dann verlieren wir die Reinheit des Datenflusses.

Ich habe eine nicht allzu schlechte, aber nicht perfekte Lösung. Ich habe eine Tabelle erstellt, eine AJAX-App mit PHP-Backend. Die vertikale Achse ist die Zeit (Tage), die Linien sind Komponenten. Es gibt Komponenten wie Eingabe (die Zeile kann vom Benutzer bearbeitet werden), vertikaler Durchschnitt, horizontaler Durchschnitt / Summe und einige domänenspezifische statistische Berechnungen. Es gibt nur ein Problem: Dies ist "eindimensional". Solange ich nur Summe und Durchschnitt und was auch immer will, kann ich neue Zeilen hinzufügen und die Komponente erstellen, die das Zeug berechnet. Es gibt jedoch eine starke Einschränkung: Die Spalten sind immer Tage (ich habe Wochen- und Monatsansichten erstellt, in denen die täglichen Daten als Summe / Durchschnitt angezeigt werden, die jedoch immer noch eindimensional sind). Ich kann es nicht zeigen, es ist kollaborativ und erfordert die Ausführung der PHP-Backend-Aufgabe 7/24. Es wird von meinem Host-Anbieter nicht unterstützt.

Mein Modell (das am besten als "Tage horizontal" beschrieben werden kann) ist also nicht in der Lage, andere Probleme zu lösen.

Ich habe eine Idee, wie man dieses Problem löst: Tabs .

Wenn Sie in Excel stecken bleiben und eine andere Tabelle erstellen müssen, können Sie einen bestimmten Bereich auf derselben Registerkarte verwenden oder eine andere Registerkarte öffnen. Außerdem ist das Verweisen zwischen Registerkarten unangenehm. Ich bevorzuge die erste Methode. Ich denke, Registerkarten sollten auf demselben Bildschirm angezeigt werden, wie nicht überlappende Fenster.

Jeder Tisch sollte eine wachsende Achse haben: vertikal, horizontal oder fest. Vertikal wachsende Tabellen haben Linienkomponenten (wie meine tagesbasierte Tabelle), wobei alle Spalten die "gleiche" Formel haben, horizontale Komponenten Spaltenkomponenten haben und Tabellen mit fester Größe wie jede Tabelle sind.

Wenn der Benutzer eine neue Zeile / Spalte hinzufügt, hat die neue Zeile / Spalte dieselbe Formel.

Außerdem hasse ich es in Tabellenkalkulationen, dass ich 1000 Mal dieselben Formeln kopieren muss, wenn ich 1000 Zeilen habe. Es ist eine Quelle von Fehlern (alte Version der Formel in einigen Zeilen beibehalten), Speicherverschwendung (Speichern derselben Formel 1000x).

Vielleicht irre ich mich und es gibt Konzeptfehler in diesem Modell, aber ich hoffe, es war ein guter Anlass zum Nachdenken.

ern0
quelle
Ich habe mich oft gefragt, ob Tabellenkalkulationen eine "Zeile: Spalte-Adressierung" benötigen, die als schädlich eingestuft wird. Wenn alles ein benannter Bereich ist und Formeln für Bereiche gelten und Zellen als Eingabe / Anzeige verwendet werden.
Sherwood Botsford
0

Mein Gedanke wäre, die Tabelle zu verwenden, um die Logik für die Berechnungen zu definieren, und dabei zu versuchen, die Tabelle so einzurichten, dass sie programmiersprachenfreundlich ist. Mit freundlich meine ich -> Namensbereiche / Referenzen anstelle von cellXY-Koordinaten verwenden und Formeln in kleinere Teile zerlegen.

John M.
quelle