2015-11-18 14 views
5

Kapsülleme ile ilgili bir sorum var:Nesneye yönelik tasarım - bir sınıfta çok fazla veri alanı olduğunda kapsülleme ne kadar önemlidir?

Bir sınıf çok fazla veri alanı olduğunda enkapsülasyon kullanılması önerilir mi?

bir örnek olarak aşağıdaki sınıf kullanılması: bir Stats sınıfında strength ve constitution olarak, daha iyi bir tasarım olarak kabul edilebilir

abstract public class Character { 
    private String name; 
    private String characterClass; 
    private int level; 
    private int hitDice; 

    private int strength; 
    private int constitution; 
    private int dexterity; 
    private int intelligence; 
    private int wisdom; 
    private int charisma; 

    private int hp; 
    private int currentHp; 
    private int armorClass; 
    private int BaseAttackBonus; 

    private long xp; 
    private double gp; 

    private Inventory inventory; 
    private double carriedWeight; 

    private Equipment equipment; 

    protected Character(String name) { 

     setName(name); 
     setCharacterClass("Class"); 
     setLevel(1); 
     setHitDice(0); 

     setStrength(10); 
     setConstitution(10); 
     setDexterity(10); 
     setIntelligence(10); 
     setWisdom(10); 
     setCharisma(10); 

     setHp((int) getLevel() * (getHitDice() + getModifier(getConstitution()))); 
     setCurrentHp(getHp()); 
     setArmorClass(10 + getModifier(getDexterity())); 
     setBaseAttackBonus(0); 

     inventory = new Inventory(); 
     setCarriedWeight(0); 

     equipment = new Equipment(); 

     setXp(0); 
     setGp(20); 

    } 

    protected Character(String name, int lvl) { 

     setName(name); 
     setCharacterClass("Class"); 
     setLevel(lvl); 
     setHitDice(0); 

     setStrength(10); 
     setConstitution(10); 
     setDexterity(10); 
     setIntelligence(10); 
     setWisdom(10); 
     setCharisma(10); 

     setHp((int) getLevel() * (getHitDice() + getModifier(getConstitution()))); 
     setCurrentHp(getHp()); 
     setArmorClass(10 + getModifier(getDexterity())); 
     setBaseAttackBonus(0); 

     inventory = new Inventory(); 
     setCarriedWeight(0); 

     equipment = new Equipment(); 

     setXp(1000 * (getLevel() - 1)); 
     setGp(getLevel() * 20); 

    } 

    void displayCharacter() throws IOException { 
     System.out.print("\n\n"); 
     System.out.println("Name: " + getName()); 
     System.out.println("Class: " + getCharacterClass()); 
     System.out.println("Level: " + getLevel()); 
     System.out.println("HP: " + getHp()); 
     System.out.println("Current HP: " + getCurrentHp()); 
     System.out.println("Armor Class: " + getArmorClass()); 
     System.out.println("Base Attack Bonus : +" + getBaseAttackBonus()); 

     System.out.println("***************"); 
     System.out.println("Attributes: "); 
     System.out.println("Strength: " + getStrength()); 
     System.out.println("Constitution: " + getConstitution()); 
     System.out.println("Dexterity: " + getDexterity()); 
     System.out.println("Intelligence: " + getIntelligence()); 
     System.out.println("Wisdom: " + getWisdom()); 
     System.out.println("Charisma: " + getCharisma()); 
     System.out.println("***************"); 
     equipment.showEquipment(); 
     inventory.showInventory(); 
     System.out.println("Carried weight: " + getCarriedWeight()); 

     System.out.println(""); 
     System.out.println("XP: " + getXp()); 
     System.out.println("Gold: " + getGp()); 
     System.out.println(""); 

    } 

    public int getModifier(int number) { 
     int mod = (int) ((number - 10)/2); 
     return mod; 
    } 

    public String getName() { 
     return name; 
    } 

    public String getCharacterClass() { 
     return characterClass; 
    } 

    public int getLevel() { 
     return level; 
    } 

    public int getHitDice() { 
     return hitDice; 
    } 

    public int getStrength() { 
     return strength; 
    } 

    public int getConstitution() { 
     return constitution; 
    } 

    public int getDexterity() { 
     return dexterity; 
    } 

    public int getIntelligence() { 
     return intelligence; 
    } 

    public int getWisdom() { 
     return wisdom; 
    } 

    public int getCharisma() { 
     return charisma; 
    } 

    public int getHp() { 
     return hp; 
    } 

    public int getCurrentHp() { 
     return currentHp; 
    } 

    public int getArmorClass() { 
     return armorClass; 
    } 

    public int getBaseAttackBonus() { 
     return BaseAttackBonus; 
    } 

    public Equipment getEquipment() { 
     return equipment; 
    } 

    public Inventory getInventory() { 
     return inventory; 
    } 

    public double getCarriedWeight() { 
     return carriedWeight; 
    } 

    public long getXp() { 
     return xp; 
    } 

    public double getGp() { 
     return gp; 
    } 

    protected void setName(String Name) { 
     name = Name; 
    } 

