Přístup k private proměnným třídy v metodách   zodpovězená otázka

VB.NET

Dobrý den,

mám vytvořenou třídu s private proměnnými, které se nastavují pomocí vlastností. Dále jsou ve třídě metody, které tyto private proměnné využívají. Chci se zeptat, zda je lepší k těmto proměnným přistupovat v metodách třídy přes vlastnost nebo k nim mohu přistupovat přímo, pokud vlastnosti obsahují určitou validaci pro nastavení private proměnné. Omlouvám se za pitomé otázky avšak v tom mám ještě trochu zmatek. Díky za odpověď.

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

To asi bude záležet na konkrétní situaci. Je potřeba si ale uvědomit že vlastnost (část setter) může obsahovat validaci proměnné a můžete v ní mít také spouštění eventů. Pokud budete hodnotu proměnné měnit přímo a ne přes vlastnost, tak se samozřejmě tyto eventy (popř. validace nebo jakýkoliv jiný kód který je v set části vlastnosti), nebude spouštět. Někdy to může být žádoucí (já to třeba někdy používám v konstruktoru třídy, kdy nechci aby se po prvním načtení dat spouštěly eventy) jindy nikoliv.

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

Takže pokud si v metodě potřebuji pouze načíst hodnotu určité private proměnné tak k ní mohu přistoupit přímo. A protože ji nehodlám nějak měnit není potřeba validace přes setter.

To, že v ní nebude nějaký nesmysl se zajistí při jejím nastavení přes vlasnost, protože v bloku set bude validace.

Takže pokaždé když měním hodnotu private proměnné bych to měl správně dělat přes vlastnost. Pochopil jsem to dobře? Jinak díky za rychlou odpověď.

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

Jak jsem řikal, bude spíš záležet na konkrétní situaci. Například pokud budete mít readOnly vlastnost, tak ji jinak než přímo přes proměnnou nenastavíte. Co se týká čtení hodnot platí to samé co pro zápis, pokud v GET části property nemáte žádný další kód (například formátování textu aby Vám to vrátilo datum v nějakém konkrétním formátu - i když to by asi ve třídě být nemělo) je to asi jedno.

Já se ale snažím i v rámci třídy data číst a zapisovat přes vlastnosti, příjde mi to přehlednější a pokud v budoucnu potřebuju k něčemu dopsat validaci, nemusím procházet celou třídu a hledat jestli náhodou někde nezapisuju/nečtu data přímo a není potřeba validaci provést i tam.

V podstatě přímo k proměnné přistupuju pouze ve dvou případech které jsem zmiňoval:

1) nastavení private vlastnosti

2) nastavení vlastností v konstruktoru když nechci aby se spustil event

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

Díky za odpověď. Ještě mám jeden malý dotázek.

Při tvorbě instance mé třídy se předává jeden povinný parametr, kterým je cesta k textovému souboru. Jakým způsobem lze zamezit vytvoření instance a vyhození chybové hlášky v případě, že soubor neexistuje? Lze ukončit tvorbu instance rovnou v setteru když předám parametr do vlastnosti a ověřím, že soubor neexistuje, nebo se takové případy řeší úplně jinak?

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

V konštruktore vyhodíte výnimku cez Throw a na mieste, kde vytvárate inštancie triedy ju zachytíte v Try..Catch..End Try bloku.Ale rýchlejšie je to overiť ešte pred vytváraním inštancie.Pre výber vždy existujúceho súboru sa používa OpenFileDialog.

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

Tento a podobné případy se vždy řeší pomocí vyjímek, proto má být taky v dokumentaci ke třídě uvedeno, jaké vyjímky může metoda vyhazovat, aby byl uživatel třídy na ně připraven reagovat. Try...Catch...Finally se používá pouze v případě, že jste schopen nějak vyjímku ošetřit.

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

Pánové, všem díky za vyčerpávající odpovědi.

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

Ano, v konštruktore sa vyhodí výnimka, ale nie je vhodnejšie si to skontrolovať podmienkou ako sa spoliehať na výnimku?

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

Tak ono by bylo správné udělat oboje, jednak si to zkontrolovat než to předám konstruktoru, ale je dobré tam mít pojistku. Nikdy nevíte kde všude Vaši třídu použijete popř. ji může použít i někdo jiný. A ten nemusí být tak pečlivý aby prováděl validaci na vstupu.

Navíc pokud by jste nějakým způsobem tu špatnou cestu konstruktoru poslal a chtěl s ní v rámci třídy pracovat, tak Vám to stejně vyjímku vyhodí. Jen s tím rozdílem že to bude nějaká globální nic neříkající chyba.

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

Tak som to myslel.

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