Fragen zu OOP in MQL5 - Seite 50

 
Aleksey Mavrin:

Dimitri, in diesem Fall verwechselst du wahrscheinlich ein wenig die Ziele der Muster Keeper und Prototype und alle ihre möglichen Kombinationen und Erscheinungsformen. Erstens: Snapshot muss im Gegensatz zu Prototype nicht unbedingt das gesamte Objekt kopieren.

Und ja, die Notwendigkeit der Kapselung zeigt sich vor allem bei großen Projekten mit vielen Beteiligten. Bei den meisten dieser Spielzeuge ist es ein bisschen überflüssig.

Worauf es ankommt, ist, sich hinzusetzen und allen Ernstes darüber zu sprechen, wie man einer Variablen einen Wert zuweist und sie dann verwendet. Ach ja - wenn man irgendetwas auf irgendetwas programmiert, werden oft verschiedene Werte verschiedenen Variablen zugewiesen und dann verwendet. Aber jetzt heißt es anders, und wenn man darüber spricht, muss man die Augenbrauen zusammenziehen und einen ernsten Blick aufsetzen.

Und es ist wichtig, keinen Fehler zu machen: Wenn alle Felder gespeichert sind, ist es Prototype, wenn nicht, ist es Keeper, sonst lachen die Jungs.

 
Sergey Dzyublik:

Sie gehören doch nicht zu der Sekte "Die installieren das Internet, wir brauchen es nicht, wir brauchen Ihr Internet nicht...", oder? ???


1. Der Custodian ähnelt von seiner Konzeption her dem Muster, das sie zur Speicherung von Zuständen bei der Eingabe veränderlicher Inhalte verwenden, um Änderungen rückgängig zu machen, wenn diese Änderungen nicht eine, sondern mehrere hundert sind. Z.B. Foto-Editor, Text-Editor...
Gefunden nach dem Schreiben -https://refactoring.guru/ru/design-patterns/memento
2. es ist im Grunde eine schlechte Praxis, wenn man das Thema nicht kennt und nicht versteht, um dort etwas zu kritisieren...
3. Wie kann etwas, das man ohnehin nicht versteht, noch verwirrender und schwieriger zu verstehen sein?
4. Der Rest liegt bei Ihnen...


Was hat die GOP damit zu tun?

 
Sergey Dzyublik:

Gehören Sie nicht zufällig zu der Sekte "Die installieren intinet, wir brauchen es nicht, Sie intinet"? ???


1. Der Custodian ähnelt von seiner Konzeption her dem Muster, das sie zur Speicherung von Zuständen bei der Eingabe veränderlicher Inhalte verwenden, um Änderungen rückgängig zu machen, wenn diese Änderungen nicht eine, sondern mehrere hundert sind. Z.B. Foto-Editor, Text-Editor...
Gefunden nach dem Schreiben -https://refactoring.guru/ru/design-patterns/memento
2. es ist im Grunde eine schlechte Praxis, wenn man das Thema nicht kennt und nicht versteht, um dort etwas zu kritisieren...
3. Wie kann etwas, das man ohnehin nicht versteht, noch verwirrender und schwieriger zu verstehen sein?
4. Der Rest liegt bei Ihnen...


Ich stehe voll und ganz hinter Ihnen! Danke, dass Sie meinen Standpunkt vertreten haben... Ich war zu faul))

Ich würde nur zu Punkt 1 hinzufügen, dass der Schnappschuss nicht unbedingt alle Objektdaten speichert und dass es mehrere Zweige mit Hunderten von Schnappschüssen desselben Objekts geben kann "Schnappschüsse von verschiedenen Seiten". In diesem Fall ist die Speicherung von Hunderten von Kopien ungenutzter Daten wirklich die schlechteste Praxis.

 
Dmitry Fedoseev:

