Jaké jsou nejlepší postupy pro stanovení úkolů konstruktoru inicializace a reset metody

hlasů
2

Jedná se o obecné OOP otázka ačkoli jsem navrhování v Javě. Nesnažím se vyřešit konkrétní problém, jen aby se promyslet některé konstrukční principy.
Z mé zkušenosti jsem dosáhl zvyk segregační nastavení objektu do tří fází.

Cílem je minimalizovat: práci navíc, obfuscated kód a zmrzačeného rozšiřitelnost.


Konstrukce

  1. Minimální opatření potřebná pro vytvoření platného objektu, prochází test existence
  2. Instanci a inicializovat pouze „jednou“ nikdy být potlačena, non variabilní objekty, které nebudou měnit / měnit po celou dobu životnosti objektu
  3. Inicializovat konečné členy
  4. Nezbytně runtime pahýl

inicializace

  1. Make Object užitečný
  2. Instanci a inicializovat veřejně přístupné členy
  3. Instanci a inicializovat soukromé členy, které jsou hodnoty proměnné
  4. Objekt by měl nyní projít externí testy s výjimkami vyšel generujících (za předpokladu, že kód je správný)

resetovat

  1. Nemění nic konkretizovat
  2. Přiřazuje výchozí hodnoty pro všechny variabilní veřejných / soukromých členů
  3. Vrátí objekt na přesném stavu

Příklad hračka:

public class TestObject {
   private int priv_a;
   private final int priv_b;
   private static int priv_c;
   private static final int priv_d = 4;

   private Integer priv_aI;
   private final Integer priv_bI;
   private static Integer priv_cI;
   private static final Integer priv_dI = 4;  

   public int pub_a;
   public final int pub_b;
   public static int pub_c;
   public static final int pub_d = 4;

   public Integer pub_aI;
   public final Integer pub_bI;
   public static Integer pub_cI;
   public static final Integer pub_dI = 4;   

   TestObject(){
        priv_b = 2;
        priv_bI = new Integer(2);
        pub_b = 2;
        pub_bI = new Integer(2);
   }

   public void init() {
       priv_a = 1;
       priv_c = 3;
       priv_aI = new Integer(1);
       priv_cI = new Integer(3);

       pub_a = 1;
       pub_c = 3;
       pub_aI = new Integer(1);
       pub_cI = new Integer(3);
   }

   public void reset() {
       priv_a = 1;
       priv_c = 3;
       priv_aI = 1;
       priv_cI = 3;

       pub_a = 1;
       pub_c = 3;
       pub_aI = 1;
       pub_cI = 3;
   }  
}
Položena 27/02/2009 v 00:30
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
0

Nelze říci, že jsem kdy použil přesně tento model, ale jsem použil podobné věci snížit duplicitu kódu. Například, když máte objekt, který může být buď vytvořený pomocí konstruktoru nebo z jiného objektu (jako DTO) pomocí způsobu výroby. V tom případě budu často mají vnitřní inicializátor, že naplní vlastnosti objektu, který je používán oběma. Nelze říci, že jsem nikdy používal „reset“ metodu, ani vidím skutečnou potřebu jedno, jestli vše, co dělá, je replikovat proces vytváření nového objektu.

V poslední době jsem se pohyboval jen s použitím výchozích konstruktérů a použití vlastností settors k inicializaci objektu. Nový C # syntaxe, která umožňuje snadno udělat ve formátu „konstruktoru-like“ dělá to každý snadno ovladatelný a považuji potřebu podporovat parametrické konstruktérů mizí.

Odpovězeno 27/02/2009 v 00:57
zdroj uživatelem

hlasů
1

Pocházím z C ++ pozadí, kde pravidla jsou trochu odlišné od Javy, ale myslím, že tyto zásady inicializační dvoustupňové platí v obecném případě.

Konstrukce

  1. Vše, co může být provedeno v době výstavby by měla být provedena v době výstavby.
  2. Minimalizovat množství „špatnosti“, které mohou vyplývat z snaží používat svůj objekt před voláním init().
  3. Všechny členské proměnné potřebují nějakou hodnotu, i když je to normálně neplatná hlídka hodnota (např set ukazatele null). Myslím, že Java bude inicializovat všechny proměnné na nulu ve výchozím nastavení, takže budete muset vybrat něco jiného, ​​pokud to platné číslo.

inicializace

  1. Inicializovat tyto proměnné členů, které jsou závislé na existenci jiných objektů. Zjednodušeně řečeno, dělat to, co jste nemohli dělat v době výstavby.
  2. Zkontrolujte, zda objekt je nyní v kompletní, připravená k použití stavu. Vezměme si házet výjimku, pokud tomu tak není.

resetovat

  1. Přemýšlejte dlouho a tvrdě o tom, co uvést Systém bude, když budete chtít volat tuto funkci. To může být lepší vytvořit nový objekt od nuly, a to iv případě, že operace se zdá drahé. Profil kódu zjistit, jestli to je problém.
  2. Za předpokladu, že jste se dostali v minulosti bod 1, uvažovat o metodu zvládnout věci, které oba reset()a vaše konstruktor je potřeba udělat. To usnadňuje údržbu a zamezuje duplicitu kódu.
  3. Vrátit objekt do stejného stavu, v jakém byl po init().
Odpovězeno 05/05/2009 v 18:02
zdroj uživatelem

hlasů
1

Já bych navrhnout mé třídy způsobem, takže není vyžadováno „init“ metoda. Myslím, že všechny metody třídy, a to zejména veřejných metod, by měla zaručit, že objekt je stále ponechána v „platném“ stavu poté, co úspěšně dokončit a není nutná žádná volání s jinými metodami.

Totéž platí i pro konstruktéry. Když je vytvořen objekt, je třeba zvážit inicializován a připraven k použití (to je to, co konstruktéři jsou i tam jsou četné triky, jak toho dosáhnout). V opačném případě je jediný způsob, jak jej bezpečně používat je kontrolovat, zda je objekt byl inicializován na začátku každého jiného veřejného metodou.

Odpovězeno 29/06/2009 v 12:01
zdroj uživatelem

hlasů
0

Je nějaký důvod init()a reset()musí být jiná? Je těžké vidět v tomto jednoduchém příkladu, proč je pravidlo „nemá nic instanci“ je důležité.

Kromě toho si myslím, že objekty by měly být užitečné, jakmile oni jsou postaveny. Pokud existuje nějaký důvod - někteří kruhová závislost nebo dědictví otázka - objekt musí být „inicializovat“ po dokončení stavby, řekl bych skrýt konstruktor a inicializaci za statické metody výroby. (A pravděpodobně pohybovat inicializační kód do samostatného konfigurátoru objektu pro správnou míru.)

V opačném případě jste spoléhají na volajících vždy volat jak konstruktor a init(), a to je nestandardní vzor. Máme některé staré, příliš užitečný-to-Jednorázové kód zde, že to dělá; je to abstraktní dialog třídy, a to, co se stane, je, pokaždé, když někdo ji prodlouží, zapomínají zavolat constructUI()a pak se odpad 15 minut přemýšlel, proč jejich nový dialog je prázdná.

Odpovězeno 31/07/2009 v 14:57
zdroj uživatelem

hlasů
0

Zajímavý. Zvláště se mi najít tato stavba užitečné, pokud máte objekt, který potřebuje provádět operace IO. Nechci nic společného provádění operací IO přímé či nepřímo ve svém konstruktoru. To dělá objekt noční můra k použití.

Odpovězeno 25/11/2009 v 17:03
zdroj uživatelem

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