\

Školení Návrhové vzory, OOP a UML


 Wednesday, March 30, 2005
Programátorsko-analytická hádanka
Hádanka

Máte třídu objednávky, která může nabývat 3 stavů (Nová, Schválená, Zamítnutá) . Dokážete určit, co všechno je v následujícím kódu špatně?

 
 
 public enum OrderState
    {
        New,
        Rejected,
        Approved
    }
    
    
    public class Order
    {
        protected OrderState m_state;
        public Order()
        {
            m_state = OrderState.New;
        }
        public virtual void Approve()
        {
            if (m_state != OrderState.New)
            {
                throw new InvalidOperationException();
            }
            m_state = OrderState.Approved;
        }
        
        public virtual void Reject()
        {
            if (m_state != OrderState.New)
            {
                throw new InvalidOperationException();
            }
            m_state = OrderState.Rejected;
        }
    }
    
    public class SpecialOrder : Order
    {
        public SpecialOrder() : base()
        {
            
        }
        
        public override void Approve()
        {
            
            throw new InvalidOperationException();
        }
        public override void Reject()
        {
            if ((m_state != OrderState.New) && (m_state != OrderState.Approved))
            {
                throw new InvalidOperationException();
            }
            
            m_state = OrderState.Rejected;
        }
        
    }
    


Wednesday, March 30, 2005 7:31:00 PM (Central Europe Standard Time, UTC+01:00)       
Comments [24]  Programátorské hádanky


Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
1) Definoval bych abstraktni tridu AbstractOrder nebo interface
2) Jednotlive stavy udrzovat pomoci stavovych objektu
3) Properties signalizujici ne/moznost prechodu mezi stavy (napr. CanReject)
4) m_state jako private + setter,getter + event, ...
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
To Libor:
Ad 1) V tomto pripade to neni nutne, ale samzorejme to udelat muzete.

Ad 2)Ano, enumerace nejsou nejvhodnejsi, lepsi je stavovy objekt, i kdyz o vyslovnou chybu se nejedna.

Ad 3) Urcite v realne aplikaci je to vhodne, ale pro tento ...
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
Ja osobne davam prednost zapouzdreni enumeratoru primo do tridy, ktere se tyka (v tomto konkretnim pripadu bych to urcite udelal, ale to je IMHO vec vkusu/sylu a predevsim architektury). Co bych urcite udelal jinak, je:

a) nechapu, jak se ...
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
ERATA : ad c) Jedina vec, kterou um<DEL>k</DEL>i navic je to, ze umoznuje zamitnout jiz <DEL>schvalenou</DEL><INS>zamitnutou</INS> objednavku.
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
Ad a) Ano, urcite je to zalezitost vkusu :)

Ad b) Samozrejme, pro okoli tridy je potreba stav zverejnit. Vypusteno jen kvuli jednoduchosti kodu a nepodstatnosti vzhledem k zadani ...¨

Ad c) Ano prihoriva - objednavku nelze schvalit, takze ...
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
>upravuje ho legalne
Mate na mysli Mediator? ;-)

D.
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
To DODO]
Mediator me ani nenapadl, prisaham:)

Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
Ok, ale ted uz tedy varim vazne z vody (cti nedostated zadani aneb zpet k problemu minima informaci ;-) )... Cast zodpovedosti za implementaci metody SpecialOrder.Reject by melo byt preneseno na predka: base.Reject() jinak uz vazne nevim a podam si ...
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
V opacnem pripade - ma-li mit potomek vlastni stavovy automat, nemely by metody Approve a Reject byt virtualni, a pokud s tim potomek nemuze nic delat, tak by SpecialOrder mel tyto metody predefinovat ('new') vlastni vetvi dedicnosti techto metod.
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
Zdravim,
mozna se hluboce mylim (nebylo by to nic divneho :) ), ale myslim, ze chyba je ve tride SpecialOrder, protoze metoda Approve porusuje princip kovariance.
V bazove tride muze mit objednavka pro potvrzeni pouze stav New, ale v potomkovi ...
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
To Dodo: Neni to ono. Vim, ze jde o zjednoduseny priklad (minimum informaci:) ), ale jedna chyba by mela bit do oci.
Na .Net DG si budu na Vas davat pozor, i kdyz jste asi v prispevcich nepouzil sve obcanske jmenu, ze?:)
To Marek:) S kovarianci to ...
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
Ve tride SpecialOrder nema stav OrderState.Approved vubec zadny vyznam. Smisena soudrznost instanci?
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
To Petr: Ne to neni tento pripad. Ted uz nevim, jak vic napovedet;)
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
Smisena soudrznost instanci ne. Ale u potomku prece nelze redukovat stavovy prostor. Tedy nazyva se to "Princip respektovani prostoru nadrizene tridy"? :-)
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
Proc vlastne trida SpecialOrder existuje? Tato objednavka je vlastne predem zamitnuta, takze jestlize muze byt pouze zamitnuta, nemuze byt zamitnuti provedeno rovnou v konstruktoru? Metody Approve() a Reject() pak vubec nemusi existovat.
Taky me ...
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
Trefa, vyborne Peter:))
Ano, to je presne ono.

Odvozena trida musi plne respektivat stavovy prostor nadrizene tridy.
Muze jej samozrejme obohatit o vlastni stavy a prechody, ale nesmi existujici stavy a prechody redukovat.
To znamena, ze metoda ...
Tuesday, July 19, 2005 11:01:23 AM (Central Europe Standard Time, UTC+01:00)
Jsou tato pravidla pro tvorbu trid nekde sepsana at uz v nejake knize nebo na netu? Abych rekl pravdu tak se pri Vasich hadankach vubec nechytam a to mne desi... :)
Tuesday, July 19, 2005 11:01:24 AM (Central Europe Standard Time, UTC+01:00)
1) Vsechna tato pravidla vysvetluji na svem skoleni

2) O souhrnnem materialu, kde by byla vsechna pravidla, opravdu nevim. Sam jsem je dal dohromady z mnoha zdroju + pridal nejaka vlastni (z vlastnich pravidel ale hadanky nedavam, nebojte se;) ...
Tuesday, July 19, 2005 11:01:24 AM (Central Europe Standard Time, UTC+01:00)
Tak vidim, ze se mam jeste dost co ucit, jedina chyba, ktere sem si vsiml ja byla, ze ani jedna ze trid nema konstruktor.
Tuesday, July 19, 2005 11:01:24 AM (Central Europe Standard Time, UTC+01:00)
Pokud mohu malou vsuvku. Co se tyce materialu k popsanemu problemu tak hledejte na Google "The Liskov Substitution Principle". To vysvetluje obecny problem zamenitelnost trid a Reneho priklad kdy dedena trida vyhazuje vyjimku kde bazova ...
Tuesday, July 19, 2005 11:01:24 AM (Central Europe Standard Time, UTC+01:00)
Docela dobrym dokumentem (ale netroufam si tvrdit ze kompletnim) v tom ohledu je toto:
www.objectmentor.com/resources/ articles/Principles_and_Patterns.PDF
Tuesday, July 19, 2005 11:01:24 AM (Central Europe Standard Time, UTC+01:00)
Kniha, která vcelku obstojně popisuje problematiku stavového prostoru tříd se jmenuje "Základy objektově orientovaného návrhu v UML" (Meilir Page-Jones). Vedle tohoto tématu jsou také dosti ...
Tuesday, July 19, 2005 11:01:24 AM (Central Europe Standard Time, UTC+01:00)
Tady jsou sepsana ta OO pravidla vsechna.

http://c2.com/cgi/wiki?PrinciplesOfObjectOrientedDesign
Tuesday, July 19, 2005 11:01:24 AM (Central Europe Standard Time, UTC+01:00)
Otázkou je, zda pro RAD (tematický okruh "orders") je "Liskov Subst. Principle" opravdu to nejpodstatnější a zda to není trochu akadamická záležitost. Při pohledu na .NET Framework třídy by hoši ...
Comments are closed.