So weit ist es gekommen - wir sitzen da und reden allen Ernstes darüber, wie einer Variablen ein Wert zugewiesen und sie dann verwendet werden kann. Ach ja - beim Programmieren von irgendetwas in irgendetwas werden oft verschiedene Werte verschiedenen Variablen zugewiesen, die dann verwendet werden. Aber jetzt heißt es anders, und wenn man darüber spricht, muss man die Augenbrauen zusammenziehen und einen ernsten Blick aufsetzen.

Und es ist wichtig, keinen Fehler zu machen, wenn alle Felder gespeichert sind, dann ist es der Prototyp, und wenn nicht alle, dann der Wächter, oder die Jungs werden lachen.

Dmitry, ich versichere Ihnen, ich würde gerne über Sie lachen, gut, ich liebe es), aber in diesem Fall haben Sie übertrieben, auch besonders gut lächelte.

Sie sind wirklich verwirrt - ein SCHUSS ist nicht gleich eine OBJEKTKOPIE, ich habe Sie darauf hingewiesen.

Wenn es nicht klar ist, lassen Sie es mich anhand eines Beispiels erklären: Sie haben 1000 Bytes eines Objekts, Sie brauchen 200 für einen Schnappschuss, warum also 800 kopieren, besonders wenn Sie viele Millionen gespeicherte Schnappschüsse haben.

p/s// Und ganz allgemein. Ist den Leuten nicht klar, dass Muster nur ein elementares Beispiel für die Lösung eines elementaren TYPISCHEN Problems sind? Und in der Tat sind die Aufgaben nicht einfach, sondern komplizierter. Und um reale Probleme zu lösen, sind die Muster notwendig, aber oft nicht in reiner Buchform, sondern angepasst an eine bestimmte Aufgabe, möglicherweise miteinander kombiniert, möglicherweise mit dem Zusatz einer gewissen Improvisation, die sich manchmal in einer Vereinfachung ausdrückt, wenn die Aufgabe es erlaubt, oder umgekehrt "Gewichtung" der Realisierung.

Nochmals, warum braucht man Kapselung und Schnittstellen - das kann man wahrscheinlich nicht verstehen, wenn Ihr IQ unter Wasserman liegt oder wenn Sie nicht an echten Projekten teilgenommen haben, bei denen verschiedene Teile des Projekts von verschiedenen Leuten gleichzeitig geändert werden und die Nichtbeachtung grundlegender OOPD-Prinzipien enorme Kosten für das Auffinden von Fehlern verursacht. Wirklich, warum all dies für Stanzen EAs für Markt))

 
Gegeben:
1. Ein endlicher Zustandsautomat (FSA)
2. Die Anzahl der KAs ist unbekannt.
3. Status des Raumfahrzeugs: erfolgreich / gescheitert / in Betrieb
4. CAs werden in mehreren Threads ausgeführt, die Anzahl der Threads ist unbekannt

Ein Muster muss es erlauben:
1. Vergabe einer eindeutigen ID für jeden Prozess - Zähler funktioniert nicht
2. Whirlpool gleichmäßig mit Fäden auffüllen
3. Status des Raumfahrzeugs abfragen
4. KA neu starten, wenn der KA-Zustand derselbe ist wie bei der zuvor ausgegebenen Aufgabe
5. AC in der Datenbank speichern und aus dem Fluss entfernen, wenn der Status erfolgreich ist
6. Wiederherstellen des Zustands von AC ( ID vom Speichern ) und Hinzufügen zum Fluss
7. Um einen gemeinsamen Pool für den Austausch von EA-Nachrichten zu haben, ist der Pool nicht gummiert, gelöschte EAs erhalten keine Nachrichten, aber neu erstellte EAs sollten neue Nachrichten erhalten und nicht die, die von gelöschten EAs übrig geblieben sind, es gibt keine Synchronisation zwischen den Threads und EAs
8. Speichern und Wiederherstellen des Zustands des gesamten Musters und Nachrichtenpools

* KAs erfüllen nicht die gleichen Aufgaben
** Der Nachrichtenpool ist das Hauptproblem, aber es könnte entweder an der CA oder der DB oder ?
*** Vielleicht ist das alles Datenbankarbeit und die Muster werden hier gar nicht gebraucht?
 
?
 
