Mein Ansatz. Der Kern ist der Motor. - Seite 138

 

"Erweiterung des kreativen Potenzials von OOP-Anhängern", Vereshchagin, Canvas, Oil


 

Ich danke Ihnen allen für die informativen Beiträge.

Heute werden wir die Kommunikation zwischen dem EA und der Engine über Ressourcen testen. Gerade abgeschlossen. Das sollte auch im Testgerät funktionieren.

 
Реter Konow:

Sie arbeiten mit der Klasse CCanvas. Sie ist die einzige in Ihrer Entwicklung.

Die Klasse ist Teil des Systems. Wenn es EINES ist, gibt es kein System.

Warum sollte man dann Klassenobjekte erstellen und auf ihre Funktionen nach OOP-Regeln verweisen?

PRAKTISCH brauchen Sie kein OOP, wenn Sie mit EINER Klasse arbeiten.

Aber Sie verwenden OOP im Umgang mit EINER Klasse. Sie brauchen aber kein OOP.

Peter, in der OOP werden Klassenobjekte erstellt, damit man mit mehreren Objekten arbeiten kann, die nicht voneinander abhängig sind. Wenn Sie mit CCanvas arbeiten und einen Graphen haben, ist alles in Ordnung, OOP ist hier wirklich nicht erforderlich. Wenn Sie jedoch mehrere Diagramme in verschiedenen Bereichen anzeigen müssen, ist es schwierig, ohne OOP und die Erstellung mehrerer Instanzen von CCanvas auszukommen.

Oder ein weiteres Beispiel. Kürzlich wurde ich gebeten, einen prozeduralen Expert Advisor so zu modifizieren, dass er auf verschiedenen Symbolen gleichzeitig handeln kann (auf einem Chart). Der prozedurale Stil hätte langwierige und komplizierte Bemühungen erfordert, um den Handel mit verschiedenen Symbolen gleichzeitig und unabhängig voneinander zu ermöglichen. Im Gegensatz dazu habe ich einfach den gesamten prozeduralen Code in einer Klasse untergebracht und drei Exemplare erstellt. Ich habe für jeden von ihnen einen eigenen Satz von Einstellungen festgelegt, einschließlich des Arbeitssymbols usw. Der Code funktionierte beim ersten Versuch einwandfrei. Der Code funktionierte auf Anhieb wie gewünscht. Der Benutzer war zufrieden.

Auch Sie verwenden OOP in Ihrem Kernel. Auch wenn Sie es stillschweigend tun:

Retag Konow:

Um nicht unbegründet zu sein, möchte ich Ihnen abschließend ein Beispiel für genau diesen "Kern" geben. Genauer gesagt, handelt es sich um eine Boot-Datei. Er enthält mehrere Kerne.

Ich möchte Sie daran erinnern, dass er automatisch auf der Grundlage des KIB-Codes gedruckt wird. Dann wird sie in den Motor eingebaut. Als nächstes arbeitet der Motor mit ihm.

Jeder Ihrer Kernel ist eine Instanz einer Klasse im Sinne der OOP. Wie auch immer man es nennen mag, aber es ist ein Element der OOP. Aber leider ist dieses Element selbstgemacht und in seiner konzeptionellen Kraft dem unterlegen, was bereits von Tausenden von Ungeübten erfunden und ausgefeilt wurde.

 

Warum versucht ihr, Peter von den Vorteilen von OOP zu überzeugen?

Sie werden ihn nicht überzeugen! Wenn Sie ein Gedächtnis wie er hätten, würden Sie sich fragen, warum dieser ganze OOP-Kram so kompliziert ist, wenn man alles so viel einfacher machen kann? Wir machen alle Variablen global, direkter Zugriff von überall, keine Verbote und Einschränkungen - schön!

Das ist für diejenigen, die in ihrem schwachen Geist vielleicht vergessen, was sie vor zehn Jahren geschrieben haben - es ist notwendig, dass der Compiler und die Sprache es in jeder Hinsicht einschränken. Und wenn Sie sich genau erinnern, warum und wieso Sie dieses oder jenes Konstrukt in Ihren viele Jahre alten Code geschrieben haben - dann ist OOP nur das fünfte Rad am Wagen.

Peters Problem liegt nicht in der Wahl "OOP oder prozeduraler Ansatz", Peters Problem liegt in der Zielgruppe. Der Mangel an Menschen, die einerseits gut programmieren können und andererseits lieber die Hände wechseln. Ich beobachte solche Menschen nicht.

 
Реter Konow:

1. genau. Im Konstruktor kann eine begrenzte Anzahl von Elementen vorgegeben werden. Eine dynamische Tabelle muss also aus einer begrenzten Anzahl von Zeilen bestehen, aber gleichzeitig unbeschränkt sein. Die Lösung besteht lediglich darin, spezielle Arrays für die hinzugefügten Parameter zu erstellen und deren Werte durch die Tabellenzellen zu scrollen.

