Jak byste přístup k vlastnostem objektů zevnitř metodu objektu?

hlasů
81

Co je to „nejčistší“ nebo „správný“ způsob přístupu k vlastnosti objektu zevnitř metodu objektu, který není metoda kariérista / seřizovač?

Vím, že z vnější strany objektu, který by měl používat getter / setter, ale zevnitř byste prostě:

Jáva:

String property = this.property;

PHP:

$property = $this->property;

nebo byste dělali:

Jáva:

String property = this.getProperty();

PHP:

$property = $this->getProperty();

Odpusť mi, jestli moje Java je trochu mimo, je to už rok, co jsem naprogramovaný v jazyce Java ...

UPRAVIT:

Zdá se, že lidé jsou za předpokladu, že mluvím o soukromých či chráněných proměnných pouze / vlastností. Když jsem se dozvěděl, OO jsem se naučil používat metody pro čtení / setters pro každou jednotlivou vlastnost, i když to bylo veřejné (a vlastně mi bylo řečeno, nikdy žádný variabilní / nemovitost veřejnost). Tak jsem se může rozjezdu z falešného předpokladu, z dostat jít. Zdá se, že lidé odpovědi na tuto otázku je třeba říct, že byste měli mít veřejné vlastnosti a že ti nepotřebují metody pro čtení a zápis, který jde proti tomu, co jsem se naučil, a to, co jsem mluvil, i když možná, že musí být projednán as dobře. To je asi dobré téma pro jinou otázku, když ...

Položena 01/08/2008 v 17:10
zdroj uživatelem
V jiných jazycích...                            


18 odpovědí

hlasů
58

To má potenciál náboženské války, ale zdá se mi, že pokud používáte getter / setter, měli byste ho použít interně, stejně - použití obou povede k problémům s údržbou dolů na silnici (např někdo přidá kód k setra, která potřebuje spustit pokaždé, když vlastnost je nastavena, a vlastnost je nastavena interně w / o tom setra volána).

Odpovězeno 01/08/2008 v 17:13
zdroj uživatelem

hlasů
41

Osobně mám pocit, že je důležité zůstat konzistentní. Máte-li metody pro čtení a zápis, je použít. Jediný případ, kdy bych přistupovat pole přímo je, když přístupový má hodně nad hlavou. Může pocit, že jste nadýmání kód zbytečně, ale to může jistě ušetřit spoustu bolesti hlavy v budoucnu. Klasický příklad:

Později můžete chtít změnit způsob, jakým pole funguje. Možná, že by měl být vypočítán na-the-fly, nebo možná byste chtěli použít jiný typ pro rubovou obchodě. Pokud máte přístup k vlastnostem přímo ke změně tak může rozbít spoustu kódu v jednom bobtnání foop.

Odpovězeno 01/08/2008 v 19:23
zdroj uživatelem

hlasů
25

Jsem docela překvapen, jak jednotní sentiment je, že gettersi tvůrci jsou v pořádku a dobré. Navrhuji zápalné článek Allen Holub „ získání a nastavení jsou zlí “. Je pravda, že titul je pro hodnotu šoku, ale autor je platné body.

V podstatě, pokud máte gettersa setterspro každého jednotlivého soukromé oblasti, děláte těchto polí tak dobrý jako veřejné. To byste se velmi zle změnit typ soukromého poli bez zvlnění vlivů na každou třídu, která volá, že getter.

Kromě toho, z čistě OO hlediska objekty by měly být reagovat na zprávy (metody), které odpovídají jejich (doufejme) jediné odpovědnosti. Drtivá většina gettersa settersnemají smysl pro své voliče předmětů; Pen.dispenseInkOnto(Surface)dává větší smysl pro mě víc, než Pen.getColor().

Getry a tvůrci také podporovat uživatele třídy požádat objekt, u některých dat, provést výpočet, a pak nastavit jinou hodnotu v objektu, lépe známý jako procedurálního programování. To byste se lépe, jednoduše říci objekt dělat to, co se děje v první řadě; také známý jako Information Expert idiom.

Získání a nastavení, ale jsou nutné zlo na rozhraní vrstev - UI, perzistence, a tak dále. Omezený přístup k vestaveb třídu, jakým je například C ++ 's přítelem klíčového slova, balík chráněný přístup Java, interní přístup .net je, a vzor Friend Class vám pomůže snížit viditelnost gettersa zápis pouze na ty, kteří je potřebují.

Odpovězeno 19/09/2008 v 01:13
zdroj uživatelem