Igor Makanu:
Gegeben:
1. Ein endlicher Zustandsautomat (FSA)
2. Die Anzahl der KAs ist unbekannt.
3. Status des Raumfahrzeugs: erfolgreich / gescheitert / in Betrieb
4. CAs werden in mehreren Threads ausgeführt, die Anzahl der Threads ist unbekannt

Ein Muster muss es erlauben:
1. Vergabe einer eindeutigen ID für jeden Prozess - Zähler funktioniert nicht
2. Whirlpool gleichmäßig mit Fäden auffüllen
3. Status des Raumfahrzeugs abfragen
4. KA neu starten, wenn der KA-Zustand derselbe ist wie bei der zuvor ausgegebenen Aufgabe
5. AC in der Datenbank speichern und aus dem Fluss entfernen, wenn der Status erfolgreich ist
6. Wiederherstellen des Zustands von AC ( ID vom Speichern ) und Hinzufügen zum Fluss
7. Um einen gemeinsamen Pool für den Austausch von EA-Nachrichten zu haben, ist der Pool nicht gummiert, gelöschte EAs erhalten keine Nachrichten, aber neu erstellte EAs sollten neue Nachrichten erhalten und nicht die, die von gelöschten EAs übrig geblieben sind, es gibt keine Synchronisation zwischen den Threads und EAs
8. Speichern und Wiederherstellen des Zustands des gesamten Musters und Nachrichtenpools

* KAs erfüllen nicht die gleichen Aufgaben
** Der Nachrichtenpool ist das Hauptproblem, aber es könnte entweder an der CA oder der DB oder ?
*** Vielleicht ist das alles Datenbankarbeit und die Muster werden hier gar nicht gebraucht?
1. Sie haben eine komplexe Aufgabe, daher kann das Wort Muster in Ihrer Frage, wenn überhaupt, nur im Plural verwendet werden :)
2. Sie müssen die CAs gleichmäßig auf die Threads verteilen. Was ist falsch an einer Fabrik, die mit einem Singleton-Idemaker und einem Thread-Manager implementiert wurde? Warum ein einfacher Zähler nicht geeignet ist, ist unklar. Es gibt keine Möglichkeit, die Erstellung von CA zu kontrollieren oder was? Machen Sie also ein Addon für das Projekt eines anderen oder für Ihr eigenes?
7. Beobachter mit Filterung nach dem Zeitpunkt der Erstellung des Raumfahrzeugs. Alle Implementierungen für MT.
Alles wird in der Datenbank gespeichert - die Datenbankebene ist nicht kompliziert.
Verknüpfung von Fabriken mit Wiederherstellung aus der Datenbank - keine Komplikationen.
Und im Allgemeinen - das ist die richtige Antwort auf Ihre Frage - brauchen Sie mindestens ALLE Muster. Ganz im Ernst. Nachdem Sie diese gemeistert haben, müssen Sie solche Aufgaben in Angriff nehmen. Denn auf dem Weg dorthin benötigen Sie möglicherweise sowohl Dekorator als auch Fassade (für DB) und Besucher, um End-to-End-Ereignisse und andere zu implementieren.

 

Sergey Dzyublik:

1. Ein Keeper, ähnlich dem Muster, das zur Speicherung von Zuständen bei der Eingabe von veränderlichen Inhalten verwendet wird, um Änderungen rückgängig zu machen, wenn diese Änderungen nicht eine, sondern mehrere hundert sind. Zum Beispiel einen Foto-Editor, einen Text-Editor...

2. In der Tat ist es eine schlechte Praxis, wenn man das Thema nicht kennt und nicht versteht, um dort etwas zu kritisieren...

Der wichtigste Punkt wurde hervorgehoben: Es ist der veränderbare Inhalt, der die Wurzel vieler Probleme des Missbrauchs von OOP ist. Auch ich habe mich lange damit beschäftigt, aber mit der Erfahrung kommt allmählich das Verständnis. Der Code, in dem es viele Beziehungen zwischen Objekten (Zeigern) gibt und gleichzeitig diese Objekte änderbar sind - ist eine schreckliche Nudel, die sich nicht ändern wird. Daher sollten wir uns bemühen, Referenzobjekte unveränderbar zu machen. Nur Wertobjekte müssen änderbar sein, d.h. Strukturen und einfache Typen, und auch Zeiger.

