2013-05-20 6 views
0

Так что я совершенно новый для программирования в целом. В настоящее время я работаю над программой формирования местности, все будет отлично подходит для этого, кроме:Есть ли способ сделать это короче?

public static class Desert 
    { 
     public const int iChance = 15; 
     public static int chance = iChance; 
     public static int chancepoint = 0; 
     public const int octaves = 4; 
     public const int lengthMin = 60; 
     public const int lengthMax = 90; 
     public const float scaleMin = 250; 
     public const float scaleMax = 350; 
     public const float persistenceMin = 0.5f; 
     public const float persistenceMax = 0.9f; 
     public const pType ptype = pType.Lowland; 
     public const bTag[] tags = { bTag.desert }; 
    } 
    public static class Meadow 
    { 
     public const int iChance = 45; 
     public static int chance = iChance; 
     public static int chancepoint = 0; 
     public const int octaves = 4; 
     public const int lengthMin = 45; 
     public const int lengthMax = 70; 
     public const float scaleMin = 200; 
     public const float scaleMax = 470; 
     public const float persistenceMin = 0.35f; 
     public const float persistenceMax = 0.70f; 
     public const pType ptype = pType.noAbs; 
     public const bTag[] tags = { bTag.lush }; 
    } 

Эти свойства для каждого типа «биома».

В настоящее время у меня около 7 из них, и они все точно такие же, за исключением значений каждого поля.

Есть ли способ сократить код? Я посмотрел в наследство, но у меня закончились ошибки, и я немного смутился. > <

Было бы блестящим, если все, что я должен был написать был:

public static class Desert 
    { 
     iChance = 15; 
     chance = iChance; 
     chancepoint = 0; 
     octaves = 4; 
     lengthMin = 60; 
     lengthMax = 90; 
     scaleMin = 250; 
     scaleMax = 350; 
     persistenceMin = 0.5f; 
     persistenceMax = 0.9f; 
     ptype = pType.Lowland; 
     strongTags = { bTag.desert }; 
    } 

Спасибо заранее.

О, и жаль насчет нужности вопроса, вы, вероятно, будете кричать о том, насколько ужасен мой код, если вы видели остальную часть программы. XD

EDIT: Возможно, разумно сказать, что я НИКОГДА не изменяю материал внутри класса заново, за исключением значения «шанс».

+1

Удалить «статический» ключевое слово и поставить все те, в конструкторе – MikeSW

+0

@AwesomePerson о том, как пытаясь использовать это в 'list' – Praveen

+0

Вы вводите в заблуждение класс со своим экземпляром. Не объявляйте 7 классов, объявляйте 1 и создавайте экземпляр для каждого бима. Затем выйдите и купите книгу о концепциях программирования :-) –

ответ

3

Вместо использования статического класса вы можете использовать нестатический класс.

public class Biome { 
    // Instance fields with default values 
    public int iChance = 15; 
    public int chance = iChance; 
    public int chancepoint = 0; 
    public int octaves = 4; 
    public int lengthMin = 60; 
    public int lengthMax = 90; 
    public float scaleMin = 250; 
    public float scaleMax = 350; 
    public float persistenceMin = 0.5f; 
    public float persistenceMax = 0.9f; 
    public pType ptype = pType.Lowland; 
    public bTag[] tags = { bTag.desert }; 
} 

Здесь используют конструктор для инициализации:

public Biome(int iChance, int chance, int chancepoint, int octaves, public int lengthMin, int lengthMax, float scaleMin, float scaleMax, float persistenceMin, float persistenceMax,pType ptype, bTag[] tags) { 
    // init fields here 
} 

Затем вызовите конструктор:

Biome bimoe = new Biome(15, iChance, 0, 4, 60, 90, 250, 350, 0.5f, 0.9f, pType.Lowland, { bTag.desert }); 

С этим трудно понять, какой параметр идет на какое поле, но это намного короче.

Если поля должны быть доступны только для чтения, вы можете сделать недвижимость только с общедоступными get и без аксессуаров set. Пример:

public Chance { get { return chance; } } 

В этом случае делают поля частные:

private int chance = iChance; 

(Лично для такого сценария, я бы поставил все данные в файле)

0

Это лучше использовать только один класс без наследования или даже структура. Пустыня, луг и т. Д. Не являются логически логически, это должны быть объекты (возможно, константы).

-2

Во-первых, вы не можете наследовать на static classes. Поэтому вам придется начать использовать экземпляры.

Во-вторых, вы бы использовали наследование, если хотите расширить объект. Например, если вы хотите добавить новое свойство «bool HasScorpions» в Desert, но не на Meadow.

Поскольку вы используете одни и те же свойства, но хотите использовать разные значения, я лично использую интерфейс. Таким образом, вы можете сделать свойства readonly ect, все еще легко устанавливая значения.