hlasů
18

Záleží na tom, jak je tento majetek používá. Řekněme například, že máte objekt studentů, který má vlastnost name. Dalo by se použít metodu GET k vytažení jména z databáze, pokud to nebyla načtena již. Tímto způsobem se snižuje zbytečné volání do databáze.

Nyní řekněme, že mají vlastní počítadlo celočíselné ve svém objektu, který počítá, kolikrát je název byl nazýván. Možná budete chtít nemohou používat metodu založenou dostat z vnitřku objektu, protože by produkovat neplatný hlas.

Odpovězeno 01/08/2008 v 17:19
zdroj uživatelem

hlasů
13

PHP nabízí nesčetné množství způsobů, jak řešit tento problém, včetně magických metod __geta __set, ale já dávám přednost explicitní získání a nastavení. Zde je důvod, proč:

  1. Ověření může být umístěn do regulátorů (a getry na to přijde)
  2. Intellisense pracuje s explicitními metodami
  3. Není pochyb, zda je vlastnost pouze pro čtení, zápis nebo jen pro čtení i zápis
  4. Načítání virtuální reality (tedy vypočtené hodnoty) vypadá stejně jako běžné vlastnosti
  5. Můžete snadno nastavit vlastnosti objektu, který je ve skutečnosti nikdy nikde definován, který pak jde nezdokumentované
Odpovězeno 24/09/2008 v 18:24
zdroj uživatelem

hlasů
12

Jsem prostě jít přes palubu tady?

Možná)

Dalším řešením by bylo využít soukromé / chráněné metody, aby skutečně dělat dostat (cache / db / etc), a veřejný obal za to, že zvýší počet:

PHP:

public function getName() {
    $this->incrementNameCalled();
    return $this->_getName();
}

protected function _getName() {
    return $this->name;
}

a pak se v rámci samotného objektu:

PHP:

$name = $this->_getName();

Tímto způsobem můžete i nadále používat tento první argument pro něco jiného (jako je posílání vlajku na tom, zda se používají data uložená v mezipaměti tady snad).

Odpovězeno 01/08/2008 v 17:43
zdroj uživatelem

hlasů
11

Musím být mimo mísu tady, proč byste měli používat getr uvnitř objektu, který má přístup k vlastnosti tohoto objektu?

Vezmeme to jeho uzavření getr by měl zavolat metodu pro čtení, který by měl zavolat kariérista.

Takže bych řekl, uvnitř přístup metoda objekt vlastnost přímo, a to zejména vidět, jak volá jinou metodu v tomto objektu (což bude jen přistupovat vlastnost přímo v každém případě pak vrátit) je jen zbytečné, marnotratné cvičení (nebo jsem špatně pochopil otázku ).

Odpovězeno 04/06/2011 v 16:42
zdroj uživatelem

hlasů
7

Řekl bych, že je lepší použít přístupové metody i uvnitř objektu. Zde jsou body, které přicházejí na mysl okamžitě:

1) Je třeba provést v zájmu zachování konzistentnosti s přístupů provedené mimo objekt.

2) V některých případech se tyto metody přístupových mechanismů by mohly dělat víc než jen přístup na nosítkách; oni mohli dělat nějaké další zpracování (její vzácnou ačkoli). Je-li tomu tak, přístupem na hřišti přímo byste chybět na to, že další zpracování a váš program může jít nakřivo, pokud toto zpracování je vždy třeba udělat během těchto přístupů

Odpovězeno 20/01/2010 v 09:32
zdroj uživatelem

hlasů
7

Purista OO způsob je, aby se zabránilo jak a následovat zákon Demeter pomocí oslovit nezeptají přístup.

Namísto získání hodnoty vlastnosti objektu, který pevně spojuje dvě třídy, použijte objekt jako parametr např

  doSomethingWithProperty() {
     doSomethingWith( this.property ) ;
  }

V případě, že majetek byl rodák typu, například int, použijte přístupovou metodu, název mluví za problémové domény není v programovém doméně.

  doSomethingWithProperty( this.daysPerWeek() ) ;

Ty vám umožní udržet zapouzdření a případných následných podmínek nebo závislých invarianty. Můžete také použít metodu setr zachovat veškeré předpoklady nebo závislých invariants, ale nespadají do pasti pojmenování jim setters, vraťte se na principu Hollywood pro pojmenování při použití idiom.

Odpovězeno 24/09/2008 v 18:04
zdroj uživatelem

hlasů
7

Pokud by „puristy“ myslíš „Většina zapouzdření“, pak jsem obvykle deklarovat všechny své pole jako soukromý a pak použít this.field zevnitř třídy samotné, ale i všechny ostatní třídy, včetně podtřídy, přístup instance státní pomocí příjemcové.

Odpovězeno 22/08/2008 v 12:15
zdroj uživatelem

hlasů
6

Záleží. Je to spíš otázka stylu, než cokoliv jiného, ​​a neexistuje žádná tvrdá pravidla.

Odpovězeno 01/10/2008 v 11:51
zdroj uživatelem

hlasů
6

Kdybych nebude upravovat vlastnost budu používat get_property()veřejnou metodu, pokud je to zvláštní událost, jako je například MySQLi objektu uvnitř jiného objektu, v tom případě budu veřejné nemovitosti a odkazují na to jak $obj->object_property.

Uvnitř objektu je to vždycky tohle $> vlastnost pro mě.

Odpovězeno 22/08/2008 v 12:34
zdroj uživatelem

hlasů
6

Soukromé pole s veřejnými nebo chráněných statků. Přístup k hodnotám by měly projít vlastnosti a musí být zkopírován do lokální proměnné, pokud budou použity více než jednou metodou. Tehdy a jen tehdy, pokud máte zbytek aplikace, takže zcela vylepšil, houpal se, a jinak je optimalizován tak, aby, kde přístup k hodnoty tím, že jde prostřednictvím svých assosciated vlastnostem stala problémové místo (A to se nikdy nestane, garantuji) byste měli dokonce začít zvážit nechat nic jiného než vlastnosti dotknout jejich doprovodné proměnné přímo.

NET vývojáři mohou použít automatické vlastnosti prosadit to, protože nemůžete ani vidět doprovodné proměnné v době návrhu.

Odpovězeno 18/08/2008 v 18:43
zdroj uživatelem

hlasů
6

jsem našel pomocí setters / getry udělal můj kód čitelnější. Také se mi líbí kontrolu přikládá při jiných tříd pomocí metody a když změním údaje vlastnost bude ukládat.

Odpovězeno 18/08/2008 v 18:37
zdroj uživatelem

hlasů
6

Mohu se mýlit, protože jsem samouk, ale nikdy jsem uživatelských veřejné vlastnosti v mém Java tříd, které jsou vždy soukromé nebo chráněné, takže mimo kód musí přistupovat pomocí metody pro čtení / tvůrci. Je to lepší pro účely údržby / modifikace. A pro vnitřní kód třídy ... Je-li metoda getter je triviální I použít vlastnost přímo, ale vždycky jsem použít nastavovací metody, protože jsem mohl snadno přidat kód ke střelbě události, pokud si přeji.

Odpovězeno 06/08/2008 v 15:43
zdroj uživatelem

hlasů
5

Líbí se mi odpověď od cmcculloh , ale vypadá to, že nejsprávnější je odpověď od Greg Hurlman . Použijte getter / setters po celou dobu, pokud jste začali používat je z GetGo a / nebo se používají pro práci s nimi.

Mimochodem, já osobně zjistit, že za použití getrové / setters dělá kód čitelnější a ladění později.

Odpovězeno 15/09/2008 v 10:46
zdroj uživatelem

hlasů
5

No, zdá se výchozí implementace C # 3.0 VLASTNOSTI, je toto rozhodnutí přijato pro vás; Je nutné nastavit vlastnost pomocí přípravku (případně soukromé) vlastnictví seřizovač.

Já osobně používám jen soukromý člen na pozadí, když není by to způsobit, že objekt, který spadá do méně než žádoucího stavu, například při inicializaci nebo pokud se jedná o ukládání do mezipaměti / lazy loading.

Odpovězeno 01/08/2008 v 17:56
zdroj uživatelem

hlasů
4

Jak je uvedeno v některé připomínky: Někdy jste měl někdy neměl. Velkou část o soukromých proměnných je to, že jste schopni vidět všechna místa, na které jsou zvyklí, když se něco změní. Pokud váš kariérista / seřizovač dělá něco, co potřebujete, použijte ji. Pokud nezáleží na tom, že se rozhodnete.

Opačný případ by mohlo být, že pokud použijete getter / seřizovač a někdo změní getter / seřizovač budou muset analyzovat všechna místa getr a tvůrcem je používán interně, jestli to zmatky něco vymyslet.

Odpovězeno 01/08/2008 v 18:01
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more