2. Ja. Der Konstruktor erstellt den Kernel für die Maschine auf der Grundlage des von Ihnen zitierten Codes. + druckt die Verbindungsdateien. Dann habe ich den Kernel in den Motor (DRIVE) eingesetzt. Danach kann die Engine die gewünschte GUI abspielen. Pairing-Dateien werden mit dem EA verbunden und beginnen mit ihm zu interagieren.

Es stellt sich heraus, dass jedes Mal für eine neue GUI müssen Sie Änderungen in der Engine machen (bieten es mit dem entsprechenden GUI-Kernel). Ich halte dies für eine grundlegend falsche Lösung. Stellen Sie sich vor, dass es Hunderte von Nutzern Ihrer Maschine gibt. Aber der Motor, der auf dem Markt oder anderswo gehostet wird, ist nur einer. Wie werden Sie in diesem Fall vorgehen? Für jeden Nutzer einen bestimmten Motor zu platzieren, den er für sich selbst herunterladen muss? Wie bereiten Sie den Kern der Benutzeroberfläche für den Motor vor? Werden Sie jedem Nutzer einen eigenen Motor zur Verfügung stellen? - Das wird schnell zu einem Albtraum. Ihre Lösung ist also nicht skalierbar.

 
Vasiliy Sokolov:

Peter, in der OOP werden Klassenobjekte erstellt, damit man mit mehreren Objekten arbeiten kann, die nicht voneinander abhängig sind. Wenn Sie mit CCanvas arbeiten und einen Graphen haben, ist alles in Ordnung, Sie brauchen hier wirklich kein OOP. Wenn Sie jedoch mehrere Diagramme in verschiedenen Bereichen anzeigen müssen, ist es schwierig, ohne OOP und die Erstellung mehrerer Instanzen von CCanvas auszukommen.

Oder ein weiteres Beispiel. Kürzlich wurde ich gebeten, einen prozeduralen Expert Advisor so zu modifizieren, dass er auf verschiedenen Symbolen gleichzeitig handeln kann (auf einem Chart). Der prozedurale Stil hätte langwierige und komplizierte Bemühungen erfordert, um den Handel mit verschiedenen Symbolen gleichzeitig und unabhängig voneinander zu ermöglichen. Im Gegensatz dazu habe ich einfach den gesamten prozeduralen Code in einer Klasse untergebracht und drei Exemplare erstellt. Ich habe für jeden von ihnen einen eigenen Satz von Einstellungen festgelegt, einschließlich des Arbeitssymbols usw. Der Code funktionierte beim ersten Versuch einwandfrei. Der Code funktionierte auf Anhieb wie gewünscht. Der Benutzer war zufrieden.

Auch Sie verwenden OOP in Ihrem Kernel. Auch wenn Sie es stillschweigend tun:

Jeder Ihrer Kernel ist im Sinne der OOP eine Instanz einer Klasse. Und wie auch immer Sie es nennen, es ist ein Element von OOP. Aber leider ist dieses Element selbstgemacht und unterliegt in seiner konzeptionellen Kraft dem, was bereits von Tausenden von unerprobten Köpfen erfunden und ausgefeilt wurde.

Vasily, ich verstehe, warum die Zeichenfunktionen zu einer Klasse gemacht werden. Denn neben ihnen gibt es noch andere Funktionsgruppen.

Aber meine Frage war ein bisschen anders. Warum genau würde Nikolai den Aufruf der Zeichenfunktionen über eine Klasse verwenden, wenn er keine anderen Klassen verwenden würde. Er zeichnet nur.

Genau das war der Sinn der Frage.

Ich habe betont, dass diese Aktion logisch gesehen sinnlos ist und dass er sich dessen nicht bewusst ist.

Ich habe auch betont, dass der Einsatz von OOP angesichts der Größe der zu lösenden Aufgaben oft unangemessen ist. Schließlich erfordert OOP eine verzweigende Klassifikation, und wenn es eine solche Klassifikation nicht gibt, lohnt es sich dann, sie absichtlich zu erstellen?

Der Punkt ist, dass sich der Entwickler an den Anforderungen der Mechanismen orientieren sollte, nicht an den Werkzeugen.

 
Vasiliy Sokolov:

Peter, in der OOP werden Klassenobjekte erstellt, damit man mit mehreren Objekten arbeiten kann, die nicht voneinander abhängig sind. Wenn Sie mit CCanvas arbeiten und einen Graphen haben, ist alles in Ordnung, Sie brauchen hier wirklich kein OOP. Wenn Sie jedoch mehrere Diagramme in verschiedenen Bereichen anzeigen müssen, ist es schwierig, ohne OOP und die Erstellung mehrerer Instanzen von CCanvas auszukommen.