    protected void setCharacterClass(String characterClass) { 
     this.characterClass = characterClass; 
    } 

    protected void setLevel(int lvl) { 
     level = lvl; 
    } 

    protected void setHitDice(int hd) { 
     hitDice = hd; 
    } 

    protected void setStrength(int str) { 
     strength = str; 
    } 

    protected void setConstitution(int con) { 
     constitution = con; 
    } 

    protected void setDexterity(int dex) { 
     dexterity = dex; 
    } 

    protected void setIntelligence(int intel) { 
     intelligence = intel; 
    } 

    protected void setWisdom(int wis) { 
     wisdom = wis; 
    } 

    protected void setCharisma(int cha) { 
     charisma = cha; 
    } 

    protected void setHp(int hitPoints) { 
     hp = hitPoints; 
    } 

    protected void setCurrentHp(int curHp) { 
     currentHp = curHp; 
    } 

    protected void setArmorClass(int ac) { 
     armorClass = ac; 
    } 

    protected void setBaseAttackBonus(int bab) { 
     BaseAttackBonus = bab; 
    } 

    protected void setXp(int XP) { 
     xp = XP; 
    } 

    protected void setGp(double GP) { 
     gp = GP; 
    } 

    protected void setCarriedWeight(double weight) { 
     carriedWeight = weight; 
    } 

    public void attack(Character target) { 

     try { 
      ((Weapon) getEquipment().getPrimaryHand()).attack(this, target); 
     } catch (NullPointerException e) { 
      getEquipment().equipPrimaryHand(
        MeleeWeapon.meleeWeaponList.get(0)); /* equip fist weapon */ 
      ((Weapon) getEquipment().getPrimaryHand()).attack(this, target); 

      if (target.getCurrentHp() <= 0) { 
       System.out.println(target.getName() + " is down !"); 
      } 
     } 
    } 

    public void equip() { 
     getInventory().equip(this); 
    } 

    public void addToInventory(Item newItem) { 
     getInventory().addToInventory(this, newItem); 
    } 

} 

farklı sınıfta veri alanlarının en depolanması istiyorsunuz,?

+1

Neye sahip olduğunuzdan oldukça iyi görünüyor. Bu inanıyorum rağmen bir kod gözden geçirme sorusu daha fazla. – 3kings

+1

"Çok fazla veri alanı" kriteri değil. Bu açıklanmıştır: – zapl

+1

"Bir sınıf DataFields sürü olduğunda kapatma sistemleri kullanılması önerilir ise" Bu https://en.wikipedia.org/wiki/Single_responsibility_principle buldunuz: Aynı amaç için vardır tüm bu DataFields? Bir veya daha fazla alan kapsülleme kullanma faktörüne DEĞİLDİR. OOP'unuzu kontrol edin. – Loc

cevap

4

Sana decomposition atıfta düşünüyorum. Sınıf kaç şey temsil ediyor:

düzgün cohesion odaklanmak gerekir, kodunuzu ayrıştırmak için mi? Birlikte ne kadar "yapışıyorlar"?

Sınıfınız şu anda temsil epeyce şeyler:

  1. Karakter kimlik bilgileri gibi name
  2. Beceri Tracker, böyle
  3. constition olarak Deneyim Tracker
  4. Envanter
  5. Kişisel Ölçeği

1 sınıfınız birden fazla varlıkları temsil eder; Düşük kohezyona sahiptir.


Yani iyi bir şey olacak bir istatistik sınıfına istatistik ilgili alanlarda hareketli, soru, evet cevap vermek. Ama sadece hareket etmeniz gereken alanlar değil, tüm sorumluluk. Bu, resetStats() yönteminiz varsa, Stat sınıfına da gider. taşınıyor üyeler private ise o ayrıntıyı daha gizler beri

Ayrışma, ayrıca kapsülleme yardımcı olur. Fakat ayrışma kendi konusu.

+2

Cevabınız için teşekkürler. Evet, ayrıştırma yapmak istedim, OO dünyasına yeni oldum :) – Niminim

+0

Stats sınıfı seviye, güç, armorClass vb. Deneyim puanları (xp) ve altın (gp) istatistikler değil, bunları istatistik sınıfına da eklemem gerekir mi? – Niminim

+1

@Niminim Kesinlikle bir “güç” içerir, çünkü bu bir stat. ArmorClass'ın ne olduğundan emin değilim, bu yüzden bu konuya bağlı olacaktır. Bana göre, ekipman bilgisi gibi geliyor. 'altın' bir öğe gibi geliyor ve 'xp 'gerçekten şeyleri nasıl ele aldığınıza bağlı. Bu statüdeki tüm detayları içeren "FireMaking" gibi her bir statü kendi türüne ayırabilirsiniz. –

2

Nesneler davranışı. Nesne içindeki durum, bu davranışları desteklemek için var. Bir grup devleti, kendi özel davranışlarıyla ayrı bir nesneden ziyade, bir devlet kabı olarak ayırmak, şeylerin büyük resminde çok fazla anlam ifade etmemektedir. Daha küçük içine büyük sistemlerini kırarak eylemini, daha kolay parçalar anlamak -

İlgili konular