Zdroje k rozvoji OOP myšlení

Polymath

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #285 kdy: 06. 04. 2017, 01:35:49 »
No jasně, mezi ně patří ty hromady veřejných *etterů, které ve třídách nemají co pohledávat. Když je odstraníš, často zbude jen hromada privátních (v horším případě protected) atributů a žádná metoda. S takovými objekty se pak nedá ani pracovat, protože nic neumí.
To ale ničemu nevadí. Prostě OOP je in, tak ho tam je třeba narvat za každou cenu. Tak je to správné a tak to má být. :D
OOP je římskými číslicemi dnešní doby...

Každé paradigma má své výhody i nevýhody a každé z nich má své uplatnění. Teď je sice hype funkcionální programování (podobně jako před 20-30 lety), ale například na deklarativní se docela zapomíná. Zřejmě proto, že nemá chybu :)
FP je deklarativní.


Kit

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #286 kdy: 06. 04. 2017, 06:59:06 »
Každé paradigma má své výhody i nevýhody a každé z nich má své uplatnění. Teď je sice hype funkcionální programování (podobně jako před 20-30 lety), ale například na deklarativní se docela zapomíná. Zřejmě proto, že nemá chybu :)
FP je deklarativní.

Ovšem ne každé deklarativní programování je funkcionální.

-j-

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #287 kdy: 06. 04. 2017, 07:56:48 »
Arafat je pro OOP úplnej základ.

Kit

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #288 kdy: 06. 04. 2017, 14:35:58 »
Arafat je pro OOP úplnej základ.

Byl...

jpu

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #289 kdy: 11. 04. 2017, 14:52:46 »
ako by ste premenili toto do OOP pomocou polymorfizmu:
Kód: [Vybrat]
public string Deregister(ServerReason reason)
        {
            switch (reason)
            {
                case ServerReason.Operator:
                    Navigate(typeof(LoginPage1), true);
                    return string.Format(LocalizationHelper.GetLocalizedString("OP"));
                case ServerReason.DifferentLocation:
                    Navigate(typeof(LoginPage1), true);
                    return LocalizationHelper.GetLocalizedString("AnotherLocation");
                case ServerReason.LimitReached:
                case ServerReason.SupportedFeaturesLimitReached:
                    Navigate(typeof(LoginPage1), true);
                    return LocalizationHelper.GetLocalizedString("MaxUsers");
                case ServerReason.TrialExpired:
                    Navigate(typeof(LoginPage1), true);
                    return LocalizationHelper.GetLocalizedString("UserTrial");
                default:
                    return string.Format(LocalizationHelper.GetLocalizedString("Disconnected"));
            }
        }


Dakujem za napady


dustin

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #290 kdy: 11. 04. 2017, 15:11:58 »
Ty jednotlivé reasons by nebyla pouhá čísla, ale enumy s metodami navigate() a toString()/getDescription(). Očividně je ten reason nejen číslo, ale nese si i nějaké znalosti/dovednosti (konkrétní postupy v navigate(), nějak se v UI jmenuje, atd.). Tipuju si, že při likvidaci takových casů přes reasons rozházených různě po kódu by se nakonec ukázalo, že  reasons toho umí ještě víc -> další metody.

Kit

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #291 kdy: 11. 04. 2017, 15:51:29 »
ako by ste premenili toto do OOP pomocou polymorfizmu:
Dakujem za napady

Zkus se podívat, jak se v Javě používá enum.

balki

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #292 kdy: 11. 04. 2017, 21:01:02 »
ako by ste premenili toto do OOP pomocou polymorfizmu:
Kód: [Vybrat]
public string Deregister(ServerReason reason)
        {
            switch (reason)
            {
                case ServerReason.Operator:
                    Navigate(typeof(LoginPage1), true);
                    return string.Format(LocalizationHelper.GetLocalizedString("OP"));
                case ServerReason.DifferentLocation:
                    Navigate(typeof(LoginPage1), true);
                    return LocalizationHelper.GetLocalizedString("AnotherLocation");
                case ServerReason.LimitReached:
                case ServerReason.SupportedFeaturesLimitReached:
                    Navigate(typeof(LoginPage1), true);
                    return LocalizationHelper.GetLocalizedString("MaxUsers");
                case ServerReason.TrialExpired:
                    Navigate(typeof(LoginPage1), true);
                    return LocalizationHelper.GetLocalizedString("UserTrial");
                default:
                    return string.Format(LocalizationHelper.GetLocalizedString("Disconnected"));
            }
        }