Oder ein weiteres Beispiel. Kürzlich wurde ich gebeten, einen prozeduralen Expert Advisor so zu modifizieren, dass er auf verschiedenen Symbolen gleichzeitig handeln kann (auf einem Chart). Der prozedurale Stil hätte langwierige und komplizierte Bemühungen erfordert, um den Handel mit verschiedenen Symbolen gleichzeitig und unabhängig voneinander zu ermöglichen. Im Gegensatz dazu habe ich einfach den gesamten prozeduralen Code in einer Klasse untergebracht und drei Exemplare erstellt. Ich habe für jeden von ihnen einen eigenen Satz von Einstellungen festgelegt, einschließlich des Arbeitssymbols usw. Der Code funktionierte beim ersten Versuch einwandfrei. Der Code funktionierte auf Anhieb so, wie er sollte. Der Benutzer war zufrieden.

Auch Sie verwenden OOP in Ihrem Kernel. Auch wenn Sie es stillschweigend tun:

Jeder Ihrer Kernel ist im Sinne der OOP eine Instanz einer Klasse. Und wie auch immer Sie es nennen, es ist ein Element von OOP. Aber leider ist dieses Element selbstgemacht und unterliegt in seiner konzeptionellen Kraft dem, was bereits von Tausenden von unfähigen Köpfen erfunden und poliert wurde.

Sie verschwenden Ihre Zeit. Erstens ist Ihr Beispiel mit dem Berater in Perth eine Mogelpackung - er kann keine Fachleute schreiben, er versteht nicht, was da steht und worum es geht, und er kann Ihr sehr klares Beispiel nicht verstehen - Sie werden sehen, er wird Ihnen, mit den Augen zuckend, das Gleiche sagen, was er Nikolay gesagt hat. Zweitens geben Sie ihm eine Ausrede, um seine Nase noch höher zu stecken, indem Sie sagen, dass er in seinem Eimer allein, ohne die Hilfe von Tausenden von Vordenkern, einen super-einzigartigen Code mit einer herausragenden Lösung geschaffen hat, die besser ist als alle bisherigen Lösungen. Sie werden sehen - genau so wird er seinen einzigartigen Eimer mit Schiebern positionieren...

ZS: Ich habe mich vielleicht etwas harsch ausgedrückt, aber ich habe sehr wenig Toleranz für undurchdringliche Dummheit.

 
Vasiliy Sokolov:

Jeder Ihrer Kernel ist im Sinne der OOP eine Instanz einer Klasse. Und ganz gleich, wie man es nennt, es ist ein Element von OOP. Aber leider ist dieses Element selbstgemacht und unterliegt in seiner konzeptionellen Kraft dem, was bereits von Tausenden von unfähigen Köpfen erfunden und ausgefeilt wurde.

So ist es. Aber dennoch gibt es einen signifikanten Unterschied. Was mich betrifft, so ist bei Peter - in diesem Musterbeispiel für Klasse - fast alles vorhanden. Und das passt nicht in das Kapselungsparadigma von OOP. Außerdem gibt es globale Variablen.

Also hier - nur "Elemente der OOP".

Aber ich fürchte, das Gegenteil wird den Leuten nicht gefallen - ich bin mir sicher, Vasily, dass, wenn ich mein OOP-Projekt ausführe, die Leute im Gegenteil schreien werden, dass "man mit dieser Schnittstelle nichts machen kann, außer dem, wofür sie gedacht ist" :)

 
Vasiliy Sokolov:

Es stellt sich heraus, dass man jedes Mal, wenn man eine neue Benutzeroberfläche erstellt, Änderungen an der Engine vornehmen muss (sie mit dem entsprechenden GUI-Kernel ausstatten). Ich halte dies für eine grundlegend falsche Lösung. Stellen Sie sich vor, dass es Hunderte von Nutzern Ihrer Maschine gibt. Aber der Motor, der auf dem Markt oder anderswo gehostet wird, ist nur einer. Wie werden Sie in diesem Fall vorgehen? Für jeden Nutzer einen bestimmten Motor zu platzieren, den er für sich selbst herunterladen muss? Wie bereiten Sie den Kern der Benutzeroberfläche für den Motor vor? Werden Sie jedem Nutzer einen eigenen Motor zur Verfügung stellen? - Das wird schnell zu einem Albtraum. Ihre Lösung ist also nicht skalierbar.

Nein, Wassili, du neigst dazu, alles zu dramatisieren.)

Im Designer gibt es eine Schaltfläche, die, wenn sie angeklickt wird, alle Dateien ausdruckt.

Und die Engine wird Kernel aus einer Textdatei laden. Das ist nicht schwer zu bewerkstelligen.

 
Nikolai Semko:
Peter, du hast wirklich etwas über die Anwendung von OOP missverstanden.
Entschuldigung, aber das riecht nach Schizophrenie.

Es ist eine besondere Form des Bewusstseins, halten Sie es nicht davon ab, sich weiterzuentwickeln