Hallo,
für einen Hardwaresimulator, der grob und vereinfacht die Funktionsweise eines Computers zeigen soll, bin ich nun daran mein Konzept weiter auszufeilen.
Meine Hauptkomponenten, die miteinander kommunizieren sollen wie Register und Speicher habe ich schon programmiert.
Allerdings werden alle Komponenten von einer Wrapperklasse die ich "Simulator" nenne initialisiert und sollen von dieser auch die Register-Wert-Maxima erhalten, die der Benutzer einstellen kann.
Da Kommunikation zwischen den einzelnen Objekten ermöglicht werden muss, habe ich mich dazu entschlossen die Simulator-Klasse als Singleton zu programmieren. So muss ich nicht jedem Register/jeder anderen Komponente die Simulator-Klasse mitgeben.
Probleme hierbei habe ich jetzt bei dem Serialisieren und Deserialisieren. Die Einstellung der einzelnen Komponenten hängt von den Einstellungen ab, die der User im Simulator vornimmt.
Beispiel: Benutzer legt Maximum für die Werte fest -> Alle Register, Speicher benötigen diesen Wert zur Verwaltung ihrer Werte.
Das daraus resultierende Problem ist, dass beim Deserialisieren diese zentralen Maxima der Werte zuerst vorliegen müssen, sodass Speicher usw. deserialisiert werden kann. Denn diese Werte müssen vorhanden sein.
Klassen (zur Verdeutlichung):
Spoiler anzeigen
Wie sollte ich also vorgehen? Der Speicher wird über ein DGV dargestellt.
für einen Hardwaresimulator, der grob und vereinfacht die Funktionsweise eines Computers zeigen soll, bin ich nun daran mein Konzept weiter auszufeilen.
Meine Hauptkomponenten, die miteinander kommunizieren sollen wie Register und Speicher habe ich schon programmiert.
Allerdings werden alle Komponenten von einer Wrapperklasse die ich "Simulator" nenne initialisiert und sollen von dieser auch die Register-Wert-Maxima erhalten, die der Benutzer einstellen kann.
Da Kommunikation zwischen den einzelnen Objekten ermöglicht werden muss, habe ich mich dazu entschlossen die Simulator-Klasse als Singleton zu programmieren. So muss ich nicht jedem Register/jeder anderen Komponente die Simulator-Klasse mitgeben.
Probleme hierbei habe ich jetzt bei dem Serialisieren und Deserialisieren. Die Einstellung der einzelnen Komponenten hängt von den Einstellungen ab, die der User im Simulator vornimmt.
Beispiel: Benutzer legt Maximum für die Werte fest -> Alle Register, Speicher benötigen diesen Wert zur Verwaltung ihrer Werte.
Das daraus resultierende Problem ist, dass beim Deserialisieren diese zentralen Maxima der Werte zuerst vorliegen müssen, sodass Speicher usw. deserialisiert werden kann. Denn diese Werte müssen vorhanden sein.
Klassen (zur Verdeutlichung):
C#-Quellcode
- public class Simulator {
- private static Simulator _instance;
- public static Simulator Instance {
- get {
- if (_instance == null)
- _instance = new Simulator();
- return _instance;
- }
- }
- private Simulator() {
- // Initialisieren der Komponenten
- Ram = new Memory(MemoryLength);
- }
- // Komponenten
- public Memory Ram { private set; get; }
- // Benutzerdefinierte Werte
- public int MemoryLength { get; set; } = 1000;
- public int MaxValue { get; set; } = 19999;
- }
- public class Memory : IEnumerable<MemoryItem> {
- private List<MemoryItem> _memList;
- private int _index = 0;
- public Memory(int cap) {
- _memList = new List<MemoryItem>(cap);
- for (int i = 0; i < cap; i++)
- Add(new MemoryItem());
- }
- public Memory() : this(Simulator.Instance.MemoryLength) {
- }
- public void Add(MemoryItem item) {
- if (_index >= _memList.Capacity)
- throw new IndexOutOfRangeException();
- item.Address = _index++;
- _memList.Add(item);
- }
- public IEnumerator<MemoryItem> GetEnumerator() => _memList.GetEnumerator();
- IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
- }
- public class MemoryItem : IMemoryItem {
- private int _value, _max;
- public MemoryItem(int max) {
- _max = max;
- }
- public MemoryItem() : this(Simulator.Instance.MaxValue) {
- }
- public int Address { get; set; }
- public int Value {
- get { return _value; }
- set {
- if (_value == value)
- return;
- else if (_value < 0)
- _value = 0;
- else if (_value > _max)
- _value = _max;
- else
- _value = value;
- RaisePropertiesChanged("Value", "Hi", "Lo");
- }
- }
- public int Hi { get { return Value / 1000; } }
- public int Lo { get { return Value - Hi * 1000; } }
- public XmlSchema GetSchema() => null;
- public void ReadXml(XmlReader reader) {
- //Deserialization
- }
- public void WriteXml(XmlWriter writer) {
- //Serialization
- }
- public event PropertyChangedEventHandler PropertyChanged;
- protected void RaisePropertiesChanged(params string[] propNames) {
- if (PropertyChanged != null)
- foreach (var name in propNames)
- PropertyChanged(this, new PropertyChangedEventArgs(name));
- }
- }
- public interface IMemoryItem : IXmlSerializable, INotifyPropertyChanged {
- int Address { get; set; }
- int Value { get; set; }
- int Hi { get; }
- int Lo { get; }
- }
Wie sollte ich also vorgehen? Der Speicher wird über ein DGV dargestellt.