In diesem Fall ist es wünschenswert, das Ausgangsobjekt als Struktur und nicht als Klasse zu deklarieren. Dann kann man seinen Inhalt ändern. In diesem Fall wird natürlich kein Zeiger auf das Objekt genommen und gespeichert, wie im besprochenen Muster, und das ist auch richtig so. Um Objekte zu ändern, muss man explizit auf ihre Methoden verweisen oder sie als Argument an eine Funktion übergeben, d.h:

memento.restoreState(myObject);

oder

myObject.restoreState(memento);

Nicht so:

memento.restoreState();

sieht es so aus, als würden wir ein Memento-Objekt ändern, aber in Wirklichkeit ändern wir ein anderes Objekt, das sich wahrscheinlich an anderer Stelle im Programm befindet. Dies hat einen Nebeneffekt: Es ist dasselbe, als würde man eine globale Variable an einer Stelle ändern und ihren Wert an einer anderen Stelle verwenden.

D.h. ein Memento sollte keinen Verweis auf das Originalobjekt speichern. Sie sollte nur den Inhalt speichern. Dies ist meine Meinung, aber ich denke, ich bin nicht weit von der Wahrheit entfernt.)

 
Aleksey Mavrin:
Im Allgemeinen ist die richtige Antwort auf Ihre Frage, dass Sie mindestens ALLE Muster benötigen. Ganz im Ernst.

Ich behaupte nicht, dass ich eine eigene Meinung habe, wahrscheinlich habe ich sie irgendwo gelesen, aber imho gibt es beim Programmieren nur zwei Probleme: die richtige Programmstruktur und das schnelle Finden eines guten Namens für eine Variable, und alles andere ist ganz einfach zu erledigen

Ich meine es auch ernst.

Danke, ich werde Ihre Muster lesen

Ich werde warten, falls jemand anderes erscheint, aber nur auf der Ebene der Anfänger und Trainer Fragen akademvelopers stürzen sich in ))))

 
Alexey Navoykov:

1) Der Code, der viele Beziehungen zwischen Objekten (Zeigern) hat, und gleichzeitig die Objekte veränderbar sind, ist eine absurde Nudel, in die der Teufel später nicht mehr hineinsehen kann. Deshalb ist anzustreben, dassReferenzobjekte unveränderbar sind.
2)
Nur Wertobjekte, d.h. Strukturen und einfache Typen, und Zeiger sollten veränderbar sein.
3)
In diesemFall ist es wünschenswert, das Ausgangsobjekt als Struktur zu deklarieren, nicht als Klasse. Dann kann man seinen Inhalt ändern. Natürlich kann man keinen Zeiger darauf nehmen und ihn speichern, wie im besprochenen Muster, und das ist auch richtig.
4)Objekte müssen geändert werden, indem man ihre Methoden explizit aufruft oder sie als Argument an eine Funktion übergibt.
Es sieht so aus, als würden wir das Memento-Objekt ändern, aber in Wirklichkeit ist es ein anderes Objekt, das sich wahrscheinlich an einer anderen Stelle im Programm befindet. Dies hat einen Nebeneffekt.

1. Es stellt sich heraus, dass die Datenstruktur Tree vom Bösen ist...
2. schlechtes C++, wo class == private struct, was zu tun ist, wir sollten wahrscheinlich Strukturen und Klassen aufgeben.
3. und das ist richtig: keine Muster, keine Sortierung nach Zeigern, keine Speicherersparnis, insbesondere bei großen Objekten...
4. Wir sollten nicht vergessen, die Verwendung von Schnittstellen und Template-Funktionen zu verbieten, da man sonst nicht versteht, mit welchem Objekt man arbeitet - was für ein Horror...

Grund der Beschwerde: