Autor Téma: TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm  (Přečteno 1238 krát)

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2482
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #15 kdy: 26-01-2019, 08:23:18 »
Jiste. Jen si stojim za tim, ze by takova metoda mela zajistit vyvolani udalosti nez nedelat vubec nic.
Mam dojem, ze sis zamenil doporuceni Composition over Inheritance za Composition instead of Inheritance...

Citace
abych nechal metodu prazdnou a z potomka volal inherited s tim, ze se nic nestane...
No to je to zakladni pomyleni dane tim absolutnim nahrazenim dedicnosti kompozici: tam skutecne kazdy musi implementovat metodu rozhrani... Ale pokud bazalni trida implementuje implicitni vlastnosti, tak vsechny odvozene tridy, pokud nepotrebuji menit implicitni vlastnosti, metodu vubec nekrekryvaji a tudiz ani nevolaji zadne inherited...

Jak kompozice, tak dedicnost maji svoje klady a zapory s tim, ze cim blize je vystavovane rozhrani blize aplikacni logice, tim mensi pocet metod zpravidla vystasvuje a tim vetsi vahu bude mit kompozice/delegovani pred dedicnosti. Ale pokud vlastnostni je hodne a odchylek od implicitniho chovani je malo, tak je nesmysl je delegovat, protoze to znamena obrovske mnozstvi zbytecne prace.

Vyborny priklad je to TObject.AfterContruction. Kdyby z toho udelali delegata, jaky overhead u kazde instance TObject by zbytecne zavedli ev. kdyby raisnuli exception (a tim vlastne simulovali to abstract), aby to nebylo prazdne, tak by to kazdy potomek TObject  musel prekryvat prazdnou metodou... To by byl blazinec k nepouziti.



Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2482
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #16 kdy: 26-01-2019, 09:52:56 »
Jiste, spousta lidi si tu rekne, co zase ten delfin plodi za nesmysly, ale to jsem zazil.
Tak ja popisu, co jsem zazil s tupe aplikovanou kompozici, kterou mel na svedomi taky mlady programator - mozna, ze takove ptakoviny skutecne nekde uci - budu se muset preptat  :)

- dostal na hrb soft pro pomerne slozite stroje, kde jeho customizaci resil interface
- na zacatku mel par zakazniku a par vlastnosti
- ale casem se mu pocet customizaci rozrostl na 100+ a pocet vlastnosti na rozhrani na stovky
- novou customizaci vytvarel Copy&Paste z nejake nejpodobnejsi
- novou vlastnost pridaval zpetne do 100+ implementaci intreface s tim, ze vsude byla 'prazdna' nebo implicitni
  krome toho jednoho prave pridaneho zakaznika...
- kdyz chtel nejakou vlastnost zmenit, musel prolezt 100+ interface...

Vyhodu to melo jedinou, ze kdyz nekde neco posr*l, tak to posr*l jen pro tu danou customaci, coz byla zrejme jeho primarni motivace k takovemu masochismu.

No a pak prisel pozadavek zmenit kompletne vsude ksicht podle navrhu graficky vcetne vzhledu gridu apod., coz mj. znamenalo rozsirit
pocet vlastnosti na rozhrani, protoze 2 zakaznici chteli treba vlastni font u konkretniho textu, vsem ostatnim 100+ to bylo jedno
- samozrejme, ze prvnim krokem byl refactoring a vytvoreni spolecnehop rozhrani a jeho implementace
- druhym krokem rozsireni spolecneho rozhrani o nove vlastnosti
- tretim krokem bylo odvozeni rozhrani od toho spolecneho a vyhazeni vsech metod z rozhrani tak, aby implementovala jen to, co bylo pro danou customizaci

A bylo po onanyji a stal se z toho udrzovatelny soft  ;D

« Poslední změna: 26-01-2019, 09:55:21 od pf1957 »

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1721
  • Karma: 66
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #17 kdy: 26-01-2019, 23:21:05 »
Vyborny priklad je to TObject.AfterContruction. Kdyby z toho udelali delegata, jaky overhead u kazde instance TObject by zbytecne zavedli ev. kdyby raisnuli exception (a tim vlastne simulovali to abstract), aby to nebylo prazdne, tak by to kazdy potomek TObject  musel prekryvat prazdnou metodou... To by byl blazinec k nepouziti.

Ten overhead volani je asi jediny argument, jenz me presvedcil k souhlasu. Jinak samozrejme implementace metod cizich interface (konkretne typu procedure, jelikoz implementace function by vzdy mela vratit hodnotu). Chapu, ze jde o deklaraci "volitelne implementace" metody, nicmene urcite bych (pokud bych na realnou situaci narazil) minimalne vyemitoval kompilacni varovani (pripadne hint).
« Poslední změna: 26-01-2019, 23:25:08 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #18 kdy: 27-01-2019, 16:25:10 »
Já mám ještě dvě hezké:

Kód: Delphi [Vybrat]
  1. constructor TObject.Create;
  2. begin
  3. end;
  4.  
  5. destructor TObject.Destroy;
  6. begin
  7. end;
Embarcadero Technology Partner

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1721
  • Karma: 66
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #19 kdy: 28-01-2019, 02:14:41 »
Já mám ještě dvě hezké:

Kód: Delphi [Vybrat]
  1. constructor TObject.Create;
  2. begin
  3. end;
  4.  
  5. destructor TObject.Destroy;
  6. begin
  7. end;

Dobra, jen bych prosil vysveteleni, proc bych mel pro vlastni tridu deklarovat metodu (tedy typu procedure, constructor a destructor), jenz bude prazdna?
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4113
  • Karma: 36
    • Verze Delphi: XE7 professional
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #20 kdy: 28-01-2019, 10:13:55 »
Lebo ju občas budem potrebovať a nechcem stratiť možnosť vždy použiť inherited. Kvôli automatizácii spúšťania rutín.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2482
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:TfrmFormMain = class(TBasalForm) -> nezbehnú udalosti v TBasalForm
« Odpověď #21 kdy: 28-01-2019, 12:48:37 »
Dobra, jen bych prosil vysveteleni, proc bych mel pro vlastni tridu deklarovat metodu (tedy typu procedure, constructor a destructor), jenz bude prazdna?
To je furt dokola: proste pri analyze a navrhu rozhrani vypadne, ze pro nektere tridy potrebujes nejakou operaci, ktera je vazana na nejakou logiku spolecnou vsem tem tridam, pricemz pocet tech trid neni dopredu znamy a neni konecny. Samozrejme bys to mohl matlat kondicionalem v run-time a operaci volat jen v pozadovanych pripadech. Ale OOP nam nabizi polymorfismus, ktery umoznuje s ruznymi objekty 'anonymne' manipulovat pres jejich spolecne rozhrani.

A to rozhrani muzes vytvorit:
- dedicnosti vystavenim rozhrani spolecne tridy a jeho dedenim/prekryvanim
- kompozici nadefinovanim extra rozhrani a jeho implementaci v kazde instanci
- kombinaci obeho.

Takze je otazka, pro co se rozhodnes:
- u dedicnosti v bazalni tride implementujes prevazujici stav tj. treba NIC
- u kompozice by jsi stav musel explicitne implementovat u kazde implementace rozhrani. Takze tam ti NIC tj. prazdna metoda nevadi  :o ?

BTW, nevim, proc se ti do hlavy zakousla zrovna prazdna procedure, protoze to je jen metoda implementujici nejake implicitni chovani a je uplne jedno, jestli je void nebo ne - podle toho co pises, tak ti zrejme function nevadi  :o

O konstruktorech/destruktorech nechci diskutovat, protoze jejich vlastnosti maji v ruznych jazykach ruzne vlastnosti a nema to tudiz obecnou platnost.