Společný parametr pro více tříd   zodpovězená otázka

C#, Algoritmy

Dobrý den,

chtěl bych se zeptat jestli existuje nějaké elegantní řešení jak společně (jednou) předat více třídám stejný parametr a zároveň i získat společný jediný výsledek typu bool.

Napadá mě to řešit pomocí napojení na událost, ale nešlo by to i nějak jinak?

Předem děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co je to za blbost? Jak chcete z více tříd (metod) dostat jediný výsledek?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zkuste uvést příklad - případně popište kód, který tímto chcete "vylepšit". Implementační detail sám o sobě můžeme chápat jinak než požadujete. Navíc je možné, že poradíme i konceptuálně odlišné řešení. Zkuste být konkrétnější.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Potřebuji vyhodnotit určitou situaci a to různými způsoby. Výsledkem má být jediná hodnota true nebo false, pokud jeden ze způsobů vrátí false. Předávám všem stejný společný parametr (vlastní objekt).

Jde mi o to, že je velmi pravděpodobné, že v budoucnu budu přidávat další způsoby vyhodnocení a chtěl bych to navrhnout tak, abych již musel co nejméně zasahovat do kódu a ideální by bylo jen přidat další třídu (pro vyhodnocení).

Pokusím se o praktický příklad:

řekněme, že by se jednalo o řízení nějakého stroje. Mám dané, opakující se vstupní hodnoty (teplota vody, teplota oleje, tlak oleje, tlak vody apod.). V nějakém pravidelném intervalu by mělo proběhnout vyhodnocení provozního stavu všech hodnot (série různých kontrol/tříd) a v případě nějaké anomálie provést zastavení stroje - tedy ta požadovaná jediná návratová hodnota false (jestliže jeden z parametrů nevyhovuje).

V mém případě vyžaduje vyhodnocení každé hodnoty určitý samostatný výpočet (nejedná se o pouhé porovnání se vzorovou hodnotou) a proto jsem uvažoval o samostatných třídách pro každou kontrolu. Dále se předpokládá, že do budoucna dojde k přidávání dalších kontrol.

Předpokládám, že by se pro jednotlivé kontroly vytvořil nějaký společný vzor, aby se dědily společné vlastnosti.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Mějte třídu, která definuje parametry, které řeší rozhodování (například DecideParams).

Dále rozhrazní (interface), který popisuje metodu, které předáme právě třídu s parametry a vrátí true nebo false (například IDecider).

No a následně budete mít funkcí, které předáte nějakou kolekci přívě tříd implementující vytvořené rozhraní a ona předá parametry a sesbírá a vyhodnotí jednotným způsobem výsledky.

Při novém způsobu rozhodování vytvoříte jen další třídu imeplementující rozhraní. A přidávat další třídy do seznamu k vyhodnocení už nebude takový problém.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Děkuji za podrobný návod. Hledal jsem v tom zbytečně složitost :-(

Přikládám ukázku jak by to asi mohlo vypadat (?):

public Form1()
        {
            InitializeComponent();
        }

        private bool CheckAll(DecideParams decideParams)
        {
            List<IDecider> lstControl = GetControlColl();

            foreach (IDecider iDecider in lstControl)
            {
                if (!iDecider.Check(decideParams))
                    return false;
            }
            return true;
        }

        private List<IDecider> GetControlColl()
        {
            Control1 control1 = new Control1();
            Control2 control2 = new Control2();

            List<IDecider> lstControl = new List<IDecider>();
            lstControl.Add(control1);
            lstControl.Add(control2);

            return lstControl;
        }

public class DecideParams
    {
        private double m_temp1;
        private double m_temp2;

        public double Temp2
        {
            get { return m_temp2; }
            set { m_temp2 = value; }
        }

        public double Temp1
        {
            get { return m_temp1; }
            set { m_temp1 = value; }
        }
    }

interface IDecider
    {
        bool Check(DecideParams decideParams);
    }

class Control1 : IDecider
    {
        #region IDecider Members

        public bool Check(DecideParams decideParams)
        {
            ' zde kod kontroly   
            return true;
        }

        #endregion
    }

class Control2 : IDecider
    {
        #region IDecider Members

        public bool Check(DecideParams decideParams)
        {
            ' zde kod kontroly
            return true;
        }

        #endregion
    }

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Přesně jak jsem myslel.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ještě doplním, že jsem nakonec použil místo Interface dedičnost, protože používám Xml serializaci tříd a Interface nelze v tom případě použít.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback