\

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


 Thursday, October 07, 2004
Dokážete najít všechny chyby v kódu?

Dokážete poznat všechny nesmysly v tomto kódu? Nejde o žádný reálný příklad, jen o letmé zachycení a nakupení střípků potměšilých nočních programátorských můr, jimiž je moje podvědomí neodbytně zaplavováno a mučeno po duševně drásající  refaktorizaci cizího kódu...;)

using System;
using System.Collections;
namespace DirtyProject.BusinessModel
{
    public class Order
    {
        private int m_id;
        private ArrayList m_orderItems;
        public Order(int id)
        {
            m_id = id;
            LoadOrSave(false);
            m_orderItems = new ArrayList();
        }
        public virtual void DeleteAndNotifyCustomer()
        {
            //Implementace
        }
        public virtual void LoadOrSave(bool save)
        {
            //implementace perzistence
        }
        //Položky objednávky
        public ArrayList OrderItems
        {
            get
            {
                return m_orderItems;
            }
        }
    }

    public class OrderItem
    {
        private Order m_order;
        private int m_orderItemsCount;
        private decimal m_orderItemsPrice;
       
        public OrderItem(Order parent)
        {
            if (parent == null)
                throw new ArgumentNullException();
           
            m_order = parent;
            m_orderItemsCount = 0;
            m_orderItemsPrice = 0;
        }
        public Order Parent
        {
            get
            {
                return m_order;               
            }
            set
            {
                m_order = value;   
            }
        }
        //Počet kusů zboží v objednávce
        public virtual int OrderItemsCount
        {
            get
            {
                return m_orderItemsCount;
            }
            set
            {
                m_orderItemsCount = value;;
            }
        }
        //Celková cena všech kusů zboží v položce objednávce
        public virtual decimal OrderItemsPrice
        {
            get
            {
                return m_orderItemsPrice;
            }
            set
            {
                m_orderItemsPrice = value;
            }
        }
        public virtual void LoadOrSave(bool save)
        {
            //implementace perzistence
        }
    }
}

 



Thursday, October 07, 2004 8:31:00 PM (Central Europe Standard Time, UTC+01:00)       
Comments [18]  Programátorské hádanky


Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
ahoj,
oko mi kole:
1- jednoducha zodpovednost(LoadOrSave, DeleteAndNotifyCustomer)
2- volanie virtualnej metody z konstruktora(zas LoadOrSave)
3- denormalizacia (agregaty price a count)

btw. NotifyCustomer by asi tiez nemalo patrit do Order
Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
No moc zkušený nejsem, přesto se mi to taky nelíbí, tak zkusím namátkou...

ORDER
- nedoporučuje se, aby konstruktor volal virtuální metody (LoadOrSave)
- m_orderItems se v kontruktoru vymaže po volání ...
Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
Zdravim,
tak zkusim nadhodit co se mi na tom kodu nelibi.
1. moc se mi nelibi, ze u obou objektu neni zpracovan bezparametricky konstruktor. Pokud se nama pouzivat tak bych ho dal jako privatni
2. u objektu Order je to o to horsi, ze pokud tento ...
Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
To vnrg:
Ad 1) Souhlas - smíšená (LoadOrSave) a vícenásobná (DeleteAndNotifyCustomer) soudržnost metod.
Ad 2)Take souhlas, i kdyz zde se jedna o pripad, kdy to neni tak kriticke. Jestlize zavedeme konvenci, ze i vsechny ...
Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
To Petr Briza:
Ano, lze predpokladat, ze metoda LoadOrSave pri nahrani objektu plni kolekci OrderItem, takze k vytvoreni objektu kolekce by melo dochazet jeste pred volanim metody Load.
Ad mazani) To jsem opravdu nepochopil;) Instance mivaji metodu ...
Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
To Marek Eichler: Kdyz poskytnete jakykoli vlastni konstruktor, je vytvareni bezparametrickeho konstruktoru kompilatorem potlaceno.

Ad 3) to neni celkova cena za objednavku, ale cena za polozku objednavky (polozka objednavky treba obsahuje 3 ks ...
Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
v tříde Order bych umožnil přístup k položkám objednávky pomocí indexrů, namísto ArrayListu.
Co se tyče OrderItem, m_order by se měl předávat pouze v konstruktoru, a dalsi zmenu neumoznit. Uz jenom proto, ze ho ...
Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
To Rene:
Ad 4) No Pokud budu brat jako bernou minci konstruktor objektu, ktery striktne vyzaduje nejakeho parenta (nesmi byt null), tak by tedy nemel byt nastavitelny parent pomoci property. Takze property Parent by mela mit jen get sekci.
A kdyz uz ...
Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
To Lada.Ka: Indexer neni nutny a zde ani zadouci.

ad Parent) Ano, to je pravda, kdyz vite, ze kardinalita vazby objednavka-polozka je 1:N a je imutabilní. Kdyz ale budete mit napriklad obchodni zastupce, kteri si vytvareji objednavky ...
Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
To Marek Eichler: Presne tak. Kontroly na ruznch mistech rozhrani museji byt konzistentni.
Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
ad Parent

když změním Parenta u OrderItem, tak se původní a nový vlastník o tom nijak nedozví. Myslel jste tohle?
Tuesday, July 19, 2005 11:01:31 AM (Central Europe Standard Time, UTC+01:00)
Taky se mi nelíbí, že můžu nastavovat počet kusů OrderItemsCount a OrderItemsPrice nezávisle. Vždyť OrderItemsPrice je zpravidla (nějaká) OrderItemsUnitPrice * OrderItemsCount.
Tuesday, July 19, 2005 11:01:32 AM (Central Europe Standard Time, UTC+01:00)
To Honza Votava: Ano, i v tom je problem. Ja bych treba parenta vubec nedovolil nastavit. Pri vyjmuti z kolekce by se parent nuloval (nova metoda SetParent u OrderItem by byla internal) a po vlozeni do jine kolekce nastavil. Dobry postreh;)
Tuesday, July 19, 2005 11:01:32 AM (Central Europe Standard Time, UTC+01:00)
To Honza Votava: Presne tak OrderItemsCount a OrderItemsPrice nelze nastavovat nezavisle - cena musi byt vypocitana, jinak se jedna tridu podporujici nelegalni stavy.
Tuesday, July 19, 2005 11:01:32 AM (Central Europe Standard Time, UTC+01:00)
Chyb je tu spousta, veci, ktery se mi nelibi a zatim tu nebyly zmineny:
1. ArrayList. IMHO by si polozky objednavky zaslouzily vlastni kolekci OrderItemCollection (odvozenou od CollectionBase)
2. Zalozeni polozky objednavky by podle me mela byt ...
Tuesday, July 19, 2005 11:01:32 AM (Central Europe Standard Time, UTC+01:00)
To MaD:
Ad 1) Ano, zminil se o tom uz pan Briza
Ad 2) K tomu neni zadny duvod.
Ad 3) Take ne, u agregace je bezna vazba na rodice.
Tuesday, July 19, 2005 11:01:32 AM (Central Europe Standard Time, UTC+01:00)
Napadá mě ještě u OrderItem:
- kontrolu parent==null bych dal do té property, jak už tu bylo naznačeno výše
- konstruktor by k nastavení Parent měl asi raději použít tuto propertu
Tuesday, July 19, 2005 11:01:32 AM (Central Europe Standard Time, UTC+01:00)
Nedokáži :-(
MJ | MJ
Comments are closed.