public interface Terrain 
{ 
    int iChance = {get { return 15; private set; } ..and repeat. 
    int chance = iChance; 
    int chancepoint = 0; 
    int octaves = 4; 
    int lengthMin = 60; 
    int lengthMax = 90; 
    float scaleMin = 250; 
    float scaleMax = 350; 
    float persistenceMin = 0.5f; 
    float persistenceMax = 0.9f; 
    pType ptype = pType.Lowland; 
    bTag[] tags = { bTag.desert }; 
} 
1

Следующая будет короче:

public const int iChance = 15, octaves = 4, lengthMin = 60, lengthMax = 90; 
public const float scaleMin = 250, scaleMax = 350, persistenceMin = 0.5f, 
        persistenceMax = 0.9f; 
public static int chance = iChance, chancepoint = 0; 

Однако ... они действительно не похожи на вещи, которые должны быть static поля, или вполне возможно, даже не const. Они выглядят как вещи, которые должны быть свойствами экземпляра. Может быть что-то вроде:

public class Terrain { 
    public int Chance {get;private set;} 
    public int LengthMin {get;private set;} 
    // ... 
    private Terrain(int chance, int lengthMin, ...) { 
     Chance = chance; 
     LengthMin = lengthMin; 
     // ... 
    } 
    private static readonly Terrain 
     desert = new Terrain(45, 45, ...), 
     meadow = new Terrain(15, 60, ...), 
     ...; 
    public static Terrain Desert { get { return desert;}} 
    public static Terrain Meadow { get { return meadow;}} 
} 
+0

Хорошо, это имеет смысл, но я никогда не меняю вещи в классе, как только создаю их, а производительность весьма важна. Это повлияет на производительность? – AwesomePerson

+0

@AwesomePerson хитрый один. Константы имеют то преимущество, что они «сжигаются» в вызывающем устройстве (это никогда не ldfld и т. Д. - это сырая загрузочная стоимость). Насколько это важно, зависит от сценария (вам нужно будет профилировать). Но синтаксис в первом примере здесь (несколько значений для объявления), по крайней мере, менее подробный! –

+0

Хорошо, спасибо! – AwesomePerson

0

Что вы можете сделать, это использовать один класс под названием Terrain и инициализацию это несколько раз, используя статический конструктор:

public class Terrain 
    { 
      public int IChance { get; private set; } 
    public int Chancepoint { get; private set; } 
    public int Octaves { get; private set; } 
    public int LengthMin { get; private set; } 
    public int LengthMax { get; private set; } 
    public float ScaleMin { get; private set; } 
    public float ScaleMax { get; private set; } 
    public float PersistenceMin { get; private set; } 
    public float PersistenceMax { get; private set; } 
    public pType Ptype { get; private set; } 
    public bTag[] Tags { get; private set; } 

     public static Terrain Desert() 
     { 
      return new Terrain 
       { 
        IChance = 15, 
        Chancepoint = 0, 
        Octaves = 4, 
        LengthMin = 60, 
        LengthMax = 90, 
        ScaleMin = 250, 
        ScaleMax = 350, 
        PersistenceMin = 0.5f, 
        PersistenceMax = 0.9f, 
        Ptype = pType.Lowland, 
        Tags = new bTag[] {bTag.Desert} 
       }; 
     } 
} 
0

ответ Джо хорошо, но вызов конструктора имеет гораздо слишком много неназванных параметров - что означает 350?

Это идеальный кандидат на проектирование с данными.

Вместо того чтобы определять все типы биома в коде, поместите все данные для типов Biome в файл и прочитайте файл во время выполнения. Язык C# содержит много вещей, которые помогут вам сделать это, ключевым словом для поиска является сериализация (and here's a link to MSDN about it).

Большое преимущество заключается в том, что вы можете изменить значения данных, не перекомпилируя код.

Недостатком является то, что для определения первого экземпляра требуется намного больше кода, но после этого вы можете легко создать столько экземпляров, сколько хотите.

1

Я мало знаю о программах создания ландшафта, но вы должны хранить свои данные в базе данных. Затем создайте классы для сопоставления этих данных с вашим приложением. Я рекомендую вам посмотреть «Структуры данных» и посмотреть, какой из них подходит вашему приложению.

0

Вы могли бы сделать что-то вроде объявить абстрактный класс, как это и затем inherting из него:

public abstract class Terrain 
    { 
     public int iChance; 
     public int chance; 
     public int chancepoint; 
     public int octaves; 
     public int lengthMin; 
     public int lengthMax; 
     public float scaleMin; 
     public float scaleMax; 
     public float persistenceMin; 
     public float persistenceMax; 
     public pType ptype; 
     public Tag[] strongTags; 
    } 

    public class Desert : Terrain 
    { 

    } 

    public enum pType 
    { 
     Desert = 1, 
     LowLand = 2 
    } 

    public enum Tag 
    { 
     desert = 1, 
     lush = 2 
    } 

Вы можете создать экземпляр пустыни, как:

var desert = new Desert() 
      { 
       iChance = 15 
       ,chance = 15 
       ,chancepoint = 0 
       ,octaves = 4 
       ,lengthMin = 60 
       ,lengthMax = 90 
       ,scaleMin = 250 
       ,scaleMax = 350 
       ,persistenceMin = 0.5f 
       ,persistenceMax = 0.9f 
       ,ptype = pType.Desert 
       ,strongTags = new Tag[]{Tag.desert} 
      }; 
0

Не уверен, что ваши точные требования, но это не лучший подход:

public abstract class BiomeBase 
{ 
    public int Chance  { get; set; } 
    public int Chancepoint { get; set; } 
    public int Octaves  { get; set; } 
    // you get the idea ... 
} 

Тогда у вас есть Desert и Meadow наследующий:

public class Desert : BiomeBase 
{ 
    // everything is inherited ... 
    // you can also add your own properties meant for Desert only (if needed) 
} 

public class Meadow : BiomeBase 
{ 
    // everything is inherited ... 
} 

Теперь Desert есть все Biome есть, и вы можете использовать его как это:

var desert = new Desert 
{ 
    Chance = 5, 
    Octaves = 1, 
    /// etc 
}; 
+0

Холли корова ... сколько ответов ... Я даже не :))) Извините, если повторится. –

Смежные вопросы