Dakujem za napady

Ak to velmi treba objektovo, tak vzor visitor. Kazdy potomok triedy Serverreason by mal v sebe metodu deregisterVisit (meno som zvolil debilne, ale nazorne) a v nej prislusny kod, co treba vykonat.

V metode deregister, ktoru ste napisali vyssie by sa uz len volala metoda deregisterVisit.


jpu

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #293 kdy: 11. 04. 2017, 21:05:29 »
aby som este ozrejmil. deregister je event, ktory je vyvolany na zaklade volania metody z kniznice od tretej strany

balki

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #294 kdy: 11. 04. 2017, 22:22:10 »
aby som este ozrejmil. deregister je event, ktory je vyvolany na zaklade volania metody z kniznice od tretej strany

Tak potom, ak aj tak silou-mocou to musi byt objektovo, tak pre kazdy Serverreason si vytvorit objekt s danou logikou a spolocnou metodou "tralala". Ulozit tieto objekty  do hashmapy a indexovat hashmapu pomocou ServerReason.

Pri zavolani vytiahnut objekt z hashmapy a zavolat patricnu metodu "tralala".

jpu

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #295 kdy: 11. 04. 2017, 22:36:37 »
nehovorim, ze to musi byt silou-mocou OOP, len mi prislo na mysel spytat sa, ako by ste to zoptimalizovali do OOP podoby.
dakujem za navrhy :)

dustin

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #296 kdy: 11. 04. 2017, 22:46:25 »
Pokud je to volání jen na jednom místě a ty ServerReasons nemají v tvém kódu jiné využití, pak nějak nechápu, k čemu by bylo předělání do objektů užitečné.

Kit

Re:Zdroje k rozvoji OOP myšlení
« Odpověď #297 kdy: 11. 04. 2017, 23:22:06 »
nehovorim, ze to musi byt silou-mocou OOP, len mi prislo na mysel spytat sa, ako by ste to zoptimalizovali do OOP podoby.
dakujem za navrhy :)

Optimalizovat pouze část aplikace do OOP bez objektových vazeb na zbývající komponenty je jen plýtváním časem.

Volání by mělo vypadat asi takto:
Kód: [Vybrat]
reason.deregister();nezávisle na třídě, ze které je vytvořena instance reason. Každá taková třída musí tedy implementovat rozhraní, které obsahuje metodu deregister(). Dle rozpisu to budou třídy Operator, DifferentLocation, LimitReached, SupportedFeaturesLimitReached, TrialExpired apod. Samozřejmě se předpokládá, že tyto třídy budou implementovat i další metody takového rozhraní a z aplikace tak zmizí i další switche s objektem reason. Třídu ServerReason předěláš dle vzoru Factory.

BoneFlute

  • *****
  • 1 841
    • Zobrazit profil
Re:Zdroje k rozvoji OOP myšlení
« Odpověď #298 kdy: 12. 04. 2017, 16:29:11 »
nehovorim, ze to musi byt silou-mocou OOP, len mi prislo na mysel spytat sa, ako by ste to zoptimalizovali do OOP podoby.
dakujem za navrhy :)

No, při zvažování jak to zoptimalizovat záleží na dalších aspektech, ne jen zda to jde. Něky převést to do OOP může být neoptimální.

Třeba já bych zvažoval, zda chci, aby objekty: Operator, DifferentLocation, LimitReached,... uměli zpracovat registraci a deregistraci. Dovedu si představit případ, kdy bych to považoval za nežádoucí a nechtěl bych, aby to znali.