Pomoc w kodzie - dodanie właściwości

0

Witam. Mam taki oto kod:

 delegate void ItemValueChanged(Item item, DataSvcStatus status);

    public partial class Main
    {
        DataSvc m_DataSvcSubscribe = null;      
        Guid m_GuidSubscribe;

        public Main()
        {
            InitializeComponent();
            try
            {
                m_DataSvcSubscribe = new DataSvc();
            }
            catch...
        }
        private void StartRefresh()
        {
            try
            {
                Item itemSubscribe = new Item("DB55.DB4");
                m_GuidSubscribe = m_DataSvcSubscribe.Subscribe(OnDataChanged, itemSubscribe);
            }
            catch...
        }
        private void StopRefresh()
        {
            try
            {
                m_DataSvcSubscribe.UnSubscribe(OnDataChanged);
            }
            catch...
        }
        public void OnDataChanged(Guid guid, Item item, DataSvcStatus status)
        {
            ItemValueChanged itemDelegate = new ItemValueChanged(OnItemValueChanged);
            BeginInvoke(itemDelegate, new Object[] { item, status }); 
        }
        public void OnItemValueChanged(Item item, DataSvcStatus status)
        {
           textBox.Text = item.Value.ToString();
        }
    } 

Działa to w taki sposób, że jak zmienię wartość zmiennej "DB55.DB4" w sterowniku PLC, to wartość tej zmiennej pojawia mi się w jakimś textboxie. Sam odczyt i zapis jest prosty, ale to dzieje się ONLINE, czyli każda zmiana w sterowniku powoduje zmianę wartości w textboxie (jak zdarzenie). Moja prośba jest następująca, chciałbym dodać właściwość, która będzie zmieniana jeśli nastąpi zmiana w sterowniku i ta właściwość będzie mi zmieniała wartość Textboxa. Potrzebuję tego do testowania, jeśli nie jestem podpięty do maszyny, żebym mógł symulować sobie zmianę tej zmiennej "DB55.DB4" np. z innej klasy. I nie za bardzo wiem, w którym miejscu mam to zmienić. Pozdrawiam i dziękuję.

Nikt nie ma żadnego pomysłu? Pilnie potrzebuję jakiejś podpowiedzi..

1

Tutaj jest mechanizm publish-subscribe. To jest subskrybujesz zdarzenie zmiany stanu na sterowniku i kiedy nastąpi zmiana to wywołuje się metoda OnDataChanged. Ona z kolei uruchamia metodę OnItemValueChanged, przekazując jej co się zmieniło.

Ja bym znów tutaj chętnie skorzystał z INotifyPropertyChanged - dorzuć implementację tego interfejsu, dorzuć właściwość, zrób tak, aby ona informowała o swoich zmianach (wywoływała zdarzenie PropertyChanged). Potem zmieniaj ją w OnDataChanged, a w subskrypcji zmiany właściwości aktualizuj TextBoxa. I wtedy nieważne jak ją zmienisz (czy ze sterownika, czy gdziekolwiek indziej z kodu) to TextBox się zmieni.

0

A gdzie lepiej zmieniać właśćiwość w OnDataChanged czy OnItemValueChanged? Bo jeśli OnDataChanged to ta druga metoda nie jest już potrzebna. I jeszcze jedno a gdzie najlepiej dodać warunek, żeby na przykład zmienił wartość textboxa, ale tylko wtedy kiedy Item wynosi "1". We właściwości czy w metodzie?

1

Oprzyj klasy o interfejsy (separacja implementacji od interfejsu). W testowanej klasie wszystkie używane klasy zmień na interfejsy i umożliw wstrzykiwanie ich z zewnątrz (najlepiej przez jakiś framework IoC/DI, np.: StructureMap, Autofac). W testach klasy użyj mocków (np. te z frameworka Moq) - w miejsce zależności wstrzykniętych przez wspomniany framework podaj mocki, w testach zasymuluj zwracanie danych przez odpowiednie metody mocków.
Pewnie brzmi to bardzo skomplikowanie, ale jeśli chcesz się rozwijać jako programista języka wysokopoziomowego, to musisz w którymś momencie zacząć programować zgodnie z zasadami SOLID, w tym używać IoC (a konkretnie DI, bo szeroko rozumiane IoC to kupa) oraz mocków (to ostatnie do testów), a więc im wcześniej się tego nauczysz, tym lepiej dla Ciebie.

1
litrmleka napisał(a):

A gdzie lepiej zmieniać właśćiwość w OnDataChanged czy OnItemValueChanged? Bo jeśli OnDataChanged to ta druga metoda nie jest już potrzebna. I jeszcze jedno a gdzie najlepiej dodać warunek, żeby na przykład zmienił wartość textboxa, ale tylko wtedy kiedy Item wynosi "1". We właściwości czy w metodzie?

Jeżeli zrobiłeś, tak jak sugerowałem, czyli z INotifyPropertyChanged, to w momencie OnDataChanged zmieniaj właściwość swojego obiektu (i wtedy OnItemValueChanged faktycznie może już nie być potrzebne, jeżeli nie jest używane). Z kolei zmiana wartości TextBoxa następuje w momencie odbioru zdarzenia PropertyChanged - i to tam powinieneś wyświetlać (albo nie) coś wewnątrz niego.

1 użytkowników online, w tym zalogowanych: 0, gości: 1